From 1fe323cbdd12312628d6d53ef7df7e6d7de20fe7 Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Sat, 7 Nov 2020 20:18:59 +0200 Subject: [PATCH] Add soft delete API for signups --- webapp/migrations/0074_signup_deleted.py | 18 ++++++++++++++++++ webapp/models.py | 4 ++-- webapp/tests/test_signup.py | 9 +++++++++ webapp/views.py | 11 ++++++++++- 4 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 webapp/migrations/0074_signup_deleted.py diff --git a/webapp/migrations/0074_signup_deleted.py b/webapp/migrations/0074_signup_deleted.py new file mode 100644 index 0000000..2526461 --- /dev/null +++ b/webapp/migrations/0074_signup_deleted.py @@ -0,0 +1,18 @@ +# Generated by Django 2.1.5 on 2020-11-07 18:00 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('webapp', '0073_auto_20201107_1916'), + ] + + operations = [ + migrations.AddField( + model_name='signup', + name='deleted', + field=models.BooleanField(default=False), + ), + ] diff --git a/webapp/models.py b/webapp/models.py index 6137b23..3349e25 100644 --- a/webapp/models.py +++ b/webapp/models.py @@ -125,7 +125,7 @@ class SignupForm(models.Model): class Signup(models.Model): """ - In + Actual signup into any SignupForm. Deletes are soft. """ class Meta: @@ -140,6 +140,7 @@ class Signup(models.Model): email = models.EmailField(blank=True, null=True) # Random unique identifier. Used for signup editing by the user. uuid = models.UUIDField(default=uuid4, editable=False) + deleted = models.BooleanField(default=False) def __str__(self): return f"{self.signupForm}: {self.list_name} ({self.pk})" @@ -147,7 +148,6 @@ class Signup(models.Model): @receiver(post_save, sender=Signup) def email_on_signup(sender, instance, created, **kwargs): - """Send email validation.""" if created and instance.email: # TODO: Possible bug due to many-to-many relationship with events and forms. # TODO: Subject field crashes with lazy loaded translations. diff --git a/webapp/tests/test_signup.py b/webapp/tests/test_signup.py index 4ec1ef8..5f7f421 100644 --- a/webapp/tests/test_signup.py +++ b/webapp/tests/test_signup.py @@ -56,6 +56,15 @@ class SignupTestCase(APITestCase): self.assertEqual(response.status_code, status.HTTP_201_CREATED) self.assertEqual(Signup.objects.count(), 3) + def test_delete_as_admin(self): + id = self.signup1.id + no_auth_response = self.client.delete(f"{URL}{id}/", format="json") + self.assertEqual(no_auth_response.status_code, status.HTTP_401_UNAUTHORIZED) + self.client.force_authenticate(user=self.authClient) + response = self.client.delete(f"{URL}{id}/", format="json") + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(Signup.objects.get(id=id).deleted, True) + @skip("NotImplemented") def test_get_hidden_forms_admin(self): pass diff --git a/webapp/views.py b/webapp/views.py index 87f2d0d..3800daa 100644 --- a/webapp/views.py +++ b/webapp/views.py @@ -106,7 +106,7 @@ class SignupFormViewSet(ModelViewSet): class SignupViewSet(ModelViewSet): - queryset = Signup.objects.all() + queryset = Signup.objects.filter(deleted=False) serializer_class = SignupSerializer permission_classes = [SignupPermission] @@ -156,6 +156,15 @@ class SignupViewSet(ModelViewSet): else: return JsonResponse(status=404, data={"error": f"SignupForm {id} not found"}) + def destroy(self, request, pk=None, *args, **kwargs): + try: + signup = self.get_object() + signup.deleted = True + signup.save() + return JsonResponse(status=200, data={"message": "OK"}) + except ObjectDoesNotExist: + return JsonResponse(status=404, data={"error": f"Signup {pk} not found"}) + class SavedQuestionsViewSet(ModelViewSet): queryset = TemplateQuestion.objects.all()