From dd07d83d4299bb795a218b9d94975f96a9cb63d3 Mon Sep 17 00:00:00 2001 From: Valentin Deniaud Date: Wed, 17 Jun 2020 17:50:02 +0200 Subject: [PATCH] api: get meeting by slug (#43526) --- chrono/api/urls.py | 5 +++++ chrono/api/views.py | 39 +++++++++++++++++++++++++++++++++++++++ tests/test_api.py | 22 ++++++++++++++++++++++ 3 files changed, 66 insertions(+) diff --git a/chrono/api/urls.py b/chrono/api/urls.py index 9f63a6b..e2f2df6 100644 --- a/chrono/api/urls.py +++ b/chrono/api/urls.py @@ -44,6 +44,11 @@ urlpatterns = [ name='api-agenda-meeting-datetimes-legacy', ), url(r'^agenda/(?P[\w-]+)/meetings/$', views.meeting_list, name='api-agenda-meetings'), + url( + r'^agenda/(?P[\w-]+)/meetings/(?P[\w-]+)/$', + views.meeting_info, + name='api-agenda-meetings', + ), url(r'^agenda/(?P[\w-]+)/desks/$', views.agenda_desk_list, name='api-agenda-desks'), url( r'^agenda/(?P[\w-]+)/meetings/(?P[\w-]+)/datetimes/$', diff --git a/chrono/api/views.py b/chrono/api/views.py index 13b5662..d98a786 100644 --- a/chrono/api/views.py +++ b/chrono/api/views.py @@ -571,6 +571,45 @@ class MeetingList(APIView): meeting_list = MeetingList.as_view() +class MeetingInfo(APIView): + permission_classes = () + + def get(self, request, agenda_identifier=None, meeting_identifier=None, format=None): + try: + agenda = Agenda.objects.get(slug=agenda_identifier) + except Agenda.DoesNotExist: + raise Http404() + if not agenda.accept_meetings(): + raise Http404('agenda found, but it does not accept meetings') + + try: + meeting_type = agenda.get_meetingtype(slug=meeting_identifier) + except MeetingType.DoesNotExist: + raise Http404() + + datetimes_url = request.build_absolute_uri( + reverse( + 'api-agenda-meeting-datetimes', + kwargs={'agenda_identifier': agenda.slug, 'meeting_identifier': meeting_type.slug}, + ) + ) + return Response( + { + 'data': { + 'text': meeting_type.label, + 'id': meeting_type.slug, + 'duration': meeting_type.duration, + 'api': {'datetimes_url': datetimes_url}, + } + } + ) + + return Response({'data': meeting_types}) + + +meeting_info = MeetingInfo.as_view() + + class AgendaDeskList(APIView): permission_classes = () diff --git a/tests/test_api.py b/tests/test_api.py index f22a767..c15e901 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -252,6 +252,28 @@ def test_agendas_meetingtypes_api(app, some_data, meetings_agenda): resp = app.get('/api/agenda/xxxx/meetings/', status=404) +def test_agendas_meetingtype_api(app, some_data, meetings_agenda): + resp = app.get('/api/agenda/%s/meetings/blah/' % meetings_agenda.slug) + assert resp.json == { + 'data': { + 'text': 'Blah', + 'id': 'blah', + 'duration': 30, + 'api': { + 'datetimes_url': 'http://testserver/api/agenda/foo-bar-meeting/meetings/blah/datetimes/', + }, + } + } + + # wrong kind + agenda1 = Agenda.objects.filter(label=u'Foo bar')[0] + resp = app.get('/api/agenda/%s/meetings/' % agenda1.slug, status=404) + + # unknown + resp = app.get('/api/agenda/xxxx/meetings/', status=404) + resp = app.get('/api/agenda/%s/meetings/xxxx/' % agenda1.slug, status=404) + + def test_agendas_desks_api(app, some_data, meetings_agenda): resp = app.get('/api/agenda/%s/desks/' % meetings_agenda.slug) assert resp.json == {'data': [{'text': 'Desk 1', 'id': 'desk-1',}]} -- 2.20.1