From 6ed2ece0d5299b3013454e64195151e532d3210e Mon Sep 17 00:00:00 2001 From: Serghei Mihai Date: Thu, 30 Aug 2018 13:40:08 +0200 Subject: [PATCH 3/3] manager: allow timeperiod exceptions with the same summary (#25962) --- chrono/agendas/models.py | 16 +++++-------- tests/test_agendas.py | 51 +++++++++++++++++----------------------- tests/test_manager.py | 10 ++++++-- 3 files changed, 36 insertions(+), 41 deletions(-) diff --git a/chrono/agendas/models.py b/chrono/agendas/models.py index 16a2f06..c2cc2e0 100644 --- a/chrono/agendas/models.py +++ b/chrono/agendas/models.py @@ -521,17 +521,13 @@ class Desk(models.Model): end_dt = make_aware(datetime.datetime.combine(start_dt, datetime.datetime.max.time())) duration = end_dt - start_dt - event = {} - event['start_datetime'] = start_dt - event['end_datetime'] = end_dt - event['label'] = summary + event = {'label': summary} - kwargs = {} - kwargs['desk'] = self + kwargs = {'desk': self, 'start_datetime': start_dt, + 'end_datetime': end_dt} 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 @@ -552,8 +548,8 @@ class Desk(models.Model): start_dt = make_aware(start_dt) end_dt = start_dt + duration kwargs['recurrence_id'] = i - event['start_datetime'] = start_dt - event['end_datetime'] = end_dt + kwargs['start_datetime'] = start_dt + kwargs['end_datetime'] = end_dt if end_dt < update_datetime: TimePeriodException.objects.filter(**kwargs).update(**event) else: diff --git a/tests/test_agendas.py b/tests/test_agendas.py index 4b31e17..13d6dcf 100644 --- a/tests/test_agendas.py +++ b/tests/test_agendas.py @@ -26,11 +26,12 @@ SEQUENCE:1 SUMMARY:Event 1 END:VEVENT BEGIN:VEVENT -DTSTAMP:20170824T092855Z -UID:950c3ff889d2465dd5d648c4c2194232c0a565f4 -DTSTART:20170830T180800Z -DTEND:20170831T223400Z -SEQUENCE:2 +DTSTAMP:20180824T082855Z +UID:8c4c219889d244232c0a565f4950c3ff65dd5d64 +DTSTART:20170831T170800Z +DTEND:20180831T203400Z +SEQUENCE:1 +SUMMARY:Event 2 END:VEVENT END:VCALENDAR""" @@ -198,6 +199,14 @@ def test_timeperiodexception_creation_from_ics(): exceptions_count = desk.create_timeperiod_exceptions_from_ics(ICS_SAMPLE) assert exceptions_count == 2 assert TimePeriodException.objects.filter(desk=desk).count() == 2 + exceptions_count = desk.create_timeperiod_exceptions_from_ics(ICS_SAMPLE) + assert exceptions_count == 0 + assert TimePeriodException.objects.filter(desk=desk).count() == 2 + assert set(TimePeriodException.objects.values_list('label', flat=True)) == set(['Event 1', 'Event 2']) + exceptions_count = desk.create_timeperiod_exceptions_from_ics(ICS_SAMPLE.replace('Event 2', 'Event 3')) + assert exceptions_count == 0 + assert TimePeriodException.objects.filter(desk=desk).count() == 2 + assert set(TimePeriodException.objects.values_list('label', flat=True)) == set(['Event 1', 'Event 3']) def test_timeperiodexception_creation_from_ics_without_startdt(): agenda = Agenda(label=u'Test 2 agenda') @@ -239,34 +248,18 @@ def test_timeperiodexception_creation_from_ics_with_recurrences(): agenda.save() desk = Desk(label='Test 4 desk', agenda=agenda) desk.save() - assert desk.create_timeperiod_exceptions_from_ics(ICS_SAMPLE_WITH_RECURRENT_EVENT) == 3 - assert TimePeriodException.objects.filter(desk=desk).count() == 3 + assert desk.create_timeperiod_exceptions_from_ics(ICS_SAMPLE_WITH_RECURRENT_EVENT) == 2 + assert TimePeriodException.objects.filter(desk=desk).count() == 2 + assert set(TimePeriodException.objects.values_list('label', 'recurrence_id')) == set([('New Year\'s Eve', 0), ('New Year\'s Eve', 1)]) 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.replace('SUMMARY:New Year\'s Eve', 'SUMMARY:Nouvel An')) == 0 + assert set(TimePeriodException.objects.values_list('label', flat=True)) == set(['Nouvel An']) # 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() == 3 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))]) - -def test_timeexception_creation_from_ics_with_dates(): - agenda = Agenda(label=u'Test 5 agenda') - agenda.save() - desk = Desk(label='Test 5 desk', agenda=agenda) - desk.save() - lines = [] - # remove end datetimes from ics - for line in ICS_SAMPLE_WITH_RECURRENT_EVENT.splitlines(): - if line.startswith('RRULE:'): - continue - lines.append(line) - ics_sample = "\n".join(lines) - exceptions_count = desk.create_timeperiod_exceptions_from_ics(ics_sample) - assert exceptions_count == 2 - for exception in TimePeriodException.objects.filter(desk=desk): - assert localtime(exception.start_datetime) == make_aware(datetime.datetime(2018, 1, 1, 0, 0)) - assert localtime(exception.end_datetime) == make_aware(datetime.datetime(2018, 1, 1, 0, 0)) + make_aware(datetime.datetime(2018, 1, 1)), make_aware(datetime.datetime(2018, 1, 2)), make_aware(datetime.datetime(2019, 1, 1))]) def test_timeexception_create_from_invalid_ics(): agenda = Agenda(label=u'Test 6 agenda') diff --git a/tests/test_manager.py b/tests/test_manager.py index a47c73e..210d91d 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.rc2