manager: forbid making booked event recurrent (#57609)

This commit is contained in:
Valentin Deniaud 2021-10-05 15:45:25 +02:00
parent 7ce030c69f
commit e9a85c134c
2 changed files with 24 additions and 0 deletions

View File

@ -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

View File

@ -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()