Source code for apps.users.models

from django.contrib.auth.models import AbstractUser
from django.db import models
from django.utils.translation import gettext_lazy as _

from apps.users.managers import NotDeletedManager
from apps.users.validators import AgeValidator, SVGValidator


[docs] class User(AbstractUser): """ Primary user model that inherits from django AbstractUser Main fields are email (used as login), username, password """ email = models.EmailField(unique=True) is_deleted = models.BooleanField(default=False, verbose_name="Is user deleted") is_passed_onboarding = models.BooleanField(default=False, verbose_name="Is user passed onboarding") interests = models.ManyToManyField("Category", verbose_name="List of user's interests") # type: ignore requests_quantity = models.PositiveSmallIntegerField(default=1, help_text="Needs for salt generation for uid") is_active = models.BooleanField(default=False) following = models.ManyToManyField("self", related_name="followers", symmetrical=False, blank=True) bio = models.TextField(max_length=80, blank=True, default="") objects: NotDeletedManager = NotDeletedManager() # type: ignore USERNAME_FIELD = "email" REQUIRED_FIELDS = ["username"] @property def limited_following(self): return self.following.all()[:5] def __str__(self): return f"{self.username}{self.email}"
[docs] class Category(models.Model): """ Content Category Model, utilized both during user registration and content creation. """ name = models.CharField(max_length=128, verbose_name="Name of category") icon = models.FileField(upload_to="categories/", validators=[SVGValidator()], blank=True, default="") class Meta: """Metaclass for like model""" verbose_name = _("Category") verbose_name_plural = _("Categories") def __str__(self): return self.name
[docs] class ActivationCode(models.Model): """ Activation Code Model, utilized to retain an activation code associated with a user in the event of password or email change/reset. """
[docs] class CodeTypes(models.TextChoices): PASSWORD = "password" # noqa EMAIL = "email"
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="activation_codes") uid = models.CharField(max_length=50, verbose_name="User ID in base64") email = models.EmailField(blank=True, help_text="Used only in case of email changing confirmation") code = models.CharField(max_length=255, verbose_name="Activation/confirmation code") expiration_date = models.DateTimeField(verbose_name="Expiration date of activation code")
[docs] class Profile(models.Model): """ User Profile Model encompasses all supplementary user information. """ user = models.OneToOneField(User, related_name="profile", on_delete=models.CASCADE) avatar = models.ImageField(upload_to="avatars/", blank=True, default="avatars/avatar.webp") birthdate = models.DateField(verbose_name="Date of Birth", null=True, default=None, validators=[AgeValidator()])