api: can not cancel, accept or suspend a secondary booking (#40039)
This commit is contained in:
parent
5636c001ac
commit
bccba482b4
|
@ -731,7 +731,8 @@ class CancelBooking(APIView):
|
|||
'''
|
||||
Cancel a booking.
|
||||
|
||||
It will return an error (code 1) if the booking was already cancelled.
|
||||
It will return error codes if the booking was cancelled before (code 1) or
|
||||
if the booking is not primary (code 2).
|
||||
'''
|
||||
|
||||
permission_classes = (permissions.IsAuthenticated,)
|
||||
|
@ -745,6 +746,13 @@ class CancelBooking(APIView):
|
|||
'err_desc': _('already cancelled'),
|
||||
}
|
||||
return Response(response)
|
||||
if booking.primary_booking is not None:
|
||||
response = {
|
||||
'err': 2,
|
||||
'err_class': 'secondary booking',
|
||||
'err_desc': _('secondary booking'),
|
||||
}
|
||||
return Response(response)
|
||||
booking.cancel()
|
||||
response = {'err': 0, 'booking_id': booking.id}
|
||||
return Response(response)
|
||||
|
@ -757,8 +765,9 @@ class AcceptBooking(APIView):
|
|||
'''
|
||||
Accept a booking currently in the waiting list.
|
||||
|
||||
It will return error codes if the booking was cancelled before (code 1) and
|
||||
if the booking was not in waiting list (code 2).
|
||||
It will return error codes if the booking was cancelled before (code 1),
|
||||
if the booking is not primary (code 2) or
|
||||
if the booking was not in waiting list (code 3).
|
||||
'''
|
||||
|
||||
permission_classes = (permissions.IsAuthenticated,)
|
||||
|
@ -772,9 +781,16 @@ class AcceptBooking(APIView):
|
|||
'err_desc': _('booking is cancelled'),
|
||||
}
|
||||
return Response(response)
|
||||
if not booking.in_waiting_list:
|
||||
if booking.primary_booking is not None:
|
||||
response = {
|
||||
'err': 2,
|
||||
'err_class': 'secondary booking',
|
||||
'err_desc': _('secondary booking'),
|
||||
}
|
||||
return Response(response)
|
||||
if not booking.in_waiting_list:
|
||||
response = {
|
||||
'err': 3,
|
||||
'err_class': 'booking is not in waiting list',
|
||||
'err_desc': _('booking is not in waiting list'),
|
||||
}
|
||||
|
@ -791,8 +807,9 @@ class SuspendBooking(APIView):
|
|||
'''
|
||||
Suspend a accepted booking.
|
||||
|
||||
It will return error codes if the booking was cancelled before (code 1) and
|
||||
if the bookingis already in waiting list (code 2).
|
||||
It will return error codes if the booking was cancelled before (code 1)
|
||||
if the booking is not primary (code 2) or
|
||||
if the booking is already in waiting list (code 3).
|
||||
'''
|
||||
|
||||
permission_classes = (permissions.IsAuthenticated,)
|
||||
|
@ -806,9 +823,16 @@ class SuspendBooking(APIView):
|
|||
'err_desc': _('booking is cancelled'),
|
||||
}
|
||||
return Response(response)
|
||||
if booking.in_waiting_list:
|
||||
if booking.primary_booking is not None:
|
||||
response = {
|
||||
'err': 2,
|
||||
'err_class': 'secondary booking',
|
||||
'err_desc': _('secondary booking'),
|
||||
}
|
||||
return Response(response)
|
||||
if booking.in_waiting_list:
|
||||
response = {
|
||||
'err': 3,
|
||||
'err_class': 'booking is already in waiting list',
|
||||
'err_desc': _('booking is already in waiting list'),
|
||||
}
|
||||
|
|
|
@ -1313,6 +1313,27 @@ def test_waiting_list_booking(app, some_data, user):
|
|||
assert resp.json['err_desc'] == 'sold out'
|
||||
|
||||
|
||||
def test_cancel_booking(app, some_data, user):
|
||||
agenda_id = Agenda.objects.filter(label=u'Foo bar')[0].pk
|
||||
event = Event.objects.filter(agenda_id=agenda_id).exclude(start_datetime__lt=now())[0]
|
||||
primary = Booking.objects.create(event=event)
|
||||
secondary = Booking.objects.create(event=event, primary_booking=primary)
|
||||
app.authorization = ('Basic', ('john.doe', 'password'))
|
||||
|
||||
resp = app.post('/api/booking/%s/cancel/' % secondary.pk)
|
||||
assert resp.json['err'] == 2
|
||||
assert resp.json['reason'] == 'secondary booking' # legacy
|
||||
assert resp.json['err_class'] == 'secondary booking'
|
||||
assert resp.json['err_desc'] == 'secondary booking'
|
||||
|
||||
resp = app.post('/api/booking/%s/cancel/' % primary.pk)
|
||||
assert resp.json['err'] == 0
|
||||
primary.refresh_from_db()
|
||||
secondary.refresh_from_db()
|
||||
assert primary.cancellation_datetime is not None
|
||||
assert secondary.cancellation_datetime is not None
|
||||
|
||||
|
||||
def test_accept_booking(app, some_data, user):
|
||||
agenda_id = Agenda.objects.filter(label=u'Foo bar')[0].id
|
||||
event = Event.objects.filter(agenda_id=agenda_id).exclude(start_datetime__lt=now())[0]
|
||||
|
@ -1320,30 +1341,40 @@ def test_accept_booking(app, some_data, user):
|
|||
event.save()
|
||||
|
||||
# create a booking on the waiting list
|
||||
booking = Booking(event=event, in_waiting_list=True)
|
||||
booking.save()
|
||||
primary = Booking.objects.create(event=event, in_waiting_list=True)
|
||||
secondary = Booking.objects.create(event=event, in_waiting_list=True, primary_booking=primary)
|
||||
|
||||
assert Booking.objects.filter(in_waiting_list=True).count() == 1
|
||||
assert Booking.objects.filter(in_waiting_list=True).count() == 2
|
||||
|
||||
app.authorization = ('Basic', ('john.doe', 'password'))
|
||||
resp = app.post('/api/booking/%s/accept/' % booking.id)
|
||||
|
||||
resp = app.post('/api/booking/%s/accept/' % secondary.id)
|
||||
assert resp.json['err'] == 2
|
||||
assert resp.json['reason'] == 'secondary booking' # legacy
|
||||
assert resp.json['err_class'] == 'secondary booking'
|
||||
assert resp.json['err_desc'] == 'secondary booking'
|
||||
|
||||
resp = app.post('/api/booking/%s/accept/' % primary.id)
|
||||
assert Booking.objects.filter(in_waiting_list=True).count() == 0
|
||||
assert Booking.objects.filter(in_waiting_list=False).count() == 1
|
||||
assert Booking.objects.filter(in_waiting_list=False).count() == 2
|
||||
primary.refresh_from_db()
|
||||
secondary.refresh_from_db()
|
||||
assert primary.in_waiting_list is False
|
||||
assert secondary.in_waiting_list is False
|
||||
|
||||
# accept a booking that doesn't exist
|
||||
resp = app.post('/api/booking/%s/accept/' % 0, status=404)
|
||||
resp = app.post('/api/booking/0/accept/', status=404)
|
||||
|
||||
# accept a booking that was not in the waiting list
|
||||
resp = app.post('/api/booking/%s/accept/' % booking.id, status=200)
|
||||
assert resp.json['err'] == 2
|
||||
resp = app.post('/api/booking/%s/accept/' % primary.id, status=200)
|
||||
assert resp.json['err'] == 3
|
||||
|
||||
# accept a booking that was cancelled before
|
||||
booking = Booking.objects.get(id=booking.id)
|
||||
booking.in_waiting_list = True
|
||||
booking.cancel()
|
||||
resp = app.post('/api/booking/%s/accept/' % booking.id, status=200)
|
||||
primary.suspend()
|
||||
primary.cancel()
|
||||
resp = app.post('/api/booking/%s/accept/' % primary.id, status=200)
|
||||
assert resp.json['err'] == 1
|
||||
assert Booking.objects.filter(in_waiting_list=True).count() == 1
|
||||
assert Booking.objects.filter(in_waiting_list=True).count() == 2
|
||||
assert Booking.objects.filter(in_waiting_list=False).count() == 0
|
||||
|
||||
|
||||
|
@ -1354,27 +1385,38 @@ def test_suspend_booking(app, some_data, user):
|
|||
event.save()
|
||||
|
||||
# create a booking not on the waiting list
|
||||
booking = Booking.objects.create(event=event, in_waiting_list=False)
|
||||
assert booking.in_waiting_list is False
|
||||
primary = Booking.objects.create(event=event, in_waiting_list=False)
|
||||
secondary = Booking.objects.create(event=event, in_waiting_list=False, primary_booking=primary)
|
||||
|
||||
assert Booking.objects.filter(in_waiting_list=False).count() == 2
|
||||
|
||||
app.authorization = ('Basic', ('john.doe', 'password'))
|
||||
resp = app.post('/api/booking/%s/suspend/' % booking.pk)
|
||||
booking.refresh_from_db()
|
||||
assert booking.in_waiting_list is True
|
||||
|
||||
resp = app.post('/api/booking/%s/suspend/' % secondary.id)
|
||||
assert resp.json['err'] == 2
|
||||
assert resp.json['reason'] == 'secondary booking' # legacy
|
||||
assert resp.json['err_class'] == 'secondary booking'
|
||||
assert resp.json['err_desc'] == 'secondary booking'
|
||||
|
||||
resp = app.post('/api/booking/%s/suspend/' % primary.pk)
|
||||
primary.refresh_from_db()
|
||||
secondary.refresh_from_db()
|
||||
assert primary.in_waiting_list is True
|
||||
assert secondary.in_waiting_list is True
|
||||
|
||||
# suspend a booking that doesn't exist
|
||||
resp = app.post('/api/booking/0/suspend/', status=404)
|
||||
|
||||
# suspend a booking that is in the waiting list
|
||||
resp = app.post('/api/booking/%s/suspend/' % booking.pk, status=200)
|
||||
assert resp.json['err'] == 2
|
||||
resp = app.post('/api/booking/%s/suspend/' % primary.pk, status=200)
|
||||
assert resp.json['err'] == 3
|
||||
|
||||
# suspend a booking that was cancelled before
|
||||
booking.in_waiting_list = False
|
||||
booking.cancel()
|
||||
resp = app.post('/api/booking/%s/suspend/' % booking.pk, status=200)
|
||||
primary.accept()
|
||||
primary.cancel()
|
||||
resp = app.post('/api/booking/%s/suspend/' % primary.pk, status=200)
|
||||
assert resp.json['err'] == 1
|
||||
assert booking.in_waiting_list is False
|
||||
assert primary.in_waiting_list is False
|
||||
|
||||
|
||||
def test_multiple_booking_api(app, some_data, user):
|
||||
|
|
Loading…
Reference in New Issue