I don't need groups and permissions, but i want to use django admin. Ive
created this simple AbstractSuperUser that looks to solve this case. But i
wonder if thats best idea.
Can "groups and permissions" tables become a bottleneck in the future even
if i dont use any groups and permissions on any objects? I mean, maybe i
should keep the permissions and groups in case i will use them in the
future? i guess it wont generate extra db queries if i wont ask for
permissions ? What if my application has 100k users?
'
class AbstractSuperUser(models.Model):
"""
Abstract base class implementing superuser. Use this when
you need django-admin without Groups and Permissions.
"""
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
class Meta:
abstract = True
def permission_check(self):
# we have to check for `is_active`
# attribute, because we don't define
# this attribute on this class
if hasattr(self, 'is_active'):
# inactive user has no permissions
if not self.is_active:
return False
# superuser has all permissions
if self.is_superuser:
return True
return False
def has_perm(self, *args, **kwargs):
return self.permission_check()
def has_perms(self, *args, **kwargs):
return self.permission_check()
def has_module_perms(self, *args, **kwargs):
return self.permission_check()
class AbstractEmailUser(AbstractBaseUser):
""" An abstract base class implementing a fully featured User model.
E-mail address and password are required. By default User is inactive.
Examples:
``
Basic user model with custom fields:
class User(AbstractEmailUser):
first_name = models.CharField()
last_name = models.CharField()
Basic user model that works with django-admin.
class User(AbstractEmailUser, AbstractSuperUser):
pass
Basic user model that works with Groups and Permissions:
class User(AbstractEmailUser, PermissionsMixin)
pass
``
"""
email = models.EmailField(unique=True, max_length=255)
date_joined = models.DateTimeField(auto_now_add=True)
is_active = models.BooleanField(default=False)
objects = UserManager()
USERNAME_FIELD = 'email'
EMAIL_FIELD = 'email'
REQUIRED_FIELDS = []
class Meta:
abstract = True
verbose_name = _('user')
verbose_name_plural = _('users')
class User(AbstractSuperUser, AbstractEmailUser):
pass
class UserManager(BaseUserManager):
""" Base Manager for our Models. Creates users
with e-mail address, password and all your extra fields. """
use_in_migrations = True
def _create_user(self, email, password, **extra_fields):
""" Creation and saving User Model instance to database happens here.
"""
if not email:
raise ValueError('Email must be set.')
email = self.normalize_email(email)
user = self.model(email=email, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
def create_user(self, email, password=None, **extra_fields):
if hasattr(self.model, 'is_staff'):
extra_fields.setdefault('is_staff', False)
if hasattr(self.model, 'is_superuser'):
extra_fields.setdefault('is_superuser', False)
if hasattr(self.model, 'is_active'):
extra_fields.setdefault('is_active', False)
return self._create_user(email, password, **extra_fields)
def create_superuser(self, email, password, **extra_fields):
if hasattr(self.model, 'is_staff'):
extra_fields.setdefault('is_staff', True)
if hasattr(self.model, 'is_superuser'):
extra_fields.setdefault('is_superuser', True)
if hasattr(self.model, 'is_active'):
extra_fields.setdefault('is_active', True)
return self._create_user(email, password, **extra_fields)
--
You received this message because you are subscribed to the Google Groups
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-users/e68d00c2-f719-4f93-b002-f0bc309e5197%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.