diff --git a/chrono/api/serializers.py b/chrono/api/serializers.py index 10058394..15adc9cd 100644 --- a/chrono/api/serializers.py +++ b/chrono/api/serializers.py @@ -164,6 +164,10 @@ class BookingSerializer(serializers.ModelSerializer): fields = [ 'id', 'in_waiting_list', + 'user_first_name', + 'user_last_name', + 'user_email', + 'user_phone_number', 'user_was_present', 'user_absence_reason', 'user_presence_reason', diff --git a/chrono/api/views.py b/chrono/api/views.py index 24d6aab0..9c9c3e7f 100644 --- a/chrono/api/views.py +++ b/chrono/api/views.py @@ -2419,13 +2419,24 @@ class BookingAPI(APIView): 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() + secondary_bookings_update = {} + for key in [ + 'user_was_present', + 'user_first_name', + 'user_last_name', + 'user_email', + 'user_phone_number', + ]: + if key in request.data: + secondary_bookings_update[key] = getattr(self.booking, key) if 'user_absence_reason' in request.data or 'user_presence_reason' in request.data: - self.booking.secondary_booking_set.update(user_check_type=self.booking.user_check_type) + secondary_bookings_update['user_check_type'] = self.booking.user_check_type if extra_data: - self.booking.secondary_booking_set.update(extra_data=self.booking.extra_data) + secondary_bookings_update['extra_data'] = self.booking.extra_data + if secondary_bookings_update: + self.booking.secondary_booking_set.update(**secondary_bookings_update) + if 'user_was_present' in request.data: + self.booking.event.set_is_checked() response = {'err': 0, 'booking_id': self.booking.pk} return Response(response) diff --git a/tests/api/test_booking.py b/tests/api/test_booking.py index 1b600962..07ed8df3 100644 --- a/tests/api/test_booking.py +++ b/tests/api/test_booking.py @@ -145,6 +145,10 @@ def test_bookings_api(app, user): { 'id': meetings_booking1.pk, 'in_waiting_list': False, + 'user_first_name': '', + 'user_last_name': '', + 'user_email': '', + 'user_phone_number': '', 'user_was_present': None, 'user_absence_reason': '', 'user_presence_reason': '', @@ -153,6 +157,10 @@ def test_bookings_api(app, user): { 'id': events_booking1.pk, 'in_waiting_list': False, + 'user_first_name': '', + 'user_last_name': '', + 'user_email': '', + 'user_phone_number': '', 'user_was_present': None, 'user_absence_reason': '', 'user_presence_reason': '', @@ -162,6 +170,10 @@ def test_bookings_api(app, user): { 'id': events_booking2.pk, 'in_waiting_list': False, + 'user_first_name': '', + 'user_last_name': '', + 'user_email': '', + 'user_phone_number': '', 'user_was_present': None, 'user_absence_reason': '', 'user_presence_reason': '', @@ -575,7 +587,7 @@ def test_booking_patch_api_present(app, user, flag): app.patch_json('/api/booking/%s/' % booking.pk, params={'user_was_present': flag}) booking.refresh_from_db() assert booking.user_was_present == flag - # all secondary bookings are upadted + # all secondary bookings are updated assert list(booking.secondary_booking_set.values_list('user_was_present', flat=True)) == [flag, flag] other_booking.refresh_from_db() assert other_booking.user_was_present is None # not changed @@ -854,6 +866,41 @@ def test_booking_patch_api_both_reasons(app, user): assert resp.json['err_desc'] == 'invalid payload' +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) + # make secondary bookings + Booking.objects.create(event=event, primary_booking=booking) + Booking.objects.create(event=event, primary_booking=booking) + # and other booking + other_booking = Booking.objects.create(event=event) + + app.authorization = ('Basic', ('john.doe', 'password')) + + to_test = [ + ('user_first_name', 'fooo'), + ('user_first_name', ''), + ('user_last_name', 'baaaar'), + ('user_last_name', ''), + ('user_email', 'fooo@baaaar.com'), + ('user_email', ''), + ('user_phone_number', '0606'), + ('user_phone_number', ''), + ] + for key, value in to_test: + params = { + key: value, + } + app.patch_json('/api/booking/%s/' % booking.pk, params=params) + booking.refresh_from_db() + assert getattr(booking, key) == value + # all secondary bookings are updated + assert list(booking.secondary_booking_set.values_list(key, flat=True)) == [value, value] + other_booking.refresh_from_db() + assert getattr(other_booking, key) == '' # not changed + + def test_booking_patch_api_extra_data(app, user): agenda = Agenda.objects.create(kind='events') event = Event.objects.create(agenda=agenda, start_datetime=now(), places=10)