Projet

Général

Profil

0001-agendas-fix-import-with-duplicated-exceptins-48615.patch

Lauréline Guérin, 24 novembre 2020 14:27

Télécharger (5,73 ko)

Voir les différences:

Subject: [PATCH] agendas: fix import with duplicated exceptins (#48615)

 chrono/agendas/models.py    | 28 ++++++++++------------------
 tests/test_import_export.py | 22 +++++++++++++++++++++-
 2 files changed, 31 insertions(+), 19 deletions(-)
chrono/agendas/models.py
614 614
    @classmethod
615 615
    def import_json(cls, data):
616 616
        data = clean_import_data(cls, data)
617
        timeperiod, _ = cls.objects.update_or_create(defaults=data, **data)
618
        return timeperiod
617
        cls.objects.update_or_create(defaults=data, **data)
619 618

  
620 619
    def export_json(self):
621 620
        return {
......
786 785
    @classmethod
787 786
    def import_json(cls, data):
788 787
        data = clean_import_data(cls, data)
789
        meeting_type, created = cls.objects.update_or_create(
790
            slug=data['slug'], agenda=data['agenda'], defaults=data
791
        )
792
        return meeting_type
788
        cls.objects.update_or_create(slug=data['slug'], agenda=data['agenda'], defaults=data)
793 789

  
794 790
    def export_json(self):
795 791
        return {
......
977 973
        )
978 974
        data = clean_import_data(cls, data)
979 975
        if data.get('slug'):
980
            event, created = cls.objects.update_or_create(slug=data['slug'], defaults=data)
981
            return event
976
            cls.objects.update_or_create(slug=data['slug'], defaults=data)
977
            return
982 978
        event = cls(**data)
983 979
        event.save()
984
        return event
985 980

  
986 981
    def export_json(self):
987 982
        return {
......
1171 1166
                raise AgendaImportError(_('The unavailability calendar "%s" does not exist.') % slug)
1172 1167
            desk.unavailability_calendars.add(target_calendar)
1173 1168

  
1174
        return desk
1175

  
1176 1169
    def export_json(self):
1177 1170
        time_period_exceptions = self.timeperiodexception_set.filter(source__settings_slug__isnull=True)
1178 1171
        time_period_exception_sources = self.timeperiodexceptionsource_set.filter(settings_slug__isnull=False)
......
1514 1507
        source, _ = cls.objects.update_or_create(**data)
1515 1508
        if source.enabled:
1516 1509
            source.enable()
1517
        return source
1518 1510

  
1519 1511
    def export_json(self):
1520 1512
        '''Export only sources from settings.'''
......
1695 1687
        data = clean_import_data(cls, data)
1696 1688
        query_data = data.copy()
1697 1689
        query_data.pop('update_datetime')
1698
        exception, _ = cls.objects.update_or_create(defaults=data, **query_data)
1699
        return exception
1690
        try:
1691
            cls.objects.update_or_create(defaults=data, **query_data)
1692
        except cls.MultipleObjectsReturned:
1693
            cls.objects.filter(**query_data).update(update_datetime=data['update_datetime'])
1700 1694

  
1701 1695
    def export_json(self):
1702 1696
        def export_datetime(dt):
......
1847 1841
    def import_json(cls, data):
1848 1842
        data = clean_import_data(cls, data)
1849 1843
        agenda = data.pop('agenda')
1850
        notification_settings, created = cls.objects.update_or_create(agenda=agenda, defaults=data)
1851
        return notification_settings
1844
        cls.objects.update_or_create(agenda=agenda, defaults=data)
1852 1845

  
1853 1846
    def export_json(self):
1854 1847
        return {
......
1908 1901
    def import_json(cls, data):
1909 1902
        data = clean_import_data(cls, data)
1910 1903
        agenda = data.pop('agenda')
1911
        reminder_settings, created = cls.objects.update_or_create(agenda=agenda, defaults=data)
1912
        return reminder_settings
1904
        cls.objects.update_or_create(agenda=agenda, defaults=data)
1913 1905

  
1914 1906
    def export_json(self):
1915 1907
        return {
tests/test_import_export.py
578 578
    TimePeriod.objects.create(
579 579
        desk=desk, weekday=3, start_time=datetime.time(10, 0), end_time=datetime.time(11, 0)
580 580
    )
581
    TimePeriodException.objects.create(
581
    tpe1 = TimePeriodException.objects.create(
582 582
        desk=desk,
583 583
        start_datetime=make_aware(datetime.datetime(2017, 5, 22, 8, 0)),
584 584
        end_datetime=make_aware(datetime.datetime(2017, 5, 22, 12, 30)),
......
597 597
    assert TimePeriod.objects.count() == 2
598 598
    assert TimePeriodException.objects.count() == 2
599 599

  
600
    # duplicated exception
601
    output = get_output_of_command('export_site')
602
    payload = json.loads(output)
603
    assert len(payload['agendas'][0]['desks'][0]['exceptions']) == 2
604
    tpe2 = TimePeriodException.objects.create(
605
        desk=desk,
606
        start_datetime=make_aware(datetime.datetime(2017, 5, 22, 8, 0)),
607
        end_datetime=make_aware(datetime.datetime(2017, 5, 22, 12, 30)),
608
    )
609
    assert TimePeriod.objects.count() == 2
610
    assert TimePeriodException.objects.count() == 3
611
    assert tpe1.update_datetime < tpe2.update_datetime
612

  
613
    import_site(payload)
614
    assert TimePeriod.objects.count() == 2
615
    assert TimePeriodException.objects.count() == 3
616
    tpe1.refresh_from_db()
617
    tpe2.refresh_from_db()
618
    assert tpe1.update_datetime == tpe2.update_datetime
619

  
600 620

  
601 621
def test_import_export_unavailability_calendar(app):
602 622
    output = get_output_of_command('export_site')
603
-