Projet

Général

Profil

0002-api-return-places-info-on-fillslot-api-for-an-event-.patch

Lauréline Guérin, 29 octobre 2019 14:38

Télécharger (4,99 ko)

Voir les différences:

Subject: [PATCH 2/2] api: return places info on fillslot api for an event
 agenda (#35297)

 chrono/api/views.py | 27 ++++++++++++++++++---------
 tests/test_api.py   | 43 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 61 insertions(+), 9 deletions(-)
chrono/api/views.py
124 124
    return agenda_detail
125 125

  
126 126

  
127
def get_event_places(event):
128
    places = {
129
        'total': event.places,
130
        'reserved': event.booked_places,
131
        'available': event.places - event.booked_places,
132
    }
133
    if event.waiting_list_places:
134
        places['waiting_list_total'] = event.waiting_list_places
135
        places['waiting_list_reserved'] = event.waiting_list
136
        places['waiting_list_available'] = (event.waiting_list_places - event.waiting_list)
137
    return places
138

  
139

  
127 140
class Agendas(APIView):
128 141
    permission_classes = ()
129 142

  
......
338 351
                             format=format)
339 352

  
340 353
    def fillslot(self, request, agenda_identifier=None, slots=[], format=None):
354
        multiple_booking = not slots
341 355
        try:
342 356
            agenda = Agenda.objects.get(slug=agenda_identifier)
343 357
        except Agenda.DoesNotExist:
......
529 543
                'slug': available_desk.slug}
530 544
        if to_cancel_booking:
531 545
            response['cancelled_booking_id'] = cancelled_booking_id
546
        if agenda.kind == 'events' and not multiple_booking:
547
            event = events[0]
548
            response['places'] = get_event_places(event)
532 549

  
533 550
        return Response(response)
534 551

  
......
614 631
        event = get_object_or_404(Event, id=event_pk)
615 632
        response = {
616 633
            'err': 0,
617
            'places': {
618
                'total': event.places,
619
                'reserved': event.booked_places,
620
                'available': event.places - event.booked_places,
621
            }
634
            'places': get_event_places(event),
622 635
        }
623
        if event.waiting_list_places:
624
            response['places']['waiting_list_total'] = event.waiting_list_places
625
            response['places']['waiting_list_reserved'] = event.waiting_list
626
            response['places']['waiting_list_available'] = (event.waiting_list_places - event.waiting_list)
627 636
        return Response(response)
628 637

  
629 638
slot_status = SlotStatus.as_view()
tests/test_api.py
736 736
    assert Booking.objects.all()[0].extra_data == {'hello': 'world'}
737 737

  
738 738

  
739
def test_booking_api_available(app, some_data, meetings_agenda, user):
740
    agenda = Agenda.objects.filter(label=u'Foo bar')[0]
741
    event = Event.objects.filter(agenda=agenda)[0]
742

  
743
    app.authorization = ('Basic', ('john.doe', 'password'))
744
    resp = app.post_json('/api/agenda/%s/fillslot/%s/' % (agenda.pk, event.pk))
745
    assert resp.json['err'] == 0
746
    assert resp.json['places']['total'] == 10
747
    assert resp.json['places']['available'] == 9
748
    assert resp.json['places']['reserved'] == 1
749
    assert 'waiting_list_total' not in resp.json['places']
750

  
751
    Booking.objects.create(event=event, in_waiting_list=True)
752
    event.waiting_list_places = 5
753
    event.save()
754

  
755
    resp = app.post_json('/api/agenda/%s/fillslot/%s/' % (agenda.pk, event.pk))
756
    assert resp.json['err'] == 0
757
    assert resp.json['places']['total'] == 10
758
    assert resp.json['places']['available'] == 9
759
    assert resp.json['places']['reserved'] == 1
760
    assert resp.json['places']['waiting_list_total'] == 5
761
    assert resp.json['places']['waiting_list_available'] == 3
762
    assert resp.json['places']['waiting_list_reserved'] == 2
763

  
764
    # not for mettings agenda
765
    meeting_type = MeetingType.objects.get(agenda=meetings_agenda)
766
    resp = app.get('/api/agenda/meetings/%s/datetimes/' % meeting_type.pk)
767
    event_id = resp.json['data'][2]['id']
768
    resp = app.post_json('/api/agenda/%s/fillslot/%s/' % (meetings_agenda.pk, event_id))
769
    assert resp.json['err'] == 0
770
    assert 'places' not in resp.json
771

  
772
    # not for multiple booking
773
    events = [x for x in Event.objects.filter(agenda=agenda).order_by('start_datetime') if x.in_bookable_period()][:2]
774
    slots = [x.pk for x in events]
775

  
776
    resp = app.post('/api/agenda/%s/fillslots/' % agenda.slug,
777
                    params={'slots': slots, 'count': '3'})
778
    assert resp.json['err'] == 0
779
    assert 'places' not in resp.json
780

  
781

  
739 782
def test_booking_api_with_cancel_booking(app, some_data, user):
740 783
    agenda_id = Agenda.objects.filter(label=u'Foo bar')[0].id
741 784
    event_0, event_1, event_2, event_3 = Event.objects.filter(agenda_id=agenda_id)[0:4]
742
-