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:31

Télécharger (4,86 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   | 41 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 59 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'] == 4
762
    assert resp.json['places']['waiting_list_reserved'] == 1
763

  
764
    # not for mettings agenda
765
    event = Event.objects.filter(agenda=meetings_agenda)[0]
766
    resp = app.post_json('/api/agenda/%s/fillslot/%s/' % (meetings_agenda.pk, event.pk))
767
    assert resp.json['err'] == 0
768
    assert 'places' not in resp.json
769

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

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

  
779

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