__author__ = "Vanessa Sochat"
__copyright__ = "Copyright 2020-2021, Vanessa Sochat"
__license__ = "MPL 2.0"
from django.conf import settings
from django.contrib.auth.models import AbstractUser, BaseUserManager
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.db import models
from rest_framework.authtoken.models import Token
[docs]class CustomUserManager(BaseUserManager):
def _create_user(
self, username, email, password, is_staff, is_superuser, **extra_fields
):
"""
Creates and saves 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)
user = self.model(
username=username,
email=email,
is_staff=is_staff,
is_active=True,
**extra_fields
)
user.set_password(password)
user.save(using=self._db)
return user
[docs] def create_user(self, username, email=None, password=None, **extra_fields):
return self._create_user(
username, email, password, False, False, **extra_fields
)
[docs] def create_superuser(self, username, email, password, **extra_fields):
return self._create_user(username, email, password, True, True, **extra_fields)
[docs] def add_superuser(self, user):
"""Intended for existing user"""
user.is_superuser = True
user.save(using=self._db)
return user
[docs] def add_staff(self, user):
"""Intended for existing user"""
user.is_staff = True
user.save(using=self._db)
return user
[docs]class User(AbstractUser):
active = models.BooleanField(default=True)
# has the user agreed to terms?
agree_terms = models.BooleanField(default=False)
agree_terms_date = models.DateTimeField(blank=True, default=None, null=True)
# Notebook token (only for terminal notebook)
notebook_token = models.CharField(
max_length=36, default=None, null=True, blank=True
)
# Ensure that we can add staff / superuser and retain on logout
objects = CustomUserManager()
class Meta:
app_label = "users"
@property
def token(self):
"""The user token is for interaction with creating and updating workflows"""
return str(Token.objects.get(user=self))
[docs] def has_create_permission(self):
"""has create permission determines if the user (globally) can create
new collections. By default, superusers and admin can, along with
regular users if USER_COLLECTIONS is True. Otherwise, not.
"""
if self.is_superuser is True or self.is_staff is True:
return True
if settings.USER_COLLECTIONS is True:
return True
return False
[docs] def get_credentials(self, provider):
"""return one or more credentials, or None"""
if self.is_anonymous is False:
try:
# Case 1: one credential
credential = self.social_auth.get(provider=provider)
return credential
except:
# Case 2: more than one credential for the provider
credential = self.social_auth.filter(provider=provider)
if credential:
return credential.last()
[docs] def get_providers(self):
"""return a list of providers that the user has credentials for."""
return [x.provider for x in self.social_auth.all()]
[docs] def get_label(self):
return "users"
[docs]@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_auth_token(sender, instance=None, created=False, **kwargs):
"""Create a token for the user when the user is created (with oAuth2)
1. Assign user a token
2. Assign user to default group
Create a Profile instance for all newly created User instances. We only
run on user creation to avoid having to check for existence on each call
to User.save.
"""
# This auth token is intended for APIs
if created and "api" in settings.PLUGINS_ENABLED:
Token.objects.create(user=instance)