Files
MarietjeDjango/marietje/marietje/models.py

121 lines
4.4 KiB
Python

from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager
from django.contrib.auth.hashers import make_password
from django.contrib.auth.models import PermissionsMixin
from django.contrib.auth.validators import UnicodeUsernameValidator
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 _
from marietje.utils import get_first_queue
from queues.models import Queue
class UserManager(BaseUserManager):
use_in_migrations = True
def _create_user(self, username, email, password, **extra_fields):
if not username:
raise ValueError("The given username must be set")
email = self.normalize_email(email)
username = self.model.normalize_username(username)
queue = get_first_queue()
user = self.model(username=username, email=email, queue=queue, **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)
extra_fields.setdefault("is_active", True)
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_active", 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(username, email, password, **extra_fields)
class User(AbstractBaseUser, PermissionsMixin):
username_validator = UnicodeUsernameValidator()
username = models.CharField(
_("username"),
max_length=150,
unique=True,
help_text=_("Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only."),
validators=[username_validator],
error_messages={
"unique": _("A user with that username already exists."),
},
)
name = models.CharField(_("name"), max_length=30, blank=True, db_index=True)
email = models.EmailField(
_("email address"),
blank=True,
)
is_staff = models.BooleanField(
_("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."
),
)
study = models.CharField(_("study"), max_length=30, blank=True)
date_joined = models.DateTimeField(_("date joined"), default=timezone.now)
objects = UserManager()
queue = models.ForeignKey(Queue, on_delete=models.SET_NULL, blank=True, null=True)
activation_token = models.TextField(_("activation token"), blank=True, null=True)
reset_token = models.TextField(_("reset token"), blank=True, null=True)
USERNAME_FIELD = "username"
REQUIRED_FIELDS = ["email", "name"]
class Meta:
verbose_name = _("user")
verbose_name_plural = _("users")
def delete(self, *args, **kwargs):
"""
We want to override the deletion behaviour for users, because we want to keep the stats
valid. Instead of deleting the user, we will completely anonimise the user's personal
data. The user will still have their uploads and queues associated with them, but they are
not personal data.
See also: UserAdmin.delete_queryset(request, queryset)
"""
self.username = "_deleteduser{:d}".format(self.id)
self.password = make_password(None)
self.name = "[deleted]"
self.email = ""
self.is_active = False
self.study = ""
self.save(*args, **kwargs)
def get_full_name(self):
return self.name
def get_short_name(self):
return self.name
def email_user(self, subject, message, from_email=None, **kwargs):
send_mail(subject, message, from_email, [self.email], **kwargs)