0001-agendas-take-care-of-primary-event-when-duplicating-.patch
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 |
- |