77 lines
3.1 KiB
Python
77 lines
3.1 KiB
Python
from rest_framework import serializers
|
||
|
||
from django.contrib.auth.models import User
|
||
from django.db.utils import IntegrityError
|
||
|
||
from api.models import UserProfile
|
||
|
||
class UserResponseSerializer(serializers.Serializer):
|
||
id = serializers.IntegerField()
|
||
email = serializers.EmailField()
|
||
account_type = serializers.CharField(source='userprofile.account_type')
|
||
name = serializers.CharField(source='first_name')
|
||
surname = serializers.CharField(source='last_name')
|
||
phone_number = serializers.CharField(source='userprofile.phone_number')
|
||
image = serializers.CharField(source='userprofile.image')
|
||
uuid = serializers.SerializerMethodField()
|
||
country = serializers.CharField(source='userprofile.country')
|
||
city = serializers.CharField(source='userprofile.city')
|
||
def get_uuid(self, obj):
|
||
try:
|
||
return str(obj.userprofile.uuid)[:6]
|
||
except Exception as e:
|
||
print(f"Serializer UUID Error: {e}") # лог ошибки
|
||
return None
|
||
|
||
class ClientRegisterSerializer(serializers.ModelSerializer):
|
||
phone_number = serializers.CharField(max_length=13)
|
||
privacy_accepted = serializers.BooleanField()
|
||
email = serializers.EmailField(required=True)
|
||
name = serializers.CharField(required=True)
|
||
surname = serializers.CharField(required=True)
|
||
uuid = serializers.SerializerMethodField()
|
||
|
||
class Meta:
|
||
model = User
|
||
fields = ['id', 'uuid', 'name', 'surname', 'email', 'password', 'phone_number', 'privacy_accepted']
|
||
extra_kwargs = {
|
||
'password': {'write_only': True},
|
||
'email': {'required': True},
|
||
'phone_number': {'required': True},
|
||
}
|
||
|
||
def validate_phone_number(self, value):
|
||
if len(value) > 18:
|
||
raise serializers.ValidationError("Номер телефона не может быть таким длинным")
|
||
return value
|
||
|
||
def validate_privacy_accepted(self, value):
|
||
if not value:
|
||
raise serializers.ValidationError("Необходимо принять условия политики конфиденциальности")
|
||
return value
|
||
|
||
def create(self, validated_data):
|
||
privacy_accepted = validated_data.pop('privacy_accepted')
|
||
phone_number = validated_data.pop('phone_number')
|
||
name = validated_data.pop('name')
|
||
surname = validated_data.pop('surname')
|
||
|
||
try:
|
||
user = User.objects.create_user(
|
||
username=validated_data['email'], # используем email как username
|
||
email=validated_data['email'],
|
||
password=validated_data['password'],
|
||
first_name=name,
|
||
last_name=surname
|
||
)
|
||
|
||
UserProfile.objects.create(
|
||
user=user,
|
||
phone_number=phone_number,
|
||
privacy_accepted=privacy_accepted
|
||
)
|
||
|
||
return user
|
||
|
||
except IntegrityError:
|
||
raise serializers.ValidationError({"email": "Пользователь с таким email уже существует"}) |