From e0cf2cf77e56545066bdfbec1533c594e08b8c78 Mon Sep 17 00:00:00 2001 From: Valentin Deniaud Date: Thu, 22 Oct 2020 11:58:55 +0200 Subject: [PATCH 1/3] agendas: set proper exception source when duplicating (#47916) --- chrono/agendas/models.py | 9 +++++++-- tests/test_agendas.py | 21 +++++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/chrono/agendas/models.py b/chrono/agendas/models.py index b8c2baf..f9c46d6 100644 --- a/chrono/agendas/models.py +++ b/chrono/agendas/models.py @@ -1184,7 +1184,7 @@ class Desk(models.Model): # clone related objects for time_period in self.timeperiod_set.all(): time_period.duplicate(desk_target=new_desk) - for time_period_exception in self.timeperiodexception_set.all(): + for time_period_exception in self.timeperiodexception_set.filter(source__isnull=True): time_period_exception.duplicate(desk_target=new_desk) for time_period_exception_source in self.timeperiodexceptionsource_set.all(): time_period_exception_source.duplicate(desk_target=new_desk) @@ -1451,6 +1451,9 @@ class TimePeriodExceptionSource(models.Model): new_source.ics_file.save(self.ics_filename, ics_file, save=False) # store new source new_source.save() + # clone related objects + for time_period_exception in self.timeperiodexception_set.all(): + time_period_exception.duplicate(desk_target=desk_target, source_target=new_source) return new_source @@ -1620,12 +1623,14 @@ class TimePeriodException(models.Model): 'update_datetime': export_datetime(self.update_datetime), } - def duplicate(self, desk_target=None): + def duplicate(self, desk_target=None, source_target=None): # clone current exception new_exception = copy.deepcopy(self) new_exception.pk = None # set desk new_exception.desk = desk_target or self.desk + # set source + new_exception.source = source_target or self.source # store new exception new_exception.save() diff --git a/tests/test_agendas.py b/tests/test_agendas.py index 1dfde6d..15e525f 100644 --- a/tests/test_agendas.py +++ b/tests/test_agendas.py @@ -970,6 +970,27 @@ def test_desk_duplicate(): assert new_desk.slug == 'new-desk-1' +def test_desk_duplicate_exception_sources(): + agenda = Agenda.objects.create(label='Agenda') + desk = Desk.objects.create(label='Desk', agenda=agenda) + exceptions_count = desk.import_timeperiod_exceptions_from_ics_file( + ContentFile(ICS_SAMPLE, name='sample.ics') + ) + source = desk.timeperiodexceptionsource_set.get(ics_filename='sample.ics') + assert exceptions_count == 2 + assert TimePeriodException.objects.filter(desk=desk).count() == 2 + + new_desk = desk.duplicate(label="New Desk") + new_source = new_desk.timeperiodexceptionsource_set.get(ics_filename='sample.ics') + assert new_desk.timeperiodexception_set.count() == exceptions_count + + source.delete() + assert new_desk.timeperiodexception_set.count() == exceptions_count + + new_source.delete() + assert not new_desk.timeperiodexception_set.exists() + + def test_agenda_meetings_duplicate(): group = Group(name=u'Group') group.save() -- 2.20.1