Add /exists/ service.

see #832
This commit is contained in:
Antoine Nguyen
2016-03-08 18:48:46 +01:00
parent 0ff132014a
commit a92a3724da
3 changed files with 41 additions and 3 deletions
+17 -1
View File
@@ -3,7 +3,10 @@
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.response import Response
from modoboa.core import models as core_models
@@ -35,7 +38,7 @@ class AccountViewSet(viewsets.ModelViewSet):
"""Return a serializer."""
if self.request.method == "GET":
return serializers.AccountSerializer
return serializers.CreateAccountSerializer
return serializers.WritableAccountSerializer
def get_queryset(self):
"""Filter queryset based on current user."""
@@ -48,3 +51,16 @@ class AccountViewSet(viewsets.ModelViewSet):
def perform_destroy(self, instance):
"""Add custom args to delete call."""
instance.delete(self.request.user)
@list_route()
def exists(self, request):
"""Check if account exists."""
email = request.GET.get("email")
if not email:
raise ParseError("email not provided")
if not core_models.User.objects.filter(email=email).exists():
data = {"exists": False}
else:
data = {"exists": True}
serializer = serializers.AccountExistsSerializer(data)
return Response(serializer.data)
+8 -2
View File
@@ -65,7 +65,13 @@ class AccountSerializer(serializers.ModelSerializer):
return account.group
class CreateAccountSerializer(AccountSerializer):
class AccountExistsSerializer(serializers.Serializer):
"""Simple serializer used with existence checks."""
exists = serializers.BooleanField()
class WritableAccountSerializer(AccountSerializer):
"""Serializer to create account."""
class Meta(AccountSerializer.Meta):
@@ -74,7 +80,7 @@ class CreateAccountSerializer(AccountSerializer):
def __init__(self, *args, **kwargs):
"""Adapt fields to current user."""
super(CreateAccountSerializer, self).__init__(*args, **kwargs)
super(WritableAccountSerializer, self).__init__(*args, **kwargs)
user = self.context["request"].user
self.fields["role"] = serializers.ChoiceField(
choices=permissions.get_account_roles(user))
+16
View File
@@ -256,3 +256,19 @@ class AccountAPITestCase(ModoAPITestCase):
self.assertFalse(
core_models.User.objects.filter(pk=account.pk).exists())
self.assertFalse(domadmin.can_access(account))
def test_account_exists(self):
"""Validate /exists/ service."""
url = reverse("external_api:account-exists")
response = self.client.get(
"{}?email={}".format(url, "user@test.com"))
self.assertEqual(response.status_code, 200)
content = json.loads(response.content)
self.assertTrue(content["exists"])
response = self.client.get(
"{}?email={}".format(url, "pipo@test.com"))
self.assertEqual(response.status_code, 200)
content = json.loads(response.content)
self.assertFalse(content["exists"])
response = self.client.get(url)
self.assertEqual(response.status_code, 400)