From 01e09741f6612ab2df57305bd5a304fc36ac2fa1 Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Tue, 13 Feb 2018 11:50:42 +0300 Subject: [PATCH] Auto create auth token for user --- apps/user/models.py | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/apps/user/models.py b/apps/user/models.py index 98118880..0572e4d0 100644 --- a/apps/user/models.py +++ b/apps/user/models.py @@ -3,9 +3,12 @@ from django.contrib.auth.models import AbstractUser, UserManager from django.contrib.postgres import fields as pgfields from django.utils.translation import gettext_lazy as _ +from rest_framework.authtoken.models import Token + from json import dumps from api.v1 import serializers + class User(AbstractUser): USER_ROLE = 0 AUTHOR_ROLE = 1 @@ -24,8 +27,10 @@ class User(AbstractUser): (FEMALE, 'Женщина'), ) email = models.EmailField(_('email address'), unique=True) - role = models.PositiveSmallIntegerField('Роль', default=0, choices=ROLE_CHOICES) - gender = models.CharField('Пол', max_length=1, default='n', choices=GENDER_CHOICES) + role = models.PositiveSmallIntegerField( + 'Роль', default=0, choices=ROLE_CHOICES) + gender = models.CharField( + 'Пол', max_length=1, default='n', choices=GENDER_CHOICES) birthday = models.DateField('День рождения', null=True, blank=True) country = models.CharField('Страна', max_length=50, null=True, blank=True) city = models.CharField('Город', max_length=85, null=True, blank=True) @@ -38,7 +43,9 @@ class User(AbstractUser): vkontakte = models.URLField('ВКонтакте', default='', null=True, blank=True) fb_id = models.BigIntegerField(null=True, blank=True, unique=True) fb_data = pgfields.JSONField(default={}, null=True, blank=True) - is_email_proved = models.BooleanField('Верифицирован по email', default=False) + is_email_proved = models.BooleanField( + 'Верифицирован по email', default=False + ) photo = models.ImageField('Фото', null=True, blank=True, upload_to='users') USERNAME_FIELD = 'email' @@ -51,3 +58,17 @@ class User(AbstractUser): user_data = serializers.user.UserSerializer(instance=self).data user_data = dumps(user_data, ensure_ascii=False) return user_data + + @receiver(post_save, sender=User) + def create_auth_token(sender, instance=None, created=False, **kwargs): + if ( + (instance.is_active or instance.fb_id) and + instance.role in [User.AUTHOR_ROLE, User.ADMIN_ROLE] and not + hasattr(instance, 'auth_token') + ): + Token.objects.create(user=instance) + elif ( + not (instance.is_active or instance.fb_id) or + instance.role not in [User.AUTHOR_ROLE, User.ADMIN_ROLE] + ) and hasattr(instance, 'auth_token'): + instance.auth_token.delete()