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.
218 lines
7.3 KiB
218 lines
7.3 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 = TreeForeignKey(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', blank=True, null=True)
|
|
|
|
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, related_name='orders')
|
|
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)
|
|
budget = models.DecimalField(max_digits=10, decimal_places=0, default=0, null=True)
|
|
budget_by_agreement = models.BooleanField(default=False)
|
|
specialization = TreeForeignKey(Specialization, related_name='portfolios')
|
|
term = models.IntegerField(default=0)
|
|
term_type = models.CharField(max_length=20, choices=TERMS, default='hour')
|
|
building_classification = models.ForeignKey(BuildingClassfication, related_name='portfolios')
|
|
construction_type = models.ForeignKey(ConstructionType, related_name='portfolios')
|
|
location = TreeForeignKey('common.Location', related_name='portfolios', null=True, blank=True)
|
|
worksell = models.BooleanField(default=False)
|
|
user = models.ForeignKey(User, related_name='portfolios')
|
|
|
|
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
|
|
|