Skip to content

Instantly share code, notes, and snippets.

@NurElHuda
Created March 13, 2022 06:46
Show Gist options
  • Save NurElHuda/ea2ce490f90b1c9a7076a9c62fd9e0b8 to your computer and use it in GitHub Desktop.
Save NurElHuda/ea2ce490f90b1c9a7076a9c62fd9e0b8 to your computer and use it in GitHub Desktop.
User.py
from api.managers import BasicManager
from api.utils import soft_delete_related_objects
from django.contrib.admin.utils import NestedObjects
from django.contrib.auth.models import AbstractUser
from django.core.validators import RegexValidator
from django.db import DEFAULT_DB_ALIAS, models
from django.db.models.fields import DateField
from django.urls import reverse
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
from django_lifecycle import LifecycleModelMixin, hook
from django_lifecycle.hooks import BEFORE_SAVE
from imagekit.models import ProcessedImageField
from imagekit.processors import ResizeToFill
class User(AbstractUser, LifecycleModelMixin):
created_at = models.DateTimeField(default=timezone.now)
updated_at = models.DateTimeField(default=timezone.now)
deleted_at = models.DateTimeField(default=None, null=True, blank=True)
USER_TYPE = [
("Admin", "Admin"),
("Manager", "Manager"),
("Staff", "Staff"),
("Teacher", "Teacher"),
("Student", "Student"),
]
name = models.CharField(_("Name"), blank=True, max_length=255, default="")
family_name = models.CharField(
_("Family name"), blank=True, max_length=255, default=""
)
phone = models.CharField(max_length=16, default="", blank=True,)
gender = models.CharField(blank=True, max_length=1, default="")
email = models.EmailField(max_length=255, unique=True)
address = models.CharField(max_length=255, default="", blank=True,)
town = models.ForeignKey(
"api.Town",
on_delete=models.CASCADE,
related_name="users",
null=True,
blank=True,
default=None,
)
birthday = DateField(default=None, null=True, blank=True)
picture = ProcessedImageField(
max_length=1000,
upload_to="users/images",
processors=[ResizeToFill(413, 531)],
format="JPEG",
options={"quality": 85},
null=True,
blank=True,
)
is_admin = models.BooleanField(_("IsAdmin"), default=False)
is_manager = models.BooleanField(_("IsManager"), default=False)
is_agent = models.BooleanField(_("IsAgent"), default=False)
is_teacher = models.BooleanField(_("IsTeacher"), default=False)
is_student = models.BooleanField(_("IsStudent"), default=False)
USERNAME_FIELD = "email"
REQUIRED_FIELDS = []
# objects = BasicManager()
class Meta:
ordering = ["-created_at"]
verbose_name = "User"
verbose_name_plural = "Users"
def save(self, *args, **kwargs):
if self.id:
self.updated_at = timezone.now()
return super().save(*args, **kwargs)
def delete(self, *args, **kwargs):
# Only set as deleted if it is not already deleted.
if not self.deleted_at:
self.updated_at = timezone.now()
self.deleted_at = timezone.now()
self.is_active = False
self.username = f"{self.username}_{self.pk}_deleted"
self.email = f"{self.email}_{self.pk}_deleted"
self.save()
if self.type != "unknown":
getattr(self, self.type).delete()
def __str__(self):
return f"{self.pk} | {self.full_name}"
@property
def type(self):
if self.is_admin:
return "admin"
elif self.is_agent:
return "agent"
elif self.is_manager:
return "manager"
elif self.is_teacher:
return "teacher"
elif self.is_student:
return "student"
else:
return "unknown"
@property
def center(self):
profile = getattr(self, self.type, None)
return getattr(profile, "center", None)
@property
def full_name(self):
return f"{self.name} {self.family_name}"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment