Rafał Pitoń 7 лет назад
Родитель
Сommit
50e7b1dc63

+ 1 - 1
misago/categories/context_processors.py

@@ -12,7 +12,7 @@ def preload_categories_json(request):
     except AttributeError:
         return {}
         
-    cache_key = 'misago_categories_json_{}'.format(request.user.acl_key)
+    cache_key = 'misago_categories_json_{}'.format(user_acl_key)
     categories_json = cache.get(cache_key, 'nada')
     if categories_json == 'nada':
         is_root = Q(level=0)

+ 1 - 1
misago/core/errorpages.py

@@ -33,7 +33,7 @@ def banned(request, exception):
             'ban': ban.get_serialized_message(),
         },
     })
-
+    
     return render(
         request, 'misago/errorpages/banned.html', {
             'ban': ban,

+ 0 - 2
misago/core/tests/test_errorpages.py

@@ -22,9 +22,7 @@ class ErrorPageViewsTests(TestCase):
     def test_banned_returns_403(self):
         """banned error page has no show-stoppers"""
         response = self.client.get(reverse('raise-misago-banned'))
-        self.assertContains(response, "misago:error-banned", status_code=403)
         self.assertContains(response, "<p>Banned for test!</p>", status_code=403)
-        self.assertContains(response, encode_json_html("<p>Banned for test!</p>"), status_code=403)
 
     def test_permission_denied_returns_403(self):
         """permission_denied error page has no show-stoppers"""

+ 17 - 17
misago/templates/misago/errorpages/ban_message.html

@@ -1,21 +1,21 @@
 {% load i18n %}
-{% with ban.get_serialized_message.message as ban_message %}
-    {% if ban_message.html %}
-        <div class="lead">
-            {{ ban_message.html|safe }}
-        </div>
-    {% else %}
-        <p class="lead">
-            {{ ban_message.plain }}
-        </p>
-    {% endif %}
+{% with ban.get_serialized_message.detail as ban_detail %}
+  {% if ban_detail.html %}
+    <div class="lead">
+      {{ ban_detail.html|safe }}
+    </div>
+  {% else %}
+    <p class="lead">
+      {{ ban_detail.plain }}
+    </p>
+  {% endif %}
 {% endwith %}
 <p className="message-footnote">
-    {% if ban.expires_on %}
-        {% blocktrans trimmed with expires_on=ban.expires_on|date:"DATETIME_FORMAT" %}
-            This ban expires on {{ expires_on }}.
-        {% endblocktrans %}
-    {% else %}
-        {% trans "This ban is permanent." %}
-    {% endif %}
+  {% if ban.expires_on %}
+    {% blocktrans trimmed with expires_on=ban.expires_on|date:"DATETIME_FORMAT" %}
+      This ban expires on {{ expires_on }}.
+    {% endblocktrans %}
+  {% else %}
+    {% trans "This ban is permanent." %}
+  {% endif %}
 </p>

+ 2 - 0
misago/threads/serializers/thread.py

@@ -110,6 +110,7 @@ class ThreadsListSerializer(ThreadSerializer):
             real_name = obj.starter.get_real_name()
         else:
             avatars = None
+            real_name = None
 
         return {
             'id': obj.starter_id,
@@ -125,6 +126,7 @@ class ThreadsListSerializer(ThreadSerializer):
             real_name = obj.last_poster.get_real_name()
         else:
             avatars = None
+            real_name = None
 
         return {
             'id': obj.last_poster_id,

+ 1 - 1
misago/users/registration.py

@@ -27,7 +27,7 @@ def send_welcome_email(request, user):
 
 
 def get_registration_result_json(user):
-    activation_method = 'active'
+    activation_method = None
     if user.requires_activation_by_admin:
         activation_method = 'admin'
     elif user.requires_activation_by_user:

+ 47 - 25
misago/users/serializers/register.py

@@ -13,7 +13,7 @@ from misago.users.bans import get_email_ban, get_username_ban
 UserModel = get_user_model()
 
 
-class RegisterUserSerializer(serializers.Serializer):
+class BaseRegisterUserSerializer(serializers.Serializer):
     username = serializers.CharField(
         max_length=255,
         validators=[validators.validate_username],
@@ -22,10 +22,6 @@ class RegisterUserSerializer(serializers.Serializer):
         max_length=255,
         validators=[validators.validate_email],
     )
-    password = serializers.CharField(
-        max_length=255,
-        trim_whitespace=False,
-    )
 
     def validate_username(self, data):
         ban = get_username_ban(data, registration_only=True)
@@ -45,10 +41,54 @@ class RegisterUserSerializer(serializers.Serializer):
                 raise ValidationError(_("This e-mail address is not allowed."))
         return data
 
+    def validate_added_errors(self):
+        if self._added_errors:
+            # fail registration with additional errors
+            raise serializers.ValidationError(self._added_errors)
+            
     def validate(self, data):
+        self._added_errors = {}
+        return data
+
+    def add_error(self, field, 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))
+
+
+class SocialRegisterUserSerializer(BaseRegisterUserSerializer):
+    def validate(self, data):
+        data = super(SocialRegisterUserSerializer, self).validate(data)
+
         request = self.context['request']
 
-        self._added_errors = {}
+        validators.validate_new_registration(request, data, self.add_error)
+
+        self.validate_added_errors()
+
+        return data
+
+
+class RegisterUserSerializer(BaseRegisterUserSerializer):
+    password = serializers.CharField(
+        max_length=255,
+        trim_whitespace=False,
+    )
+
+    def validate(self, data):
+        data = super(RegisterUserSerializer, self).validate(data)
+
+        request = self.context['request']
 
         try:
             self.full_clean_password(data)
@@ -57,9 +97,7 @@ class RegisterUserSerializer(serializers.Serializer):
 
         validators.validate_new_registration(request, data, self.add_error)
 
-        if self._added_errors:
-            # fail registration with additional errors
-            raise serializers.ValidationError(self._added_errors)
+        self.validate_added_errors()
 
         # run test for captcha
         try:
@@ -78,19 +116,3 @@ class RegisterUserSerializer(serializers.Serializer):
                     email=data.get('email'),
                 ),
             )
-
-    def add_error(self, field, 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))
-

+ 8 - 7
misago/users/social/pipeline.py

@@ -12,7 +12,7 @@ from misago.conf import settings
 from misago.core.exceptions import SocialAuthFailed, SocialAuthBanned
 
 from misago.users.bans import get_request_ip_ban, get_user_ban
-from misago.users.forms.register import SocialAuthRegisterForm
+from misago.users.serializers.register import SocialRegisterUserSerializer
 from misago.users.models import Ban
 from misago.users.registration import get_registration_result_json, send_welcome_email
 from misago.users.validators import (
@@ -181,11 +181,12 @@ def create_user_with_form(strategy, details, backend, user=None, *args, **kwargs
         except (TypeError, ValueError):
             request_data = request.POST.copy()
             
-        form = SocialAuthRegisterForm(request_data, request=request)
-        if not form.is_valid():
-            return JsonResponse(form.errors, status=400)
+        serializer = SocialRegisterUserSerializer(data=request_data, context={'request': request})
+        if not serializer.is_valid():
+            return JsonResponse(serializer.errors, status=400)
 
-        email_verified = form.cleaned_data['email'] == details.get('email')
+        validated_data = serializer.validated_data
+        email_verified = validated_data['email'] == details.get('email')
 
         activation_kwargs = {}
         if settings.account_activation == 'admin':
@@ -195,8 +196,8 @@ def create_user_with_form(strategy, details, backend, user=None, *args, **kwargs
 
         try:
             new_user = UserModel.objects.create_user(
-                form.cleaned_data['username'],
-                form.cleaned_data['email'],
+                validated_data['username'],
+                validated_data['email'],
                 joined_from_ip=request.user_ip,
                 set_default_avatar=True,
                 **activation_kwargs

+ 1 - 2
misago/users/tests/test_auth_api.py

@@ -131,8 +131,7 @@ class GatewayTests(TestCase):
         )
         self.assertEqual(response.status_code, 400)
         self.assertEqual(response.json(), {
-            'code': 'invalid_login',
-            'detail': 'Login or password is incorrect.',
+            'non_field_errors': ["Login or password is incorrect."],
         })
 
     def test_login_banned(self):

+ 1 - 1
misago/users/tests/test_social_pipeline.py

@@ -27,7 +27,7 @@ def create_request(user_ip='0.0.0.0', data=None):
     else:
         request = factory.post('/', data=json.dumps(data), content_type='application/json')
     request.include_frontend_context = True
-    request.frontend_context = {}
+    request.frontend_context = {'auth': {}, 'conf': {}, 'store': {}, 'url': {}}
     request.session = {}
     request.user = AnonymousUser()
     request.user_ip = user_ip