From bd3aa69d21a9902f98e474ef051b32c4f6fd8f5a Mon Sep 17 00:00:00 2001 From: Valentin Deniaud Date: Tue, 11 Jan 2022 16:11:41 +0100 Subject: [PATCH 2/2] manager: add recurrences on event creation (#60504) --- chrono/manager/forms.py | 18 ++++++++++++++---- tests/manager/test_event.py | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/chrono/manager/forms.py b/chrono/manager/forms.py index 40f6b1f3..e1d7aa56 100644 --- a/chrono/manager/forms.py +++ b/chrono/manager/forms.py @@ -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, diff --git a/tests/manager/test_event.py b/tests/manager/test_event.py index 9aa431e4..99955f3c 100644 --- a/tests/manager/test_event.py +++ b/tests/manager/test_event.py @@ -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) -- 2.30.2