gault-millau/apps/account/serializers/web.py

70 lines
2.2 KiB
Python

"""Serializers for account web"""
from django.conf import settings
from rest_framework import serializers
from django.contrib.auth import password_validation as password_validators
from account import models
from account import tasks
from utils import exceptions as utils_exceptions
class PasswordResetSerializer(serializers.ModelSerializer):
"""Serializer from model PasswordReset"""
class Meta:
"""Meta class"""
model = models.ResetPasswordToken
fields = ('expiry_datetime', )
def create(self, validated_data, *args, **kwargs):
"""Override create method"""
request = self.context.get('request')
user = request.user
ip_address = request.META.get('REMOTE_ADDR')
obj = models.ResetPasswordToken.objects.create(
user=user,
ip_address=ip_address,
source=models.ResetPasswordToken.WEB
)
if settings.USE_CELERY:
tasks.send_reset_password_email.delay(obj.id)
else:
tasks.send_reset_password_email(obj.id)
return obj
class PasswordResetConfirmSerializer(serializers.ModelSerializer):
"""Serializer for model User"""
password = serializers.CharField(write_only=True)
class Meta:
"""Meta class"""
model = models.ResetPasswordToken
fields = ('password', )
def validate(self, attrs):
"""Override validate method"""
user = self.instance.user
password = attrs.get('password')
try:
# Compare new password with the old ones
if user.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.user.set_password(validated_data.get('password'))
instance.user.save()
# Overdue instance
instance.overdue()
return instance