From 6fa5a9eaa62a734593f1473eb816dfe63dd4cb73 Mon Sep 17 00:00:00 2001 From: Valentin Deniaud Date: Tue, 5 Oct 2021 15:45:25 +0200 Subject: [PATCH] manager: forbid making booked event recurrent (#57609) --- chrono/manager/forms.py | 7 +++++++ tests/manager/test_event.py | 17 +++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/chrono/manager/forms.py b/chrono/manager/forms.py index ae7b04e9..690fc9d4 100644 --- a/chrono/manager/forms.py +++ b/chrono/manager/forms.py @@ -169,6 +169,7 @@ class NewEventForm(forms.ModelForm): ('recurring', _('Recurring')), ), initial='unique', + help_text=_('This field will not be editable once event has bookings.'), ) recurrence_days = forms.TypedMultipleChoiceField( choices=Event.WEEKDAY_CHOICES, @@ -242,6 +243,12 @@ class EventForm(NewEventForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields['frequency'].initial = 'recurring' if self.instance.recurrence_days else 'unique' + if not self.instance.recurrence_days and self.instance.booking_set.exists(): + self.fields['frequency'].disabled = True + self.fields['frequency'].help_text = '' + self.fields['frequency'].widget.attrs['title'] = _( + 'This field cannot be modified because event has bookings.' + ) if self.instance.recurrence_days and self.instance.has_recurrences_booked(): for field in self.protected_fields: self.fields[field].disabled = True diff --git a/tests/manager/test_event.py b/tests/manager/test_event.py index ffa8afcb..77bfc9a7 100644 --- a/tests/manager/test_event.py +++ b/tests/manager/test_event.py @@ -369,6 +369,23 @@ def test_edit_recurring_event_with_end_date(settings, app, admin_user, freezer): assert 'Bookings exist after this date' in resp.text +def test_edit_booked_event_disable_frequency_choice(settings, app, admin_user, freezer): + freezer.move_to('2021-01-12 12:10') + agenda = Agenda.objects.create(label='Foo bar', kind='events') + event = Event.objects.create(start_datetime=now(), places=10, agenda=agenda) + + app = login(app) + resp = app.get('/manage/agendas/%s/events/%s/edit' % (agenda.id, event.id)) + assert 'disabled' not in resp.form['frequency'].attrs + assert 'This field will not be editable once event has bookings.' in resp.text + + Booking.objects.create(event=event) + resp = app.get('/manage/agendas/%s/events/%s/edit' % (agenda.id, event.id)) + assert 'disabled' in resp.form['frequency'].attrs + assert 'cannot be modified' in resp.form['frequency'].attrs['title'] + assert 'This field will not be editable once event has bookings.' not in resp.text + + def test_booked_places(app, admin_user): agenda = Agenda(label='Foo bar') agenda.save() -- 2.30.2