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.
 
 
 
 
 
 

193 lines
6.7 KiB

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
GENDERS = (
('male', 'Мужской'),
('female', 'Женский'),
)
class UserManager(BaseUserManager):
def create_user(self, username, email, password=None, **kwargs):
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='Заказчики')
class UserFinancialInfo(models.Model):
RESIDENCIES = (
('russian_resident', 'Резидент РФ'),
('non_russian_resident', 'Нерезидент РФ'),
('refugee', 'Беженец'),
('russian_stay_permit', 'Вид на жительство'),
)
LEGAL_STATUSES = (
('individual', 'Физическое лицо'),
('legal_entity', 'ИП и юридическое лицо'),
)
credit_card_number = models.CharField(max_length=50)
date_of_birth = models.DateTimeField()
fio = models.CharField(max_length=255)
inn = models.CharField(max_length=100)
legal_status = models.CharField(max_length=30, choices=LEGAL_STATUSES)
passport_issue_date = models.DateTimeField()
passport_issued_by = models.CharField(max_length=255)
passport_number = models.CharField(max_length=10)
passport_scan = models.ImageField(upload_to='users/contractors/')
passport_series = models.CharField(max_length=6)
phone = models.CharField(max_length=30)
residency = models.CharField(max_length=50, choices=RESIDENCIES)
subdivision_code = models.CharField(max_length=10)
yandex_money = models.CharField(max_length=50)
def __str__(self):
return self.fio
class Meta:
verbose_name = 'Финансовая информация'
verbose_name_plural = 'Финансовая информация'
class ContractorResume(models.Model):
resume_file = models.FileField(upload_to='users/resume/files/', null=True, blank=True)
text = models.TextField(null=True, blank=True)
def __str__(self):
return self.text
class Meta:
verbose_name = 'Резюме'
verbose_name_plural = 'Резюме'
RESUME_TYPE_FILES = (
('diplom', 'Дипломы/Сертификаты'),
('cro', 'Допуск CPO'),
)
class ContractorResumeFiles(models.Model):
description = models.TextField(blank=True)
img = models.ImageField(upload_to='users/resume/images/')
resume = models.ForeignKey(ContractorResume, related_name='resume_files')
title = models.CharField(max_length=255)
type = models.CharField(max_length=50, choices=RESUME_TYPE_FILES)
def __str__(self):
return self.title
class Meta:
verbose_name = 'Файлы резюме'
verbose_name_plural = 'Файлы резюме'
class User(AbstractBaseUser, PermissionsMixin):
STATUSES = (
('free', 'Свободен'),
('busy', 'Занят'),
)
avatar = models.ImageField(upload_to='users/avatars/', blank=True)
contractor_resume = models.OneToOneField(ContractorResume, related_name='contractor', blank=True, null=True)
contractor_specializations = TreeManyToManyField(Specialization, related_name='contractors', blank=True)
contractor_status = models.CharField(default='free', max_length=20, choices=STATUSES)
created = models.DateTimeField(default=timezone.now)
cro = models.BooleanField(default=False)
date_joined = models.DateTimeField(default=timezone.now)
date_of_birth = models.DateTimeField(null=True, blank=True)
email = models.EmailField(max_length=255, unique=True, db_index=True)
financial_info = models.OneToOneField(UserFinancialInfo, related_name='user', blank=True, null=True)
first_name = models.CharField(max_length=255, blank=True)
gender = models.CharField(max_length=30, choices=GENDERS, blank=True)
is_active = models.BooleanField(default=True)
last_name = models.CharField(max_length=255, blank=True)
last_time_visit = models.DateTimeField(default=timezone.now)
location = TreeForeignKey('common.Location', related_name='users', null=True, blank=True)
patronym = models.CharField(max_length=255, blank=True)
phone = models.CharField(max_length=30, blank=True, null=True)
skype = models.CharField(max_length=100, blank=True)
username = models.CharField(max_length=50, unique=True)
website = models.CharField(max_length=255, blank=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
class Team(models.Model):
created = models.DateTimeField(default=timezone.now)
name = models.CharField(max_length=255)
owner = models.OneToOneField(User, related_name='team', blank=True, null=True)
specializations = TreeManyToManyField(Specialization, related_name='teams', blank=True)
users = models.ManyToManyField(User, related_name ='teams', blank=True)
def __str__(self):
return self.name
class Meta:
verbose_name = 'Команда'
verbose_name_plural = 'Команды'