diff --git a/modoboa/admin/api.py b/modoboa/admin/api.py index d36184980..bfe452cf7 100644 --- a/modoboa/admin/api.py +++ b/modoboa/admin/api.py @@ -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) diff --git a/modoboa/admin/serializers.py b/modoboa/admin/serializers.py index 730fe9d31..473395656 100644 --- a/modoboa/admin/serializers.py +++ b/modoboa/admin/serializers.py @@ -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)) diff --git a/modoboa/admin/tests/api.py b/modoboa/admin/tests/api.py index a060d96a6..7c610f774 100644 --- a/modoboa/admin/tests/api.py +++ b/modoboa/admin/tests/api.py @@ -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)