Projet

Général

Profil

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

Lauréline Guérin, 12 mai 2020 10:28

Télécharger (5,79 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 | 35 ++++++++++++++++++++++++++
 tests/test_api.py   | 61 +++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 101 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
1088 1088
slot_status = SlotStatus.as_view()
1089 1089

  
1090 1090

  
1091
class SlotBookings(APIView):
1092
    permission_classes = (permissions.IsAuthenticated,)
1093

  
1094
    def get_object(self, agenda_identifier, event_identifier):
1095
        try:
1096
            return Event.objects.get(slug=event_identifier, agenda__slug=agenda_identifier)
1097
        except Event.DoesNotExist:
1098
            try:
1099
                # legacy access by event id
1100
                return Event.objects.get(pk=int(event_identifier), agenda__slug=agenda_identifier)
1101
            except (ValueError, Event.DoesNotExist):
1102
                raise Http404()
1103

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

  
1122

  
1123
slot_bookings = SlotBookings.as_view()
1124

  
1125

  
1091 1126
class BookingICS(APIView):
1092 1127
    permission_classes = (permissions.IsAuthenticated,)
1093 1128

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

  
1292 1292

  
1293
def test_bookings(app, some_data, user):
1294
    agenda = Agenda.objects.filter(label=u'Foo bar')[0]
1295
    event = Event.objects.filter(agenda=agenda).exclude(start_datetime__lt=now())[0]
1296
    event.slug = 'event-slug'
1297
    event.places = 5
1298
    event.waiting_list_places = 5
1299
    event.save()
1300

  
1301
    # create a booking not on the waiting list
1302
    primary1 = Booking.objects.create(event=event, in_waiting_list=False, user_external_id='42')
1303
    Booking.objects.create(
1304
        event=event, in_waiting_list=False, primary_booking=primary1, user_external_id='42'
1305
    )
1306
    primary2 = Booking.objects.create(event=event, in_waiting_list=False, user_external_id='foobar')
1307
    Booking.objects.create(event=event, in_waiting_list=False, user_external_id='')
1308
    primary4 = Booking.objects.create(event=event, in_waiting_list=True, user_external_id='42')
1309

  
1310
    app.authorization = ('Basic', ('john.doe', 'password'))
1311

  
1312
    # unknown agenda
1313
    resp = app.get(
1314
        '/api/agenda/foobar/bookings/%s/' % (event.pk), params={'user_external_id': '42'}, status=404
1315
    )
1316
    # unknown event
1317
    resp = app.get(
1318
        '/api/agenda/%s/bookings/0/' % (agenda.slug), params={'user_external_id': '42'}, status=404
1319
    )
1320
    resp = app.get(
1321
        '/api/agenda/%s/bookings/foobar/' % (agenda.slug), params={'user_external_id': '42'}, status=404
1322
    )
1323

  
1324
    # get event by pk
1325
    resp = app.get('/api/agenda/%s/bookings/%s/' % (agenda.slug, event.pk), params={'user_external_id': '42'})
1326
    assert resp.json['err'] == 0
1327
    assert resp.json['data'] == [
1328
        {'booking_id': primary1.pk, 'in_waiting_list': False},
1329
        {'booking_id': primary4.pk, 'in_waiting_list': True},
1330
    ]
1331
    # get event by slug
1332
    resp = app.get(
1333
        '/api/agenda/%s/bookings/%s/' % (agenda.slug, event.slug), params={'user_external_id': 'foobar'}
1334
    )
1335
    assert resp.json['err'] == 0
1336
    assert resp.json['data'] == [
1337
        {'booking_id': primary2.pk, 'in_waiting_list': False},
1338
    ]
1339
    resp = app.get(
1340
        '/api/agenda/%s/bookings/%s/' % (agenda.slug, event.slug), params={'user_external_id': '35'}
1341
    )
1342
    assert resp.json['err'] == 0
1343
    assert resp.json['data'] == []
1344
    # no user_external_id in params
1345
    resp = app.get('/api/agenda/%s/bookings/%s/' % (agenda.slug, event.slug), params={'user_external_id': ''})
1346
    assert resp.json['err'] == 1
1347
    assert resp.json['reason'] == 'missing param user_external_id'  # legacy
1348
    assert resp.json['err_class'] == 'missing param user_external_id'
1349
    assert resp.json['err_desc'] == 'missing param user_external_id'
1350
    resp = app.get('/api/agenda/%s/bookings/%s/' % (agenda.slug, event.slug))
1351
    assert resp.json['err'] == 1
1352

  
1353

  
1293 1354
def test_waiting_list_datetimes(app, some_data, user):
1294 1355
    agenda_id = Agenda.objects.filter(label=u'Foo bar')[0].id
1295 1356
    event = Event.objects.filter(agenda_id=agenda_id).exclude(start_datetime__lt=now())[0]
1296
-