text: import jwt
  import random
  from datetime import datetime, timedelta
  from django.conf import settings
  from django.contrib.auth.models import (
      AbstractBaseUser, BaseUserManager, PermissionsMixin
  )
  from django.db import models
  from django.core.mail import send_mail
  
  
  class UserManager(BaseUserManager):
  
      def create_user(self, username, email, password=None):
          """Create and return a `User` with an email, username and password."""
          if username is None:
              raise TypeError('Users must have a username.')
  
          if email is None:
              raise TypeError('Users must have an email address.')
  
          user = self.model(username=username, email=self.normalize_email(email))
          user.set_password(password)
          if not user.is_verified:
              user.otp = random.randint(1000,9999)
              # Send OTP email
              send_mail(
                  subject="Verify your account",
                  message="OTP: {}".format(user.otp),
                  from_email="admin@ygag.com",
                  recipient_list=[user.email]
              )
          user.save()
          return user
  
      def create_superuser(self, username, email, password):
          """
          Create and return a `User` with superuser (admin) permissions.
          """
          if password is None:
              raise TypeError('Superusers must have a password.')
  
          user = self.create_user(username, email, password)
          user.is_superuser = True
          user.is_staff = True
          user.is_verified = True
          user.save()
  
          return user
  
  
  class User(AbstractBaseUser, PermissionsMixin):
      username = models.CharField(db_index=True, max_length=255, unique=True)
      email = models.EmailField(db_index=True, unique=True)
      is_active = models.BooleanField(default=True)
      is_staff = models.BooleanField(default=False)
      is_verified = models.BooleanField(default=False)
      otp = models.PositiveSmallIntegerField(null=True)
      created_at = models.DateTimeField(auto_now_add=True)
      updated_at = models.DateTimeField(auto_now=True)
      USERNAME_FIELD = 'email'
      REQUIRED_FIELDS = ['username']
  
      # Tells Django that the UserManager class defined above should manage
      objects = UserManager()
  
      def __str__(self):
          return self.email
  
      @property
      def token(self):
          return self._generate_jwt_token()
  
      def get_full_name(self):
          return self.username
  
      def get_short_name(self):
          return self.username
  
      def _generate_jwt_token(self):
          """
          Generates a JSON Web Token that stores this user's ID and has an expiry
          date set to 60 days into the future.
          """
          dt = datetime.now() + timedelta(days=60)
  
          token = jwt.encode({
              'id': self.pk,
              'exp': int(dt.strftime('%s'))
          }, settings.SECRET_KEY, algorithm='HS256')
  
          return token.decode('utf-8')