Files
MarietjeDjango/marietje/marietje/models.py
Daan Sprenkels f1e6fef2d2 Add an index on User.name
This is needed because this field is queried when the songs list
is being searched.
2018-10-28 17:23:10 +01:00

135 lines
4.5 KiB
Python

from django.db import models
from queues.models import Queue
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 ASCIIUsernameValidator, UnicodeUsernameValidator
from django.utils import six, timezone
from django.utils.translation import ugettext_lazy as _
from django.core.mail import send_mail
from marietje.utils import get_first_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() if six.PY3 else ASCIIUsernameValidator()
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)