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.
 
 
 
 
 
 

209 lines
6.6 KiB

from mptt.models import TreeForeignKey
from datetime import datetime
from django.db import models
from django.utils import timezone
from users.models import User
from specializations.models import Specialization
CURRENCIES = (
('rur', 'RUR'),
('usd', 'USD'),
('eur', 'EUR'),
)
TERMS = (
('project', 'За проект'),
('hour', 'За час'),
('day', 'За день'),
('month', 'За месяц'),
)
class BuildingClassfication(models.Model):
name = models.CharField(max_length=255)
def __str__(self):
return self.name
class Meta:
verbose_name = 'Тип здания'
verbose_name_plural = 'Типы зданий'
class ConstructionType(models.Model):
name = models.CharField(max_length=255)
def __str__(self):
return self.name
class Meta:
verbose_name = 'Вид строительства'
verbose_name_plural = 'Виды строительства'
class Realty(models.Model):
building_classification = models.ForeignKey(BuildingClassfication, related_name='realties')
construction_type = models.ForeignKey(ConstructionType, related_name='realties')
location = TreeForeignKey('common.Location', related_name='realties', null=True, blank=True)
name = models.CharField(max_length=255)
user = models.ForeignKey(User, related_name='realties')
def __str__(self):
return self.name
class Meta:
verbose_name = 'Объект'
verbose_name_plural = 'Объекты'
class Project(models.Model):
WORK_TYPES = (
(1, 'Проектирование'),
(2, 'Техническое сопровождение')
)
DEAL_TYPES = (
('secure_deal', 'Безопасная сделка (с резервированием бюджета) '),
('direct_payment', 'Прямая оплата Исполнителю на его кошелек/счет'),
)
STATES = (
('active', 'Активный'),
('trashed', 'В корзине'),
('deleted', 'Удален'),
)
budget = models.DecimalField(max_digits=10, decimal_places=0)
budget_by_agreement = models.BooleanField(default=False)
created = models.DateTimeField(default=timezone.now)
cro = models.BooleanField(default=False)
currency = models.CharField(max_length=20, default='rur', choices=CURRENCIES)
customer = models.ForeignKey(User, related_name='projects')
name = models.CharField(max_length=255)
price_and_term_required = models.BooleanField(default=False)
realty = models.ForeignKey(Realty, blank=True, null=True, related_name='projects')
deal_type = models.CharField(max_length=20, default='secure_deal', choices=DEAL_TYPES)
specialization = models.ForeignKey(Specialization, related_name='projects')
term = models.IntegerField(default=0)
term_type = models.CharField(max_length=20, choices=TERMS, default='hour')
text = models.TextField(blank=True)
work_type = models.IntegerField(default=1, choices=WORK_TYPES)
state = models.CharField(default='active', max_length=20, choices=STATES)
def __str__(self):
return self.name
class Meta:
verbose_name = 'Проект'
verbose_name_plural = 'Проекты'
def secure_deal(self):
return self.deal_type == 'secure_deal'
class ProjectFile(models.Model):
file = models.FileField(upload_to='projects/project_files')
project = models.ForeignKey(Project, related_name='files')
class Meta:
verbose_name = 'Файл проекта'
verbose_name_plural = 'Файлы проектов'
def __str__(self):
return self.file and self.file.url or self.pk
class Answer(models.Model):
budget = models.DecimalField(max_digits=10, decimal_places=0)
currency = models.CharField(max_length=5, choices=CURRENCIES, default='rur')
created = models.DateTimeField(default=timezone.now)
project = models.ForeignKey(Project, related_name='answers')
term = models.IntegerField(default=0)
term_type = models.CharField(max_length=10, choices=TERMS, default='hour')
text = models.TextField()
contractor = models.ForeignKey(User, related_name='answers')
def __str__(self):
return self.text
class Meta:
verbose_name = 'Ответ к проекту'
verbose_name_plural = 'Ответы к проектам'
ordering = ('-created',)
class Order(models.Model):
contractor = models.ForeignKey(User, null=True, blank=True)
created = models.DateTimeField(default=timezone.now)
project = models.OneToOneField(Project, related_name='order')
secure = models.BooleanField(default=False)
status = models.BooleanField(default=False)
def __str__(self):
return self.project.name
class Meta:
verbose_name = 'Заказ'
verbose_name_plural = 'Заказы'
class Stage(models.Model):
cost = models.DecimalField(max_digits=10, decimal_places=0)
cost_type = models.CharField(max_length=5, choices=CURRENCIES, default='rur')
name = models.CharField(max_length=255)
order = models.ForeignKey(Order, related_name='stages')
result = models.CharField(max_length=255)
term = models.IntegerField(default=0)
term_type = models.CharField(max_length=10, choices=TERMS, default='hour')
def __str__(self):
return self.name
class Meta:
verbose_name = 'Этап'
verbose_name_plural = 'Этапы'
class Candidate(models.Model):
answer = models.ForeignKey(Answer, related_name='candidates')
project = models.ForeignKey(Project, related_name='candidates')
status = models.BooleanField(default=False)
def __str__(self):
return self.answer.user.get_full_name()
class Meta:
verbose_name = 'Кандидат'
verbose_name_plural = 'Кандидаты'
class Portfolio(models.Model):
description = models.TextField()
name = models.CharField(max_length=255)
user = models.ForeignKey(User, related_name='portfolio')
def __str__(self):
return self.name
class Meta:
verbose_name = 'Портфолио'
verbose_name_plural = 'Портфолио'
def get_cover(self):
cover = None
all_photos = self.portfoliophoto_set.all()
if all_photos:
cover = all_photos[0].img
return cover
class PortfolioPhoto(models.Model):
img = models.ImageField(upload_to='projects/portfolio')
portfolio = models.ForeignKey(Portfolio)
class Meta:
verbose_name = 'Фото портфолио'
verbose_name_plural = 'Фото портфолио'
# def __str__(self):
# return self.img