diff --git a/apps/account/serializers/web.py b/apps/account/serializers/web.py index d9fddfae..8d5f1cd9 100644 --- a/apps/account/serializers/web.py +++ b/apps/account/serializers/web.py @@ -89,3 +89,35 @@ class PasswordResetConfirmSerializer(serializers.ModelSerializer): # Overdue instance instance.overdue() return instance + + +class ChangePasswordSerializer(serializers.ModelSerializer): + """Serializer for model User.""" + + password = serializers.CharField(write_only=True) + + class Meta: + """Meta class""" + model = models.User + fields = ('password', ) + + def validate(self, attrs): + """Override validate method""" + password = attrs.get('password') + try: + # Compare new password with the old ones + if self.instance.check_password(raw_password=password): + raise utils_exceptions.PasswordsAreEqual() + # Validate password + password_validators.validate_password(password=password) + except serializers.ValidationError as e: + raise serializers.ValidationError(str(e)) + else: + return attrs + + def update(self, instance, validated_data): + """Override update method""" + # Update user password from instance + instance.set_password(validated_data.get('password')) + instance.save() + return instance diff --git a/apps/account/urls/web.py b/apps/account/urls/web.py index 1b6d97a2..89612ded 100644 --- a/apps/account/urls/web.py +++ b/apps/account/urls/web.py @@ -7,6 +7,8 @@ from account.views import web as views app_name = 'account' urlpatterns_api = [ + path('change-password/', views.ChangePasswordView.as_view(), + name='change-password'), path('reset-password/', views.PasswordResetView.as_view(), name='password-reset'), path('form/reset-password///', views.FormPasswordResetConfirmView.as_view(), diff --git a/apps/account/views/web.py b/apps/account/views/web.py index 152c818a..591b5622 100644 --- a/apps/account/views/web.py +++ b/apps/account/views/web.py @@ -23,6 +23,7 @@ from account.serializers import web as serializers from utils import exceptions as utils_exceptions from utils.models import GMTokenGenerator from utils.views import (JWTCreateAPIView, + JWTUpdateAPIView, JWTGenericViewMixin) @@ -74,6 +75,20 @@ class PasswordResetConfirmView(JWTGenericViewMixin): return Response(status=status.HTTP_200_OK) +class ChangePasswordView(JWTUpdateAPIView): + """Change password view""" + serializer_class = serializers.ChangePasswordSerializer + queryset = models.User.objects.active() + + def patch(self, request, *args, **kwargs): + """Implement PUT method""" + serializer = self.get_serializer(instance=self.request.user, + data=request.data) + serializer.is_valid(raise_exception=True) + serializer.save() + return Response(status=status.HTTP_200_OK) + + # Form view class PasswordContextMixin: extra_context = None