diff --git a/sandbox/sandbox/apps/user/models.py b/sandbox/sandbox/apps/user/models.py index 159740b..3051167 100644 --- a/sandbox/sandbox/apps/user/models.py +++ b/sandbox/sandbox/apps/user/models.py @@ -1,42 +1,115 @@ +from django.apps import apps +from django.contrib import auth +from django.contrib.auth.hashers import make_password from django.contrib.auth.models import ( - AbstractBaseUser, PermissionsMixin, UserManager) + AbstractBaseUser, + BaseUserManager, + PermissionsMixin, +) from django.core.mail import send_mail from django.db import models from django.utils import timezone from django.utils.translation import gettext_lazy as _ +class UserManager(BaseUserManager): + use_in_migrations = True + + def _create_user(self, email, password, **extra_fields): + """ + Create and save a user with the given email and password. + """ + email = self.normalize_email(email) + # Lookup the real model class from the global app registry so this + # manager method can be used in migrations. This is fine because + # managers are by definition working on the real model. + GlobalUserModel = apps.get_model( + self.model._meta.app_label, self.model._meta.object_name + ) + user = self.model(email=email, **extra_fields) + user.password = make_password(password) + user.save(using=self._db) + return user + + def create_user(self, email=None, password=None, **extra_fields): + extra_fields.setdefault("is_staff", False) + extra_fields.setdefault("is_superuser", False) + return self._create_user(email, password, **extra_fields) + + def create_superuser(self, email=None, password=None, **extra_fields): + extra_fields.setdefault("is_staff", True) + extra_fields.setdefault("is_superuser", True) + + if extra_fields.get("is_staff") is not True: + raise ValueError("Superuser must have is_staff=True.") + if extra_fields.get("is_superuser") is not True: + raise ValueError("Superuser must have is_superuser=True.") + + return self._create_user(email, password, **extra_fields) + + def with_perm( + self, perm, is_active=True, include_superusers=True, backend=None, obj=None + ): + if backend is None: + backends = auth._get_backends(return_tuples=True) + if len(backends) == 1: + backend, _ = backends[0] + else: + raise ValueError( + "You have multiple authentication backends configured and " + "therefore must provide the `backend` argument." + ) + elif not isinstance(backend, str): + raise TypeError( + "backend must be a dotted import path string (got %r)." % backend + ) + else: + backend = auth.load_backend(backend) + if hasattr(backend, "with_perm"): + return backend.with_perm( + perm, + is_active=is_active, + include_superusers=include_superusers, + obj=obj, + ) + return self.none() + + class User(AbstractBaseUser, PermissionsMixin): - """Cusomtized version of the default `AbstractUser` from Django. + """Cusomtized version of the default `AbstractUser` from Django.""" - """ - first_name = models.CharField(_('first name'), max_length=100, blank=True) - last_name = models.CharField(_('last name'), max_length=100, blank=True) - email = models.EmailField(_('email address'), blank=True, unique=True) + first_name = models.CharField(_("first name"), max_length=100, blank=True) + last_name = models.CharField(_("last name"), max_length=100, blank=True) + email = models.EmailField(_("email address"), blank=True, unique=True) is_staff = models.BooleanField( - _('staff status'), default=False, - help_text=_('Designates whether the user can log into this admin ' - 'site.')) + _("staff status"), + default=False, + help_text=_("Designates whether the user can log into this admin " "site."), + ) is_active = models.BooleanField( - _('active'), default=True, - help_text=_('Designates whether this user should be treated as ' - 'active. Unselect this instead of deleting accounts.')) - date_joined = models.DateTimeField(_('date joined'), default=timezone.now) + _("active"), + default=True, + help_text=_( + "Designates whether this user should be treated as " + "active. Unselect this instead of deleting accounts." + ), + ) + date_joined = models.DateTimeField(_("date joined"), default=timezone.now) objects = UserManager() - USERNAME_FIELD = 'email' + USERNAME_FIELD = "email" REQUIRED_FIELDS = [] class Meta: - verbose_name = _('user') - verbose_name_plural = _('users') + verbose_name = _("user") + verbose_name_plural = _("users") def get_full_name(self): """ Returns the first_name plus the last_name, with a space in between. """ - full_name = '%s %s' % (self.first_name, self.last_name) + full_name = "%s %s" % (self.first_name, self.last_name) return full_name.strip() def get_short_name(self):