auth serializer

This commit is contained in:
2025-05-18 12:23:05 +03:00
parent 48d286cf55
commit be46e09aeb
9 changed files with 178 additions and 5 deletions

View File

@@ -1,3 +1,19 @@
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.models import User
from .models import UserProfile
# Register your models here.
class UserProfileInline(admin.StackedInline):
model = UserProfile
can_delete = False
verbose_name = 'Профиль пользователя'
verbose_name_plural = 'Профили пользователей'
fields = ('is_active', 'phone_number', 'birthday', 'country', 'city','privacy_accepted','newsletter', 'uuid', 'image', 'authMailCode','additionalDetails')
readonly_fields = ('uuid','authMailCode') # ридонли в админке
class UserAdmin(BaseUserAdmin):
inlines = (UserProfileInline,)
# перерегистрируем User
admin.site.unregister(User)
admin.site.register(User, UserAdmin)

View File

View File

@@ -0,0 +1,70 @@
from rest_framework import serializers
from django.contrib.auth.models import User
from django.db.utils import IntegrityError
from api.models import UserProfile
class UserResponceSerializer(serializers.Serializer):
id = serializers.IntegerField()
email = serializers.EmailField()
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()
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)
username = serializers.CharField(source='first_name')
uuid = serializers.SerializerMethodField()
class Meta:
model = User
fields = ['id', 'uuid', 'username', 'email', 'password', 'phone_number', 'privacy_accepted']
extra_kwargs = {
'password' : {'write_only':True},
'email' : {'required' : True, 'unique': True},
'phone_number' : {'required' : True, 'unique': 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("Необходимо принять условия политики конфиденциальности")
def create(self, validated_data):
privacy_accepted = validated_data.pop('privacy_accepted')
phone_number = validated_data.pop('phone_number')
name = validated_data.pop('first_name')
try:
user = User.objects.create_user(
username=validated_data['name'],
email=validated_data['email'],
password=validated_data['password'],
first_name = name,
)
UserProfile.objects.create(
user=user,
phone_number=phone_number,
privacy_accepted=privacy_accepted
)
return user
except IntegrityError:
raise serializers.ValidationError({"email": "Пользователь с таким email уже существует"})

View File

@@ -0,0 +1,6 @@
from rest_framework import serializers
from django.contrib.auth.models import User
from django.db.utils import IntegrityError
from django.contrib.auth.hashers import make_password

View File

@@ -0,0 +1,36 @@
# Generated by Django 5.2.1 on 2025-05-18 08:57
import django.db.models.deletion
import uuid
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='UserProfile',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('is_active', models.BooleanField(default=True)),
('phone_number', models.CharField(max_length=13)),
('birthday', models.DateField(blank=True, null=True)),
('privacy_accepted', models.BooleanField(default=False)),
('uuid', models.UUIDField(default=uuid.uuid4, editable=False, null=True)),
('image', models.ImageField(blank=True, null=True, upload_to='')),
('country', models.CharField(blank=True, max_length=15, null=True)),
('city', models.CharField(blank=True, max_length=35, null=True)),
('newsletter', models.BooleanField(default=False)),
('authMailCode', models.CharField(max_length=50)),
('additionalDetails', models.TextField(blank=True, null=True)),
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
]

View File

@@ -1,3 +1,20 @@
from django.contrib.auth.models import User
from django.db import models
import uuid
# Create your models here.
class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
is_active = models.BooleanField(default=True)
phone_number = models.CharField(max_length=13, verbose_name="Номер телефона")
birthday = models.DateField(null=True, blank=True, verbose_name="Дата рождения")
privacy_accepted = models.BooleanField(default=False, verbose_name="Согласие с политикой конфиденциальности")
uuid = models.UUIDField(default=uuid.uuid4, editable=False, null=True)
image = models.ImageField(null=True, blank=True)
country = models.CharField(max_length=15,null=True, blank=True, verbose_name="Страна")
city = models.CharField(max_length=35, null=True, blank=True, verbose_name="Город")
newsletter = models.BooleanField(default=False, verbose_name="Подписка на новостную рассылку")
authMailCode = models.CharField(max_length=50)
additionalDetails = models.TextField(null=True, blank=True, verbose_name="Дополнительные детали")
def __str__(self):
return {self.phone_number}

View File

@@ -0,0 +1,23 @@
# Generated by Django 5.2.1 on 2025-05-18 08:57
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('sitemanagement', '0008_alter_news_slug'),
]
operations = [
migrations.AlterField(
model_name='news',
name='slug',
field=models.SlugField(blank=True, editable=False, max_length=255, null=True),
),
migrations.AlterField(
model_name='news',
name='titleImage',
field=models.ImageField(upload_to='uploads/news/images/', verbose_name='Главная картинка'),
),
]

View File

@@ -0,0 +1,7 @@
import React from 'react'
const page = () => {
return <div>page</div>
}
export default page

View File

@@ -27,9 +27,7 @@ const RegisterPage = () => {
return (
<div className="flex items-center justify-center p-12">
<div className="flex w-full max-w-xl md:max-w-3xl lg:max-w-3xl flex-col gap-4 bg-white rounded-2xl shadow-lg p-6">
<h1 className="text-2xl text-center py-1">
Давайте познакомимся поближе!
</h1>
<h1 className="text-2xl py-1">Давайте познакомимся поближе!</h1>
<ClientRegistrationForm />