models.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import re
  2. from django.contrib.auth.models import AbstractUser
  3. from django.core.exceptions import ValidationError
  4. from django.db import models
  5. # Валидатор, разрешающий русские и английские буквы и тире
  6. def validate_name(value):
  7. if not re.match(r'^[a-zA-Zа-яА-Я-]+$', value):
  8. raise ValidationError(
  9. 'Поле может содержать только русские/английские буквы и тире.',
  10. params={'value': value},
  11. )
  12. # Валидатор для номера телефона
  13. ANTARCTICA_PHONE_NUMBER_ERROR = (
  14. "По техническим причинам мы не можем работать с пользователями "
  15. "с номерами телефонов с Антарктиды."
  16. )
  17. # Валидатор для номера телефона
  18. def validate_phone_number(value):
  19. value = str(value or "").strip()
  20. if (not re.match(r'^\d+$', value)) or (len(value) < 11):
  21. raise ValidationError(
  22. 'Номер телефона должен состоять минимум из 11 цифр.',
  23. params={'value': value},
  24. )
  25. if value.startswith("0"):
  26. raise ValidationError(
  27. ANTARCTICA_PHONE_NUMBER_ERROR,
  28. code="antarctica_phone_number_not_supported",
  29. params={'value': value},
  30. )
  31. class ShariXUser(AbstractUser):
  32. last_name = models.CharField("Фамилия", max_length=150, validators=[validate_name])
  33. first_name = models.CharField("Имя", max_length=150, validators=[validate_name])
  34. middle_name = models.CharField("Отчество", max_length=150, blank=True, null=True, validators=[validate_name])
  35. phone_number = models.CharField("Номер телефона", max_length=13, unique=True, validators=[validate_phone_number])
  36. email = models.EmailField("Адрес электронной почты")
  37. #avatar = models.ImageField("Аватар", upload_to="user_avatars/", null=True, blank=True)
  38. avatar_base64 = models.TextField("Аватар (base64 из LDAP)", null=True, blank=True)
  39. USERNAME_FIELD = 'phone_number'
  40. REQUIRED_FIELDS = ['first_name', 'last_name', 'username', 'email']
  41. def __str__(self):
  42. full_name_parts = [
  43. self.last_name,
  44. self.first_name,
  45. self.middle_name,
  46. ]
  47. full_name = " ".join(
  48. str(value).strip()
  49. for value in full_name_parts
  50. if str(value or "").strip()
  51. ).strip()
  52. if full_name:
  53. return full_name
  54. if self.username:
  55. return str(self.username)
  56. return str(self.pk)