api: better pk & slug support in status url (#46772)

This commit is contained in:
Lauréline Guérin 2020-09-24 09:49:49 +02:00
parent f06b378038
commit 1995cc18e4
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
2 changed files with 46 additions and 26 deletions

View File

@ -1339,15 +1339,19 @@ class SlotStatus(APIView):
def get_object(self, agenda_identifier, event_identifier):
try:
return Event.objects.get(
slug=event_identifier, agenda__slug=agenda_identifier, agenda__kind='events'
)
agenda = Agenda.objects.get(slug=agenda_identifier, kind='events')
except Agenda.DoesNotExist:
try:
# legacy access by agenda id
agenda = Agenda.objects.get(pk=agenda_identifier, kind='events')
except (ValueError, Agenda.DoesNotExist):
raise Http404()
try:
return agenda.event_set.get(slug=event_identifier)
except Event.DoesNotExist:
try:
# legacy access by event id
return Event.objects.get(
pk=int(event_identifier), agenda=int(agenda_identifier), agenda__kind='events'
)
return agenda.event_set.get(pk=event_identifier)
except (ValueError, Event.DoesNotExist):
raise Http404()

View File

@ -1735,13 +1735,10 @@ def test_status(app, user):
)
Booking.objects.create(event=event)
app.get('/api/agenda/%s/status/%s/' % (agenda.pk, event.pk), status=401)
app.get('/api/agenda/%s/status/%s/' % (agenda.slug, event.slug), status=401)
app.authorization = ('Basic', ('john.doe', 'password'))
app.get('/api/agenda/%s/status/%s/' % (agenda.pk, 0), status=404)
app.get('/api/agenda/%s/status/%s/' % (agenda.pk, 'xx'), status=404)
resp = app.get('/api/agenda/%s/status/%s/' % (agenda.pk, event.pk))
resp = app.get('/api/agenda/%s/status/%s/' % (agenda.slug, event.slug))
assert resp.json['err'] == 0
assert resp.json['places']['total'] == 10
assert resp.json['places']['available'] == 9
@ -1751,28 +1748,47 @@ def test_status(app, user):
Booking(event=event, in_waiting_list=True).save()
event.waiting_list_places = 5
event.save()
resp = app.get('/api/agenda/%s/status/%s/' % (agenda.pk, event.pk))
resp = app.get('/api/agenda/%s/status/%s/' % (agenda.slug, event.slug))
assert resp.json['places']['waiting_list_total'] == 5
assert resp.json['places']['waiting_list_available'] == 4
assert resp.json['places']['waiting_list_reserved'] == 1
# unknown agenda
app.get('/api/agenda/0/status/%s/' % (event.pk), params={'user_external_id': '42'}, status=404)
app.get('/api/agenda/foobar/status/%s/' % (event.slug), params={'user_external_id': '42'}, status=404)
# unknown event
app.get('/api/agenda/%s/status/0/' % (agenda.pk), params={'user_external_id': '42'}, status=404)
app.get('/api/agenda/%s/status/foobar/' % (agenda.slug), params={'user_external_id': '42'}, status=404)
# wrong kind
agenda.kind = 'meetings'
agenda.save()
app.get(
'/api/agenda/%s/status/%s/' % (agenda.pk, event.pk), status=404,
)
app.get(
'/api/agenda/%s/status/%s/' % (agenda.slug, event.slug), status=404,
for kind in ['meetings', 'virtual']:
agenda.kind = kind
agenda.save()
app.get('/api/agenda/%s/status/%s/' % (agenda.pk, event.slug), status=404)
app.get('/api/agenda/%s/status/%s/' % (agenda.slug, event.slug), status=404)
def test_status_url(app, user):
agenda = Agenda.objects.create(label='Foo bar', kind='events', minimal_booking_delay=0)
event = Event.objects.create(
slug='event-slug',
start_datetime=(now() + datetime.timedelta(days=5)).replace(hour=10, minute=0),
places=10,
agenda=agenda,
)
app.authorization = ('Basic', ('john.doe', 'password'))
app.get('/api/agenda/%s/status/%s/' % (agenda.pk, event.pk))
app.get('/api/agenda/%s/status/%s/' % (agenda.slug, event.slug))
app.get('/api/agenda/%s/status/%s/' % (agenda.pk, event.slug))
app.get('/api/agenda/%s/status/%s/' % (agenda.slug, event.pk))
# unknown event
app.get('/api/agenda/%s/status/%s/' % (agenda.pk, 0), status=404)
app.get('/api/agenda/%s/status/%s/' % (agenda.slug, 0), status=404)
app.get('/api/agenda/%s/status/%s/' % (agenda.pk, 'foobar'), status=404)
app.get('/api/agenda/%s/status/%s/' % (agenda.slug, 'foobar'), status=404)
# unknown agenda
app.get('/api/agenda/%s/status/%s/' % (0, event.pk), status=404)
app.get('/api/agenda/%s/status/%s/' % (0, event.slug), status=404)
app.get('/api/agenda/%s/status/%s/' % ('foobar', event.pk), status=404)
app.get('/api/agenda/%s/status/%s/' % ('foobar', event.slug), status=404)
def test_bookings(app, user):
agenda = Agenda.objects.create(label='Foo bar', kind='events', minimal_booking_delay=0)