Projet

Général

Profil

0003-manager-allow-timeperiod-exceptions-with-the-same-su.patch

Serghei Mihai, 05 septembre 2018 12:23

Télécharger (7,37 ko)

Voir les différences:

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(-)
chrono/agendas/models.py
521 521
                        end_dt = make_aware(datetime.datetime.combine(start_dt, datetime.datetime.max.time()))
522 522
                        duration = end_dt - start_dt
523 523

  
524
                event = {}
525
                event['start_datetime'] = start_dt
526
                event['end_datetime'] = end_dt
527
                event['label'] = summary
524
                event = {'label': summary}
528 525

  
529
                kwargs = {}
530
                kwargs['desk'] = self
526
                kwargs = {'desk': self, 'start_datetime': start_dt,
527
                          'end_datetime': end_dt}
531 528
                if keep_synced_by_uid:
529
                    # event from remote ics
532 530
                    kwargs['external_id'] = vevent.contents['uid'][0].value
533
                else:
534
                    kwargs['label'] = summary
535 531

  
536 532
                if not vevent.rruleset:
537 533
                    # classical event
......
552 548
                            start_dt = make_aware(start_dt)
553 549
                        end_dt = start_dt + duration
554 550
                        kwargs['recurrence_id'] = i
555
                        event['start_datetime'] = start_dt
556
                        event['end_datetime'] = end_dt
551
                        kwargs['start_datetime'] = start_dt
552
                        kwargs['end_datetime'] = end_dt
557 553
                        if end_dt < update_datetime:
558 554
                            TimePeriodException.objects.filter(**kwargs).update(**event)
559 555
                        else:
tests/test_agendas.py
26 26
SUMMARY:Event 1
27 27
END:VEVENT
28 28
BEGIN:VEVENT
29
DTSTAMP:20170824T092855Z
30
UID:950c3ff889d2465dd5d648c4c2194232c0a565f4
31
DTSTART:20170830T180800Z
32
DTEND:20170831T223400Z
33
SEQUENCE:2
29
DTSTAMP:20180824T082855Z
30
UID:8c4c219889d244232c0a565f4950c3ff65dd5d64
31
DTSTART:20170831T170800Z
32
DTEND:20180831T203400Z
33
SEQUENCE:1
34
SUMMARY:Event 2
34 35
END:VEVENT
35 36
END:VCALENDAR"""
36 37

  
......
198 199
    exceptions_count = desk.create_timeperiod_exceptions_from_ics(ICS_SAMPLE)
199 200
    assert exceptions_count == 2
200 201
    assert TimePeriodException.objects.filter(desk=desk).count() == 2
202
    exceptions_count = desk.create_timeperiod_exceptions_from_ics(ICS_SAMPLE)
203
    assert exceptions_count == 0
204
    assert TimePeriodException.objects.filter(desk=desk).count() == 2
205
    assert set(TimePeriodException.objects.values_list('label', flat=True)) == set(['Event 1', 'Event 2'])
206
    exceptions_count = desk.create_timeperiod_exceptions_from_ics(ICS_SAMPLE.replace('Event 2', 'Event 3'))
207
    assert exceptions_count == 0
208
    assert TimePeriodException.objects.filter(desk=desk).count() == 2
209
    assert set(TimePeriodException.objects.values_list('label', flat=True)) == set(['Event 1', 'Event 3'])
201 210

  
202 211
def test_timeperiodexception_creation_from_ics_without_startdt():
203 212
    agenda = Agenda(label=u'Test 2 agenda')
......
239 248
    agenda.save()
240 249
    desk = Desk(label='Test 4 desk', agenda=agenda)
241 250
    desk.save()
242
    assert desk.create_timeperiod_exceptions_from_ics(ICS_SAMPLE_WITH_RECURRENT_EVENT) == 3
243
    assert TimePeriodException.objects.filter(desk=desk).count() == 3
251
    assert desk.create_timeperiod_exceptions_from_ics(ICS_SAMPLE_WITH_RECURRENT_EVENT) == 2
252
    assert TimePeriodException.objects.filter(desk=desk).count() == 2
253
    assert set(TimePeriodException.objects.values_list('label', 'recurrence_id')) == set([('New Year\'s Eve', 0), ('New Year\'s Eve', 1)])
244 254
    assert set(TimePeriodException.objects.values_list('start_datetime', flat=True)) == set([
245 255
        make_aware(datetime.datetime(2018, 1, 1)), make_aware(datetime.datetime(2019, 1, 1))])
246
    assert desk.create_timeperiod_exceptions_from_ics(ICS_SAMPLE_WITH_RECURRENT_EVENT) == 0
256
    assert desk.create_timeperiod_exceptions_from_ics(ICS_SAMPLE_WITH_RECURRENT_EVENT.replace('SUMMARY:New Year\'s Eve', 'SUMMARY:Nouvel An')) == 0
257
    assert set(TimePeriodException.objects.values_list('label', flat=True)) == set(['Nouvel An'])
247 258
    # verify occurences are cleaned when count changed
248
    assert desk.create_timeperiod_exceptions_from_ics(ICS_SAMPLE_WITH_RECURRENT_EVENT_2) == 0
249
    assert TimePeriodException.objects.filter(desk=desk).count() == 2
259
    assert desk.create_timeperiod_exceptions_from_ics(ICS_SAMPLE_WITH_RECURRENT_EVENT_2) == 1
260
    assert TimePeriodException.objects.filter(desk=desk).count() == 3
250 261
    assert set(TimePeriodException.objects.values_list('start_datetime', flat=True)) == set([
251
        make_aware(datetime.datetime(2018, 1, 1)), make_aware(datetime.datetime(2018, 1, 2))])
252

  
253
def test_timeexception_creation_from_ics_with_dates():
254
    agenda = Agenda(label=u'Test 5 agenda')
255
    agenda.save()
256
    desk = Desk(label='Test 5 desk', agenda=agenda)
257
    desk.save()
258
    lines = []
259
    # remove end datetimes from ics
260
    for line in ICS_SAMPLE_WITH_RECURRENT_EVENT.splitlines():
261
        if line.startswith('RRULE:'):
262
            continue
263
        lines.append(line)
264
    ics_sample = "\n".join(lines)
265
    exceptions_count = desk.create_timeperiod_exceptions_from_ics(ics_sample)
266
    assert exceptions_count == 2
267
    for exception in TimePeriodException.objects.filter(desk=desk):
268
        assert localtime(exception.start_datetime) == make_aware(datetime.datetime(2018, 1, 1, 0, 0))
269
        assert localtime(exception.end_datetime) == make_aware(datetime.datetime(2018, 1, 1, 0, 0))
262
        make_aware(datetime.datetime(2018, 1, 1)), make_aware(datetime.datetime(2018, 1, 2)), make_aware(datetime.datetime(2019, 1, 1))])
270 263

  
271 264
def test_timeexception_create_from_invalid_ics():
272 265
    agenda = Agenda(label=u'Test 6 agenda')
tests/test_manager.py
987 987
DTEND:20180101
988 988
SUMMARY:New Year's Eve
989 989
END:VEVENT
990
BEGIN:VEVENT
991
DTSTART:20190101
992
DTEND:20190101
993
SUMMARY:New Year's Eve
994
END:VEVENT
990 995
END:VCALENDAR"""
991 996
    resp = app.get('/manage/agendas/%d/' % agenda.pk).follow()
992 997
    resp = resp.click('Settings')
993 998
    resp = resp.click('upload')
994 999
    resp.form['ics_file'] = Upload('exceptions.ics', ics_with_exceptions, 'text/calendar')
995 1000
    resp = resp.form.submit(status=302)
996
    assert TimePeriodException.objects.filter(desk=desk).count() == 1
1001
    assert TimePeriodException.objects.filter(desk=desk).count() == 2
1002
    assert TimePeriodException.objects.filter(desk=desk, label="New Year's Eve").count() == 2
997 1003
    resp = resp.follow()
998
    assert 'An exception has been imported.' in resp.text
1004
    assert '2 exceptions have been imported.' in resp.text
999 1005

  
1000 1006

  
1001 1007
@pytest.mark.freeze_time('2017-12-01')
1002
-