Projet

Général

Profil

0001-api-add-event-deletion-59792.patch

Valentin Deniaud, 22 décembre 2021 15:13

Télécharger (4,48 ko)

Voir les différences:

Subject: [PATCH] api: add event deletion (#59792)

 chrono/api/views.py     | 15 +++++++++
 tests/api/test_event.py | 72 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 87 insertions(+)
chrono/api/views.py
2197 2197
            event = serializer.save()
2198 2198
        return Response({'err': 0, 'data': get_event_detail(request, event)})
2199 2199

  
2200
    def delete(self, request, agenda_identifier, event_identifier):
2201
        event = self.get_object(agenda_identifier, event_identifier)
2202

  
2203
        cannot_delete = bool(
2204
            event.booking_set.filter(cancellation_datetime__isnull=True).exists()
2205
            and event.start_datetime > now()
2206
            or event.has_recurrences_booked()
2207
        )
2208

  
2209
        if cannot_delete:
2210
            raise APIError(_('This cannot be removed as there are bookings for a future date.'))
2211

  
2212
        event.delete()
2213
        return Response({'err': 0})
2214

  
2200 2215

  
2201 2216
events = Events.as_view()
2202 2217

  
tests/api/test_event.py
517 517
    assert not resp.json['err']
518 518
    event = Event.objects.filter(agenda=agenda).get(slug=event.slug)
519 519
    assert event.recurrences.count() == 5
520

  
521

  
522
@pytest.mark.freeze_time('2021-11-01 10:00')
523
def test_delete_event(app, user):
524
    agenda = Agenda.objects.create(label='Foo bar', kind='events')
525
    event = Event.objects.create(
526
        slug='event', start_datetime=now() + datetime.timedelta(days=5), places=1, agenda=agenda
527
    )
528

  
529
    # no authentication
530
    resp = app.delete('/api/agenda/%s/event/%s/' % (agenda.slug, event.slug), status=401)
531
    assert Event.objects.count() == 1
532

  
533
    app.authorization = ('Basic', ('john.doe', 'password'))
534
    resp = app.delete('/api/agenda/%s/event/%s/' % (agenda.slug, event.slug))
535
    assert resp.json['err'] == 0
536
    assert not Event.objects.exists()
537

  
538

  
539
@pytest.mark.freeze_time('2021-11-01 10:00')
540
def test_delete_event_forbidden(app, user, freezer):
541
    agenda = Agenda.objects.create(label='Foo bar', kind='events')
542
    event = Event.objects.create(
543
        slug='event', start_datetime=now() + datetime.timedelta(days=5), places=1, agenda=agenda
544
    )
545
    booking = Booking.objects.create(event=event)
546

  
547
    app.authorization = ('Basic', ('john.doe', 'password'))
548
    resp = app.delete('/api/agenda/%s/event/%s/' % (agenda.slug, event.slug))
549
    assert resp.json['err'] == 1
550
    assert 'This cannot be removed' in resp.json['err_desc']
551

  
552
    freezer.move_to('2021-11-10 10:00')
553
    resp = app.delete('/api/agenda/%s/event/%s/' % (agenda.slug, event.slug))
554
    assert resp.json['err'] == 0
555
    assert not Event.objects.exists()
556

  
557
    event = Event.objects.create(
558
        slug='event', start_datetime=now() + datetime.timedelta(days=5), places=1, agenda=agenda
559
    )
560
    booking = Booking.objects.create(event=event)
561

  
562
    resp = app.delete('/api/agenda/%s/event/%s/' % (agenda.slug, event.slug))
563
    assert resp.json['err'] == 1
564

  
565
    booking.cancellation_datetime = now()
566
    booking.save()
567
    resp = app.delete('/api/agenda/%s/event/%s/' % (agenda.slug, event.slug))
568
    assert resp.json['err'] == 0
569
    assert not Event.objects.exists()
570

  
571

  
572
@pytest.mark.freeze_time('2021-11-01 10:00')
573
def test_delete_recurring_event_forbidden(app, user):
574
    agenda = Agenda.objects.create(label='Foo bar', kind='events')
575
    start_datetime = now() + datetime.timedelta(days=10)
576
    event = Event.objects.create(
577
        start_datetime=start_datetime, places=10, agenda=agenda, recurrence_days=[start_datetime.weekday()]
578
    )
579
    event_recurrence = event.get_or_create_event_recurrence(event.start_datetime)
580
    booking = Booking.objects.create(event=event_recurrence)
581

  
582
    app.authorization = ('Basic', ('john.doe', 'password'))
583
    resp = app.delete('/api/agenda/%s/event/%s/' % (agenda.slug, event.slug))
584
    assert resp.json['err'] == 1
585
    assert 'This cannot be removed' in resp.json['err_desc']
586

  
587
    booking.cancellation_datetime = now()
588
    booking.save()
589
    resp = app.delete('/api/agenda/%s/event/%s/' % (agenda.slug, event.slug))
590
    assert resp.json['err'] == 0
591
    assert not Event.objects.exists()
520
-