From 414ba4c99cfc88ea428044c48b6243b13fb9653c Mon Sep 17 00:00:00 2001 From: Emmanuel Cazenave Date: Mon, 5 Dec 2022 17:17:42 +0100 Subject: [PATCH] manager: forbid dates inferior to 2000 (#71558) --- chrono/manager/forms.py | 16 ++++++++++++++++ tests/manager/test_event.py | 17 +++++++++++++++++ tests/manager/test_exception.py | 18 ++++++++++++++++++ tests/manager/test_timeperiod.py | 17 +++++++++++++++++ 4 files changed, 68 insertions(+) diff --git a/chrono/manager/forms.py b/chrono/manager/forms.py index 5cd138f1..199fb27d 100644 --- a/chrono/manager/forms.py +++ b/chrono/manager/forms.py @@ -212,6 +212,12 @@ class NewEventForm(forms.ModelForm): self.cleaned_data['recurrence_days'] = None self.cleaned_data['recurrence_end_date'] = None + def clean_start_datetime(self): + start_datetime = self.cleaned_data['start_datetime'] + if start_datetime.year < 2000: + raise ValidationError(_('Year must be after 2000.')) + return start_datetime + def clean_recurrence_days(self): recurrence_days = self.cleaned_data['recurrence_days'] if recurrence_days == []: @@ -896,6 +902,12 @@ class TimePeriodForm(TimePeriodFormBase, forms.ModelForm): del self.fields['repeat'] del self.fields['weekday_indexes'] + def clean_date(self): + data = self.cleaned_data['date'] + if data.year < 2000: + raise ValidationError(_('Year must be after 2000.')) + return data + def save(self): super().save() @@ -995,6 +1007,10 @@ class TimePeriodExceptionForm(forms.ModelForm): def clean(self): cleaned_data = super().clean() + for date_field in ('start_datetime', 'end_datetime'): + if date_field in cleaned_data and cleaned_data[date_field].year < 2000: + self.add_error(date_field, _('Year must be after 2000.')) + if 'start_datetime' in cleaned_data and 'end_datetime' in cleaned_data: if cleaned_data['end_datetime'] <= cleaned_data['start_datetime']: self.add_error('end_datetime', _('End datetime must be greater than start datetime.')) diff --git a/tests/manager/test_event.py b/tests/manager/test_event.py index 98e03256..51f986f8 100644 --- a/tests/manager/test_event.py +++ b/tests/manager/test_event.py @@ -152,6 +152,23 @@ def test_add_event_as_manager(app, manager_user): assert event.end_datetime == event.start_datetime + datetime.timedelta(minutes=45) +def test_add_event_third_millennium(app, admin_user): + agenda = Agenda.objects.create(label='Foo bar') + Desk.objects.create(agenda=agenda, slug='_exceptions_holder') + assert Event.objects.filter(agenda=agenda).count() == 0 + app = login(app) + resp = app.get('/manage/agendas/%s/settings' % agenda.pk) + assert '

Settings' in resp.text + resp = resp.click('New Event') + resp.form['start_datetime_0'] = '0022-02-15' + resp.form['start_datetime_1'] = '17:00' + resp.form['places'] = 10 + resp.form['duration'] = 45 + resp = resp.form.submit() + assert resp.context['form'].errors['start_datetime'] == ['Year must be after 2000.'] + assert Event.objects.filter(agenda=agenda).count() == 0 + + def test_edit_event(settings, app, admin_user): settings.LANGUAGE_CODE = 'fr-fr' # check date initial value format agenda = Agenda.objects.create(label='Foo bar') diff --git a/tests/manager/test_exception.py b/tests/manager/test_exception.py index 7a1b0ca1..d0571a6f 100644 --- a/tests/manager/test_exception.py +++ b/tests/manager/test_exception.py @@ -110,6 +110,24 @@ def test_meetings_agenda_add_time_period_exception(app, admin_user): assert 'Exception 2' in resp.text +def test_meetings_agenda_add_time_period_exception_third_millennium(app, admin_user): + agenda = Agenda.objects.create(label='Foo bar', kind='meetings') + desk = Desk.objects.create(agenda=agenda, label='Desk A') + assert TimePeriodException.objects.filter(desk=desk).count() == 0 + app = login(app) + resp = app.get('/manage/agendas/%s/settings' % agenda.pk) + resp = resp.click('Add a time period exception', index=0) + resp.form['label'] = 'Exception 1' + resp.form['start_datetime_0'] = '0022-10-24' + resp.form['start_datetime_1'] = '08:00' + resp.form['end_datetime_0'] = '0022-10-24' + resp.form['end_datetime_1'] = '16:00' + resp = resp.form.submit() + assert resp.context['form'].errors['start_datetime'] == ['Year must be after 2000.'] + assert resp.context['form'].errors['end_datetime'] == ['Year must be after 2000.'] + assert TimePeriodException.objects.filter(desk=desk).count() == 0 + + def test_meetings_agenda_add_time_period_exception_booking_overlaps(app, admin_user): agenda = Agenda.objects.create(label='Foo bar', kind='meetings') desk = Desk.objects.create(agenda=agenda, label='Desk A') diff --git a/tests/manager/test_timeperiod.py b/tests/manager/test_timeperiod.py index 189125ac..b2c71b52 100644 --- a/tests/manager/test_timeperiod.py +++ b/tests/manager/test_timeperiod.py @@ -317,6 +317,23 @@ def test_meetings_agenda_date_time_period_desk_simple_management(app, admin_user assert TimePeriod.objects.count() == 0 +@pytest.mark.freeze_time('2022-10-24 10:00') +def test_meetings_agenda_date_time_period_third_millennium(app, admin_user): + agenda = Agenda.objects.create(label='Foo bar', kind='meetings', desk_simple_management=True) + desk = Desk.objects.create(agenda=agenda, label='Desk A') + assert agenda.is_available_for_simple_management() is True + assert TimePeriod.objects.filter(desk=desk).count() == 0 + + app = login(app) + resp = app.get('/manage/agendas/%s/desk/%s/add-date-time-period' % (agenda.pk, desk.pk)) + resp.form['date'] = '0022-10-24' + resp.form['start_time'] = '10:00' + resp.form['end_time'] = '13:00' + resp = resp.form.submit() + assert resp.context['form'].errors['date'] == ['Year must be after 2000.'] + assert TimePeriod.objects.filter(desk=desk).count() == 0 + + @pytest.mark.freeze_time('2022-10-23') def test_meetings_agenda_date_time_period_display(app, admin_user): agenda = Agenda.objects.create(label='Foo bar', kind='meetings')