api: patch booking color through dedicated endpoint (#65756)

This commit is contained in:
Paul Marillonnet 2022-05-30 17:11:56 +02:00
parent de59c38321
commit 81afbc271f
3 changed files with 31 additions and 4 deletions

View File

@ -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']

View File

@ -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)

View File

@ -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):