mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-10-18 05:51:26 +02:00
+17
-1
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user