api: patch booking color through dedicated endpoint (#65756)
This commit is contained in:
parent
de59c38321
commit
81afbc271f
|
@ -11,6 +11,7 @@ from rest_framework.exceptions import ValidationError
|
|||
from chrono.agendas.models import (
|
||||
Agenda,
|
||||
Booking,
|
||||
BookingColor,
|
||||
Category,
|
||||
CheckType,
|
||||
Event,
|
||||
|
@ -158,6 +159,11 @@ class RecurringFillslotsSerializer(MultipleAgendasEventsSlotsSerializer):
|
|||
class BookingSerializer(serializers.ModelSerializer):
|
||||
user_absence_reason = serializers.CharField(required=False, allow_blank=True, allow_null=True)
|
||||
user_presence_reason = serializers.CharField(required=False, allow_blank=True, allow_null=True)
|
||||
color = serializers.SlugRelatedField(
|
||||
many=False,
|
||||
slug_field='label',
|
||||
queryset=BookingColor.objects.all(),
|
||||
)
|
||||
|
||||
class Meta:
|
||||
model = Booking
|
||||
|
@ -171,6 +177,7 @@ class BookingSerializer(serializers.ModelSerializer):
|
|||
'user_was_present',
|
||||
'user_absence_reason',
|
||||
'user_presence_reason',
|
||||
'color',
|
||||
'extra_data',
|
||||
]
|
||||
read_only_fields = ['id', 'in_waiting_list', 'extra_data']
|
||||
|
|
|
@ -2427,6 +2427,7 @@ class BookingAPI(APIView):
|
|||
'user_last_name',
|
||||
'user_email',
|
||||
'user_phone_number',
|
||||
'color',
|
||||
]:
|
||||
if key in request.data:
|
||||
secondary_bookings_update[key] = getattr(self.booking, key)
|
||||
|
|
|
@ -9,6 +9,7 @@ from django.utils.timezone import make_aware, now
|
|||
from chrono.agendas.models import (
|
||||
Agenda,
|
||||
Booking,
|
||||
BookingColor,
|
||||
Category,
|
||||
CheckType,
|
||||
CheckTypeGroup,
|
||||
|
@ -152,6 +153,7 @@ def test_bookings_api(app, user):
|
|||
'user_was_present': None,
|
||||
'user_absence_reason': '',
|
||||
'user_presence_reason': '',
|
||||
'color': None,
|
||||
'extra_data': None,
|
||||
},
|
||||
{
|
||||
|
@ -164,6 +166,7 @@ def test_bookings_api(app, user):
|
|||
'user_was_present': None,
|
||||
'user_absence_reason': '',
|
||||
'user_presence_reason': '',
|
||||
'color': None,
|
||||
'extra_data': None,
|
||||
'event': resp.json['data'][1]['event'],
|
||||
},
|
||||
|
@ -177,6 +180,7 @@ def test_bookings_api(app, user):
|
|||
'user_was_present': None,
|
||||
'user_absence_reason': '',
|
||||
'user_presence_reason': '',
|
||||
'color': None,
|
||||
'extra_data': None,
|
||||
'event': resp.json['data'][1]['event'],
|
||||
},
|
||||
|
@ -869,7 +873,9 @@ def test_booking_patch_api_both_reasons(app, user):
|
|||
def test_booking_patch_api_user_fields(app, user):
|
||||
agenda = Agenda.objects.create(kind='events')
|
||||
event = Event.objects.create(agenda=agenda, start_datetime=now(), places=10)
|
||||
booking = Booking.objects.create(event=event)
|
||||
BookingColor.objects.create(label='the warmest color')
|
||||
color = BookingColor.objects.create(label='meh')
|
||||
booking = Booking.objects.create(event=event, color=color)
|
||||
# make secondary bookings
|
||||
Booking.objects.create(event=event, primary_booking=booking)
|
||||
Booking.objects.create(event=event, primary_booking=booking)
|
||||
|
@ -887,6 +893,7 @@ def test_booking_patch_api_user_fields(app, user):
|
|||
('user_email', ''),
|
||||
('user_phone_number', '0606'),
|
||||
('user_phone_number', ''),
|
||||
('color', 'the warmest color'),
|
||||
]
|
||||
for key, value in to_test:
|
||||
params = {
|
||||
|
@ -894,11 +901,23 @@ def test_booking_patch_api_user_fields(app, user):
|
|||
}
|
||||
app.patch_json('/api/booking/%s/' % booking.pk, params=params)
|
||||
booking.refresh_from_db()
|
||||
assert getattr(booking, key) == value
|
||||
assert str(getattr(booking, key)) == value
|
||||
# all secondary bookings are updated
|
||||
assert list(booking.secondary_booking_set.values_list(key, flat=True)) == [value, value]
|
||||
for secondary_booking in booking.secondary_booking_set.all():
|
||||
assert str(getattr(secondary_booking, key)) == value
|
||||
other_booking.refresh_from_db()
|
||||
assert getattr(other_booking, key) == '' # not changed
|
||||
assert not getattr(other_booking, key) # not changed
|
||||
|
||||
# try again with a non existing color, it should fail
|
||||
params = {
|
||||
'color': 'unicorn crimson',
|
||||
}
|
||||
response = app.patch_json('/api/booking/%s/' % booking.pk, params=params, status=400)
|
||||
booking.refresh_from_db()
|
||||
assert booking.color.label == 'the warmest color'
|
||||
assert response.json['err_desc'] == 'invalid payload'
|
||||
assert list(response.json['errors'].keys()) == ['color']
|
||||
assert response.json['errors']['color'] == ['Object with label=unicorn crimson does not exist.']
|
||||
|
||||
|
||||
def test_booking_patch_api_extra_data(app, user):
|
||||
|
|
Loading…
Reference in New Issue