Files
2024-11-27 13:18:16 +01:00

161 lines
4.6 KiB
Python
Executable File

from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin
from django.contrib.auth.validators import UnicodeUsernameValidator
from django.contrib.contenttypes.models import ContentType
from django.core.mail import send_mail
from django.db import models
from django.utils.translation import gettext_lazy as _
from rules.contrib.models import RulesModelMixin, RulesModelBase
from outbo.apps.authentication import rules
from outbo.apps.authentication.managers import UserManager
from outbo.apps.core.models import TimestampableDeletableMixin
class User(
RulesModelMixin,
TimestampableDeletableMixin,
AbstractBaseUser,
PermissionsMixin,
metaclass=RulesModelBase,
):
objects = UserManager()
all_objects = UserManager(alive_only=False)
class Meta:
verbose_name = _("user")
verbose_name_plural = _("users")
rules_permissions = {
"read": rules.can_read_user,
"read_current": rules.can_read_current_user,
}
username_validator = UnicodeUsernameValidator()
username = models.CharField(
verbose_name=_("username"),
max_length=150,
unique=True,
help_text=_(
"Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only."
),
validators=[username_validator],
error_messages={"unique": _("A user with that username already exists.")},
)
email = models.EmailField(
verbose_name=_("email address"), blank=True, null=True, unique=True
)
is_staff = models.BooleanField(
verbose_name=_("staff status"),
default=False,
help_text=_("Designates whether the user can log into this admin site."),
)
is_observer = models.BooleanField(
verbose_name=_("observer status"),
default=False,
help_text=_("Designates whether the user is an observer."),
)
is_trader = models.BooleanField(
verbose_name=_("trader status"),
default=False,
help_text=_("Designates whether the user is an trader."),
)
first_name = models.CharField(
verbose_name=_("first name"), max_length=30, blank=True
)
last_name = models.CharField(
verbose_name=_("last name"), max_length=150, blank=True
)
organization = models.ForeignKey(
verbose_name=_("organization"),
to="organizations.Organization",
on_delete=models.CASCADE,
null=True,
default=None,
)
category = models.ForeignKey(
verbose_name=_("category for trader"),
to="organizations.Category",
on_delete=models.CASCADE,
blank=True,
null=True,
)
photo = models.ImageField(
verbose_name=_("profile photo"), upload_to="users/", blank=True, null=True
)
job_title = models.CharField(verbose_name=_("job title"), max_length=30, blank=True)
phone_number = models.CharField(
verbose_name=_("phone_number"), max_length=30, blank=True
)
USERNAME_FIELD = "username"
EMAIL_FIELD = "email"
REQUIRED_FIELDS = []
@property
def photo_url(self):
return None if not self.photo else self.photo.url
@property
def is_active(self):
return self.deleted_at is None
@property
def full_name(self):
return f"{self.first_name} {self.last_name}".strip()
@property
def is_agency(self):
return (
False
if not self.organization
else self.organization.type
== ContentType.objects.get(
app_label="organizations", model="agencyorganization"
)
)
@property
def is_client(self):
return (
False
if not self.organization
else self.organization.type
== ContentType.objects.get(
app_label="organizations", model="clientorganization"
)
)
@property
def is_supplier(self):
return (
False
if not self.organization
else self.organization.type
== ContentType.objects.get(
app_label="organizations", model="supplierorganization"
)
)
@property
def user_role(self):
from outbo.apps.projects.models.member import MembershipType
if self.is_client:
return MembershipType.CLIENT
elif self.is_agency:
return MembershipType.AGENCY
elif self.is_supplier:
return MembershipType.SUPPLIER
def email_user(self, subject, message, from_email=None, **kwargs):
"""Send an email to this user."""
send_mail(subject, message, from_email, [self.email], **kwargs)