from mptt.models import TreeForeignKey, TreeManyToManyField from datetime import datetime from django.db import models from django.utils import timezone from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, AbstractUser, Group, PermissionsMixin from specializations.models import Specialization class UserManager(BaseUserManager): def create_user(self, username, email, password=None, **kwargs): # import code; code.interact(local=dict(globals(), **locals())) if not email: raise ValueError('Users must have an email address') user = self.model(username=username, email=UserManager.normalize_email(email),) user.set_password(password) user.save(using=self._db) return user def create_superuser(self, username, password): user = self.create_user(username, "admin@exampletest.com", password) user.is_superuser = True user.save(using=self._db) return user class ContractorUserManager(models.Manager): def get_queryset(self): return super().get_queryset().filter(groups__name='Исполнители') class CustomerUserManager(models.Manager): def get_queryset(self): return super().get_queryset().filter(groups__name='Заказчики') GENDERS = ( ('male', 'Мужской'), ('female', 'Женский'), ) class ContractorFinancialInfo(models.Model): RESIDENCIES = ( ('russian_resident', 'Резидент РФ'), ('non_russian_resident', 'Нерезидент РФ'), ('refugee', 'Беженец'), ('russian_stay_permit', 'Вид на жительство'), ) LEGAL_STATUSES = ( ('individual', 'Физическое лицо'), ('legal_entity', 'ИП и юридическое лицо'), ) fio = models.CharField(max_length=255) date_of_birth = models.DateTimeField() phone = models.CharField(max_length=30) residency = models.CharField(max_length=50, choices=RESIDENCIES) legal_status = models.CharField(max_length=30, choices=LEGAL_STATUSES) passport_series = models.CharField(max_length=6) passport_number = models.CharField(max_length=10) subdivision_code = models.CharField(max_length=10) passport_issued_by = models.CharField(max_length=255) passport_issue_date = models.DateTimeField() inn = models.CharField(max_length=100) yandex_money = models.CharField(max_length=50) credit_card_number = models.CharField(max_length=50) passport_scan = models.ImageField(upload_to='users/contractors/') def __str__(self): return self.fio class Meta: verbose_name = 'Финансовая информация' verbose_name_plural = 'Финансовая информация' class User(AbstractBaseUser, PermissionsMixin): STATUSES = ( ('free', 'Свободен'), ('busy', 'Занят'), ) username = models.CharField(max_length=50, unique=True) first_name = models.CharField(max_length=255, blank=True) last_name = models.CharField(max_length=255, blank=True) patronym = models.CharField(max_length=255, blank=True) email = models.EmailField(max_length=255, unique=True, db_index=True) is_active = models.BooleanField(default=True) created = models.DateTimeField(default=timezone.now) date_joined = models.DateTimeField(default=timezone.now) last_time_visit = models.DateTimeField(default=timezone.now) contractor_specializations = TreeManyToManyField(Specialization, related_name='contractors', blank=True) contractor_status = models.CharField(default='free', max_length=20, choices=STATUSES) contractor_financial_info = models.OneToOneField(ContractorFinancialInfo, related_name='contractor',blank=True, null=True) location = TreeForeignKey('common.Location', related_name='users', null=True, blank=True) skype = models.CharField(max_length=100, blank=True) gender = models.CharField(max_length=30, choices=GENDERS, blank=True) cro = models.BooleanField(default=False) website = models.CharField(max_length=255, blank=True) date_of_birth = models.DateTimeField(null=True,blank=True) avatar = models.ImageField(upload_to='users/avatars/', blank=True) phone = models.CharField(max_length=30, blank=True, null=True) @property def is_staff(self): return self.is_superuser @property def is_free(self): return self.contractor_status == 'free' def __str__(self): return self.email def get_short_name(self): return self.email def get_full_name(self): return self.first_name + ' ' + self.last_name def get_profile_image(self): return self.avatar USERNAME_FIELD = 'username' REQUIRED_FIELDS = [] objects = UserManager() contractor_objects = ContractorUserManager() customer_objects = CustomerUserManager() class Meta: verbose_name = 'Пользователь' verbose_name_plural = 'Пользователи' def is_contractor(self): return self.groups.filter(name='Исполнители').exists() def is_customer(self): return self.groups.filter(name='Заказчики').exists() def is_owner_profile(self, user_id): pass # return class Team(models.Model): name = models.CharField(max_length=255) users = models.ManyToManyField(User, related_name ='teams', blank=True) owner = models.OneToOneField(User, related_name='team', blank=True, null=True) # groups = models.ManyToManyField(Group, related_name='teams', blank=True) def __str__(self): return self.name class Meta: verbose_name = 'Команда' verbose_name_plural = 'Команды'