From 0483142578b23f8f50bfebf667f1f0c7634bca7d Mon Sep 17 00:00:00 2001 From: Valentin Deniaud Date: Mon, 26 Oct 2020 17:26:57 +0100 Subject: [PATCH 2/3] agendas: move desk settings exceptions import to view (#47966) --- chrono/agendas/models.py | 7 ++----- chrono/manager/views.py | 6 ++++++ tests/test_agendas.py | 13 ++++++++----- tests/test_manager.py | 37 ++++++++++++++++++++++++++++++++++++- 4 files changed, 52 insertions(+), 11 deletions(-) diff --git a/chrono/agendas/models.py b/chrono/agendas/models.py index a6394aa..71b1bcd 100644 --- a/chrono/agendas/models.py +++ b/chrono/agendas/models.py @@ -1132,14 +1132,11 @@ class Desk(models.Model): ordering = ['label'] unique_together = ['agenda', 'slug'] - def save(self, *args, import_exceptions=True, **kwargs): + def save(self, *args, **kwargs): assert self.agenda.kind != 'virtual', "a desk can't reference a virtual agenda" - first_created = not self.pk if not self.slug: self.slug = generate_slug(self, agenda=self.agenda) super(Desk, self).save(*args, **kwargs) - if first_created and import_exceptions: - self.import_timeperiod_exceptions_from_settings(enable=True) @property def base_slug(self): @@ -1179,7 +1176,7 @@ class Desk(models.Model): if agenda_target: new_desk.agenda = agenda_target # store new desk - new_desk.save(import_exceptions=False) + new_desk.save() # clone related objects for time_period in self.timeperiod_set.all(): diff --git a/chrono/manager/views.py b/chrono/manager/views.py index e587081..89e2079 100644 --- a/chrono/manager/views.py +++ b/chrono/manager/views.py @@ -582,6 +582,7 @@ class AgendaAddView(CreateView): if self.object.kind == 'meetings': default_desk = Desk(agenda=self.object, label=_('Desk 1')) default_desk.save() + default_desk.import_timeperiod_exceptions_from_settings(enable=True) return model_form def get_success_url(self): @@ -1797,6 +1798,11 @@ class AgendaAddDesk(ManagedAgendaMixin, CreateView): model = Desk form_class = NewDeskForm + def form_valid(self, form): + self.object = form.save() + self.object.import_timeperiod_exceptions_from_settings(enable=True) + return HttpResponseRedirect(self.get_success_url()) + agenda_add_desk = AgendaAddDesk.as_view() diff --git a/tests/test_agendas.py b/tests/test_agendas.py index 4a781df..c25c527 100644 --- a/tests/test_agendas.py +++ b/tests/test_agendas.py @@ -525,8 +525,8 @@ def test_timeperiodexception_from_settings(): agenda.save() desk = Desk(label='Test 1 desk', agenda=agenda) desk.save() + desk.import_timeperiod_exceptions_from_settings(enable=True) - # first save automatically load exceptions source = TimePeriodExceptionSource.objects.get(desk=desk) assert source.settings_slug == 'holidays' assert source.enabled @@ -555,21 +555,23 @@ def test_timeperiodexception_from_settings_command(): } agenda = Agenda(label=u'Test 1 agenda') agenda.save() + desk1 = Desk(label='Test 1 desk', agenda=agenda) desk1.save() + assert not TimePeriodExceptionSource.objects.filter(desk=desk1).exists() + with override_settings(**setting): desk2 = Desk(label='Test 2 desk', agenda=agenda) desk2.save() + desk2.import_timeperiod_exceptions_from_settings(enable=True) desk3 = Desk(label='Test 3 desk', agenda=agenda) desk3.save() - source3 = TimePeriodExceptionSource.objects.get(desk=desk3) - source3.disable() - + desk3.import_timeperiod_exceptions_from_settings(enable=False) call_command('sync_desks_timeperiod_exceptions_from_settings') assert not TimePeriodExceptionSource.objects.get(desk=desk1).enabled source2 = TimePeriodExceptionSource.objects.get(desk=desk2) assert source2.enabled - source3.refresh_from_db() + source3 = TimePeriodExceptionSource.objects.get(desk=desk3) assert not source3.enabled exceptions_count = source2.timeperiodexception_set.count() @@ -997,6 +999,7 @@ def test_desk_duplicate_exception_sources(): def test_desk_duplicate_exception_source_from_settings(): agenda = Agenda.objects.create(label='Agenda') desk = Desk.objects.create(label='Desk', agenda=agenda) + desk.import_timeperiod_exceptions_from_settings(enable=True) source = desk.timeperiodexceptionsource_set.get(settings_slug='holidays') assert source.enabled diff --git a/tests/test_manager.py b/tests/test_manager.py index 9a5b929..313926d 100644 --- a/tests/test_manager.py +++ b/tests/test_manager.py @@ -872,6 +872,39 @@ def test_add_agenda(app, admin_user): assert agenda.maximal_booking_delay == 56 +@override_settings( + EXCEPTIONS_SOURCES={'holidays': {'class': 'workalendar.europe.France', 'label': 'Holidays'},} +) +def test_add_agenda_exceptions_from_settings(app, admin_user): + app = login(app) + resp = app.get('/manage/', status=200) + resp = resp.click('New') + resp.form['label'] = 'Foo bar' + resp.form['kind'] = 'meetings' + resp = resp.form.submit().follow() + + agenda = Agenda.objects.get(label='Foo bar') + assert agenda.desk_set.count() == 1 + + default_desk = agenda.desk_set.first() + assert default_desk.timeperiodexception_set.exists() + assert default_desk.timeperiodexceptionsource_set.count() == 1 + + source = default_desk.timeperiodexceptionsource_set.first() + assert source.enabled + + resp = resp.click('New Desk') + resp.form['label'] = 'Desk A' + resp = resp.form.submit().follow() + + desk = Desk.objects.get(slug='desk-a') + assert desk.timeperiodexception_set.exists() + assert desk.timeperiodexceptionsource_set.count() == 1 + + source = desk.timeperiodexceptionsource_set.first() + assert source.enabled + + def test_add_agenda_as_manager(app, manager_user): # open /manage/ access to manager_user, and check agenda creation is not # allowed. @@ -2676,6 +2709,7 @@ END:VCALENDAR""" def test_meetings_agenda_time_period_exception_source_from_settings(app, admin_user): agenda = Agenda.objects.create(label='Foo bar', kind='meetings') desk = Desk.objects.create(agenda=agenda, label='Desk A') + desk.import_timeperiod_exceptions_from_settings(enable=True) MeetingType(agenda=agenda, label='Blah').save() TimePeriod.objects.create( weekday=1, desk=desk, start_time=datetime.time(10, 0), end_time=datetime.time(12, 0) @@ -2725,10 +2759,11 @@ def test_meetings_agenda_time_period_exception_source_try_disable_ics(app, admin @override_settings( EXCEPTIONS_SOURCES={'holidays': {'class': 'workalendar.europe.France', 'label': 'Holidays'},} ) -def test_meetings_agenda_time_period_exception_source_external(app, admin_user, freezer): +def test_meetings_agenda_time_period_exception_source_from_settings(app, admin_user, freezer): freezer.move_to('2020-01-01') agenda = Agenda.objects.create(label='Foo bar', kind='meetings') desk = Desk.objects.create(agenda=agenda, label='Desk A') + desk.import_timeperiod_exceptions_from_settings(enable=True) MeetingType(agenda=agenda, label='Blah').save() TimePeriod.objects.create( weekday=1, desk=desk, start_time=datetime.time(10, 0), end_time=datetime.time(12, 0) -- 2.20.1