Make it possible to target only some providers with campaigns
authorMagnus Hagander <magnus@hagander.net>
Tue, 3 Dec 2024 22:00:19 +0000 (23:00 +0100)
committerMagnus Hagander <magnus@hagander.net>
Tue, 3 Dec 2024 22:00:19 +0000 (23:00 +0100)
postgresqleu/confreg/campaigns.py
postgresqleu/confreg/models.py
postgresqleu/confreg/twitter.py

index 0230ddcc5595c4a61423b7f313c20882488a3c52..e76a7d2e636ddfb1de72a7f69294f576d6207bc0 100644 (file)
@@ -56,6 +56,8 @@ class BaseCampaignForm(forms.Form):
                                        widget=MonospaceTextarea,
                                        required=True)
     available_fields = forms.CharField(required=False, help_text="These fields are available as {{field}} in the template")
+    providers = forms.ModelMultipleChoiceField(required=True, queryset=None,
+                                               help_text="Which social media providers to post to")
     dynamic_preview_fields = ['content_template', ]
 
     confirm = forms.BooleanField(help_text="Confirm that you want to generate all the tweets for this campaign at this time", required=False)
@@ -66,6 +68,9 @@ class BaseCampaignForm(forms.Form):
 
         super(BaseCampaignForm, self).__init__(*args, *kwargs)
 
+        self.fields['providers'].queryset = MessagingProvider.objects.filter(conferencemessaging__conference=conference, active=True, conferencemessaging__broadcast=True)
+        self.fields['providers'].initial = [p.id for p in self.fields['providers'].queryset.all()]
+
         self.fields['available_fields'].widget = SimpleTreeviewWidget(treedata=self.get_contextrefs())
 
         if not all([self.data.get(f) for f in ['starttime', 'timebetween', 'timerandom', 'content_template'] + self.custom_fields]):
@@ -107,7 +112,8 @@ class BaseCampaignForm(forms.Form):
                                    self.generate_tweet(self.conference, obj, self.cleaned_data['content_template']),
                                    approved=False,
                                    posttime=ts,
-                                   author=author)
+                                   author=author,
+                                   providers=self.cleaned_data['providers'])
 
 
 class ApprovedSessionsCampaignForm(BaseCampaignForm):
index e2ab7ce01e1eaaf413a15bdb99c9d2ab28ae10a5..0fc4514a5ef60b7e25a3c4cc4c42ba7c0999ac16 100644 (file)
@@ -1653,17 +1653,23 @@ class ConferenceTweetQueue(models.Model):
                 self.contents = "\n\n{}".format(hashtags)
 
     def save(self, *args, **kwargs):
+        create_on_providers = kwargs.pop('create_on_providers', None)
         super().save(*args, **kwargs)
 
         # When we are saving, *if* we have not yet been sent, materialize a list of
         # which providers to send to. However, we *only* do this if there isn't something
         # already in the list to be remaining -- if there is, then we just keep adding things
         # back that have already been taken care of.
-        if self.approved and not self.sent and not self.remainingtosend.exists():
+        if not self.sent and not self.remainingtosend.exists():
             if self.conference:
-                self.remainingtosend.set(MessagingProvider.objects.filter(active=True, conferencemessaging__conference=self.conference, conferencemessaging__broadcast=True))
+                providers = MessagingProvider.objects.filter(active=True, conferencemessaging__conference=self.conference, conferencemessaging__broadcast=True)
             else:
-                self.remainingtosend.set(MessagingProvider.objects.filter(active=True, series__isnull=True))
+                providers = MessagingProvider.objects.filter(active=True, series__isnull=True)
+
+            if create_on_providers:
+                providers = providers.filter(id__in=create_on_providers)
+
+            self.remainingtosend.set(providers)
             exec_no_result("NOTIFY pgeu_broadcast")
 
     def _ensure_provider_cache(self, cache):
index 489beb4967a046c285c89c6953f6186746ebd760..4dc5a6c7a6f639e91164575f725890c649da0896 100644 (file)
@@ -25,7 +25,7 @@ from .models import ConferenceTweetQueue, ConferenceIncomingTweet, ConferenceMes
 from .models import ConferenceRegistration, ConferenceHashtag
 
 
-def post_conference_social(conference, contents, approved=False, posttime=None, author=None):
+def post_conference_social(conference, contents, approved=False, posttime=None, author=None, providers=None):
     if not contents:
         # None for contents means this was a multiprovider rendered template that had no providers at all.
         # Contents is empty shouldn't happen, but if it does we don't want to post something empty anyway.
@@ -58,7 +58,7 @@ def post_conference_social(conference, contents, approved=False, posttime=None,
                              approved=approved,
                              datetime=posttime,
                              author=author)
-    t.save()
+    t.save(create_on_providers=providers)
 
     # There are no cases here where we want to moderate the post, so don't bother
     # calling the moderation system. This may change in the future.