# -*- coding: utf-8 -*- from django.db import models from hvad.models import TranslatableModel, TranslatedFields from django.contrib.auth.models import BaseUserManager, AbstractBaseUser, PermissionsMixin from django.core.mail import send_mail from django.utils import timezone from django.utils.translation import ugettext as _ from django.db.models.signals import post_save #custom functions from functions.form_check import translit_with_separator import random, string from django.core.validators import email_re from django.db.models import Q """ from django.contrib.auth.hashers import check_password from hashlib import md5 from django.contrib.auth import get_user_model from django.db.models import get_model """ class UserManager(BaseUserManager): """ Creates and saves a User with the given email, first_name, last_name and password. """ def create_user(self, email, first_name, last_name, password=None, **extra_fields): now = timezone.now() if not email: raise ValueError('Вы должни ввести электронную почту') user= self.model( email = UserManager.normalize_email(email),first_name = first_name,last_name = last_name, username = UserManager.normalize_email(email), is_staff=False, is_active=False, is_superuser=False, last_login=now, date_joined=now, **extra_fields ) user.set_password(password) user.save(using=self._db) return user def create_social_user(self,username, first_name, last_name, password=None, **extra_fields): now = timezone.now() # generate random password digits = random.sample(('0', '1', '2', '3', '4', '5', '6', '7', '8', '9'), 4) chars = random.sample(string.lowercase[:], 4) password = chars + digits random.shuffle(password) password = ''.join(password) user= self.model(first_name=first_name, last_name=last_name, username=username, is_staff=False, is_active=True, is_superuser=False, last_login=now, date_joined=now, **extra_fields) check = True if email_re.match(username) else False if check: user.email = UserManager.normalize_email(username) user.set_password(password) user.save(using=self._db) return user def create_superuser(self, username, first_name, last_name, password, **extra_fields): if not username: raise ValueError('Вы должни ввести электронную почту') username = UserManager.normalize_email(username) user = self.create_user( email = username, first_name = first_name,last_name = last_name, password = password, **extra_fields ) user.is_staff = True user.is_active = True user.is_superuser = True user.is_admin = True user.save(using=self._db) return user def safe_get(self, **kwargs): model = self.model try: return model.objects.get(**kwargs) except: return None class User(AbstractBaseUser, PermissionsMixin): """ Implementing a fully featured User model with admin-compliant permissions. Email, first name, last name and password are required. Other fields are optional. """ email = models.EmailField( verbose_name = u'Email', max_length = 255, #unique = True, db_index = True, ) username = models.CharField(verbose_name='Email', max_length=255, unique=True, db_index=True) first_name = models.CharField(verbose_name='First name', max_length=255) last_name = models.CharField(verbose_name='Last name', max_length=255) url = models.SlugField(blank=True) # is_active = models.BooleanField(default=0) # СДЕЛАТЬ проверку на емейле is_staff = models.BooleanField(default=0) is_admin = models.BooleanField(default=0) date_joined = models.DateTimeField(auto_now_add=True) date_registered = models.DateTimeField(blank=True, null=True)# date_modified = models.DateTimeField(auto_now=True) #relations organiser = models.ForeignKey('organiser.Organiser', verbose_name='Организатор', blank=True, null=True, unique=True, on_delete=models.PROTECT) translator = models.ForeignKey('translator.Translator', verbose_name='Переводчик', blank=True, null=True, unique=True, on_delete=models.PROTECT, related_name='user') company = models.ForeignKey('company.Company', blank=True, null=True, on_delete=models.PROTECT, related_name='users') objects = UserManager() USERNAME_FIELD = 'username' REQUIRED_FIELDS = ['first_name', 'last_name'] def get_full_name(self): """ Returns the first_name plus the last_name, with a space in between. """ return u'%s %s'%(self.first_name, self.last_name) def set_url(self, st): """ """ self.url = translit_with_separator(u'%s'%st) def __unicode__(self): return self.email def get_short_name(self): "Returns the short name for the user." return self.first_name def email_user(self, subject, message, from_email=None): """ Sends an email to this User. """ send_mail(subject, message, from_email, [self.email]) def has_perm(self, perm, obj=None): return True def has_module_perms(self, app_label): return True def get_expositions_number(self): return len(self.exposition_users.all()) def get_conferences_number(self): return len(self.conference_users.all()) def get_seminars_number(self): return len(self.seminar_users.all()) def get_webinars_number(self): return len(self.webinar_users.all()) def get_events_number(self): n = self.get_expositions_number() + self.get_conferences_number() + self.get_seminars_number() + self.get_webinars_number() return n def get_permanent_url(self): if self.url: return '/user/'+self.url+'/' return '/user/'+str(self.id)+'/' class Profile(models.Model): user = models.OneToOneField(User) country = models.ForeignKey('country.Country', verbose_name='Страна', blank=True, null=True, on_delete=models.PROTECT, related_name='users') city = models.ForeignKey('city.City', verbose_name='Город', blank=True, null=True, on_delete=models.PROTECT) position = models.CharField(verbose_name='Должность', max_length=255, blank=True) work = models.CharField(verbose_name='Работа', max_length=255, blank=True) about_company = models.TextField(verbose_name=_(u'Описание компании'), blank=True) phone = models.BigIntegerField(verbose_name='Телефон', blank=True, null=True) web_page = models.URLField(verbose_name='Вебсайт',blank=True) about = models.TextField(verbose_name='О себе', blank=True) avatar = models.ImageField(verbose_name='Фото', upload_to='accounts/avatar/', blank=True) skype = models.CharField(blank=True, max_length=255) facebook = models.URLField(verbose_name=_(u'Facebook'), blank=True) twitter = models.URLField(verbose_name=_(u'Twitter'), blank=True) linkedin = models.URLField(verbose_name=_(u'LinkedIn'), blank=True) vk = models.URLField(verbose_name=_(u'В контакте'), blank=True) # meta title = models.CharField(max_length=255, blank=True) descriptions = models.CharField(max_length=255, blank=True) keywords = models.CharField(max_length=255, blank=True) from dateutil.relativedelta import relativedelta class Calendar(models.Model): user = models.OneToOneField(User) expositions = models.ManyToManyField('exposition.Exposition', null=True) conferences = models.ManyToManyField('conference.Conference', null=True) seminars = models.ManyToManyField('seminar.Seminar', null=True) webinars = models.ManyToManyField('webinar.Webinar', null=True) def get_events(self): events = list(self.expositions.all()) + list(self.conferences.all()) + list(self.seminars.all()) + list(self.webinars.all()) return events def events_by_month(self, day): exp = list(self.expositions.filter((Q(data_begin__month=day.month) & Q(data_begin__year=day.year))\ | (Q(data_end__month=day.month) & Q(data_end__year=day.year)))) con = list(self.conferences.filter((Q(data_begin__month=day.month) & Q(data_begin__year=day.year))\ | (Q(data_end__month=day.month) & Q(data_end__year=day.year)))) sem = list(self.seminars.filter((Q(data_begin__month=day.month) & Q(data_begin__year=day.year))\ | (Q(data_end__month=day.month) & Q(data_end__year=day.year)))) web = list(self.webinars.filter(Q(data_begin__month=day.month)&Q(data_begin__year=day.year))) return exp+con+sem+web def create_user_inf(sender, instance, created, **kwargs): if created: Calendar.objects.create(user=instance) Profile.objects.create(user=instance) post_save.connect(create_user_inf, sender=User) #need import after User Model, because User imported in "organiser.models" #from organiser.models import Organiser ''' def create_profiles(sender, **kw): """ create Translator profile if "is_translator" field in User model true if it's false delete Translator profile connected to User create Organiser profile if "is_organiser" field in User model true if it's false delete Organiser profile connected to User """ user = kw["instance"] if user.is_translator and not user.translator.all(): #check flag is_translator and if translator profile already exist translator = TranslatorProfile(user=user) translator.save() if not user.is_translator: TranslatorProfile.objects.filter(user = user).delete() if user.is_organiser and not user.organiser.all(): #check flag is_organiser and if organiser profile already exist organiser = Organiser(user=user) if user.country: organiser.country = user.country if user.city: organiser.city = user.city organiser.save() data = {'name_ru':user.get_full_name()} zero_fields = {} fill_trans_fields_all(Organiser, organiser, data, None, zero_fields) #populate empty fields and fields which was already populated organiser_id = getattr(organiser, 'id') populate_all(Organiser, data, organiser_id, zero_fields) if not user.is_organiser: Organiser.objects.filter(user = user).delete() post_save.connect(create_profiles, sender=User) ''' """ class MyUserAuthBackend(object): def check_md5_password(self, db_password, supplied_password): return md5(supplied_password).hex_digest(), db_password def authenticate(self, username=None, password=None, **kwargs): # Authenticate a user based on email address as the user name. UserModel = get_user_model() if username is None: username = kwargs.get(UserModel.USERNAME_FIELD) try: user = UserModel._default_manager.get_by_natural_key(username) if check_password(password, user.password): # user.set_password(password) # user.save() return user #if user.check_password(password): # return user except UserModel.DoesNotExist: return None def get_user(self, user_id): try: UserModel = get_user_model() return UserModel._default_manager.get(pk=user_id) except UserModel.DoesNotExist: return None """