Projet

Général

Profil

0002-api-list-bookings-of-user_external_id-for-an-event-4.patch

Lauréline Guérin, 15 mai 2020 11:33

Télécharger (5,48 ko)

Voir les différences:

Subject: [PATCH 2/2] api: list bookings of user_external_id for an event
 (#40719)

 chrono/api/urls.py  |  5 ++++
 chrono/api/views.py | 28 +++++++++++++++++++++
 tests/test_api.py   | 61 +++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 94 insertions(+)
chrono/api/urls.py
33 33
        views.slot_status,
34 34
        name='api-event-status',
35 35
    ),
36
    url(
37
        r'^agenda/(?P<agenda_identifier>[\w-]+)/bookings/(?P<event_identifier>[\w-]+)/$',
38
        views.slot_bookings,
39
        name='api-event-bookings',
40
    ),
36 41
    url(
37 42
        r'^agenda/meetings/(?P<meeting_identifier>[\w-]+)/datetimes/$',
38 43
        views.meeting_datetimes,
chrono/api/views.py
1099 1099
slot_status = SlotStatus.as_view()
1100 1100

  
1101 1101

  
1102
class SlotBookings(APIView):
1103
    permission_classes = (permissions.IsAuthenticated,)
1104

  
1105
    def get_object(self, agenda_identifier, event_identifier):
1106
        return get_object_or_404(Event, slug=event_identifier, agenda__slug=agenda_identifier)
1107

  
1108
    def get(self, request, agenda_identifier=None, event_identifier=None, format=None):
1109
        if not request.GET.get('user_external_id'):
1110
            response = {
1111
                'err': 1,
1112
                'err_class': 'missing param user_external_id',
1113
                'err_desc': _('missing param user_external_id'),
1114
            }
1115
            return Response(response)
1116
        event = self.get_object(agenda_identifier, event_identifier)
1117
        booking_queryset = event.booking_set.filter(
1118
            user_external_id=request.GET['user_external_id'], primary_booking__isnull=True
1119
        ).order_by('pk')
1120
        response = {
1121
            'err': 0,
1122
            'data': [{'booking_id': b.pk, 'in_waiting_list': b.in_waiting_list} for b in booking_queryset],
1123
        }
1124
        return Response(response)
1125

  
1126

  
1127
slot_bookings = SlotBookings.as_view()
1128

  
1129

  
1102 1130
class BookingICS(APIView):
1103 1131
    permission_classes = (permissions.IsAuthenticated,)
1104 1132

  
tests/test_api.py
1303 1303
    resp = app.get('/api/agenda/%s/status/%s/' % (agenda_id, 'unknown'), status=404)
1304 1304

  
1305 1305

  
1306
def test_bookings(app, some_data, user):
1307
    agenda = Agenda.objects.filter(label=u'Foo bar')[0]
1308
    event = Event.objects.filter(agenda=agenda).exclude(start_datetime__lt=now())[0]
1309
    event.slug = 'event-slug'
1310
    event.places = 5
1311
    event.waiting_list_places = 5
1312
    event.save()
1313

  
1314
    # create a booking not on the waiting list
1315
    primary1 = Booking.objects.create(event=event, in_waiting_list=False, user_external_id='42')
1316
    Booking.objects.create(
1317
        event=event, in_waiting_list=False, primary_booking=primary1, user_external_id='42'
1318
    )
1319
    primary2 = Booking.objects.create(event=event, in_waiting_list=False, user_external_id='foobar')
1320
    Booking.objects.create(event=event, in_waiting_list=False, user_external_id='')
1321
    primary4 = Booking.objects.create(event=event, in_waiting_list=True, user_external_id='42')
1322

  
1323
    app.authorization = ('Basic', ('john.doe', 'password'))
1324

  
1325
    # unknown agenda
1326
    resp = app.get(
1327
        '/api/agenda/foobar/bookings/%s/' % (event.pk), params={'user_external_id': '42'}, status=404
1328
    )
1329
    # unknown event
1330
    resp = app.get(
1331
        '/api/agenda/%s/bookings/0/' % (agenda.slug), params={'user_external_id': '42'}, status=404
1332
    )
1333
    resp = app.get(
1334
        '/api/agenda/%s/bookings/foobar/' % (agenda.slug), params={'user_external_id': '42'}, status=404
1335
    )
1336

  
1337
    resp = app.get(
1338
        '/api/agenda/%s/bookings/%s/' % (agenda.slug, event.slug), params={'user_external_id': '42'}
1339
    )
1340
    assert resp.json['err'] == 0
1341
    assert resp.json['data'] == [
1342
        {'booking_id': primary1.pk, 'in_waiting_list': False},
1343
        {'booking_id': primary4.pk, 'in_waiting_list': True},
1344
    ]
1345
    resp = app.get(
1346
        '/api/agenda/%s/bookings/%s/' % (agenda.slug, event.slug), params={'user_external_id': 'foobar'}
1347
    )
1348
    assert resp.json['err'] == 0
1349
    assert resp.json['data'] == [
1350
        {'booking_id': primary2.pk, 'in_waiting_list': False},
1351
    ]
1352
    resp = app.get(
1353
        '/api/agenda/%s/bookings/%s/' % (agenda.slug, event.slug), params={'user_external_id': '35'}
1354
    )
1355
    assert resp.json['err'] == 0
1356
    assert resp.json['data'] == []
1357
    # no user_external_id in params
1358
    resp = app.get('/api/agenda/%s/bookings/%s/' % (agenda.slug, event.slug), params={'user_external_id': ''})
1359
    assert resp.json['err'] == 1
1360
    assert resp.json['reason'] == 'missing param user_external_id'  # legacy
1361
    assert resp.json['err_class'] == 'missing param user_external_id'
1362
    assert resp.json['err_desc'] == 'missing param user_external_id'
1363
    resp = app.get('/api/agenda/%s/bookings/%s/' % (agenda.slug, event.slug))
1364
    assert resp.json['err'] == 1
1365

  
1366

  
1306 1367
def test_waiting_list_datetimes(app, some_data, user):
1307 1368
    agenda_id = Agenda.objects.filter(label=u'Foo bar')[0].id
1308 1369
    event = Event.objects.filter(agenda_id=agenda_id).exclude(start_datetime__lt=now())[0]
1309
-