Projet

Général

Profil

0001-api-prevent-crash-on-invalid-event_display_template-.patch

Valentin Deniaud, 31 mai 2021 17:12

Télécharger (3,09 ko)

Voir les différences:

Subject: [PATCH] api: prevent crash on invalid event_display_template (#54388)

 chrono/agendas/models.py | 1 +
 chrono/api/views.py      | 7 +++++--
 tests/test_api.py        | 6 ++++++
 3 files changed, 12 insertions(+), 2 deletions(-)
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
-