You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
280 lines
9.7 KiB
280 lines
9.7 KiB
|
|
<<<<<<< HEAD
|
|
=======
|
|
|
|
>>>>>>> develop
|
|
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(
|
|
<<<<<<< HEAD
|
|
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']
|
|
=======
|
|
choices=User.GenderChoices.choices,
|
|
required=False,
|
|
help_text="Select the user's gender."
|
|
)
|
|
fcm = serializers.CharField(required=False, help_text="Firebase Cloud Messaging token.")
|
|
saved_location = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = User
|
|
fields = ['id', 'device_id', 'fcm', 'fullname', 'slug', 'avatar', 'email', 'phone_number', 'password', 'info', 'skill', 'city', 'country', 'birthdate', 'gender', 'saved_location']
|
|
read_only_fields = ['email', 'info', 'skill', 'device_id', 'slug', 'saved_location']
|
|
|
|
def get_saved_location(self, obj):
|
|
last_location = obj.location_history.order_by('-at_time').first()
|
|
if last_location:
|
|
return {
|
|
'lat': last_location.lat,
|
|
'lon': last_location.lon,
|
|
'city': last_location.city,
|
|
'country': last_location.country,
|
|
'timezone': last_location.timezone,
|
|
'selected_manually': last_location.selected_manually,
|
|
'at_time': last_location.at_time,
|
|
}
|
|
return None
|
|
>>>>>>> develop
|
|
|
|
# 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):
|
|
<<<<<<< HEAD
|
|
=======
|
|
# Pop the password from the data to handle it separately
|
|
password = validated_data.pop('password', None)
|
|
|
|
# Use the default update logic for all other fields
|
|
>>>>>>> develop
|
|
for attr, value in validated_data.items():
|
|
if value is not None:
|
|
setattr(instance, attr, value)
|
|
|
|
<<<<<<< HEAD
|
|
=======
|
|
# If a new password was provided, hash and set it correctly
|
|
if password:
|
|
instance.set_password(password)
|
|
|
|
>>>>>>> develop
|
|
instance.save()
|
|
return instance
|
|
|
|
|
|
class UserRegisterSerializer(serializers.ModelSerializer):
|
|
<<<<<<< HEAD
|
|
fcm = serializers.CharField(required=False)
|
|
device_id = serializers.CharField(required=True)
|
|
=======
|
|
fcm = serializers.CharField(required=False, allow_blank=True, allow_null=True)
|
|
device_id = serializers.CharField(required=False, allow_blank=True, allow_null=True, write_only=True)
|
|
>>>>>>> develop
|
|
email = serializers.EmailField()
|
|
|
|
class Meta:
|
|
model = User
|
|
fields = ['id','fullname', 'email', 'fcm', 'device_id']
|
|
extra_kwargs = {
|
|
'fullname': {'required': True,},
|
|
'email': {'required': True,},
|
|
<<<<<<< HEAD
|
|
'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
|
|
=======
|
|
}
|
|
|
|
def create(self, validated_data):
|
|
device_id = validated_data.pop('device_id', None)
|
|
user = super().create(validated_data)
|
|
if device_id:
|
|
user.device_id = device_id
|
|
user.save()
|
|
return user
|
|
|
|
def validate_email(self, value):
|
|
normalized_email = User.objects.normalize_email(value)
|
|
if User.objects.filter(email=normalized_email).exists():
|
|
raise serializers.ValidationError("This email is already registered.")
|
|
return normalized_email
|
|
>>>>>>> develop
|
|
|
|
|
|
|
|
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)
|
|
|
|
<<<<<<< HEAD
|
|
|
|
=======
|
|
def validate_email(self, value):
|
|
"""
|
|
Normalize the email to ensure the Redis key matches correctly.
|
|
"""
|
|
return User.objects.normalize_email(value)
|
|
|
|
>>>>>>> develop
|
|
|
|
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
|
|
<<<<<<< HEAD
|
|
=======
|
|
def validate_email(self, value):
|
|
"""
|
|
Normalize email for case-insensitive login.
|
|
"""
|
|
return User.objects.normalize_email(value)
|
|
|
|
>>>>>>> develop
|
|
|
|
# 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)
|
|
|
|
|
|
|
|
|
|
<<<<<<< HEAD
|
|
class UserRecoverPasswordSerializer(serializers.ModelSerializer):
|
|
email = serializers.EmailField()
|
|
|
|
class Meta:
|
|
model = User
|
|
fields = ['email',]
|
|
extra_kwargs = {
|
|
'email': {'required': True,},
|
|
}
|
|
|
|
|
|
=======
|
|
# class UserRecoverPasswordSerializer(serializers.ModelSerializer):
|
|
# email = serializers.EmailField()
|
|
|
|
# class Meta:
|
|
# model = User
|
|
# fields = ['email',]
|
|
# extra_kwargs = {
|
|
# 'email': {'required': True,},
|
|
# }
|
|
|
|
class UserRecoverPasswordSerializer(serializers.Serializer):
|
|
"""
|
|
Validates that an email is provided and is in a valid format
|
|
without checking for database uniqueness.
|
|
"""
|
|
email = serializers.EmailField(required=True)
|
|
|
|
def validate_email(self, value):
|
|
"""
|
|
Normalize the email address to ensure case-insensitive lookups.
|
|
"""
|
|
return User.objects.normalize_email(value)
|
|
|
|
>>>>>>> develop
|
|
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
|
|
|
|
<<<<<<< HEAD
|
|
=======
|
|
class WebUserGuestSerializer(serializers.ModelSerializer):
|
|
|
|
user_agent = serializers.CharField(required=False, allow_null=True, allow_blank=True)
|
|
client_ip = serializers.CharField(required=False, allow_null=True, allow_blank=True)
|
|
timezone = serializers.CharField(required=False, allow_null=True, allow_blank=True)
|
|
|
|
class Meta:
|
|
model = User
|
|
fields = ['user_agent', 'client_ip', 'timezone', 'device_id', 'device_os']
|
|
|
|
def validate(self, data):
|
|
# Ensure device_id is provided (generated by view)
|
|
if not data.get('device_id'):
|
|
raise serializers.ValidationError({"device_id": "Device ID is required for web guest users."})
|
|
return data
|
|
|
|
|
|
|
|
class UserFCMSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = User
|
|
fields = ['fcm']
|
|
>>>>>>> develop
|