Projet

Général

Profil

0001-api-add-agenda-deletion-59127.patch

Valentin Deniaud, 09 décembre 2021 16:45

Télécharger (3,9 ko)

Voir les différences:

Subject: [PATCH] api: add agenda deletion (#59127)

 chrono/api/urls.py    |  2 +-
 chrono/api/views.py   | 23 ++++++++++++++++-------
 tests/api/test_all.py | 32 ++++++++++++++++++++++++++++++++
 3 files changed, 49 insertions(+), 8 deletions(-)
chrono/api/urls.py
28 28
        views.agendas_events_fillslots,
29 29
        name='api-agendas-events-fillslots',
30 30
    ),
31
    url(r'^agenda/(?P<agenda_identifier>[\w-]+)/$', views.agenda_detail),
31
    url(r'^agenda/(?P<agenda_identifier>[\w-]+)/$', views.agenda),
32 32
    url(r'^agenda/(?P<agenda_identifier>[\w-]+)/datetimes/$', views.datetimes, name='api-agenda-datetimes'),
33 33
    url(
34 34
        r'^agenda/(?P<agenda_identifier>[\w-]+)/fillslot/(?P<event_identifier>[\w:-]+)/$',
chrono/api/views.py
757 757
agendas = Agendas.as_view()
758 758

  
759 759

  
760
class AgendaDetail(APIView):
761
    """
762
    Retrieve an agenda instance.
763
    """
764

  
765
    permission_classes = ()
760
class AgendaAPI(APIView):
761
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
766 762

  
767 763
    def get(self, request, agenda_identifier):
768 764
        agenda = get_object_or_404(Agenda, slug=agenda_identifier)
769 765
        return Response({'data': get_agenda_detail(request, agenda, check_events=True)})
770 766

  
767
    def delete(self, request, agenda_identifier):
768
        agenda = get_object_or_404(Agenda, slug=agenda_identifier)
769

  
770
        has_bookings = Booking.objects.filter(
771
            event__agenda=agenda, event__start_datetime__gt=now(), cancellation_datetime__isnull=True
772
        ).exists()
773

  
774
        if has_bookings:
775
            raise APIError(_('This cannot be removed as there are bookings for a future date.'))
776

  
777
        agenda.delete()
778
        return Response({'err': 0})
779

  
771 780

  
772
agenda_detail = AgendaDetail.as_view()
781
agenda = AgendaAPI.as_view()
773 782

  
774 783

  
775 784
class Datetimes(APIView):
tests/api/test_all.py
10 10
    AbsenceReason,
11 11
    AbsenceReasonGroup,
12 12
    Agenda,
13
    Booking,
13 14
    Category,
14 15
    Desk,
15 16
    Event,
......
525 526
    }
526 527

  
527 528

  
529
def test_agenda_api_delete(app, user):
530
    agenda = Agenda.objects.create(label='Foo bar', kind='events')
531

  
532
    # unauthenticated
533
    resp = app.delete('/api/agenda/%s/' % agenda.slug, status=401)
534
    assert Agenda.objects.count() == 1
535

  
536
    app.authorization = ('Basic', ('john.doe', 'password'))
537
    resp = app.delete('/api/agenda/%s/' % agenda.slug)
538
    assert resp.json['err'] == 0
539
    assert not Agenda.objects.exists()
540

  
541

  
542
def test_agenda_api_delete_busy(app, user):
543
    agenda = Agenda.objects.create(label='Foo bar', kind='events')
544
    Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
545
    event = Event.objects.create(start_datetime=now() + datetime.timedelta(days=10), places=10, agenda=agenda)
546
    booking = Booking.objects.create(event=event)
547

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

  
553
    booking.cancellation_datetime = now()
554
    booking.save()
555
    resp = app.delete('/api/agenda/%s/' % agenda.slug)
556
    assert resp.json['err'] == 0
557
    assert not Agenda.objects.exists()
558

  
559

  
528 560
def test_virtual_agendas_meetingtypes_api(app):
529 561
    virt_agenda = Agenda.objects.create(label='Virtual agenda', kind='virtual')
530 562

  
531
-