From 233a8fe9fd2e5c9842be6059ec799a4787e909d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Lebleu?= Date: Mon, 8 Feb 2021 19:13:34 +0100 Subject: [PATCH] Wrap ModelViewSet requests to a revision block --- modoboa/admin/api.py | 11 ++++++----- modoboa/admin/tests/test_api.py | 6 ++++-- modoboa/lib/viewsets.py | 11 +++++++++++ modoboa/relaydomains/viewsets.py | 3 ++- 4 files changed, 23 insertions(+), 8 deletions(-) create mode 100644 modoboa/lib/viewsets.py diff --git a/modoboa/admin/api.py b/modoboa/admin/api.py index 7a1b04e6c..8f0267c2a 100644 --- a/modoboa/admin/api.py +++ b/modoboa/admin/api.py @@ -13,6 +13,7 @@ from rest_framework.response import Response from modoboa.core import models as core_models from modoboa.core import sms_backends +from modoboa.lib.viewsets import RevisionModelMixin from . import lib, models, serializers @@ -31,7 +32,7 @@ from . import lib, models, serializers summary="Create a new domain" ) ) -class DomainViewSet(viewsets.ModelViewSet): +class DomainViewSet(RevisionModelMixin, viewsets.ModelViewSet): """Domain viewset.""" permission_classes = [IsAuthenticated, DjangoModelPermissions, ] @@ -46,7 +47,7 @@ class DomainViewSet(viewsets.ModelViewSet): instance.delete(self.request.user) -class DomainAliasViewSet(viewsets.ModelViewSet): +class DomainAliasViewSet(RevisionModelMixin, viewsets.ModelViewSet): """ViewSet for DomainAlias.""" permission_classes = [IsAuthenticated, DjangoModelPermissions, ] @@ -62,7 +63,7 @@ class DomainAliasViewSet(viewsets.ModelViewSet): return queryset -class AccountViewSet(viewsets.ModelViewSet): +class AccountViewSet(RevisionModelMixin, viewsets.ModelViewSet): """ViewSet for User/Mailbox.""" filter_backends = [filters.SearchFilter] @@ -157,7 +158,7 @@ class AccountViewSet(viewsets.ModelViewSet): return Response(body) -class AliasViewSet(viewsets.ModelViewSet): +class AliasViewSet(RevisionModelMixin, viewsets.ModelViewSet): """ create: Create a new alias instance. @@ -182,7 +183,7 @@ class AliasViewSet(viewsets.ModelViewSet): return queryset -class SenderAddressViewSet(viewsets.ModelViewSet): +class SenderAddressViewSet(RevisionModelMixin, viewsets.ModelViewSet): """View set for SenderAddress model.""" permission_classes = [IsAuthenticated, DjangoModelPermissions, ] diff --git a/modoboa/admin/tests/test_api.py b/modoboa/admin/tests/test_api.py index 982ff5aa6..727154239 100644 --- a/modoboa/admin/tests/test_api.py +++ b/modoboa/admin/tests/test_api.py @@ -10,6 +10,7 @@ from django.test import override_settings from django.urls import reverse from rest_framework.authtoken.models import Token +from reversion.models import Version from modoboa.admin import models as admin_models from modoboa.core import factories as core_factories, models as core_models @@ -51,8 +52,9 @@ class DomainAPITestCase(ModoAPITestCase): url, {"name": "test3.com", "quota": 0, "default_mailbox_quota": 10} ) self.assertEqual(response.status_code, 201) - self.assertTrue( - models.Domain.objects.filter(name="test3.com").exists()) + domain = models.Domain.objects.get(name="test3.com") + self.assertEqual(Version.objects.get_for_object(domain).count(), 1) + response = self.client.post(url, {}) self.assertEqual(response.status_code, 400) self.assertIn("name", response.data) diff --git a/modoboa/lib/viewsets.py b/modoboa/lib/viewsets.py new file mode 100644 index 000000000..b97fd9a1d --- /dev/null +++ b/modoboa/lib/viewsets.py @@ -0,0 +1,11 @@ +"""ViewSet related mixins and tools.""" + +from reversion.views import RevisionMixin + + +class RevisionModelMixin(RevisionMixin): + """ + A mixin to wrap every request in a revision block. + """ + + pass diff --git a/modoboa/relaydomains/viewsets.py b/modoboa/relaydomains/viewsets.py index d7de1b82d..35841af6a 100644 --- a/modoboa/relaydomains/viewsets.py +++ b/modoboa/relaydomains/viewsets.py @@ -4,10 +4,11 @@ from rest_framework import viewsets from rest_framework.permissions import DjangoModelPermissions, IsAuthenticated from modoboa.admin import models as admin_models +from modoboa.lib.viewsets import RevisionModelMixin from . import serializers -class RelayDomainViewSet(viewsets.ModelViewSet): +class RelayDomainViewSet(RevisionModelMixin, viewsets.ModelViewSet): """RelayDomain viewset.""" permission_classes = [IsAuthenticated, DjangoModelPermissions, ]