auth serializer
This commit is contained in:
@@ -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)
|
||||
0
backend/api/auth/__init__.py
Normal file
0
backend/api/auth/__init__.py
Normal file
70
backend/api/auth/serializers.py
Normal file
70
backend/api/auth/serializers.py
Normal 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 уже существует"})
|
||||
6
backend/api/auth/views.py
Normal file
6
backend/api/auth/views.py
Normal 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
|
||||
|
||||
36
backend/api/migrations/0001_initial.py
Normal file
36
backend/api/migrations/0001_initial.py
Normal 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)),
|
||||
],
|
||||
),
|
||||
]
|
||||
@@ -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}
|
||||
@@ -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='Главная картинка'),
|
||||
),
|
||||
]
|
||||
7
frontend/app/(urls)/privacy-policy/page.tsx
Normal file
7
frontend/app/(urls)/privacy-policy/page.tsx
Normal file
@@ -0,0 +1,7 @@
|
||||
import React from 'react'
|
||||
|
||||
const page = () => {
|
||||
return <div>page</div>
|
||||
}
|
||||
|
||||
export default page
|
||||
@@ -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 />
|
||||
|
||||
|
||||
Reference in New Issue
Block a user