added endpoint to change password

This commit is contained in:
Anatoly 2019-09-02 13:47:42 +03:00
parent 6d3b7b1921
commit 2f0b8ab90d
3 changed files with 49 additions and 0 deletions

View File

@ -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

View File

@ -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/<uidb64>/<token>/', views.FormPasswordResetConfirmView.as_view(),

View File

@ -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