Browse Source

#923: bugfixed add_error

Rafał Pitoń 7 years ago
parent
commit
54d950e95a
2 changed files with 21 additions and 6 deletions
  1. 16 3
      misago/users/serializers/register.py
  2. 5 3
      misago/users/tests/test_user_create_api.py

+ 16 - 3
misago/users/serializers/register.py

@@ -3,6 +3,7 @@ from rest_framework import serializers
 from django.contrib.auth import get_user_model
 from django.contrib.auth.password_validation import validate_password
 from django.core.exceptions import ValidationError
+from django.utils import six
 from django.utils.translation import ugettext as _
 
 from misago.users import captcha, validators
@@ -74,7 +75,7 @@ class RegisterUserSerializer(serializers.Serializer):
         try:
             captcha.test_request(self.context['request'])
         except ValidationError as e:
-            raise serializers.ValidationError({'captcha': [e.args[0]]})
+            raise serializers.ValidationError({'captcha': e.message})
 
         return data
 
@@ -89,5 +90,17 @@ class RegisterUserSerializer(serializers.Serializer):
             )
 
     def add_error(self, field, error):
-        """we are using custom implementation so custom validators work"""
-        self._added_errors.setdefault(field, []).append(error)
+        """
+        custom implementation for quasi add_error feature for custom validators
+        we are doing some hacky introspection here to deconstruct ValidationError
+        """
+        self._added_errors.setdefault(field, [])
+
+        if isinstance(error, ValidationError):
+            self._added_errors[field].extend(list(error))
+        elif isinstance(error, serializers.ValidationError):
+            details = [e['message'] for e in error.get_full_details()]
+            self._added_errors[field].extend(details)
+        else:
+            self._added_errors[field].append(six.text_type(error))
+

+ 5 - 3
misago/users/tests/test_user_create_api.py

@@ -285,11 +285,13 @@ class UserCreateTests(UserTestCase):
             data={
                 'username': 'Bob',
                 'email': 'l.o.r.e.m.i.p.s.u.m@gmail.com',
-                'password': 'pas123',
+                'password': 'pass1234',
             },
         )
-
-        self.assertContains(response, "email is not allowed", status_code=400)
+        self.assertEqual(response.status_code, 400)
+        self.assertEqual(response.json(), {
+            'email': ["This email is not allowed."]
+        })
 
     def test_registration_creates_active_user(self):
         """api creates active and signed in user on POST"""