You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
3.4 KiB
84 lines
3.4 KiB
import random
|
|
from dj_language.field import LanguageField
|
|
from django.contrib.auth.models import AbstractUser
|
|
from django.db import models
|
|
from django.utils.translation import gettext_lazy as _
|
|
from django.utils import timezone
|
|
from phonenumber_field.modelfields import PhoneNumberField
|
|
from utils.validators import validate_possible_number
|
|
from apps.account.manager import UserManager
|
|
|
|
|
|
|
|
class User(AbstractUser):
|
|
class UserType(models.TextChoices):
|
|
PROFESSOR = 'professor', 'Professor'
|
|
CLIENT = 'client', 'Client'
|
|
STUDENT = 'student', "Student"
|
|
ADMIN = 'admin', 'Admin'
|
|
SUPER_ADMIN = 'super_admin', 'Super Admin'
|
|
|
|
class GenderChoices(models.TextChoices):
|
|
MALE = 'male', 'Male'
|
|
FEMALE = 'female', 'Female'
|
|
|
|
email = models.EmailField(unique=True, verbose_name="Email Address", help_text="Enter the user's email address.")
|
|
fullname = models.CharField(max_length=255, verbose_name="Full Name", help_text="Enter the full name of the user.")
|
|
birthdate = models.DateField(verbose_name=_('birthdate'), null=True, blank=True)
|
|
|
|
avatar = models.ImageField(null=True, blank=True, upload_to='users/avatars/%Y/%m/')
|
|
phone_number = PhoneNumberField(unique=True, validators=[validate_possible_number], null=True, blank=True, verbose_name=_('phone'))
|
|
language = LanguageField(null=True)
|
|
username = None
|
|
last_name = None
|
|
first_name = None
|
|
gender = models.CharField(
|
|
max_length=20, choices=GenderChoices.choices, null=True, blank=True, verbose_name=_('Gender'), help_text="Select the user's gender."
|
|
)
|
|
user_type = models.CharField(
|
|
max_length=20,
|
|
choices=UserType.choices,
|
|
default=UserType.CLIENT,
|
|
verbose_name="User Type",
|
|
help_text="Type of the user."
|
|
)
|
|
device_id = models.CharField(verbose_name=_('device id'), max_length=255, null=True, blank=True)
|
|
fcm = models.CharField(max_length=512, null=True, blank=True)
|
|
date_joined = models.DateTimeField(auto_now_add=True, verbose_name="Date Joined", help_text="The date and time the user registered.")
|
|
is_staff = models.BooleanField(default=False)
|
|
is_active = models.BooleanField(default=True, verbose_name="Active", help_text="Designates whether this user should be treated as active. Unselect this instead of deleting accounts.")
|
|
deleted_at = models.DateTimeField(null=True, blank=True)
|
|
info = models.TextField(verbose_name="Info", null=True, blank=True)
|
|
objects = UserManager()
|
|
|
|
|
|
EMAIL_FIELD = "email"
|
|
USERNAME_FIELD = "email"
|
|
REQUIRED_FIELDS = ["fullname", ]
|
|
|
|
def soft_delete(self):
|
|
self.deleted_at = timezone.now()
|
|
self.is_active = False
|
|
number = str(random.randint(1000000000, 9999999999)) # ایجاد یک عدد رندوم 10 رقمی
|
|
self.phone_number = f'{self.phone_number}:deleted{number}'
|
|
self.email = f'{self.email}:deleted{number}' if self.email else None
|
|
self.save()
|
|
|
|
# def clean(self):
|
|
# super().clean()
|
|
# if self.email == "":
|
|
# # fix db uniqueness error bcz of django charfield null to empty string conversion
|
|
# self.email = None
|
|
|
|
def __str__(self):
|
|
return f"{self.email} - {self.get_full_name()}"
|
|
|
|
|
|
def get_full_name(self):
|
|
return self.fullname
|
|
|
|
|
|
class Meta:
|
|
ordering = ("-id",)
|
|
verbose_name = "All Users"
|
|
verbose_name_plural = "All Users"
|