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) gender = serializers.ChoiceField( choices=User.GenderChoices.choices, required=False, help_text="Select the user's gender." ) fcm = serializers.CharField(required=False, help_text="Firebase Cloud Messaging token.") class Meta: model = User fields = ['id', 'device_id', 'fcm', 'fullname', 'avatar', 'email', 'phone_number', 'password', 'info', 'skill', 'city', 'country', 'birthdate', 'gender'] read_only_fields = ['email', 'info', 'skill', 'device_id'] # 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): for attr, value in validated_data.items(): if value is not None: setattr(instance, attr, value) instance.save() return instance class UserRegisterSerializer(serializers.ModelSerializer): fcm = serializers.CharField(required=False) device_id = serializers.CharField(required=True) email = serializers.EmailField() class Meta: model = User fields = ['id','fullname', 'email', 'fcm', 'device_id'] extra_kwargs = { 'fullname': {'required': True,}, 'email': {'required': True,}, 'device_id': {'required': True,}, } def validate_email(self, value): if User.objects.filter(email=value).exists(): raise serializers.ValidationError("This email is already registered.") return value class UserVerifySerializer(serializers.Serializer): code = serializers.CharField(max_length=5, validators=[validate_type_code]) email = serializers.EmailField() device_id = serializers.CharField(max_length=255, required=False) class UserLoginSerializer(serializers.Serializer): 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) timezone = serializers.CharField(required=False, allow_null=True, allow_blank=True) def validate(self, data): # Custom validation logic can be added here if needed # data.pop('fcm', None) # data.pop('device_id', None) return data # class UserLoginSerializer(serializers.Serializer): # 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) # timezone = serializers.CharField(required=False, allow_null=True, allow_blank=True) 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) class Meta: model = User fields = ['password', ] extra_kwargs = { 'password': {'required': True,}, } class UserGuestSerializer(serializers.ModelSerializer): lat = serializers.CharField(max_length=255, allow_null=True, allow_blank=True, required=False) lon = serializers.CharField(max_length=255, allow_null=True, allow_blank=True, required=False) fcm = serializers.CharField(required=False) device_id = serializers.CharField(required=False) device_os = serializers.ChoiceField(choices=User.DeviceOs.choices, required=False) timezone = serializers.CharField(required=False, allow_null=True, allow_blank=True) class Meta: model = User fields = ['device_id', 'fcm', 'device_os', 'lat', 'lon', 'timezone'] def validate(self, data): # Make sure at least device_id is provided if not data.get('device_id'): raise serializers.ValidationError({"device_id": "Device ID is required for guest users."}) return data