# -*- coding: utf-8 -*- from django.db import models from django.contrib.auth.models import BaseUserManager, AbstractBaseUser, PermissionsMixin from django.core.mail import send_mail from django.utils import timezone from django.db.models.signals import post_save """ 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, is_staff=False, is_active=True, is_superuser=False, last_login=now, date_joined=now, **extra_fields ) user.set_password(password) user.save(using=self._db) return user def create_superuser(self, email, first_name, last_name, password, **extra_fields): if not email: raise ValueError('Вы должни ввести электронную почту') user = self.create_user( email = UserManager.normalize_email(email), 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 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 = 'Электронная почта', max_length = 255, unique = True, db_index = True, ) first_name = models.CharField(verbose_name='Имя', max_length=255) last_name = models.CharField(verbose_name='Фамилия', max_length=255) # is_active = models.BooleanField(default=1) # СДЕЛАТЬ проверку на емейле is_staff = models.BooleanField(default=0) is_admin = models.BooleanField(default=0) is_translator = models.BooleanField(verbose_name='Переводчик', 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 country = models.ForeignKey('country.Country', verbose_name='Страна', blank=True, null=True, related_name='users') city = models.ForeignKey('city.City', verbose_name='Город', blank=True, null=True) company = models.ForeignKey('company.Company', blank=True, null=True) organiser = models.ForeignKey('organiser.Organiser', blank=True, null=True) #other user information phone = models.PositiveIntegerField(verbose_name='Телефон', blank=True, null=True) url = models.CharField(verbose_name='URL', max_length=255, blank=True) position = models.CharField(verbose_name='Должность', max_length=255, blank=True) about = models.TextField(verbose_name='О себе', blank=True) avatar = models.ImageField(verbose_name='Фото', upload_to='/accounts/avatar/', blank=True) web_page = models.CharField(verbose_name='Вебсайт', max_length=255, blank=True) social = models.TextField(verbose_name='Социальные страници', 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) # objects = UserManager() USERNAME_FIELD = 'email' 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 __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 """ 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 """ class TranslatorProfile(models.Model): """ Extra information about tranlators """ #required field, relation with user model user = models.ForeignKey(User, related_name='translator') #other fields education = models.CharField(verbose_name='Образование', max_length=255, blank=True) specialization = models.CharField(verbose_name='Специализация', max_length=255, blank=True) languages = models.CharField(verbose_name='Языки', max_length=255, blank=True) native_language= models.CharField(verbose_name='Родной язык', max_length=255, blank=True) car = models.BooleanField(verbose_name='Личный автомобиль', default=0) prices = models.TextField(verbose_name='Тарифы', blank=True) discounts = models.TextField(verbose_name='Скидки', blank=True) def __unicode__(self): return self.user.email def create_translator_profile(sender, **kw): """ create Translator profile if "is_translator" field in User model true if it's false delete Translator profile connected to User """ user = kw["instance"] if user.is_translator: translator = TranslatorProfile(user=user) translator.save() else: try: TranslatorProfile.objects.get(user = user).delete() except: pass post_save.connect(create_translator_profile, sender=User)