astrosat / django-astrosat-users

Common backend library for Astrosat projects' user management
GNU General Public License v3.0
2 stars 0 forks source link

add a custom manager #21

Open allynt opened 4 years ago

allynt commented 4 years ago

May need to tweak things b/c I'm creating them based on email instead of username

allynt commented 4 years ago

managers.py:

from django.contrib.auth.models import BaseUserManager
from django.db import models

# Using a custom QuerySet _and_ a custom Manager may seem needlessly complicated.  But I can't just use
# "QuerySet.as_manager()" w/ AbstractUser b/c I also need to override create_user & create_superuser.
# (as per https://docs.djangoproject.com/en/2.2/topics/auth/customizing/#writing-a-manager-for-a-custom-user-model)

class UserQuerySet(models.QuerySet):
    def active(self):
        return self.filter(is_active=True)

    def approved(self):
        return self.filter(is_approved=True)

class UserManager(BaseUserManager):

    # chainable methods...

    def get_queryset(self):
        return UserQuerySet(self.model, using=self._db)

    def active(self):
        return self.get_queryset().active()

    def approved(self):
        return self.get_queryset().approved()

    # special user methods...

    def _create_user(self, username, email, password, **extra_fields):
        """
        Create and save a user with the given username, email, and password.
        """
        if not username:
            raise ValueError("The given username must be set")
        email = self.normalize_email(email)
        username = self.model.normalize_username(username)
        user = self.model(username=username, email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_user(self, username, email=None, password=None, **extra_fields):
        extra_fields.setdefault("is_staff", False)
        extra_fields.setdefault("is_superuser", False)
        return self._create_user(username, email, password, **extra_fields)

    def create_superuser(self, username, email, password, **extra_fields):
        extra_fields.setdefault("is_staff", True)
        extra_fields.setdefault("is_superuser", True)
        extra_fields.setdefault("is_approved", 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.")
        if extra_fields.get("is_approved") is not True:
            raise ValueError("Superuser must have is_approved=True.")

        return self._create_user(username, email, password, **extra_fields)

models_users.py:

class User(AbstractUser):
   ...
    objects = (
      UserManager()
    )  # see the note in "managers.py" explaining why I'm not just using "UserQuerySet.as_manager()" here