From fdbaaf7c60d00080465129172e2e4f9b4ef9fff8 Mon Sep 17 00:00:00 2001 From: H1ako <87087971+H1ako@users.noreply.github.com> Date: Sat, 11 Feb 2023 04:25:16 +0000 Subject: [PATCH 1/6] fixed bug with custom user field --- drfpasswordless/serializers.py | 19 ++++++++++++++++--- tests/conftest.py | 7 ++++++- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/drfpasswordless/serializers.py b/drfpasswordless/serializers.py index 597f4d4..9a932ab 100644 --- a/drfpasswordless/serializers.py +++ b/drfpasswordless/serializers.py @@ -34,6 +34,11 @@ def alias_type(self): # The alias type, either email or mobile raise NotImplementedError + @property + def user_field(self): + # The user field, either email or mobile + raise NotImplementedError + def validate(self, attrs): alias = attrs.get(self.alias_type) @@ -44,15 +49,15 @@ def validate(self, attrs): if api_settings.PASSWORDLESS_REGISTER_NEW_USERS is True: # If new aliases should register new users. try: - user = User.objects.get(**{self.alias_type+'__iexact': alias}) + user = User.objects.get(**{self.user_field+'__iexact': alias}) except User.DoesNotExist: - user = User.objects.create(**{self.alias_type: alias}) + user = User.objects.create(**{self.user_field: alias}) user.set_unusable_password() user.save() else: # If new aliases should not register new users. try: - user = User.objects.get(**{self.alias_type+'__iexact': alias}) + user = User.objects.get(**{self.user_field+'__iexact': alias}) except User.DoesNotExist: user = None @@ -77,6 +82,10 @@ class EmailAuthSerializer(AbstractBaseAliasAuthenticationSerializer): def alias_type(self): return 'email' + @property + def user_field(self): + return api_settings.PASSWORDLESS_USER_EMAIL_FIELD_NAME + email = serializers.EmailField() @@ -85,6 +94,10 @@ class MobileAuthSerializer(AbstractBaseAliasAuthenticationSerializer): def alias_type(self): return 'mobile' + @property + def user_field(self): + return api_settings.PASSWORDLESS_USER_MOBILE_FIELD_NAME + phone_regex = RegexValidator(regex=r'^\+[1-9]\d{1,14}$', message="Mobile number must be entered in the format:" " '+999999999'. Up to 15 digits allowed.") diff --git a/tests/conftest.py b/tests/conftest.py index 9054645..82b0005 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -52,11 +52,16 @@ def pytest_configure(): PASSWORD_HASHERS=( 'django.contrib.auth.hashers.MD5PasswordHasher', ), - AUTH_USER_MODEL='tests.CustomUser', ) try: import django + from django.core.management import call_command + django.setup() + + if settings.DATABASES['default']['NAME'] == ':memory:': + call_command('makemigrations', 'tests') + call_command('migrate', interactive=True) except AttributeError: pass From 91d419e488ab53119572979287b67aa8fdba2113 Mon Sep 17 00:00:00 2001 From: H1ako <87087971+H1ako@users.noreply.github.com> Date: Sat, 11 Feb 2023 04:36:13 +0000 Subject: [PATCH 2/6] removed test db creator --- tests/conftest.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 82b0005..b5601aa 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -59,9 +59,5 @@ def pytest_configure(): from django.core.management import call_command django.setup() - - if settings.DATABASES['default']['NAME'] == ':memory:': - call_command('makemigrations', 'tests') - call_command('migrate', interactive=True) except AttributeError: pass From 2ca724b2262e6d96ab4438ab4f9ad045ba5c0bc6 Mon Sep 17 00:00:00 2001 From: H1ako <87087971+H1ako@users.noreply.github.com> Date: Sat, 11 Feb 2023 04:37:11 +0000 Subject: [PATCH 3/6] returned original user model --- tests/conftest.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/conftest.py b/tests/conftest.py index b5601aa..c1d12c7 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -52,6 +52,7 @@ def pytest_configure(): PASSWORD_HASHERS=( 'django.contrib.auth.hashers.MD5PasswordHasher', ), + AUTH_USER_MODEL='tests.CustomUser', ) try: From d12093ba6f0d0b88f448beaacb2df78b8c8cff5e Mon Sep 17 00:00:00 2001 From: H1ako <87087971+H1ako@users.noreply.github.com> Date: Sat, 11 Feb 2023 04:37:46 +0000 Subject: [PATCH 4/6] removed import --- tests/conftest.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/conftest.py b/tests/conftest.py index c1d12c7..307b1f9 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -57,7 +57,6 @@ def pytest_configure(): try: import django - from django.core.management import call_command django.setup() except AttributeError: From 444ba08099e5f61bba14864950da84de4de07f73 Mon Sep 17 00:00:00 2001 From: H1ako <87087971+H1ako@users.noreply.github.com> Date: Sat, 11 Feb 2023 04:38:36 +0000 Subject: [PATCH 5/6] returned original file format --- tests/conftest.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/conftest.py b/tests/conftest.py index 307b1f9..9054645 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -57,7 +57,6 @@ def pytest_configure(): try: import django - django.setup() except AttributeError: pass From 9d9eeefd6977c95da2a69fc937ae01055716965a Mon Sep 17 00:00:00 2001 From: H1ako <87087971+H1ako@users.noreply.github.com> Date: Sat, 11 Feb 2023 15:32:58 +0000 Subject: [PATCH 6/6] fixed bug with wrong validating and alias type --- drfpasswordless/serializers.py | 40 ++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/drfpasswordless/serializers.py b/drfpasswordless/serializers.py index 9a932ab..02feb8a 100644 --- a/drfpasswordless/serializers.py +++ b/drfpasswordless/serializers.py @@ -35,7 +35,7 @@ def alias_type(self): raise NotImplementedError @property - def user_field(self): + def user_field_type(self): # The user field, either email or mobile raise NotImplementedError @@ -49,15 +49,15 @@ def validate(self, attrs): if api_settings.PASSWORDLESS_REGISTER_NEW_USERS is True: # If new aliases should register new users. try: - user = User.objects.get(**{self.user_field+'__iexact': alias}) + user = User.objects.get(**{self.user_field_type+'__iexact': alias}) except User.DoesNotExist: - user = User.objects.create(**{self.user_field: alias}) + user = User.objects.create(**{self.user_field_type: alias}) user.set_unusable_password() user.save() else: # If new aliases should not register new users. try: - user = User.objects.get(**{self.user_field+'__iexact': alias}) + user = User.objects.get(**{self.user_field_type+'__iexact': alias}) except User.DoesNotExist: user = None @@ -83,7 +83,7 @@ def alias_type(self): return 'email' @property - def user_field(self): + def user_field_type(self): return api_settings.PASSWORDLESS_USER_EMAIL_FIELD_NAME email = serializers.EmailField() @@ -95,7 +95,7 @@ def alias_type(self): return 'mobile' @property - def user_field(self): + def user_field_type(self): return api_settings.PASSWORDLESS_USER_MOBILE_FIELD_NAME phone_regex = RegexValidator(regex=r'^\+[1-9]\d{1,14}$', @@ -119,11 +119,16 @@ def alias_type(self): # The alias type, either email or mobile raise NotImplementedError + @property + def user_field_type(self): + # The user field from settings + raise NotImplementedError + def validate(self, attrs): msg = _('There was a problem with your request.') - if self.alias_type: + if self.user_field_type: # Get request.user # Get their specified valid endpoint # Validate @@ -137,15 +142,15 @@ def validate(self, attrs): msg = _('User account is disabled.') else: - if hasattr(user, self.alias_type): + if hasattr(user, self.user_field_type): # Has the appropriate alias type attrs['user'] = user return attrs else: - msg = _('This user doesn\'t have an %s.' % self.alias_type) + msg = _('This user doesn\'t have an %s.' % self.user_field_type) raise serializers.ValidationError(msg) else: - msg = _('Missing %s.') % self.alias_type + msg = _('Missing %s.') % self.user_field_type raise serializers.ValidationError(msg) @@ -154,12 +159,20 @@ class EmailVerificationSerializer(AbstractBaseAliasVerificationSerializer): def alias_type(self): return 'email' + @property + def user_field_type(self): + return api_settings.PASSWORDLESS_USER_EMAIL_FIELD_NAME + class MobileVerificationSerializer(AbstractBaseAliasVerificationSerializer): @property def alias_type(self): return 'mobile' + @property + def user_field_type(self): + return api_settings.PASSWORDLESS_USER_MOBILE_FIELD_NAME + """ Callback Token @@ -191,6 +204,9 @@ class AbstractBaseCallbackTokenSerializer(serializers.Serializer): token = TokenField(min_length=6, max_length=6, validators=[token_age_validator]) def validate_alias(self, attrs): + email_type = api_settings.PASSWORDLESS_USER_EMAIL_FIELD_NAME + mobile_type = api_settings.PASSWORDLESS_USER_MOBILE_FIELD_NAME + email = attrs.get('email', None) mobile = attrs.get('mobile', None) @@ -201,9 +217,9 @@ def validate_alias(self, attrs): raise serializers.ValidationError() if email: - return 'email', email + return email_type, email elif mobile: - return 'mobile', mobile + return mobile_type, mobile return None