from django.utils.dateparse import parse_datetime, parse_duration
from django.utils import timezone
-from postgresqleu.util.widgets import MonospaceTextarea
-from postgresqleu.confreg.models import ConferenceSession, Track
+from postgresqleu.util.widgets import MonospaceTextarea, SimpleTreeviewWidget
+from postgresqleu.confreg.models import Conference, ConferenceSession, Track
from postgresqleu.confreg.models import MessagingProvider
from postgresqleu.confreg.twitter import post_conference_social, render_multiprovider_tweet
+from postgresqleu.confreg.jinjafunc import get_all_available_attributes
from postgresqleu.confsponsor.models import Sponsor, SponsorshipLevel
from postgresqleu.util.messaging import get_messaging, get_messaging_class
from postgresqleu.util.messaging.short import get_shortened_post_length
content_template = forms.CharField(max_length=2000,
widget=MonospaceTextarea,
required=True)
+ available_fields = forms.CharField(required=False, help_text="These fields are available as {{field}} in the template")
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)
def __init__(self, conference, *args, **kwargs):
self.conference = conference
- self.field_order = ['starttime', 'timebetween', 'timerandom', 'content_template'] + self.custom_fields + ['confirm', ]
+ self.field_order = ['starttime', 'timebetween', 'timerandom', 'content_template', 'available_fields', ] + self.custom_fields + ['confirm', ]
super(BaseCampaignForm, self).__init__(*args, *kwargs)
+ 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]):
del self.fields['confirm']
else:
else:
self.fields['confirm'].help_text = "Campaign matches no entries. Try again."
+ def get_contextrefs(self):
+ return {}
+
def clean_confirm(self):
if not self.cleaned_data['confirm']:
if self.get_queryset().count == 0:
'session': session,
})
+ @classmethod
+ def get_contextrefs(cls):
+ return {
+ 'conference': dict(get_all_available_attributes(Conference)),
+ 'session': dict(get_all_available_attributes(ConferenceSession)),
+ }
+
def get_queryset(self):
return ConferenceSession.objects.filter(conference=self.conference, status=1, cross_schedule=False, track__in=self.data.getlist('tracks'))
'sponsor': sponsor,
})
+ @classmethod
+ def get_contextrefs(cls):
+ return {
+ 'conference': dict(get_all_available_attributes(Conference)),
+ 'sponsor': dict(get_all_available_attributes(Sponsor)),
+ }
+
def get_queryset(self):
return Sponsor.objects.filter(conference=self.conference, confirmed=True, level__in=self.data.getlist('levels'))
import json
from postgresqleu.util.db import exec_to_scalar
-from postgresqleu.util.widgets import StaticTextWidget
+from postgresqleu.util.widgets import StaticTextWidget, SimpleTreeviewWidget
from postgresqleu.util.widgets import MonospaceTextarea
from postgresqleu.util.backendforms import BackendForm, BackendBeforeNewForm
from postgresqleu.util.backendlookups import GeneralAccountLookup
from postgresqleu.confreg.jinjafunc import JinjaTemplateValidator, filter_social
+from postgresqleu.confreg.jinjafunc import get_all_available_attributes
from postgresqleu.confreg.twitter import get_all_conference_social_media
from postgresqleu.confreg.twitter import render_multiprovider_tweet
+from postgresqleu.confreg.models import Conference
from .models import Sponsor
from .models import SponsorshipLevel, SponsorshipContract, SponsorshipBenefit
from .models import ShipmentAddress
markdown_fields = ['benefitdescription', 'claimprompt', ]
dynamic_preview_fields = ['tweet_template']
form_before_new = BackendSponsorshipNewBenefitForm
- readonly_fields = ['benefit_class_name', ]
+ readonly_fields = ['benefit_class_name', 'available_fields', ]
exclude_date_validators = ['deadline', ]
class_param_fields = [] # Overridden in subclass!
benefit_class_name = django.forms.CharField(required=False)
+ available_fields = django.forms.CharField(required=False)
@property
def fieldsets(self):
return [
{'id': 'base', 'legend': 'Base', 'fields': basefields},
{'id': 'download', 'legend': 'Token download data', 'fields': ['overview_name', 'overview_value', 'include_in_data']},
- {'id': 'marketing', 'legend': 'Marketing', 'fields': ['tweet_template', ]},
+ {'id': 'marketing', 'legend': 'Marketing', 'fields': ['tweet_template', 'available_fields', ]},
{'id': 'params', 'legend': 'Parameters', 'fields': self.class_param_fields},
]
class Meta:
model = SponsorshipBenefit
fields = ['benefitname', 'benefitdescription', 'sortkey', 'maxclaims',
- 'claimprompt', 'deadline', 'tweet_template', 'benefit_class_name', 'autoconfirm',
+ 'claimprompt', 'deadline', 'tweet_template', 'available_fields', 'benefit_class_name', 'autoconfirm',
'overview_name', 'overview_value', 'include_in_data', ]
_can_multiclaim = None
]
self.fields['tweet_template'].widget = MonospaceTextarea()
+ self.fields['available_fields'].widget = SimpleTreeviewWidget(treedata=self.get_contextrefs())
+
if not self.can_multiclaim:
del self.fields['maxclaims']
self.update_protected_fields()
return p
return ''
+ @classmethod
+ def get_contextrefs(self):
+ return {
+ 'benefit': dict(get_all_available_attributes(SponsorshipBenefit)),
+ 'level': dict(get_all_available_attributes(SponsorshipLevel)),
+ 'conference': dict(get_all_available_attributes(Conference)),
+ 'sponsor': dict(get_all_available_attributes(Sponsor)),
+ }
+
class BackendSponsorshipLevelBenefitManager(object):
title = 'Benefits'