From 33141992c4b8082384ddd6f94d7270ff1f1c9b0b Mon Sep 17 00:00:00 2001 From: Valentin Deniaud Date: Thu, 17 Dec 2020 18:20:29 +0100 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(-) diff --git a/chrono/agendas/management/commands/anonymize_bookings.py b/chrono/agendas/management/commands/anonymize_bookings.py index fed270b..e4540e8 100644 --- a/chrono/agendas/management/commands/anonymize_bookings.py +++ b/chrono/agendas/management/commands/anonymize_bookings.py @@ -32,12 +32,4 @@ class Command(BaseCommand): event__start_datetime__lt=timezone.now() - timedelta(days=1) * F('event__agenda__anonymize_delay'), ) - - bookings_to_anonymize.update( - label='', - user_display_label='', - user_external_id='', - user_name='', - extra_data={}, - anonymization_datetime=timezone.now(), - ) + Booking.anonymize_bookings(bookings_to_anonymize) diff --git a/chrono/agendas/models.py b/chrono/agendas/models.py index e26127d..15f163f 100644 --- a/chrono/agendas/models.py +++ b/chrono/agendas/models.py @@ -1136,6 +1136,17 @@ class Booking(models.Model): self.secondary_booking_set.update(in_waiting_list=True) self.save() + @classmethod + def anonymize_bookings(cls, bookings_queryset): + bookings_queryset.update( + label='', + user_display_label='', + user_external_id='', + user_name='', + extra_data={}, + anonymization_datetime=now(), + ) + def get_ics(self, request=None): ics = vobject.iCalendar() ics.add('prodid').value = '-//Entr\'ouvert//NON SGML Publik' diff --git a/chrono/api/urls.py b/chrono/api/urls.py index 3ba16d0..c1d7379 100644 --- a/chrono/api/urls.py +++ b/chrono/api/urls.py @@ -58,6 +58,7 @@ urlpatterns = [ url(r'^booking/(?P\w+)/$', views.booking, name='api-booking'), url(r'^booking/(?P\w+)/cancel/$', views.cancel_booking, name='api-cancel-booking'), url(r'^booking/(?P\w+)/accept/$', views.accept_booking, name='api-accept-booking'), + url(r'^booking/(?P\w+)/anonymize/$', views.anonymize_booking, name='api-anonymize-booking'), url(r'^booking/(?P\w+)/suspend/$', views.suspend_booking, name='api-suspend-booking'), url(r'^booking/(?P\w+)/resize/$', views.resize_booking, name='api-resize-booking'), url(r'^booking/(?P\w+)/ics/$', views.booking_ics, name='api-booking-ics'), diff --git a/chrono/api/views.py b/chrono/api/views.py index b2a520a..bad1360 100644 --- a/chrono/api/views.py +++ b/chrono/api/views.py @@ -1409,6 +1409,20 @@ class SuspendBooking(APIView): suspend_booking = SuspendBooking.as_view() +class AnonymizeBooking(APIView): + permission_classes = (permissions.IsAuthenticated,) + + def post(self, request, booking_pk=None, format=None): + booking = get_object_or_404(Booking, pk=booking_pk) + bookings = Booking.objects.filter(Q(pk=booking.pk) | Q(primary_booking=booking.pk)) + Booking.anonymize_bookings(bookings) + response = {'err': 0, 'booking_id': booking.pk} + return Response(response) + + +anonymize_booking = AnonymizeBooking.as_view() + + class ResizeSerializer(serializers.Serializer): count = serializers.IntegerField(min_value=1) diff --git a/tests/test_api.py b/tests/test_api.py index 3c84820..0d5be95 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -2806,6 +2806,20 @@ def test_resize_booking_non_event_agenda(app, user): app.post('/api/booking/%s/resize/' % booking.pk, params={'count': 42}, status=404) +def test_anonymize_booking(app, user): + agenda = Agenda.objects.create(label='Foo bar') + event = Event.objects.create(start_datetime=now(), places=5, agenda=agenda) + Booking.objects.create(event=event, label='not to anonymize') + booking = Booking.objects.create(event=event, label='test') + secondary_booking = Booking.objects.create(event=event, label='test secondary', primary_booking=booking) + app.authorization = ('Basic', ('john.doe', 'password')) + + resp = app.post('/api/booking/%s/anonymize/' % booking.pk) + assert resp.json['err'] == 0 + assert Booking.objects.filter(anonymization_datetime__isnull=False).count() == 2 + assert Booking.objects.filter(label='').count() == 2 + + def test_multiple_booking_api(app, some_data, user): agenda = Agenda.objects.filter(label=u'Foo bar')[0] event = [x for x in Event.objects.filter(agenda=agenda) if x.in_bookable_period()][0] -- 2.20.1