manager: add recurrences on event creation (#60504)

This commit is contained in:
Valentin Deniaud 2022-01-11 16:11:41 +01:00
parent c9337d47b7
commit 39f78e0cc2
2 changed files with 51 additions and 5 deletions

View File

@ -24,6 +24,7 @@ from django import forms
from django.conf import settings
from django.contrib.auth.models import Group
from django.core.exceptions import FieldDoesNotExist
from django.db import transaction
from django.forms import ValidationError
from django.utils.encoding import force_text
from django.utils.six import StringIO
@ -198,12 +199,25 @@ class NewEventForm(forms.ModelForm):
'recurrence_end_date': forms.DateInput(attrs={'type': 'date'}, format='%Y-%m-%d'),
}
def clean(self):
super().clean()
if self.cleaned_data.get('frequency') == 'unique':
self.cleaned_data['recurrence_days'] = None
self.cleaned_data['recurrence_end_date'] = None
def clean_recurrence_days(self):
recurrence_days = self.cleaned_data['recurrence_days']
if recurrence_days == []:
return None
return recurrence_days
def save(self, *args, **kwargs):
with transaction.atomic():
event = super().save(*args, **kwargs)
if event.recurrence_end_date:
event.create_all_recurrences()
return event
class EventForm(NewEventForm):
protected_fields = (
@ -281,10 +295,6 @@ class EventForm(NewEventForm):
):
raise ValidationError(_('Bookings exist after this date.'))
if self.cleaned_data.get('frequency') == 'unique':
self.cleaned_data['recurrence_days'] = None
self.cleaned_data['recurrence_end_date'] = None
def save(self, *args, **kwargs):
with self.instance.update_recurrences(
self.changed_data,
@ -292,7 +302,7 @@ class EventForm(NewEventForm):
self.protected_fields,
list(self.protected_fields) + ['recurrence_end_date', 'frequency'],
):
super().save(*args, **kwargs)
super(NewEventForm, self).save(*args, **kwargs)
return self.instance

View File

@ -62,6 +62,42 @@ def test_add_event(app, admin_user):
)
@pytest.mark.freeze_time('2021-05-06 14:00')
def test_add_recurring_event(app, admin_user):
agenda = Agenda.objects.create(label='Foo bar', kind='events')
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
app = login(app)
resp = app.get('/manage/agendas/%s/settings' % agenda.id, status=200)
resp = resp.click('New Event')
resp.form['start_datetime_0'] = '2021-06-01'
resp.form['start_datetime_1'] = '17:00'
resp.form['places'] = 10
resp.form['frequency'] = 'unique' # not a recurring event
resp.form['recurrence_days'] = [1]
resp.form.submit().follow()
event = Event.objects.get()
assert event.recurrence_days is None
event.delete()
# add recurring event
resp.form['frequency'] = 'recurring'
resp.form.submit().follow()
event = Event.objects.get()
assert event.recurrence_days == [1]
event.delete()
# add recurring event with end date
resp.form['recurrence_end_date'] = '2021-07-01'
resp.form.submit().follow()
event = Event.objects.get(primary_event__isnull=True)
assert event.recurrence_days == [1]
assert Event.objects.filter(primary_event=event).count() == 5
def test_add_event_on_missing_agenda(app, admin_user):
app = login(app)
app.get('/manage/agendas/%s/add-event' % '0', status=404)