Projet

Général

Profil

0003-manager-forbid-moving-event-end-recurrence-date-befo.patch

Valentin Deniaud, 17 février 2021 16:57

Télécharger (3,32 ko)

Voir les différences:

Subject: [PATCH 3/3] manager: forbid moving event end recurrence date before
 bookings (#51218)

 chrono/agendas/models.py | 6 ++++--
 chrono/manager/forms.py  | 7 +++++++
 tests/test_manager.py    | 9 +++++++++
 3 files changed, 20 insertions(+), 2 deletions(-)
chrono/agendas/models.py
1340 1340
            return None
1341 1341
        return rrule
1342 1342

  
1343
    def has_recurrences_booked(self):
1343
    def has_recurrences_booked(self, after=None):
1344 1344
        return Booking.objects.filter(
1345
            event__primary_event=self, event__start_datetime__gt=now(), cancellation_datetime__isnull=True
1345
            event__primary_event=self,
1346
            event__start_datetime__gt=after or now(),
1347
            cancellation_datetime__isnull=True,
1346 1348
        ).exists()
1347 1349

  
1348 1350
    def create_all_recurrences(self, excluded_datetimes=None):
chrono/manager/forms.py
212 212
                    'This field cannot be modified because some recurrences have bookings attached to them.'
213 213
                )
214 214

  
215
    def clean(self):
216
        super().clean()
217
        if 'recurrence_end_date' in self.changed_data and self.instance.has_recurrences_booked(
218
            after=self.cleaned_data['recurrence_end_date']
219
        ):
220
            raise ValidationError(_('Bookings exist after this date.'))
221

  
215 222
    def save(self, *args, **kwargs):
216 223
        with transaction.atomic():
217 224
            if any(field for field in self.changed_data if field in self.protected_fields):
tests/test_manager.py
1547 1547
    # old recurrences were deleted
1548 1548
    assert not Event.objects.filter(primary_event=event, start_datetime=now()).exists()
1549 1549

  
1550
    # editing recurrence_end_date is permitted as long as bookings are not impacted
1551
    event_recurrence = Event.objects.get(primary_event=event, start_datetime__day=15)
1552
    Booking.objects.create(event=event_recurrence)
1550 1553
    resp = app.get('/manage/agendas/%s/events/%s/edit' % (agenda.id, event.id))
1551 1554
    resp.form['recurrence_end_date'] = (localtime() + datetime.timedelta(days=6)).strftime('%Y-%m-%d')
1552 1555
    resp = resp.form.submit()
......
1557 1560
    resp = resp.form.submit()
1558 1561
    assert Event.objects.filter(primary_event=event).count() == 4
1559 1562

  
1563
    resp = app.get('/manage/agendas/%s/events/%s/edit' % (agenda.id, event.id))
1564
    resp.form['recurrence_end_date'] = (localtime() + datetime.timedelta(days=2)).strftime('%Y-%m-%d')
1565
    resp = resp.form.submit()
1566
    assert Event.objects.filter(primary_event=event).count() == 4
1567
    assert 'Bookings exist after this date' in resp.text
1568

  
1560 1569

  
1561 1570
def test_booked_places(app, admin_user):
1562 1571
    agenda = Agenda(label=u'Foo bar')
1563
-