from rest_framework import serializers from rest_framework.authtoken.models import Token from django.contrib.auth.password_validation import validate_password from django.utils.translation import gettext_lazy as _ from apps.account.models import User from utils import FileFieldSerializer, absolute_url from utils.validators import validate_type_code class UserProfileSerializer(serializers.ModelSerializer): avatar = FileFieldSerializer(required=False) password = serializers.CharField(write_only=True, required=False, validators=[validate_password]) fullname = serializers.CharField(required=False) class Meta: model = User fields = ['id', 'fullname', 'avatar', 'email', 'phone_number', 'password', 'info'] read_only_fields = ['email', 'info'] # def validate_email(self, value): # if User.objects.filter(email=value).exists(): # raise serializers.ValidationError("This email is already registered.") # return value def update(self, instance, validated_data): password = validated_data.pop('password', None) if password: instance.set_password(password) # Update other fields for attr, value in validated_data.items(): if value is not None: setattr(instance, attr, value) instance.save() return instance class UserRegisterSerializer(serializers.ModelSerializer): password_confirmation = serializers.CharField(write_only=True) fcm = serializers.CharField(required=False) device_id = serializers.CharField(required=False) email = serializers.EmailField() class Meta: model = User fields = ['id','fullname', 'email', 'password', 'password_confirmation', 'fcm', 'device_id'] extra_kwargs = { 'fullname': {'required': True,}, 'email': {'required': True,}, 'password': {'required': True,}, 'password_confirmation': {'required': True,}, } def validate_email(self, value): if User.objects.filter(email=value).exists(): raise serializers.ValidationError("This email is already registered.") return value def validate(self, data): password = data.get('password') password_confirmation = data.get('password_confirmation') if password and password_confirmation and password != password_confirmation: raise serializers.ValidationError("Passwords do not match.") if len(password) < 8: raise serializers.ValidationError("Password must be at least 8 characters long.") data.pop('password_confirmation', None) data.pop('fcm', None) data.pop('device_id', None) return data class UserVerifySerializer(serializers.ModelSerializer): code = serializers.CharField(max_length=5, validators=[validate_type_code]) email = serializers.EmailField() class Meta: model = User fields = ["email", "code"] extra_kwargs = { 'email': {'required': True,}, 'code': {'required': True,}, } class UserLoginSerializer(serializers.ModelSerializer): password = serializers.CharField(write_only=True) token = serializers.CharField(allow_null=True, read_only=True, required=False) fullname = serializers.CharField(allow_null=True, read_only=True, required=False) avatar = serializers.CharField(allow_null=True, read_only=True, required=False) email = serializers.EmailField(write_only=True) password = serializers.CharField(style={'input_type': 'password'}, trim_whitespace=False) fcm = serializers.CharField(required=False) device_id = serializers.CharField(required=False) class Meta: model = User fields = ['id', 'phone_number', 'password', 'fullname', 'avatar', 'email', 'token', 'fcm', 'device_id'] def get_token(self, obj): token, created = Token.objects.get_or_create(user=obj) return token.key def validate(self, data): data.pop('fcm', None) data.pop('device_id', None) return data class UserRecoverPasswordSerializer(serializers.ModelSerializer): email = serializers.EmailField() class Meta: model = User fields = ['email',] extra_kwargs = { 'email': {'required': True,}, } class UserResetPasswordSerializer(serializers.ModelSerializer): password = serializers.CharField(write_only=True) password_confirmation = serializers.CharField(write_only=True) class Meta: model = User fields = ['password', 'password_confirmation'] extra_kwargs = { 'password': {'required': True,}, 'password_confirmation': {'required': True,}, } def validate(self, data): password = data.get('password') password_confirmation = data.get('password_confirmation') if password and password_confirmation and password != password_confirmation: raise serializers.ValidationError("Passwords do not match.") if len(password) < 8: raise serializers.ValidationError("Password must be at least 8 characters long.") data.pop('password_confirmation', None) return data