from django.db import models from django.db.models.signals import post_save from django.dispatch import receiver 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 ADMIN_ROLE = 2 ROLE_CHOICES = ( (USER_ROLE, 'пользователь'), (AUTHOR_ROLE, 'автор'), (ADMIN_ROLE, 'администратор'), ) NOT_DEFINED = 'n' MALE = 'm' FEMALE = 'f' GENDER_CHOICES = ( (NOT_DEFINED, 'не указан'), (MALE, 'Мужчина'), (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) 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) about = models.CharField('О себе', max_length=1000, null=True, blank=True) instagram = models.URLField(default='', null=True, blank=True) facebook = models.URLField(default='', null=True, blank=True) twitter = models.URLField(default='', null=True, blank=True) pinterest = models.URLField(default='', null=True, blank=True) youtube = models.URLField(default='', null=True, blank=True) 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 ) photo = models.ImageField('Фото', null=True, blank=True, upload_to='users') USERNAME_FIELD = 'email' REQUIRED_FIELDS = ['username'] class Meta(AbstractUser.Meta): ordering = ('-date_joined',) def serialized(self): user_data = serializers.user.UserSerializer(instance=self).data user_data = dumps(user_data, ensure_ascii=False) return user_data @property def balance(self): aggregate = self.balances.aggregate( models.Sum('amount'), models.Sum('commission'), ) amount = aggregate.get('amount__sum') or 0 commission = aggregate.get('commission__sum') or 0 return amount - commission @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()