api: flat extra_data in booking patch endpoint (#61074)

This commit is contained in:
Lauréline Guérin 2022-02-08 09:15:47 +01:00
parent d1da2b5c95
commit 8be7358dee
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
3 changed files with 14 additions and 17 deletions

View File

@ -143,7 +143,7 @@ class BookingSerializer(serializers.ModelSerializer):
class Meta:
model = Booking
fields = ['id', 'in_waiting_list', 'user_was_present', 'user_absence_reason', 'extra_data']
read_only_fields = ['id', 'in_waiting_list']
read_only_fields = ['id', 'in_waiting_list', 'extra_data']
def validate_user_absence_reason(self, value):
if not value:

View File

@ -2089,18 +2089,19 @@ class BookingAPI(APIView):
):
raise APIErrorBadRequest(N_('event is marked as checked'), err=5)
if 'extra_data' in serializer.validated_data:
extra_data = self.booking.extra_data or {}
extra_data.update(serializer.validated_data['extra_data'] or {})
serializer.validated_data['extra_data'] = extra_data
serializer.save()
extra_data = {k: v for k, v in request.data.items() if k not in serializer.validated_data}
if extra_data:
self.booking.extra_data = self.booking.extra_data or {}
self.booking.extra_data.update(extra_data)
self.booking.save()
if 'user_was_present' in request.data:
self.booking.secondary_booking_set.update(user_was_present=self.booking.user_was_present)
self.booking.event.set_is_checked()
if 'user_absence_reason' in request.data:
self.booking.secondary_booking_set.update(user_absence_reason=self.booking.user_absence_reason)
if 'extra_data' in request.data:
if extra_data:
self.booking.secondary_booking_set.update(extra_data=self.booking.extra_data)
response = {'err': 0, 'booking_id': self.booking.pk}

View File

@ -638,22 +638,22 @@ def test_booking_patch_api_extra_data(app, user):
app.authorization = ('Basic', ('john.doe', 'password'))
app.patch_json('/api/booking/%s/' % booking.pk, params={'extra_data': {'foo': 'bar'}})
app.patch_json('/api/booking/%s/' % booking.pk, params={'foo': 'bar'})
booking.refresh_from_db()
assert booking.user_was_present is True # not changed
assert booking.extra_data == {'foo': 'bar'}
app.patch_json('/api/booking/%s/' % booking.pk, params={'extra_data': {'foo': 'baz'}})
app.patch_json('/api/booking/%s/' % booking.pk, params={'foo': 'baz'})
booking.refresh_from_db()
assert booking.user_was_present is True # not changed
assert booking.extra_data == {'foo': 'baz'}
app.patch_json('/api/booking/%s/' % booking.pk, params={'extra_data': {'foooo': 'bar'}})
app.patch_json('/api/booking/%s/' % booking.pk, params={'foooo': 'bar'})
booking.refresh_from_db()
assert booking.user_was_present is True # not changed
assert booking.extra_data == {'foo': 'baz', 'foooo': 'bar'}
app.patch_json('/api/booking/%s/' % booking.pk, params={'extra_data': {'foooo': 'baz', 'foo': None}})
app.patch_json('/api/booking/%s/' % booking.pk, params={'foooo': 'baz', 'foo': None})
booking.refresh_from_db()
assert booking.user_was_present is True # not changed
assert booking.extra_data == {'foo': None, 'foooo': 'baz'}
@ -664,7 +664,7 @@ def test_booking_patch_api_extra_data(app, user):
# and other booking
other_booking = Booking.objects.create(event=event)
app.patch_json('/api/booking/%s/' % booking.pk, params={'extra_data': {'foooo': 'baz', 'foo': None}})
app.patch_json('/api/booking/%s/' % booking.pk, params={'foooo': 'baz', 'foo': None})
assert booking.user_was_present is True # not changed
assert booking.extra_data == {'foo': None, 'foooo': 'baz'}
# all secondary bookings are upadted
@ -679,11 +679,7 @@ def test_booking_patch_api_extra_data(app, user):
other_booking.refresh_from_db()
assert other_booking.extra_data is None # not changed
app.patch_json('/api/booking/%s/' % booking.pk, params={'extra_data': None})
booking.refresh_from_db()
assert booking.user_was_present is True # not changed
assert booking.extra_data == {'foo': None, 'foooo': 'baz'} # not changed
app.patch_json('/api/booking/%s/' % booking.pk, params={'extra_data': {}})
app.patch_json('/api/booking/%s/' % booking.pk, params={})
booking.refresh_from_db()
assert booking.user_was_present is True # not changed
assert booking.extra_data == {'foo': None, 'foooo': 'baz'} # not changed