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.
156 lines
5.5 KiB
156 lines
5.5 KiB
|
|
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', 'skill']
|
|
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({"email": "This email is already registered."})
|
|
return value
|
|
|
|
|
|
def validate(self, data):
|
|
password = data.get('password')
|
|
password_confirmation = data.get('password_confirmation')
|
|
errors = {}
|
|
|
|
if password and password_confirmation and password != password_confirmation:
|
|
raise serializers.ValidationError({"password_confirmation": "Passwords do not match."})
|
|
if len(password) < 8:
|
|
raise serializers.ValidationError({"password": "Password must be at least 8 characters long."})
|
|
# If there are any errors, raise ValidationError
|
|
|
|
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')
|
|
errors = {}
|
|
|
|
if password and password_confirmation and password != password_confirmation:
|
|
raise serializers.ValidationError({"password_confirmation": "Passwords do not match."})
|
|
if len(password) < 8:
|
|
raise serializers.ValidationError({"password": "Password must be at least 8 characters long."})
|
|
# If there are any errors, raise ValidationError
|
|
|
|
data.pop('password_confirmation', None)
|
|
return data
|
|
|
|
|