agendas: allow custom event api text (#53661)

This commit is contained in:
Valentin Deniaud 2021-05-06 15:20:09 +02:00
parent a4195b0dc2
commit bf4b986591
6 changed files with 62 additions and 3 deletions

View File

@ -0,0 +1,23 @@
# Generated by Django 2.2.19 on 2021-05-19 12:23
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agendas', '0087_booking_user_name'),
]
operations = [
migrations.AddField(
model_name='agenda',
name='event_display_template',
field=models.CharField(
blank=True,
help_text='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.',
max_length=256,
verbose_name='Event display template',
),
),
]

View File

@ -217,6 +217,14 @@ class Agenda(models.Model):
blank=True,
validators=[django_template_validator],
)
event_display_template = models.CharField(
_('Event display template'),
max_length=256,
blank=True,
help_text=_(
'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.'
),
)
class Meta:
ordering = ['label']

View File

@ -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
@ -414,7 +415,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'),

View File

@ -103,12 +103,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['event_display_template']
self.fields['default_view'].choices = [
(k, v) for k, v in self.fields['default_view'].choices if k != 'open_events'
]

View File

@ -469,6 +469,7 @@ def test_options_agenda(app, admin_user):
assert resp.context['form'].initial['default_view'] == 'month'
assert 'open_events' in [k for k, v in resp.context['form'].fields['default_view'].choices]
assert 'booking_form_url' in resp.context['form'].fields
assert 'event_display_template' in resp.context['form'].fields
resp = resp.form.submit()
assert resp.location.endswith('/manage/agendas/%s/settings' % agenda_events.pk)
resp = resp.follow()
@ -482,6 +483,7 @@ def test_options_agenda(app, admin_user):
assert 'default_view' in resp.context['form'].fields
assert 'open_events' not in [k for k, v in resp.context['form'].fields['default_view'].choices]
assert 'booking_form_url' not in resp.context['form'].fields
assert 'event_display_template' not in resp.context['form'].fields
resp.form['default_view'] = 'month'
resp.form.submit()
@ -492,6 +494,7 @@ def test_options_agenda(app, admin_user):
assert resp.form['default_view'].value == 'month'
assert 'default_view' in resp.context['form'].fields
assert 'booking_form_url' not in resp.context['form'].fields
assert 'event_display_template' not in resp.context['form'].fields
assert 'open_events' not in [k for k, v in resp.context['form'].fields['default_view'].choices]

View File

@ -540,9 +540,10 @@ 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(
event = Event.objects.create(
label='Hello world',
slug='event-slug',
start_datetime=(now() + datetime.timedelta(days=1)),
@ -550,7 +551,20 @@ 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 resp.json['data'][0]['text'] == 'Hello world - May 7, 2021, 4 p.m.'
Booking.objects.create(event=event)
agenda.event_display_template = (
'{{ event.label }} ({{ event.remaining_places }}/{{ event.places }} places remaining)'
)
agenda.save()
resp = app.get('/api/agenda/%s/datetimes/' % agenda.slug)
assert resp.json['data'][0]['text'] == 'Hello world (4/5 places remaining)'
def test_datetime_api_urls(app):
@ -6338,6 +6352,12 @@ def test_recurring_events_api(app, user, freezer):
assert len(resp.json['data']) == 2
assert resp.json['data'][0]['id'] == 'abc:2021-02-02-1305'
# events follow agenda display template
agenda.event_display_template = '{{ event.label }} - {{ event.start_datetime }}'
agenda.save()
resp = app.get('/api/agenda/%s/datetimes/' % agenda.slug)
assert resp.json['data'][0]['text'] == 'Test - Feb. 2, 2021, 1:05 p.m.'
def test_recurring_events_api_various_times(app, user, mock_now):
agenda = Agenda.objects.create(