from django.conf import settings from django.contrib.auth.models import ( AbstractBaseUser, BaseUserManager, PermissionsMixin, ) from django.db import models from django.utils.translation import ugettext_lazy as _ from .base import LoggingMixin class UserManager(BaseUserManager): """ This is the user manager for our custom user model. See the User model documentation to see what's so special about our user model. """ def create_user(self, email: str, password: str=None, **kwargs): user = self.model(email=email, **kwargs) user.set_password(password) user.save() return user def create_superuser(self, email: str, password: str=None): # NOQA # Not used in the software but required by Django if password is None: raise Exception("You must provide a password") user = self.model(email=email) user.is_staff = True user.is_superuser = True user.set_password(password) user.save() return user class User(AbstractBaseUser, PermissionsMixin, LoggingMixin): """ This is the user model used by pretix for authentication. :param email: The user's email address, used for identification. :type email: str :param givenname: The user's given name. May be empty or null. :type givenname: str :param familyname: The user's given name. May be empty or null. :type familyname: str :param is_active: Whether this user account is activated. :type is_active: bool :param is_staff: ``True`` for system operators. :type is_staff: bool :param date_joined: The datetime of the user's registration. :type date_joined: datetime :param locale: The user's preferred locale code. :type locale: str :param timezone: The user's preferred timezone. :type timezone: str """ USERNAME_FIELD = 'email' REQUIRED_FIELDS = [] email = models.EmailField(unique=True, db_index=True, null=True, blank=True, verbose_name=_('E-mail')) givenname = models.CharField(max_length=255, blank=True, null=True, verbose_name=_('Given name')) familyname = models.CharField(max_length=255, blank=True, null=True, verbose_name=_('Family name')) is_active = models.BooleanField(default=True, verbose_name=_('Is active')) is_staff = models.BooleanField(default=False, verbose_name=_('Is site admin')) date_joined = models.DateTimeField(auto_now_add=True, verbose_name=_('Date joined')) locale = models.CharField(max_length=50, choices=settings.LANGUAGES, default=settings.LANGUAGE_CODE, verbose_name=_('Language')) timezone = models.CharField(max_length=100, default=settings.TIME_ZONE, verbose_name=_('Timezone')) objects = UserManager() class Meta: verbose_name = _("User") verbose_name_plural = _("Users") def save(self, *args, **kwargs): self.email = self.email.lower() super().save(*args, **kwargs) def __str__(self): return self.email def get_short_name(self) -> str: """ Returns the first of the following user properties that is found to exist: * Given name * Family name * Email address """ if self.givenname: return self.givenname elif self.familyname: return self.familyname else: return self.email def get_full_name(self) -> str: """ Returns the first of the following user properties that is found to exist: * A combination of given name and family name, depending on the locale * Given name * Family name * User name """ if self.givenname and not self.familyname: return self.givenname elif not self.givenname and self.familyname: return self.familyname elif self.familyname and self.givenname: return _('%(family)s, %(given)s') % { 'family': self.familyname, 'given': self.givenname } else: return self.email