Projet

Général

Profil

0001-api-patch-booking-extra_data-51340.patch

Lauréline Guérin, 23 février 2021 09:01

Télécharger (5,01 ko)

Voir les différences:

Subject: [PATCH] api: patch booking extra_data (#51340)

 chrono/api/views.py |  9 ++++++-
 tests/test_api.py   | 58 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 66 insertions(+), 1 deletion(-)
chrono/api/views.py
1243 1243

  
1244 1244
    class Meta:
1245 1245
        model = Booking
1246
        fields = ['user_was_present', 'user_absence_reason']
1246
        fields = ['user_was_present', 'user_absence_reason', 'extra_data']
1247 1247

  
1248 1248
    def validate_user_absence_reason(self, value):
1249 1249
        if value is None:
......
1308 1308
                status=status.HTTP_400_BAD_REQUEST,
1309 1309
            )
1310 1310

  
1311
        if 'extra_data' in serializer.validated_data:
1312
            extra_data = self.booking.extra_data or {}
1313
            extra_data.update(serializer.validated_data['extra_data'] or {})
1314
            serializer.validated_data['extra_data'] = extra_data
1315

  
1311 1316
        serializer.save()
1312 1317
        if 'user_was_present' in request.data:
1313 1318
            self.booking.secondary_booking_set.update(user_was_present=self.booking.user_was_present)
1314 1319
        if 'user_absence_reason' in request.data:
1315 1320
            self.booking.secondary_booking_set.update(user_absence_reason=self.booking.user_absence_reason)
1321
        if 'extra_data' in request.data:
1322
            self.booking.secondary_booking_set.update(extra_data=self.booking.extra_data)
1316 1323

  
1317 1324
        response = {'err': 0, 'booking_id': self.booking.pk}
1318 1325
        return Response(response)
tests/test_api.py
2093 2093
    assert other_booking.user_absence_reason == ''  # not changed
2094 2094

  
2095 2095

  
2096
def test_booking_patch_api_extra_data(app, user):
2097
    agenda = Agenda.objects.create(kind='events')
2098
    event = Event.objects.create(agenda=agenda, start_datetime=now(), places=10)
2099
    booking = Booking.objects.create(event=event, user_was_present=True)
2100

  
2101
    app.authorization = ('Basic', ('john.doe', 'password'))
2102

  
2103
    app.patch_json('/api/booking/%s/' % booking.pk, params={'extra_data': {'foo': 'bar'}})
2104
    booking.refresh_from_db()
2105
    assert booking.user_was_present is True  # not changed
2106
    assert booking.extra_data == {'foo': 'bar'}
2107

  
2108
    app.patch_json('/api/booking/%s/' % booking.pk, params={'extra_data': {'foo': 'baz'}})
2109
    booking.refresh_from_db()
2110
    assert booking.user_was_present is True  # not changed
2111
    assert booking.extra_data == {'foo': 'baz'}
2112

  
2113
    app.patch_json('/api/booking/%s/' % booking.pk, params={'extra_data': {'foooo': 'bar'}})
2114
    booking.refresh_from_db()
2115
    assert booking.user_was_present is True  # not changed
2116
    assert booking.extra_data == {'foo': 'baz', 'foooo': 'bar'}
2117

  
2118
    app.patch_json('/api/booking/%s/' % booking.pk, params={'extra_data': {'foooo': 'baz', 'foo': None}})
2119
    booking.refresh_from_db()
2120
    assert booking.user_was_present is True  # not changed
2121
    assert booking.extra_data == {'foo': None, 'foooo': 'baz'}
2122

  
2123
    # make secondary bookings
2124
    Booking.objects.create(event=event, primary_booking=booking, user_was_present=False)
2125
    Booking.objects.create(event=event, primary_booking=booking, user_was_present=False)
2126
    # and other booking
2127
    other_booking = Booking.objects.create(event=event)
2128

  
2129
    app.patch_json('/api/booking/%s/' % booking.pk, params={'extra_data': {'foooo': 'baz', 'foo': None}})
2130
    assert booking.user_was_present is True  # not changed
2131
    assert booking.extra_data == {'foo': None, 'foooo': 'baz'}
2132
    # all secondary bookings are upadted
2133
    assert list(booking.secondary_booking_set.values_list('extra_data', flat=True)) == [
2134
        {'foo': None, 'foooo': 'baz'},
2135
        {'foo': None, 'foooo': 'baz'},
2136
    ]
2137
    assert list(booking.secondary_booking_set.values_list('user_was_present', flat=True)) == [
2138
        False,
2139
        False,
2140
    ]  # not changed
2141
    other_booking.refresh_from_db()
2142
    assert other_booking.extra_data is None  # not changed
2143

  
2144
    app.patch_json('/api/booking/%s/' % booking.pk, params={'extra_data': None})
2145
    booking.refresh_from_db()
2146
    assert booking.user_was_present is True  # not changed
2147
    assert booking.extra_data == {'foo': None, 'foooo': 'baz'}  # not changed
2148
    app.patch_json('/api/booking/%s/' % booking.pk, params={'extra_data': {}})
2149
    booking.refresh_from_db()
2150
    assert booking.user_was_present is True  # not changed
2151
    assert booking.extra_data == {'foo': None, 'foooo': 'baz'}  # not changed
2152

  
2153

  
2096 2154
def test_booking_cancellation_api(app, some_data, user):
2097 2155
    agenda = Agenda.objects.filter(label=u'Foo bar')[0]
2098 2156
    event = [x for x in Event.objects.filter(agenda=agenda) if x.in_bookable_period()][0]
2099
-