Skip to content

Commit e896e39

Browse files
authored
Merge pull request #538 from PROCOLLAB-github/fix/name-validator
Переведены ошибки валидации данных пользователя
2 parents 1897442 + 8c1799c commit e896e39

4 files changed

Lines changed: 111 additions & 18 deletions

File tree

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
# Generated by Django 4.2.11 on 2025-08-20 07:55
2+
3+
from django.db import migrations, models
4+
import functools
5+
import users.validators
6+
7+
8+
class Migration(migrations.Migration):
9+
10+
dependencies = [
11+
("users", "0053_customuser_is_mospolytech_student_and_more"),
12+
]
13+
14+
operations = [
15+
migrations.AlterField(
16+
model_name="customuser",
17+
name="first_name",
18+
field=models.CharField(
19+
max_length=255,
20+
validators=[
21+
functools.partial(
22+
users.validators.user_name_validator, *(), **{"field_name": "Имя"}
23+
)
24+
],
25+
),
26+
),
27+
migrations.AlterField(
28+
model_name="customuser",
29+
name="last_name",
30+
field=models.CharField(
31+
max_length=255,
32+
validators=[
33+
functools.partial(
34+
users.validators.user_name_validator,
35+
*(),
36+
**{"field_name": "Фамилия"}
37+
)
38+
],
39+
),
40+
),
41+
migrations.AlterField(
42+
model_name="customuser",
43+
name="patronymic",
44+
field=models.CharField(
45+
blank=True,
46+
max_length=255,
47+
null=True,
48+
validators=[
49+
functools.partial(
50+
users.validators.user_name_validator,
51+
*(),
52+
**{"field_name": "Отчество"}
53+
)
54+
],
55+
),
56+
),
57+
]

users/models.py

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1+
from functools import partial
2+
13
from django.contrib.auth.models import AbstractUser
24
from django.contrib.contenttypes.fields import GenericRelation
35
from django.core.exceptions import ValidationError
6+
from django.core.validators import URLValidator
47
from django.db import models
58
from django.db.models import QuerySet
69
from django.utils import timezone
@@ -60,9 +63,18 @@ class CustomUser(AbstractUser):
6063
INVESTOR = constants.INVESTOR
6164

6265
username = None
63-
email = models.EmailField(unique=True)
64-
first_name = models.CharField(max_length=255, validators=[user_name_validator])
65-
last_name = models.CharField(max_length=255, validators=[user_name_validator])
66+
email = models.EmailField(
67+
unique=True,
68+
error_messages={
69+
"unique": "Пользователь с таким email уже существует",
70+
},
71+
)
72+
first_name = models.CharField(
73+
max_length=255, validators=[partial(user_name_validator, field_name="Имя")]
74+
)
75+
last_name = models.CharField(
76+
max_length=255, validators=[partial(user_name_validator, field_name="Фамилия")]
77+
)
6678
password = models.CharField(max_length=255)
6779
is_active = models.BooleanField(default=False, editable=False)
6880
user_type = models.PositiveSmallIntegerField(
@@ -74,7 +86,10 @@ class CustomUser(AbstractUser):
7486
editable=False,
7587
)
7688
patronymic = models.CharField(
77-
max_length=255, validators=[user_name_validator], null=True, blank=True
89+
max_length=255,
90+
validators=[partial(user_name_validator, field_name="Отчество")],
91+
null=True,
92+
blank=True,
7893
)
7994
# TODO need to be removed in future `key_skills` -> `skills`.
8095
key_skills = models.CharField(
@@ -87,7 +102,11 @@ class CustomUser(AbstractUser):
87102
"core.SkillToObject",
88103
related_query_name="users",
89104
)
90-
avatar = models.URLField(null=True, blank=True)
105+
avatar = models.URLField(
106+
null=True,
107+
blank=True,
108+
validators=[URLValidator(message="Введите корректный URL")],
109+
)
91110
birthday = models.DateField(
92111
validators=[user_birthday_validator],
93112
)

users/serializers.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from django.forms.models import model_to_dict
88
from rest_framework import serializers
99
from rest_framework.exceptions import ValidationError
10+
from rest_framework.validators import UniqueValidator
1011
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
1112

1213
from core.models import Skill, SkillToObject, Specialization, SpecializationCategory
@@ -692,6 +693,21 @@ class Meta:
692693
class UserListSerializer(
693694
serializers.ModelSerializer[CustomUser], SkillsWriteSerializerMixin
694695
):
696+
email = serializers.EmailField(
697+
validators=[
698+
UniqueValidator(
699+
queryset=CustomUser.objects.all(),
700+
message="Пользователь с таким email уже существует",
701+
)
702+
],
703+
error_messages={"invalid": "Введите корректный email адрес"},
704+
)
705+
avatar = serializers.URLField(
706+
required=False,
707+
allow_null=True,
708+
error_messages={"invalid": "Введите корректный url адрес"},
709+
)
710+
695711
member = MemberSerializer(required=False)
696712
is_online = serializers.SerializerMethodField()
697713

users/validators.py

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1+
import phonenumbers
2+
from django.core.exceptions import ValidationError as DjangoValidationError
13
from django.utils import timezone
24
from rest_framework import serializers
35
from rest_framework.exceptions import ValidationError
4-
from django.core.exceptions import ValidationError as DjangoValidationError
5-
6-
import phonenumbers
76

87
from users.constants import NOT_VALID_NUMBER_MESSAGE
98

@@ -18,19 +17,19 @@ def user_birthday_validator(birthday):
1817
raise ValidationError("Человек младше 12 лет")
1918

2019

21-
def user_name_validator(name):
22-
"""returns true if name is valid"""
23-
# TODO: add check for vulgar words
20+
def user_name_validator(value, field_name="Поле"):
21+
"""Валидатор для имени, фамилии и отчества"""
22+
if not value:
23+
return
2424

2525
valid_name_chars = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"
26-
for letter in name:
26+
for letter in value:
2727
if letter.upper() not in valid_name_chars:
28-
raise ValidationError(
29-
"Имя содержит недопустимые символы. Могут быть только символы кириллического алфавита."
28+
raise DjangoValidationError(
29+
f"{field_name} содержит недопустимые символы. Могут быть только символы кириллического алфавита."
3030
)
31-
if len(name) < 2:
32-
raise ValidationError("Имя слишком короткое")
33-
return True
31+
if len(value) < 2:
32+
raise DjangoValidationError(f"Поле '{field_name}' слишком короткое")
3433

3534

3635
def specialization_exists_validator(pk: int):
@@ -49,7 +48,9 @@ def user_experience_years_range_validator(value: int):
4948
(2000 - `now.year`)
5049
"""
5150
if value not in range(2000, timezone.now().year + 1):
52-
raise DjangoValidationError(f"Год должен быть в диапазоне 2000 - {timezone.now().year}")
51+
raise DjangoValidationError(
52+
f"Год должен быть в диапазоне 2000 - {timezone.now().year}"
53+
)
5354

5455

5556
def user_phone_number_validation(value: str):

0 commit comments

Comments
 (0)