| # |
| # Copyright 2018 CNIT - Consorzio Nazionale Interuniversitario per le Telecomunicazioni |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| # |
| |
| from __future__ import unicode_literals |
| |
| from django.contrib.auth.models import ( |
| AbstractBaseUser, BaseUserManager, PermissionsMixin) |
| from django.utils import timezone |
| from django.utils.translation import ugettext_lazy as _ |
| from django.contrib.sessions.base_session import AbstractBaseSession |
| from django.db import models |
| |
| class CustomUserManager(BaseUserManager): |
| """Custom manager for CustomUser.""" |
| |
| def _create_user(self, username, password, is_staff, is_superuser, **extra_fields): |
| """Create and save a CustomUser with the given username and password. """ |
| now = timezone.now() |
| |
| if not username: |
| raise ValueError('The given username must be set') |
| |
| is_active = extra_fields.pop("is_active", True) |
| user = self.model(username=username, is_staff=is_staff, is_active=is_active, |
| is_superuser=is_superuser, last_login=now, |
| date_joined=now, **extra_fields) |
| user.set_password(password) |
| user.save(using=self._db) |
| return user |
| |
| """Create and save an CustomUser with the given username and password.""" |
| def create_superuser(self, username, password, **extra_fields): |
| return self._create_user(username, password, True, True, is_admin=True, |
| **extra_fields) |
| |
| """Create and save an FullOperator with the given email and password. """ |
| def create_full_operator(self, username, password=None, **extra_fields): |
| return self._create_user(username, password, False, False, is_full_operator=True, |
| **extra_fields) |
| |
| """Create and save an BasicUser with the given email and password. """ |
| def create_basic_user(self, username, password=None, **extra_fields): |
| return self._create_user(username, password, False, False, is_basic_user=True, |
| **extra_fields) |
| |
| """Create and save an GuestUser with the given email and password. """ |
| def create_guest_user(self, username, password="guest", **extra_fields): |
| return self._create_user(username, password, False, False, is_guest_user=True, |
| **extra_fields) |
| |
| |
| class AbstractCustomUser(AbstractBaseUser, PermissionsMixin): |
| """Abstract User with the same behaviour as Django's default User. |
| |
| AbstractCustomUser does not have username field. Uses email as the |
| USERNAME_FIELD for authentication. |
| |
| Use this if you need to extend EmailUser. |
| |
| Inherits from both the AbstractBaseUser and PermissionMixin. |
| |
| The following attributes are inherited from the superclasses: |
| * password |
| * last_login |
| * is_superuser |
| |
| """ |
| username = models.CharField(_('username'), max_length=255, unique=True, db_index=True) |
| |
| email = models.EmailField(_('email address'), max_length=255, unique=True) |
| |
| first_name = models.CharField(_('first name'), max_length=255, blank=True) |
| last_name = models.CharField(_('last name'), max_length=255, blank=True) |
| phone = models.CharField(_('phone'), max_length=100, blank=True) |
| # user_groups = models.ManyToManyField(UserGroup, verbose_name=_('user groups'), blank=True) |
| |
| is_admin = models.BooleanField(_('admin status'), default=False) |
| is_full_operator = models.BooleanField(_('full_operator status'), default=False) |
| is_basic_user = models.BooleanField(_('basic_user status'), default=False) |
| is_guest_user = models.BooleanField(_('guest_user status'), default=False) |
| |
| 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.')) |
| |
| date_joined = models.DateTimeField(_('date joined'), default=timezone.now) |
| |
| objects = CustomUserManager() |
| |
| USERNAME_FIELD = 'username' |
| REQUIRED_FIELDS = ['email', 'first_name', 'last_name', 'phone', ] |
| |
| class Meta: |
| verbose_name = _('custom user') |
| verbose_name_plural = _('custom users') |
| abstract = True |
| |
| def get_full_name(self): |
| """Return the fullname.""" |
| return "%s %s" % (self.last_name, self.first_name) |
| |
| def get_short_name(self): |
| """Return the firstname.""" |
| return self.first_name |
| |
| |
| class CustomUser(AbstractCustomUser): |
| """ |
| Concrete class of AbstractCustomUser. |
| |
| Use this if you don't need to extend CustomUser. |
| |
| """ |
| |
| class Meta(AbstractCustomUser.Meta): |
| swappable = 'AUTH_USER_MODEL' |
| |
| def count_admins(self): |
| return CustomUser.objects.filter(is_admin=True).count() |
| |
| def count_employee(self): |
| return CustomUser.objects.filter(is_full_operator=True).count() |
| |
| def count_basic_users(self): |
| return CustomUser.objects.filter(is_basic_user=True).count() |
| |
| def count_inactives(self): |
| return CustomUser.objects.filter(is_active=False).count() |
| |
| def is_guest(self): |
| return self.is_guest_user |
| |
| def get_avatar(self): |
| if self.is_admin: |
| return "assets/img/employer.png" |
| elif self.is_full_operator: |
| return "assets/img/employer.png" |
| elif self.is_basic_user: |
| return "assets/img/employer.png" |
| elif self.is_guest_user: |
| return "assets/img/account_circle.png" |
| |
| def get_user_role(self): |
| if self.is_admin: |
| return 0, "Admin" |
| elif self.is_full_operator: |
| return 1, "Full operator" |
| elif self.is_basic_user: |
| return 2, "Basic user" |
| elif self.is_guest_user: |
| return 3, "Guest user" |
| |
| def get_user_role_name(self): |
| if self.is_admin: |
| return "Admin" |
| elif self.is_full_operator: |
| return "Full operator" |
| elif self.is_basic_user: |
| return "Basic user" |
| elif self.is_guest_user: |
| return "Guest user" |
| |
| def has_perm(self, perm, obj=None): |
| if perm == 'deploymenthandler': |
| if self.is_guest_user: |
| return False |
| else: |
| return True |
| else: |
| super.has_perm(perm, obj) |
| |
| |
| class CustomSession(AbstractBaseSession): |
| account_id = models.IntegerField(null=True, db_index=True) |
| |
| @classmethod |
| def get_session_store_class(cls): |
| return SessionStore |
| |