diff --git a/api/custom_auth/serializers.py b/api/custom_auth/serializers.py index 41ffe1e4e1f0..37cfeffaedba 100644 --- a/api/custom_auth/serializers.py +++ b/api/custom_auth/serializers.py @@ -1,8 +1,10 @@ from django.conf import settings +from djoser.conf import settings as djoser_settings from djoser.serializers import UserCreateSerializer, UserDeleteSerializer from rest_framework import serializers from rest_framework.authtoken.models import Token from rest_framework.exceptions import PermissionDenied +from rest_framework.validators import UniqueValidator from organisations.invites.models import Invite from users.constants import DEFAULT_DELETE_ORPHAN_ORGANISATIONS_VALUE @@ -18,17 +20,27 @@ class Meta: class CustomUserCreateSerializer(UserCreateSerializer): - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.fields["key"] = serializers.SerializerMethodField() + key = serializers.SerializerMethodField() class Meta(UserCreateSerializer.Meta): fields = UserCreateSerializer.Meta.fields + ( "is_active", "marketing_consent_given", + "key", ) read_only_fields = ("is_active",) write_only_fields = ("sign_up_type",) + extra_kwargs = { + "email": { + "validators": [ + UniqueValidator( + queryset=FFAdminUser.objects.all(), + lookup="iexact", + message=djoser_settings.CONSTANTS.messages.CANNOT_CREATE_USER_ERROR, + ) + ] + } + } def validate(self, attrs): attrs = super().validate(attrs) @@ -42,8 +54,6 @@ def validate(self, attrs): self.context.get("request"), email=email, raise_exception=True ) - if FFAdminUser.objects.filter(email__iexact=email).count() != 0: - raise serializers.ValidationError({"detail": "Unable to create account"}) attrs["email"] = email.lower() return attrs diff --git a/api/custom_auth/tests/test_serializer.py b/api/custom_auth/tests/test_serializer.py index baa4ad816fc3..ea13be6bafce 100644 --- a/api/custom_auth/tests/test_serializer.py +++ b/api/custom_auth/tests/test_serializer.py @@ -25,7 +25,7 @@ def test_CustomUserCreateSerializer_does_case_insensitive_lookup_with_email(db): # When assert serializer.is_valid() is False - assert serializer.errors["detail"][0].title() == "Unable To Create Account" + assert serializer.errors["email"][0].title() == "Unable To Create Account." def test_CustomUserCreateSerializer_calls_is_authentication_method_valid_correctly_if_auth_controller_is_installed(