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)
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]):
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):
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):
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.
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.