From b5095958fcacf92ebe6267b70826645b75abe57c Mon Sep 17 00:00:00 2001 From: Serghei Mihai Date: Thu, 30 Aug 2018 13:40:08 +0200 Subject: [PATCH] manager: allow timeperiod exceptions with the same summary (#25962) --- chrono/agendas/models.py | 18 ++++++++++-------- tests/test_agendas.py | 6 +++--- tests/test_manager.py | 10 ++++++++-- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/chrono/agendas/models.py b/chrono/agendas/models.py index 16a2f06..16d0495 100644 --- a/chrono/agendas/models.py +++ b/chrono/agendas/models.py @@ -526,17 +526,19 @@ class Desk(models.Model): event['end_datetime'] = end_dt event['label'] = summary - kwargs = {} - kwargs['desk'] = self + kwargs = {'desk': self} if keep_synced_by_uid: + # event from remote ics kwargs['external_id'] = vevent.contents['uid'][0].value - else: - kwargs['label'] = summary if not vevent.rruleset: - # classical event - obj, created = TimePeriodException.objects.update_or_create(defaults=event, **kwargs) - if created: + if keep_synced_by_uid: + obj, created = TimePeriodException.objects.update_or_create(defaults=event, **kwargs) + if created: + total_created += 1 + # event from local ics file + else: + TimePeriodException.objects.create(desk=self, **event) total_created += 1 else: # recurring event until recurring_days in the future @@ -557,7 +559,7 @@ class Desk(models.Model): if end_dt < update_datetime: TimePeriodException.objects.filter(**kwargs).update(**event) else: - obj, created = TimePeriodException.objects.update_or_create(defaults=event, **kwargs) + obj, created = TimePeriodException.objects.update_or_create(defaults=event, label=summary, **kwargs) if created: total_created += 1 # delete unseen occurrences diff --git a/tests/test_agendas.py b/tests/test_agendas.py index 4b31e17..4c5a885 100644 --- a/tests/test_agendas.py +++ b/tests/test_agendas.py @@ -243,10 +243,10 @@ def test_timeperiodexception_creation_from_ics_with_recurrences(): assert TimePeriodException.objects.filter(desk=desk).count() == 3 assert set(TimePeriodException.objects.values_list('start_datetime', flat=True)) == set([ make_aware(datetime.datetime(2018, 1, 1)), make_aware(datetime.datetime(2019, 1, 1))]) - assert desk.create_timeperiod_exceptions_from_ics(ICS_SAMPLE_WITH_RECURRENT_EVENT) == 0 + assert desk.create_timeperiod_exceptions_from_ics(ICS_SAMPLE_WITH_RECURRENT_EVENT) == 1 # verify occurences are cleaned when count changed - assert desk.create_timeperiod_exceptions_from_ics(ICS_SAMPLE_WITH_RECURRENT_EVENT_2) == 0 - assert TimePeriodException.objects.filter(desk=desk).count() == 2 + assert desk.create_timeperiod_exceptions_from_ics(ICS_SAMPLE_WITH_RECURRENT_EVENT_2) == 1 + assert TimePeriodException.objects.filter(desk=desk).count() == 4 assert set(TimePeriodException.objects.values_list('start_datetime', flat=True)) == set([ make_aware(datetime.datetime(2018, 1, 1)), make_aware(datetime.datetime(2018, 1, 2))]) diff --git a/tests/test_manager.py b/tests/test_manager.py index 7f3c863..135f7a4 100644 --- a/tests/test_manager.py +++ b/tests/test_manager.py @@ -987,15 +987,21 @@ DTSTART:20180101 DTEND:20180101 SUMMARY:New Year's Eve END:VEVENT +BEGIN:VEVENT +DTSTART:20190101 +DTEND:20190101 +SUMMARY:New Year's Eve +END:VEVENT END:VCALENDAR""" resp = app.get('/manage/agendas/%d/' % agenda.pk).follow() resp = resp.click('Settings') resp = resp.click('upload') resp.form['ics_file'] = Upload('exceptions.ics', ics_with_exceptions, 'text/calendar') resp = resp.form.submit(status=302) - assert TimePeriodException.objects.filter(desk=desk).count() == 1 + assert TimePeriodException.objects.filter(desk=desk).count() == 2 + assert TimePeriodException.objects.filter(desk=desk, label="New Year's Eve").count() == 2 resp = resp.follow() - assert 'An exception has been imported.' in resp.text + assert '2 exceptions have been imported.' in resp.text @pytest.mark.freeze_time('2017-12-01') -- 2.19.0.rc1