Projet

Général

Profil

0001-agendas-take-care-of-primary-event-when-duplicating-.patch

Emmanuel Cazenave, 01 juillet 2021 16:48

Télécharger (3,51 ko)

Voir les différences:

Subject: [PATCH] agendas: take care of primary event when duplicating
 recurring events (#55301)

 chrono/agendas/models.py | 14 ++++++++++++--
 tests/test_agendas.py    | 24 ++++++++++++++++++++++++
 2 files changed, 36 insertions(+), 2 deletions(-)
chrono/agendas/models.py
517 517
            for desk in self.desk_set.all():
518 518
                desk.duplicate(agenda_target=new_agenda)
519 519
            new_agenda.resources.set(self.resources.all())
520

  
520 521
        elif self.kind == 'events':
521
            for event in self.event_set.all():
522
            for event in self.event_set.filter(recurrence_days__isnull=True).filter(
523
                primary_event__isnull=True
524
            ):
522 525
                event.duplicate(agenda_target=new_agenda)
526
            for primary_event in self.event_set.filter(recurrence_days__isnull=False):
527
                dup_primary_event = primary_event.duplicate(agenda_target=new_agenda)
528
                for child_event in self.event_set.filter(primary_event=primary_event):
529
                    child_event.duplicate(agenda_target=new_agenda, primary_event=dup_primary_event)
530

  
523 531
        elif self.kind == 'virtual':
524 532
            for timeperiod in self.excluded_timeperiods.all():
525 533
                timeperiod.duplicate(agenda_target=new_agenda)
......
1537 1545
            'pricing': self.pricing,
1538 1546
        }
1539 1547

  
1540
    def duplicate(self, agenda_target=None):
1548
    def duplicate(self, agenda_target=None, primary_event=None):
1541 1549
        new_event = copy.deepcopy(self)
1542 1550
        new_event.pk = None
1543 1551
        if agenda_target:
1544 1552
            new_event.agenda = agenda_target
1545 1553
        else:
1546 1554
            new_event.slug = None
1555
        if primary_event:
1556
            new_event.primary_event = primary_event
1547 1557
        new_event.save()
1548 1558

  
1549 1559
        return new_event
tests/test_agendas.py
1366 1366
    assert new_event.start_datetime == event.start_datetime
1367 1367

  
1368 1368

  
1369
def test_agenda_events_recurrence_duplicate(freezer):
1370
    freezer.move_to('2021-01-06 12:00')  # Wednesday
1371
    now_ = now()
1372
    end = now_ + datetime.timedelta(days=15)
1373
    orig_agenda = Agenda.objects.create(label='Agenda', kind='events')
1374
    event = Event.objects.create(
1375
        agenda=orig_agenda,
1376
        start_datetime=now_,
1377
        recurrence_days=[now_.weekday()],
1378
        label='Event',
1379
        places=10,
1380
        recurrence_end_date=end,
1381
    )
1382
    event.create_all_recurrences()
1383
    dup_agenda = orig_agenda.duplicate()
1384

  
1385
    for agenda in (orig_agenda, dup_agenda):
1386
        assert agenda.event_set.count() == 4  # one recurring event, 3 real events
1387
        assert agenda.event_set.filter(recurrence_days__isnull=False).count() == 1
1388
        rec_event = agenda.event_set.filter(recurrence_days__isnull=False).first()
1389
        for event in agenda.event_set.filter(recurrence_days__isnull=True):
1390
            assert event.primary_event == rec_event
1391

  
1392

  
1369 1393
def test_agenda_virtual_duplicate():
1370 1394
    agenda1 = Agenda.objects.create(label=u'Agenda 1', kind='meetings')
1371 1395
    agenda2 = Agenda.objects.create(label=u'Agenda 2', kind='meetings')
1372
-