JSON format. Will be automatically populated with a default set of
parameters when created, but their values have to be set.
+Tweet template
+: A template, in jinja2 format, used to generate tweets when this
+benefit is confirmed. If left empty, no tweet is posted. Can reference
+*sponsor*, *level*, *conference* and *benefit* variables that will be
+filled with information about the current conference.
### Sponsorship contract <a name="contract"></a>
from django.http import Http404, HttpResponse
from django.template.backends.utils import csrf_input_lazy, csrf_token_lazy
from django.template import defaultfilters
+from django.core.exceptions import ValidationError
from django.contrib.messages.api import get_messages
from django.utils.text import slugify
from django.conf import settings
c.update(settings_context_unicode())
return HttpResponse(t.render(**c), content_type='text/html')
+
+
+
+
+
+# Small sandboxed jinja templates that can be configured in system
+def render_sandboxed_template(templatestr, context):
+ env = ConfSandbox(loader=jinja2.DictLoader({'t': templatestr}))
+ t = env.get_template('t')
+ return t.render(context)
+
+class JinjaTemplateValidator(object):
+ def __init__(self, context={}):
+ self.context = context
+
+ def __call__(self, s):
+ try:
+ render_sandboxed_template(s, self.context)
+ except jinja2.TemplateSyntaxError, e:
+ raise ValidationError("Template syntax error: %s" % e)
+ except Exception, e:
+ raise ValidationError("Failed to parse template: %s" % e)
from postgresqleu.util.widgets import RequiredFileUploadWidget, PrettyPrintJsonWidget
from postgresqleu.confreg.backendforms import BackendForm
from postgresqleu.confreg.backendlookups import GeneralAccountLookup
+from postgresqleu.confreg.jinjafunc import JinjaTemplateValidator, render_sandboxed_template
from models import Sponsor
from models import SponsorshipLevel, SponsorshipContract, SponsorshipBenefit
helplink='sponsors#benefit'
json_fields = ['class_parameters', ]
markdown_fields = ['benefitdescription', 'claimprompt', ]
+ dynamic_preview_fields = ['tweet_template']
+
class Meta:
model = SponsorshipBenefit
fields = ['benefitname', 'benefitdescription', 'sortkey', 'benefit_class',
- 'claimprompt', 'class_parameters', ]
+ 'claimprompt', 'class_parameters', 'tweet_template']
widgets = {
'class_parameters': PrettyPrintJsonWidget,
}
+ def fix_fields(self):
+ self.fields['tweet_template'].validators = [
+ JinjaTemplateValidator({
+ 'conference': self.conference,
+ 'benefit': self.instance,
+ 'level': self.instance.level,
+ 'sponsor': Sponsor(name='Test'),
+ }),
+ ]
+
+ @classmethod
+ def get_dynamic_preview(self, fieldname, s, objid):
+ if fieldname == 'tweet_template':
+ if objid:
+ o = self.Meta.model.objects.get(pk=objid)
+ return render_sandboxed_template(s, {
+ 'benefit': o,
+ 'level': o.level,
+ 'conference': o.level.conference,
+ 'sponsor': Sponsor(name='Test'),
+ })
+ return ''
+
def clean(self):
cleaned_data = super(BackendSponsorshipLevelBenefitForm, self).clean()
if cleaned_data.get('benefit_class') >= 0:
--- /dev/null
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.10 on 2018-10-09 21:13
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('confsponsor', '0009_vat_allow_null'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='sponsorshipbenefit',
+ name='tweet_template',
+ field=models.TextField(blank=True),
+ ),
+ ]
claimprompt = models.TextField(null=False, blank=True)
benefit_class = models.IntegerField(null=True, blank=True, default=None, choices=benefit_choices)
class_parameters = JSONField(blank=True, null=False)
+ tweet_template = models.TextField(null=False, blank=True)
def __unicode__(self):
return self.benefitname
from postgresqleu.auth import user_search, user_import
from postgresqleu.confreg.models import Conference, PrepaidVoucher, DiscountCode
+from postgresqleu.confreg.models import ConferenceTweetQueue
+from postgresqleu.confreg.jinjafunc import render_sandboxed_template
from postgresqleu.mailqueue.util import send_simple_mail
from postgresqleu.util.storage import InlineEncodedStorage
from postgresqleu.util.decorators import superuser_required
sendername=conference.conferencename,
)
+ # Potentially send tweet
+ if benefit.benefit.tweet_template:
+ ConferenceTweetQueue(conference=conference, datetime=datetime.now(),
+ contents=render_sandboxed_template(benefit.benefit.tweet_template, {
+ 'benefit': benefit.benefit,
+ 'level': benefit.benefit.level,
+ 'conference': conference,
+ 'sponsor': benefit.sponsor
+ })).save()
+
@login_required
def sponsor_admin_sponsor(request, confurlname, sponsorid):
if request.user.is_superuser: