Просмотр исходного кода

#706: ChangeUsernameForm moved to serializer

Rafał Pitoń 8 лет назад
Родитель
Сommit
4fb2ec0071

+ 7 - 1
misago/users/api/userendpoints/changeemail.py

@@ -10,7 +10,13 @@ from misago.users.serializers import ChangeEmailSerializer
 
 
 def change_email_endpoint(request, pk=None):
-    serializer = ChangeEmailSerializer(data=request.data, user=request.user)
+    serializer = ChangeEmailSerializer(
+        data=request.data,
+        context={
+            'user': request.user
+        }
+    )
+
     if serializer.is_valid():
         token = store_new_credential(
             request, 'email', serializer.validated_data['new_email'])

+ 7 - 1
misago/users/api/userendpoints/changepassword.py

@@ -10,7 +10,13 @@ from misago.users.serializers import ChangePasswordSerializer
 
 
 def change_password_endpoint(request, pk=None):
-    serializer = ChangePasswordSerializer(data=request.data, user=request.user)
+    serializer = ChangePasswordSerializer(
+        data=request.data,
+        context={
+            'user': request.user
+        }
+    )
+
     if serializer.is_valid():
         token = store_new_credential(
             request, 'password', serializer.validated_data['new_password'])

+ 26 - 13
misago/users/api/userendpoints/username.py

@@ -5,7 +5,7 @@ from django.db import IntegrityError
 from django.utils.translation import ugettext as _
 
 from misago.conf import settings
-from misago.users.forms.rename import ChangeUsernameForm
+from misago.users.serializers import ChangeUsernameSerializer
 from misago.users.namechanges import UsernameChanges
 
 
@@ -41,10 +41,16 @@ def change_username(request):
         },
         status=status.HTTP_400_BAD_REQUEST)
 
-    form = ChangeUsernameForm(request.data, user=request.user)
-    if form.is_valid():
+    serializer = ChangeUsernameSerializer(
+        data=request.data,
+        context={
+            'user': request.user
+        }
+    )
+
+    if serializer.is_valid():
         try:
-            form.change_username(changed_by=request.user)
+            serializer.change_username(changed_by=request.user)
             return Response({
                 'username': request.user.username,
                 'slug': request.user.slug,
@@ -57,16 +63,23 @@ def change_username(request):
             },
             status=status.HTTP_400_BAD_REQUEST)
     else:
-        return Response({'detail': form.non_field_errors()[0]},
-                        status=status.HTTP_400_BAD_REQUEST)
+        return Response({
+            'detail': serializer.errors['non_field_errors'][0]
+        }, status=status.HTTP_400_BAD_REQUEST)
 
 
 def moderate_username_endpoint(request, profile):
     if request.method == 'POST':
-        form = ChangeUsernameForm(request.data, user=profile)
-        if form.is_valid():
+        serializer = ChangeUsernameSerializer(
+            data=request.data,
+            context={
+                'user': profile
+            }
+        )
+
+        if serializer.is_valid():
             try:
-                form.change_username(changed_by=request.user)
+                serializer.change_username(changed_by=request.user)
                 return Response({
                     'username': profile.username,
                     'slug': profile.slug,
@@ -75,11 +88,11 @@ def moderate_username_endpoint(request, profile):
                 return Response({
                     'detail': _("Error changing username. Please try again."),
                     'options': options
-                },
-                status=status.HTTP_400_BAD_REQUEST)
+                }, status=status.HTTP_400_BAD_REQUEST)
         else:
-            return Response({'detail': form.non_field_errors()[0]},
-                            status=status.HTTP_400_BAD_REQUEST)
+            return Response({
+                'detail': serializer.errors['non_field_errors'][0]
+            }, status=status.HTTP_400_BAD_REQUEST)
     else:
         return Response({
             'length_min': settings.username_length_min,

+ 0 - 32
misago/users/forms/rename.py

@@ -1,32 +0,0 @@
-from django import forms
-from django.utils.translation import ugettext_lazy as _
-
-from misago.users.validators import validate_username
-
-
-class ChangeUsernameForm(forms.Form):
-    username = forms.CharField(max_length=200, required=False)
-
-    def __init__(self, *args, **kwargs):
-        self.user = kwargs.pop('user', None)
-        super(ChangeUsernameForm, self).__init__(*args, **kwargs)
-
-    def clean(self):
-        data = super(ChangeUsernameForm, self).clean()
-        username = data.get('username')
-
-        if not username:
-            raise forms.ValidationError(_("Enter new username."))
-
-        if username == self.user.username:
-            message = _("New username is same as current one.")
-            raise forms.ValidationError(message)
-
-        validate_username(username, exclude=self.user)
-
-        return data
-
-    def change_username(self, changed_by):
-        self.user.set_username(
-            self.cleaned_data['username'], changed_by=changed_by)
-        self.user.save(update_fields=['username', 'slug'])

+ 30 - 15
misago/users/serializers/options.py

@@ -2,11 +2,10 @@ from rest_framework import serializers
 
 from django.contrib.auth import get_user_model
 from django.contrib.auth.password_validation import validate_password
-from django.utils.translation import ugettext_lazy as _
+from django.utils.translation import ugettext as _
 
 from misago.conf import settings
-from misago.core.forms import YesNoSwitch
-from misago.users.validators import validate_email
+from misago.users.validators import validate_email, validate_username
 
 
 UserModel = get_user_model()
@@ -14,6 +13,7 @@ UserModel = get_user_model()
 __all__ = [
     'ForumOptionsSerializer',
     'EditSignatureSerializer',
+    'ChangeUsernameSerializer',
     'ChangePasswordSerializer',
     'ChangeEmailSerializer',
 ]
@@ -53,21 +53,40 @@ class EditSignatureSerializer(serializers.ModelSerializer):
         return data
 
 
+class ChangeUsernameSerializer(serializers.Serializer):
+    username = serializers.CharField(max_length=200, required=False, allow_blank=True)
+
+    def validate(self, data):
+        username = data.get('username')
+
+        if not username:
+            raise serializers.ValidationError(_("Enter new username."))
+
+        if username == self.context['user'].username:
+            raise serializers.ValidationError(
+                _("New username is same as current one."))
+
+        validate_username(username)
+
+        return data
+
+    def change_username(self, changed_by):
+        self.context['user'].set_username(
+            self.validated_data['username'], changed_by=changed_by)
+        self.context['user'].save(update_fields=['username', 'slug'])
+
+
 class ChangePasswordSerializer(serializers.Serializer):
     password = serializers.CharField(max_length=200)
     new_password = serializers.CharField(max_length=200)
 
-    def __init__(self, *args, **kwargs):
-        self.user = kwargs.pop('user', None)
-        super(ChangePasswordSerializer, self).__init__(*args, **kwargs)
-
     def validate_password(self, value):
-        if not self.user.check_password(value):
+        if not self.context['user'].check_password(value):
             raise serializers.ValidationError(_("Entered password is invalid."))
         return value
 
     def validate_new_password(self, value):
-        validate_password(value, user=self.user)
+        validate_password(value, user=self.context['user'])
         return value
 
 
@@ -75,12 +94,8 @@ class ChangeEmailSerializer(serializers.Serializer):
     password = serializers.CharField(max_length=200)
     new_email = serializers.CharField(max_length=200)
 
-    def __init__(self, *args, **kwargs):
-        self.user = kwargs.pop('user', None)
-        super(ChangeEmailSerializer, self).__init__(*args, **kwargs)
-
     def validate_password(self, value):
-        if not self.user.check_password(value):
+        if not self.context['user'].check_password(value):
             raise serializers.ValidationError(_("Entered password is invalid."))
         return value
 
@@ -88,7 +103,7 @@ class ChangeEmailSerializer(serializers.Serializer):
         if not value:
             raise serializers.ValidationError(_("You have to enter new e-mail address."))
 
-        if value.lower() == self.user.email.lower():
+        if value.lower() == self.context['user'].email.lower():
             raise serializers.ValidationError(_("New e-mail is same as current one."))
 
         validate_email(value)