0001-api-prevent-crash-on-invalid-event_display_template-.patch
chrono/agendas/models.py | ||
---|---|---|
221 | 221 |
_('Event display template'), |
222 | 222 |
max_length=256, |
223 | 223 |
blank=True, |
224 |
validators=[django_template_validator], |
|
224 | 225 |
help_text=_( |
225 | 226 |
'By default event labels will be displayed to users. This allows for a custom template to include additional informations. For example, "{{ event.label }} - {{ event.start_datetime }}" will show event datetime after label. Available variables: event.label (label), event.start_datetime (start date/time), event.places (places), event.remaining_places (remaining places), event.duration (duration), event.pricing (pricing).' |
226 | 227 |
), |
chrono/api/views.py | ||
---|---|---|
24 | 24 |
from django.db.models.functions import TruncDay |
25 | 25 |
from django.http import Http404, HttpResponse |
26 | 26 |
from django.shortcuts import get_object_or_404 |
27 |
from django.template import Context, Template |
|
27 |
from django.template import Context, Template, TemplateSyntaxError, VariableDoesNotExist
|
|
28 | 28 |
from django.urls import reverse |
29 | 29 |
from django.utils.dateparse import parse_date, parse_datetime |
30 | 30 |
from django.utils.encoding import force_text |
... | ... | |
417 | 417 |
agenda = agenda or event.agenda |
418 | 418 |
event_text = force_text(event) |
419 | 419 |
if agenda.event_display_template: |
420 |
event_text = Template(agenda.event_display_template).render(Context({'event': event})) |
|
420 |
try: |
|
421 |
event_text = Template(agenda.event_display_template).render(Context({'event': event})) |
|
422 |
except (VariableDoesNotExist, TemplateSyntaxError): |
|
423 |
pass |
|
421 | 424 |
elif event.label and event.primary_event is not None: |
422 | 425 |
event_text = '%s (%s)' % ( |
423 | 426 |
event.label, |
tests/test_api.py | ||
---|---|---|
566 | 566 |
resp = app.get('/api/agenda/%s/datetimes/' % agenda.slug) |
567 | 567 |
assert resp.json['data'][0]['text'] == 'Hello world (4/5 places remaining)' |
568 | 568 | |
569 |
# invalid template yields default text |
|
570 |
agenda.event_display_template = '{{ event.not-found }}' |
|
571 |
agenda.save() |
|
572 |
resp = app.get('/api/agenda/%s/datetimes/' % agenda.slug) |
|
573 |
assert resp.json['data'][0]['text'] == 'Hello world' |
|
574 | ||
569 | 575 | |
570 | 576 |
def test_datetime_api_urls(app): |
571 | 577 |
agenda = Agenda.objects.create(label='Foo bar', kind='events', minimal_booking_delay=0) |
572 |
- |