text: from django.db import models
  from django.contrib.auth.models import (
      BaseUserManager, PermissionsMixin, AbstractBaseUser
  )
  from django.contrib.auth.models import Group as BaseGroup
  from django.core.mail import send_mail
  from django.utils import timezone
  from django.utils.translation import ugettext_lazy as _
  
  
  class UserProfileManager(BaseUserManager):
      use_in_migrations = True
  
      def _create_user(self, email, password, **extra_fields):
          if not email:
              raise ValueError('The given email must be set')
          email = self.normalize_email(email)
          user = self.model(email=email, **extra_fields)
          user.set_password(password)
          user.is_staff = True
          user.save(using=self._db)
          return user
  
      def create_user(self, email, password=None, **extra_fields):
          extra_fields.setdefault('is_staff', False)
          extra_fields.setdefault('is_superuser', False)
          return self._create_user(email, password, **extra_fields)
  
      def create_superuser(self, email, password, **extra_fields):
          extra_fields.setdefault('is_staff', True)
          extra_fields.setdefault('is_superuser', 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(email, password, **extra_fields)
  
  
  class AbstractUserProfile(AbstractBaseUser, PermissionsMixin):
      email = models.EmailField(
          _('email address'),
          unique=True,
          error_messages={
              'unique': _("A user with that email address already exists."),
          },
      )
      first_name = models.CharField(_('first name'), max_length=30)
      last_name = models.CharField(_('last name'), max_length=150)
      description = models.CharField("Description", max_length=280, blank=True)
      nickname = models.CharField("Nickname", max_length=20)
  
      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 = UserProfileManager()
  
      EMAIL_FIELD = 'email'
      USERNAME_FIELD = 'email'
      REQUIRED_FIELDS = ['first_name', 'last_name', 'nickname']
  
      class Meta:
          verbose_name = _('user')
          verbose_name_plural = _('users')
          abstract = True
  
      def clean(self):
          super().clean()
          self.email = self.__class__.objects.normalize_email(self.email)
  
      def get_full_name(self):
          """
          Return the first_name plus the last_name, with a space in between.
          """
          full_name = '%s %s' % (self.first_name, self.last_name)
          return full_name.strip()
  
      def get_short_name(self):
          """Return the short name for the user."""
          return self.first_name
  
      def email_user(self, subject, message, from_email=None, **kwargs):
          """Send an email to this user."""
          send_mail(subject, message, from_email, [self.email], **kwargs)
  
  
  class UserProfile(AbstractUserProfile):
      class Meta(AbstractUserProfile.Meta):
          swappable = 'AUTH_USER_MODEL'
  
  
  class Group(BaseGroup):
      class Meta:
          verbose_name = _('group')
          verbose_name_plural = _('groups')
          proxy = True
  