119 lines
4.0 KiB
Python
119 lines
4.0 KiB
Python
# coding=utf-8
|
|
from __future__ import unicode_literals
|
|
|
|
import json
|
|
|
|
from django.contrib.auth.models import User
|
|
from django.db import models
|
|
from django.utils.translation import gettext_lazy as _
|
|
from django.db.models.signals import post_save, pre_save
|
|
from django.contrib.contenttypes.fields import GenericRelation
|
|
from django.contrib.postgres.fields import JSONField
|
|
from BaseModels.base_models import BaseModel
|
|
from datetime import datetime
|
|
|
|
|
|
def user_name_str(self):
|
|
return f'{self.last_name} {self.first_name}'
|
|
|
|
|
|
User.add_to_class("__str__", user_name_str)
|
|
|
|
|
|
account_type_choices = (
|
|
('mover', _('Перевозчик')),
|
|
('sender', _('Отправитель'))
|
|
)
|
|
|
|
|
|
class UserProfile(BaseModel):
|
|
|
|
account_type = models.CharField(
|
|
max_length=250, verbose_name=_('Тип учетной записи'), choices=account_type_choices, default='sender')
|
|
|
|
user = models.OneToOneField(User, verbose_name=_('Пользователь'), related_name=u'user_profile',
|
|
null=True, blank=True, on_delete=models.CASCADE)
|
|
|
|
avatar = models.ImageField(upload_to='uploads/', verbose_name=_('Аватар'), null=True, blank=True)
|
|
|
|
authMailCode = models.CharField(max_length=32, null=True, blank=True)
|
|
|
|
phone = models.CharField(max_length=100, verbose_name=_('Телефон'), null=True, blank=True)
|
|
country = models.CharField(max_length=250, verbose_name=_('Страна'), null=True, blank=True)
|
|
city = models.CharField(max_length=250, verbose_name=_('Город'), null=True, blank=True)
|
|
|
|
birthdate = models.DateField(verbose_name=_('Дата рождения'), null=True, blank=True)
|
|
|
|
comment = models.TextField(verbose_name=_('Дополнительные сведения'), null=True, blank=True)
|
|
|
|
creator = models.ForeignKey(
|
|
User, verbose_name=_('Создатель'), related_name='rel_users_for_creator', null=True, blank=True,
|
|
on_delete=models.SET_NULL
|
|
)
|
|
|
|
mailing_on = models.BooleanField(default=False, verbose_name=_('Рассылка'))
|
|
|
|
def get_timezone(self):
|
|
tz = None
|
|
if 'user_timezone' in self.json_data:
|
|
tz = self.json_data['user_timezone']
|
|
return tz
|
|
|
|
def save_user_alerts_to_session(self, request):
|
|
for_save_to_session = self.get_node_by_name('for_save_to_session')
|
|
if for_save_to_session:
|
|
for key, val in for_save_to_session.items():
|
|
request.session[key] = val
|
|
return request
|
|
|
|
|
|
def __str__(self):
|
|
if self.user:
|
|
return '{0} {1}'.format(self.user.last_name, self.user.first_name)
|
|
else:
|
|
return str(self.id)
|
|
|
|
|
|
class Meta:
|
|
verbose_name = _(u'Профиль')
|
|
verbose_name_plural = _(u'Профили')
|
|
ordering = ('user__last_name', 'user__first_name')
|
|
|
|
|
|
|
|
def create_user_profile(sender, instance, created, **kwargs):
|
|
user_profile = None
|
|
if created:
|
|
user_profile = UserProfile.objects.create(user=instance)
|
|
|
|
# if user_profile and not user_profile.avatar:
|
|
# from allauth.socialaccount.models import SocialAccount
|
|
# # try:
|
|
# social_accounts = SocialAccount.objects.filter(user=instance)
|
|
# if social_accounts:
|
|
# for social_account in social_accounts:
|
|
# if 'picture' in social_account.account.extra_data and social_account.account.extra_data['picture']:
|
|
# with open(social_account.account.extra_data['picture'], 'rb') as fd:
|
|
# user_profile.avatar.save(f'avatar_{instance.id}.jpeg', fd.read(), True)
|
|
#
|
|
# # except Exception as e:
|
|
# # msg = f'post_save create_user_profile Error = {str(e)}'
|
|
# # print(msg)
|
|
|
|
|
|
post_save.connect(create_user_profile, sender=User, dispatch_uid='post_save_connect')
|
|
|
|
|
|
def preSaveUser(sender, instance, **kwargs):
|
|
if not instance.email:
|
|
instance.email = str(instance.username).lower()
|
|
|
|
|
|
try:
|
|
instance.user_profile.modifiedDT = datetime.now()
|
|
except:
|
|
pass
|
|
|
|
|
|
pre_save.connect(preSaveUser, sender=User, dispatch_uid='pre_save_connect')
|