Filter by domain.

see #832 #844 #848
This commit is contained in:
Antoine Nguyen
2016-03-18 11:23:02 +01:00
parent d2ec190266
commit c76e47be98
3 changed files with 46 additions and 8 deletions
+20 -8
View File
@@ -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
+6
View File
@@ -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))
+20
View File
@@ -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")