Skip to content

Instantly share code, notes, and snippets.

@AliRn76
Created May 13, 2021 20:18
Show Gist options
  • Save AliRn76/45319f918a5fb7af5c5c03be5007865e to your computer and use it in GitHub Desktop.
Save AliRn76/45319f918a5fb7af5c5c03be5007865e to your computer and use it in GitHub Desktop.
Custom User Model
from rest_framework.authentication import TokenAuthentication
from .models import Token
class TokenAuthentication(TokenAuthentication):
model = Token
from django.utils import timezone
from django.contrib.auth.models import BaseUserManager, AbstractBaseUser
from django.db import models
from django.conf import settings
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib import auth
from rest_framework.authtoken.models import Token
from django.utils.translation import gettext_lazy as _
class MyUserManager(BaseUserManager):
def create_user(self, username, is_male, password=None):
if not username:
raise ValueError('Users must have a username')
user = self.model(
username=username,
is_male=is_male,
)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, username, password=None, is_male=True):
user = self.create_user(
username,
password=password,
is_male=is_male
)
user.is_admin = True
user.save(using=self._db)
return user
class MyUser(AbstractBaseUser):
username = models.CharField(max_length=127, unique=True)
password = models.CharField(max_length=127)
first_name = models.CharField(max_length=65, blank=True, null=True)
last_name = models.CharField(max_length=127, blank=True, null=True)
is_admin = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
date_joined = models.DateTimeField(auto_now_add=True)
last_login = models.DateTimeField(blank=True, null=True)
is_male = models.BooleanField(default=True)
profile_picture = models.ImageField(upload_to='profile_pictures/', max_length=255, blank=True, null=True)
email = models.EmailField(verbose_name='email address', max_length=255, blank=True, null=True)
birth_date = models.DateField(blank=True, null=True)
objects = MyUserManager()
USERNAME_FIELD = 'username'
def __str__(self):
return self.username
def has_perm(self, perm, obj=None):
"Does the user have a specific permission?"
# Simplest possible answer: Yes, always
return True
def has_module_perms(self, app_label):
"Does the user have permissions to view the app `app_label`?"
# Simplest possible answer: Yes, always
return True
@property
def is_staff(self):
"Is the user a member of staff?"
# Simplest possible answer: All admins are staff
return self.is_admin
class Meta:
db_table = 'User'
@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_auth_token(sender, instance=None, created=False, **kwargs):
if created:
Token.objects.create(user=instance)
class Token(Token):
key = models.CharField(_("Key"), max_length=40, primary_key=True)
user = models.ForeignKey(User, related_name='auth_tokens', on_delete=models.CASCADE, verbose_name=_("User"))
created = models.DateTimeField(_("Created"), auto_now_add=True)
... +
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'your_project.authentication.TokenAuthentication',
],
}
+ ... +
AUTH_USER_MODEL = 'user.User'
+ ...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment