Skip to content

Commit d79b64f

Browse files
Korben11apragacz
authored andcommitted
Use the DRF default setting for NON_FIELD_ERRORS_KEY
1 parent d3e2f9a commit d79b64f

File tree

5 files changed

+38
-3
lines changed

5 files changed

+38
-3
lines changed

rest_registration/api/views/login.py

+4
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ def login(request):
3030
try:
3131
user = login_authenticator(serializer.validated_data, serializer=serializer)
3232
except UserNotFound:
33+
if registration_settings.USE_NON_FIELD_ERRORS_KEY_FROM_DRF_SETTINGS:
34+
raise LoginInvalid({
35+
api_settings.NON_FIELD_ERRORS_KEY: [LoginInvalid.default_detail]
36+
}) from None
3337
raise LoginInvalid() from None
3438

3539
extra_data = perform_login(request, user)

rest_registration/api/views/register.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from rest_framework import serializers, status
55
from rest_framework.decorators import api_view, permission_classes
66
from rest_framework.response import Response
7+
from rest_framework.settings import api_settings
78

89
from rest_registration import signals
910
from rest_registration.api.views.login import perform_login
@@ -46,7 +47,10 @@ def register(request):
4647
email_field_name = get_user_email_field_name()
4748
if (email_field_name not in serializer.validated_data
4849
or not serializer.validated_data[email_field_name]):
49-
raise BadRequest(_("User without email cannot be verified"))
50+
detail = _("User without email cannot be verified")
51+
if registration_settings.USE_NON_FIELD_ERRORS_KEY_FROM_DRF_SETTINGS:
52+
raise BadRequest({api_settings.NON_FIELD_ERRORS_KEY: [detail]})
53+
raise BadRequest(detail)
5054

5155
with transaction.atomic():
5256
user = serializer.save(**kwargs)

rest_registration/api/views/register_email.py

+9-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from rest_framework import serializers
44
from rest_framework.decorators import api_view, permission_classes
55
from rest_framework.permissions import IsAuthenticated
6+
from rest_framework.settings import api_settings
67

78
from rest_registration import signals
89
from rest_registration.decorators import (
@@ -68,7 +69,10 @@ def register_email(request):
6869
notification_data, template_config_data, custom_user_address=email)
6970
else:
7071
if email_already_used:
71-
raise BadRequest(_("This email is already registered."))
72+
detail = _("This email is already registered.")
73+
if registration_settings.USE_NON_FIELD_ERRORS_KEY_FROM_DRF_SETTINGS:
74+
raise BadRequest({api_settings.NON_FIELD_ERRORS_KEY: [detail]})
75+
raise BadRequest(detail)
7276

7377
email_field_name = get_user_email_field_name()
7478
old_email = getattr(user, email_field_name)
@@ -118,7 +122,10 @@ def process_verify_email_data(input_data, serializer_context=None):
118122
new_email = data['email']
119123

120124
if is_user_email_field_unique() and user_with_email_exists(new_email):
121-
raise BadRequest(_("This email is already registered."))
125+
detail = _("This email is already registered.")
126+
if registration_settings.USE_NON_FIELD_ERRORS_KEY_FROM_DRF_SETTINGS:
127+
raise BadRequest({api_settings.NON_FIELD_ERRORS_KEY: [detail]})
128+
raise BadRequest(detail)
122129

123130
email_field_name = get_user_email_field_name()
124131
user = get_user_by_verification_id(data['user_id'])

rest_registration/settings_fields.py

+4
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,10 @@ def __new__(
363363
default='rest_registration.utils.responses.build_default_success_response', # noqa: E501
364364
import_string=True,
365365
),
366+
Field(
367+
'USE_NON_FIELD_ERRORS_KEY_FROM_DRF_SETTINGS',
368+
default=False
369+
),
366370
]
367371

368372
PERMISSIONS_SETTINGS_FIELDS = [

tests/api/views/login/test_login.py

+16
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,22 @@ def test_when_faulty_auth_token_manager_then_login_fails(
8080
assert_response_is_bad_request(response)
8181

8282

83+
@override_rest_registration_settings({
84+
'USE_NON_FIELD_ERRORS_KEY_FROM_DRF_SETTINGS': True,
85+
})
86+
def test_invalid_non_field_errors(
87+
settings_minimal,
88+
user, password_change, api_view_provider, api_factory):
89+
request = api_factory.create_post_request({
90+
'login': user.username,
91+
'password': "blah",
92+
})
93+
api_factory.add_session_to_request(request)
94+
response = api_view_provider.view_func(request)
95+
assert "non_field_errors" in response.data
96+
assert_response_is_bad_request(response)
97+
98+
8399
@override_rest_registration_settings({
84100
'LOGIN_SERIALIZER_CLASS': 'tests.testapps.custom_serializers.serializers.DefaultDeprecatedLoginSerializer', # noqa: E501
85101
})

0 commit comments

Comments
 (0)