Projet

Général

Profil

0001-api-add-anonymize-booking-endpoint-49093.patch

Valentin Deniaud, 25 janvier 2021 16:11

Télécharger (4,97 ko)

Voir les différences:

Subject: [PATCH] api: add anonymize booking endpoint (#49093)

 .../management/commands/anonymize_bookings.py      | 10 +---------
 chrono/agendas/models.py                           | 11 +++++++++++
 chrono/api/urls.py                                 |  1 +
 chrono/api/views.py                                | 14 ++++++++++++++
 tests/test_api.py                                  | 14 ++++++++++++++
 5 files changed, 41 insertions(+), 9 deletions(-)
chrono/agendas/management/commands/anonymize_bookings.py
32 32
            event__start_datetime__lt=timezone.now()
33 33
            - timedelta(days=1) * F('event__agenda__anonymize_delay'),
34 34
        )
35

  
36
        bookings_to_anonymize.update(
37
            label='',
38
            user_display_label='',
39
            user_external_id='',
40
            user_name='',
41
            extra_data={},
42
            anonymization_datetime=timezone.now(),
43
        )
35
        Booking.anonymize_bookings(bookings_to_anonymize)
chrono/agendas/models.py
1136 1136
            self.secondary_booking_set.update(in_waiting_list=True)
1137 1137
            self.save()
1138 1138

  
1139
    @classmethod
1140
    def anonymize_bookings(cls, bookings_queryset):
1141
        bookings_queryset.update(
1142
            label='',
1143
            user_display_label='',
1144
            user_external_id='',
1145
            user_name='',
1146
            extra_data={},
1147
            anonymization_datetime=now(),
1148
        )
1149

  
1139 1150
    def get_ics(self, request=None):
1140 1151
        ics = vobject.iCalendar()
1141 1152
        ics.add('prodid').value = '-//Entr\'ouvert//NON SGML Publik'
chrono/api/urls.py
58 58
    url(r'^booking/(?P<booking_pk>\w+)/$', views.booking, name='api-booking'),
59 59
    url(r'^booking/(?P<booking_pk>\w+)/cancel/$', views.cancel_booking, name='api-cancel-booking'),
60 60
    url(r'^booking/(?P<booking_pk>\w+)/accept/$', views.accept_booking, name='api-accept-booking'),
61
    url(r'^booking/(?P<booking_pk>\w+)/anonymize/$', views.anonymize_booking, name='api-anonymize-booking'),
61 62
    url(r'^booking/(?P<booking_pk>\w+)/suspend/$', views.suspend_booking, name='api-suspend-booking'),
62 63
    url(r'^booking/(?P<booking_pk>\w+)/resize/$', views.resize_booking, name='api-resize-booking'),
63 64
    url(r'^booking/(?P<booking_pk>\w+)/ics/$', views.booking_ics, name='api-booking-ics'),
chrono/api/views.py
1409 1409
suspend_booking = SuspendBooking.as_view()
1410 1410

  
1411 1411

  
1412
class AnonymizeBooking(APIView):
1413
    permission_classes = (permissions.IsAuthenticated,)
1414

  
1415
    def post(self, request, booking_pk=None, format=None):
1416
        booking = get_object_or_404(Booking, pk=booking_pk)
1417
        bookings = Booking.objects.filter(Q(pk=booking.pk) | Q(primary_booking=booking.pk))
1418
        Booking.anonymize_bookings(bookings)
1419
        response = {'err': 0, 'booking_id': booking.pk}
1420
        return Response(response)
1421

  
1422

  
1423
anonymize_booking = AnonymizeBooking.as_view()
1424

  
1425

  
1412 1426
class ResizeSerializer(serializers.Serializer):
1413 1427
    count = serializers.IntegerField(min_value=1)
1414 1428

  
tests/test_api.py
2806 2806
    app.post('/api/booking/%s/resize/' % booking.pk, params={'count': 42}, status=404)
2807 2807

  
2808 2808

  
2809
def test_anonymize_booking(app, user):
2810
    agenda = Agenda.objects.create(label='Foo bar')
2811
    event = Event.objects.create(start_datetime=now(), places=5, agenda=agenda)
2812
    Booking.objects.create(event=event, label='not to anonymize')
2813
    booking = Booking.objects.create(event=event, label='test')
2814
    secondary_booking = Booking.objects.create(event=event, label='test secondary', primary_booking=booking)
2815
    app.authorization = ('Basic', ('john.doe', 'password'))
2816

  
2817
    resp = app.post('/api/booking/%s/anonymize/' % booking.pk)
2818
    assert resp.json['err'] == 0
2819
    assert Booking.objects.filter(anonymization_datetime__isnull=False).count() == 2
2820
    assert Booking.objects.filter(label='').count() == 2
2821

  
2822

  
2809 2823
def test_multiple_booking_api(app, some_data, user):
2810 2824
    agenda = Agenda.objects.filter(label=u'Foo bar')[0]
2811 2825
    event = [x for x in Event.objects.filter(agenda=agenda) if x.in_bookable_period()][0]
2812
-