Projet

Général

Profil

0001-api-add-a-param-in_waiting_list-to-fillslot-40022.patch

Lauréline Guérin, 03 mars 2020 14:58

Télécharger (5,64 ko)

Voir les différences:

Subject: [PATCH] api: add a param in_waiting_list to fillslot (#40022)

 chrono/api/views.py |  8 ++++--
 tests/test_api.py   | 64 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 70 insertions(+), 2 deletions(-)
chrono/api/views.py
387 387
    backoffice_url = serializers.URLField(allow_blank=True)
388 388
    count = serializers.IntegerField(min_value=1)
389 389
    cancel_booking_id = serializers.CharField(max_length=250, allow_blank=True, allow_null=True)
390
    force_waiting_list = serializers.BooleanField(default=False)
390 391

  
391 392

  
392 393
class StringOrListField(serializers.ListField):
......
605 606
        # search free places. Switch to waiting list if necessary.
606 607
        in_waiting_list = False
607 608
        for event in events:
609
            if payload.get('force_waiting_list') and not event.waiting_list_places:
610
                return Response({'err': 1, 'err_class': 'no waiting list', 'err_desc': _('no waiting list')})
611

  
608 612
            if event.waiting_list_places:
609
                if (event.booked_places + places_count) > event.places or event.waiting_list:
613
                if payload.get('force_waiting_list') or (event.booked_places + places_count) > event.places or event.waiting_list:
610 614
                    # if this is full or there are people waiting, put new bookings
611 615
                    # in the waiting list.
612 616
                    in_waiting_list = True
613 617
                    if (event.waiting_list + places_count) > event.waiting_list_places:
614
                        return Response({'err': 1, 'err_class': 'sold out', 'err_desc': _('sold out'),})
618
                        return Response({'err': 1, 'err_class': 'sold out', 'err_desc': _('sold out')})
615 619
            else:
616 620
                if (event.booked_places + places_count) > event.places:
617 621
                    return Response({'err': 1, 'err_class': 'sold out', 'err_desc': _('sold out')})
tests/test_api.py
965 965
    assert 'places' not in resp.json
966 966

  
967 967

  
968
def test_booking_api_force_waiting_list(app, some_data, user):
969
    agenda = Agenda.objects.filter(label=u'Foo bar')[0]
970
    event = Event.objects.filter(agenda=agenda)[0]
971

  
972
    app.authorization = ('Basic', ('john.doe', 'password'))
973

  
974
    # no waiting list
975
    assert event.waiting_list_places == 0
976
    resp = app.post_json('/api/agenda/%s/fillslot/%s/' % (agenda.pk, event.pk), params={'force_waiting_list': True})
977
    assert resp.json['err'] == 1
978
    assert resp.json['reason'] == 'no waiting list'  # legacy
979
    assert resp.json['err_class'] == 'no waiting list'
980
    assert resp.json['err_desc'] == 'no waiting list'
981

  
982
    event.waiting_list_places = 2
983
    event.save()
984
    # add a booking
985
    resp = app.post_json('/api/agenda/%s/fillslot/%s/' % (agenda.pk, event.pk))
986
    assert resp.json['err'] == 0
987
    assert resp.json['places']['total'] == 10
988
    assert resp.json['places']['available'] == 9
989
    assert resp.json['places']['reserved'] == 1
990
    assert resp.json['places']['waiting_list_total'] == 2
991
    assert resp.json['places']['waiting_list_available'] == 2
992
    assert resp.json['places']['waiting_list_reserved'] == 0
993

  
994
    # add another booking
995
    resp = app.post_json('/api/agenda/%s/fillslot/%s/' % (agenda.pk, event.pk), params={'force_waiting_list': False})
996
    assert resp.json['err'] == 0
997
    assert resp.json['places']['total'] == 10
998
    assert resp.json['places']['available'] == 8
999
    assert resp.json['places']['reserved'] == 2
1000
    assert resp.json['places']['waiting_list_total'] == 2
1001
    assert resp.json['places']['waiting_list_available'] == 2
1002
    assert resp.json['places']['waiting_list_reserved'] == 0
1003

  
1004
    # add a booking, but in waiting list
1005
    resp = app.post_json('/api/agenda/%s/fillslot/%s/' % (agenda.pk, event.pk), params={'force_waiting_list': True})
1006
    assert resp.json['err'] == 0
1007
    assert resp.json['places']['total'] == 10
1008
    assert resp.json['places']['available'] == 8
1009
    assert resp.json['places']['reserved'] == 2
1010
    assert resp.json['places']['waiting_list_total'] == 2
1011
    assert resp.json['places']['waiting_list_available'] == 1
1012
    assert resp.json['places']['waiting_list_reserved'] == 1
1013

  
1014
    # add a booking => booked in waiting list
1015
    resp = app.post_json('/api/agenda/%s/fillslot/%s/' % (agenda.pk, event.pk))
1016
    assert resp.json['err'] == 0
1017
    assert resp.json['places']['total'] == 10
1018
    assert resp.json['places']['available'] == 8
1019
    assert resp.json['places']['reserved'] == 2
1020
    assert resp.json['places']['waiting_list_total'] == 2
1021
    assert resp.json['places']['waiting_list_available'] == 0
1022
    assert resp.json['places']['waiting_list_reserved'] == 2
1023

  
1024
    # waiting list is full
1025
    resp = app.post_json('/api/agenda/%s/fillslot/%s/' % (agenda.pk, event.pk), params={'force_waiting_list': True})
1026
    assert resp.json['err'] == 1
1027
    assert resp.json['reason'] == 'sold out'  # legacy
1028
    assert resp.json['err_class'] == 'sold out'
1029
    assert resp.json['err_desc'] == 'sold out'
1030

  
1031

  
968 1032
def test_booking_api_with_cancel_booking(app, some_data, user):
969 1033
    agenda_id = Agenda.objects.filter(label=u'Foo bar')[0].id
970 1034
    event_0, event_1, event_2, event_3 = Event.objects.filter(agenda_id=agenda_id)[0:4]
971
-