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()])