api: add desk info in booking response (#18973)

This commit is contained in:
Josue Kouka 2017-09-26 16:17:05 +02:00 committed by Frédéric Péters
parent 169cc6a0ab
commit fc1bdf3391
2 changed files with 34 additions and 4 deletions

View File

@ -316,6 +316,7 @@ class Fillslot(GenericAPIView):
else:
places_count = 1
available_desk = None
if agenda.kind == 'meetings':
# event is actually a timeslot, convert to a real event object
meeting_type_id, start_datetime_str = event_pk.split(':')
@ -327,12 +328,12 @@ class Fillslot(GenericAPIView):
start_datetime=start_datetime,
full=False, places=1)
available_desk = None
open_slots, _ = get_all_slots(agenda, MeetingType.objects.get(id=meeting_type_id))
slot = open_slots[event.start_datetime:event.end_datetime]
# sort available matching slots by desk id
slot = sorted(open_slots[event.start_datetime:event.end_datetime], key=lambda x: x.data.desk.id)
if slot:
available_desk = slot.pop().data.desk
# book first available desk
available_desk = slot[0].data.desk
if not available_desk:
return Response({'err': 1, 'reason': 'no more desk available'})
@ -377,6 +378,10 @@ class Fillslot(GenericAPIView):
if new_booking.in_waiting_list:
response['api']['accept_url'] = request.build_absolute_uri(
reverse('api-accept-booking', kwargs={'booking_pk': new_booking.id}))
if available_desk:
response['desk'] = {
'label': available_desk.label,
'slug': available_desk.slug}
return Response(response)

View File

@ -994,3 +994,28 @@ def test_agenda_meeting_api_in_between_exceptions(app, meetings_agenda, user):
weekday=time_period.weekday)
resp4 = app.get('/api/agenda/meetings/%s/datetimes/' % meeting_type.id)
assert len(resp.json['data']) == len(resp4.json['data'])
def test_agenda_meeting_api_desk_info(app, meetings_agenda, user):
app.authorization = ('Basic', ('john.doe', 'password'))
meeting_type = MeetingType.objects.get(agenda=meetings_agenda)
desk = meetings_agenda.desk_set.get(slug='desk-1')
desk2 = Desk.objects.create(label='Desk 2', agenda=meetings_agenda)
for time_period in desk.timeperiod_set.all():
TimePeriod.objects.create(
desk=desk2, start_time=time_period.start_time, end_time=time_period.end_time,
weekday=time_period.weekday)
resp = app.get('/api/agenda/meetings/%s/datetimes/' % meeting_type.id)
booking_url = resp.json['data'][0]['api']['fillslot_url']
booking_url2 = resp.json['data'][3]['api']['fillslot_url']
resp = app.post(booking_url)
assert resp.json['desk']['label'] == desk.label
assert resp.json['desk']['slug'] == desk.slug
# book the same slot and make sure desk 2 info are returned
resp = app.post(booking_url)
assert resp.json['desk']['label'] == desk2.label
assert resp.json['desk']['slug'] == desk2.slug
# booking slot 3 and make sure desk 1 info are returened
resp = app.post(booking_url2)
assert resp.json['desk']['label'] == desk.label
assert resp.json['desk']['slug'] == desk.slug