From c76e47be983af2a88ed2351e3b826b427d99f505 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Fri, 18 Mar 2016 11:23:02 +0100 Subject: [PATCH] Filter by domain. see #832 #844 #848 --- modoboa/admin/api.py | 28 ++++++++++++++++++++-------- modoboa/admin/serializers.py | 6 ++++++ modoboa/admin/tests/test_api.py | 20 ++++++++++++++++++++ 3 files changed, 46 insertions(+), 8 deletions(-) diff --git a/modoboa/admin/api.py b/modoboa/admin/api.py index 1bbca82ae..ad44bba21 100644 --- a/modoboa/admin/api.py +++ b/modoboa/admin/api.py @@ -5,7 +5,7 @@ from django.contrib.contenttypes.models import ContentType from rest_framework import viewsets from rest_framework.decorators import list_route from rest_framework.exceptions import ParseError -from rest_framework.permissions import DjangoModelPermissions +from rest_framework.permissions import IsAuthenticated, DjangoModelPermissions from rest_framework.response import Response from modoboa.core import models as core_models @@ -17,7 +17,7 @@ from . import serializers class DomainViewSet(viewsets.ModelViewSet): """ViewSet for Domain.""" - permission_classes = [DjangoModelPermissions, ] + permission_classes = [IsAuthenticated, DjangoModelPermissions, ] serializer_class = serializers.DomainSerializer def get_queryset(self): @@ -32,18 +32,22 @@ class DomainViewSet(viewsets.ModelViewSet): class DomainAliasViewSet(viewsets.ModelViewSet): """ViewSet for DomainAlias.""" - permission_classes = [DjangoModelPermissions, ] + permission_classes = [IsAuthenticated, DjangoModelPermissions, ] serializer_class = serializers.DomainAliasSerializer def get_queryset(self): """Filter queryset based on current user.""" - return models.DomainAlias.objects.get_for_admin(self.request.user) + queryset = models.DomainAlias.objects.get_for_admin(self.request.user) + domain = self.request.query_params.get("domain") + if domain: + queryset = queryset.filter(target__name=domain) + return queryset class AccountViewSet(viewsets.ModelViewSet): """ViewSet for User/Mailbox.""" - permission_classes = [DjangoModelPermissions, ] + permission_classes = [IsAuthenticated, DjangoModelPermissions, ] def get_serializer_class(self): """Return a serializer.""" @@ -57,7 +61,11 @@ class AccountViewSet(viewsets.ModelViewSet): ids = user.objectaccess_set \ .filter(content_type=ContentType.objects.get_for_model(user)) \ .values_list('object_id', flat=True) - return core_models.User.objects.filter(pk__in=ids) + queryset = core_models.User.objects.filter(pk__in=ids) + domain = self.request.query_params.get("domain") + if domain: + queryset = queryset.filter(mailbox__domain__name=domain) + return queryset def perform_destroy(self, instance): """Add custom args to delete call.""" @@ -80,7 +88,7 @@ class AccountViewSet(viewsets.ModelViewSet): class AliasViewSet(viewsets.ModelViewSet): """ViewSet for Alias.""" - permission_classes = [DjangoModelPermissions, ] + permission_classes = [IsAuthenticated, DjangoModelPermissions, ] serializer_class = serializers.AliasSerializer def get_queryset(self): @@ -91,4 +99,8 @@ class AliasViewSet(viewsets.ModelViewSet): content_type=ContentType.objects.get_for_model(models.Alias)) .values_list('object_id', flat=True) ) - return models.Alias.objects.filter(pk__in=ids) + queryset = models.Alias.objects.filter(pk__in=ids) + domain = self.request.query_params.get("domain") + if domain: + queryset = queryset.filter(domain__name=domain) + return queryset diff --git a/modoboa/admin/serializers.py b/modoboa/admin/serializers.py index 6d4c0c50d..1a665c38a 100644 --- a/modoboa/admin/serializers.py +++ b/modoboa/admin/serializers.py @@ -70,6 +70,9 @@ class AccountSerializer(serializers.ModelSerializer): def __init__(self, *args, **kwargs): """Adapt fields to current user.""" super(AccountSerializer, self).__init__(*args, **kwargs) + request = self.context.get("request") + if not request: + return user = self.context["request"].user if not user.is_superuser: del self.fields["master_user"] @@ -95,6 +98,9 @@ class WritableAccountSerializer(AccountSerializer): def __init__(self, *args, **kwargs): """Adapt fields to current user.""" super(WritableAccountSerializer, self).__init__(*args, **kwargs) + request = self.context.get("request") + if not request: + return user = self.context["request"].user self.fields["role"] = serializers.ChoiceField( choices=permissions.get_account_roles(user)) diff --git a/modoboa/admin/tests/test_api.py b/modoboa/admin/tests/test_api.py index 19fe1b9ff..3a33ba072 100644 --- a/modoboa/admin/tests/test_api.py +++ b/modoboa/admin/tests/test_api.py @@ -113,6 +113,11 @@ class DomainAliasAPITestCase(ModoAPITestCase): self.assertEqual(response.status_code, 200) self.assertEqual(response.data["name"], "dalias1.com") + url = reverse("external_api:domain_alias-list") + response = self.client.get("{}?domain=test.com".format(url)) + self.assertEqual(response.status_code, 200) + self.assertEqual(len(response.data), 1) + self.client.credentials( HTTP_AUTHORIZATION='Token ' + self.da_token.key) response = self.client.get(reverse("external_api:domain_alias-list")) @@ -194,6 +199,16 @@ class AccountAPITestCase(ModoAPITestCase): response = json.loads(response.content) self.assertEqual(len(response), 5) + response = self.client.get("{}?domain=test.com".format(url)) + self.assertEqual(response.status_code, 200) + response = json.loads(response.content) + self.assertEqual(len(response), 2) + + response = self.client.get("{}?domain=pouet.com".format(url)) + self.assertEqual(response.status_code, 200) + response = json.loads(response.content) + self.assertEqual(len(response), 0) + def test_create_account(self): """Try to create a new account.""" url = reverse("external_api:account-list") @@ -380,6 +395,11 @@ class AliasAPITestCase(ModoAPITestCase): response = json.loads(response.content) self.assertEqual(len(response), 3) + response = self.client.get("{}?domain=test.com".format(url)) + self.assertEqual(response.status_code, 200) + response = json.loads(response.content) + self.assertEqual(len(response), 3) + def test_get_alias(self): """Retrieve an alias.""" al = models.Alias.objects.get(address="alias@test.com")