From 8904cdb7ccf90a90d8bd6c60b1a63bcdac74dece Mon Sep 17 00:00:00 2001 From: Valentin Deniaud Date: Thu, 6 May 2021 15:20:09 +0200 Subject: [PATCH] agendas: allow custom event api text (#53661) --- chrono/agendas/models.py | 7 +++++++ chrono/api/views.py | 5 ++++- chrono/manager/forms.py | 2 ++ tests/test_api.py | 8 +++++++- 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/chrono/agendas/models.py b/chrono/agendas/models.py index 6d7a980..6a19be4 100644 --- a/chrono/agendas/models.py +++ b/chrono/agendas/models.py @@ -204,6 +204,13 @@ class Agenda(models.Model): _('Booking form URL'), max_length=200, blank=True, validators=[django_template_validator] ) desk_simple_management = models.BooleanField(default=False) + event_display_template = models.CharField( + _('Event display template'), + max_length=256, + help_text=_( + 'Change event text displayed to users. For example, "{{ event.label }} - {{ event.start_datetime }}" will show event datetime after label.' + ), + ) class Meta: ordering = ['label'] diff --git a/chrono/api/views.py b/chrono/api/views.py index a5e5c94..930800b 100644 --- a/chrono/api/views.py +++ b/chrono/api/views.py @@ -23,6 +23,7 @@ from django.db import transaction from django.db.models import Prefetch, Q from django.http import Http404, HttpResponse from django.shortcuts import get_object_or_404 +from django.template import Context, Template from django.urls import reverse from django.utils.dateparse import parse_date, parse_datetime from django.utils.encoding import force_text @@ -400,7 +401,9 @@ def is_event_disabled(event, min_places=1): def get_event_detail(request, event, agenda=None, min_places=1): agenda = agenda or event.agenda event_text = force_text(event) - if event.label and event.primary_event is not None: + if agenda.event_display_template: + event_text = Template(agenda.event_display_template).render(Context({'event': event})) + elif event.label and event.primary_event is not None: event_text = '%s (%s)' % ( event.label, date_format(localtime(event.start_datetime), 'DATETIME_FORMAT'), diff --git a/chrono/manager/forms.py b/chrono/manager/forms.py index 3ad52b5..6230175 100644 --- a/chrono/manager/forms.py +++ b/chrono/manager/forms.py @@ -86,12 +86,14 @@ class AgendaEditForm(forms.ModelForm): 'anonymize_delay', 'default_view', 'booking_form_url', + 'event_display_template', ] def __init__(self, *args, **kwargs): super(AgendaEditForm, self).__init__(*args, **kwargs) if kwargs['instance'].kind != 'events': del self.fields['booking_form_url'] + del self.fields['user_display_template'] self.fields['default_view'].choices = [ (k, v) for k, v in self.fields['default_view'].choices if k != 'open_events' ] diff --git a/tests/test_api.py b/tests/test_api.py index 361c663..5bf6206 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -514,6 +514,7 @@ def test_datetime_api_fr(app): assert 'data' in resp.json +@pytest.mark.freeze_time('2021-05-06 14:00') def test_datetime_api_label(app): agenda = Agenda.objects.create(label='Foo bar', kind='events', minimal_booking_delay=0) Event.objects.create( @@ -524,7 +525,12 @@ def test_datetime_api_label(app): agenda=agenda, ) resp = app.get('/api/agenda/%s/datetimes/' % agenda.slug) - assert 'Hello world' in [x['text'] for x in resp.json['data']] + assert 'Hello world' == resp.json['data'][0]['text'] + + agenda.event_display_template = '{{ event.label }} - {{ event.start_datetime }}' + agenda.save() + resp = app.get('/api/agenda/%s/datetimes/' % agenda.slug) + assert 'Hello world - May 7, 2021, 4 p.m.' == resp.json['data'][0]['text'] def test_datetime_api_urls(app): -- 2.20.1