You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
87 lines
3.3 KiB
87 lines
3.3 KiB
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()
|
|
|