import uuid from django.contrib.auth.base_user import BaseUserManager from django.contrib.auth.models import AbstractBaseUser from django.contrib.auth.models import PermissionsMixin from django.db import models from django.utils.translation import gettext_lazy as _ class UserManager(BaseUserManager): """The user manager class.""" def create_user(self, password: str = None, **kwargs): user = self.model(**kwargs) user.set_password(password) user.save() return user def create_superuser(self, password: str, **kwargs): user = self.create_user(password=password, **kwargs) user.is_staff = True user.is_superuser = True user.save(update_fields=['is_staff', 'is_superuser']) return user class User(PermissionsMixin, AbstractBaseUser): EMAIL_FIELD = 'email' USERNAME_FIELD = 'email' objects = UserManager() nick = models.CharField(max_length=60, null=True, blank=True) email = models.EmailField( unique=True, verbose_name=_('E-Mail'), help_text=_( 'Your email address will be used for password resets and notification about your event/submissions.' ), ) is_active = models.BooleanField(default=True) # For the Django admin... is_staff = models.BooleanField(default=False) is_superuser = models.BooleanField(default=False) # Used for confirmations and password reminders to NOT disclose email in URL token_uuid = models.UUIDField(default=uuid.uuid4, editable=False) def __str__(self) -> str: """Use a useful string representation.""" return self.get_display_name() def get_display_name(self) -> str: return self.nick if self.nick else str(_('Unnamed user')) class Meta: verbose_name = _("User")