102 lines
3.3 KiB
Python
102 lines
3.3 KiB
Python
from django.conf import settings
|
||
from django.db import models
|
||
|
||
|
||
class Project(models.Model):
|
||
class Status(models.TextChoices):
|
||
PLANNED = "planned", "Планируется"
|
||
ACTIVE = "active", "В работе"
|
||
PAUSED = "paused", "Приостановлен"
|
||
COMPLETED = "completed", "Завершён"
|
||
ARCHIVED = "archived", "Архив"
|
||
|
||
name = models.CharField("Название", max_length=255)
|
||
description = models.TextField("Цель и описание", blank=True)
|
||
customer = models.CharField("Заказчик", max_length=255, blank=True)
|
||
manager = models.ForeignKey(
|
||
settings.AUTH_USER_MODEL,
|
||
on_delete=models.PROTECT,
|
||
related_name="managed_projects",
|
||
)
|
||
status = models.CharField(
|
||
max_length=16, choices=Status.choices, default=Status.PLANNED
|
||
)
|
||
starts_on = models.DateField(null=True, blank=True)
|
||
ends_on = models.DateField(null=True, blank=True)
|
||
created_by = models.ForeignKey(
|
||
settings.AUTH_USER_MODEL,
|
||
on_delete=models.PROTECT,
|
||
related_name="created_projects",
|
||
)
|
||
created_at = models.DateTimeField(auto_now_add=True)
|
||
updated_at = models.DateTimeField(auto_now=True)
|
||
|
||
class Meta:
|
||
ordering = ["name", "pk"]
|
||
verbose_name = "Локальный проект"
|
||
verbose_name_plural = "Локальные проекты"
|
||
constraints = [
|
||
models.CheckConstraint(
|
||
condition=models.Q(ends_on__isnull=True)
|
||
| models.Q(starts_on__isnull=True)
|
||
| models.Q(ends_on__gte=models.F("starts_on")),
|
||
name="project_dates_order",
|
||
)
|
||
]
|
||
|
||
def __str__(self):
|
||
return self.name
|
||
|
||
|
||
class ProjectEvent(models.Model):
|
||
project = models.ForeignKey(
|
||
Project, on_delete=models.PROTECT, related_name="events"
|
||
)
|
||
actor = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT)
|
||
action = models.CharField(max_length=100)
|
||
details = models.JSONField(default=dict)
|
||
created_at = models.DateTimeField(auto_now_add=True)
|
||
|
||
class Meta:
|
||
ordering = ["-created_at", "-id"]
|
||
|
||
|
||
class ProjectResource(models.Model):
|
||
project = models.ForeignKey(
|
||
Project, on_delete=models.CASCADE, related_name="resources"
|
||
)
|
||
title = models.CharField(max_length=255)
|
||
kind = models.CharField(
|
||
max_length=16,
|
||
choices=[
|
||
("task", "Задача"),
|
||
("procurement", "Закупка"),
|
||
("document", "Документ"),
|
||
],
|
||
)
|
||
url = models.CharField(max_length=1000)
|
||
created_at = models.DateTimeField(auto_now_add=True)
|
||
|
||
|
||
class ProjectBoardLink(models.Model):
|
||
project = models.ForeignKey(
|
||
Project, on_delete=models.CASCADE, related_name="board_links"
|
||
)
|
||
board = models.ForeignKey(
|
||
"tasks.TaskBoard", on_delete=models.CASCADE, related_name="project_links"
|
||
)
|
||
created_by = models.ForeignKey(
|
||
settings.AUTH_USER_MODEL,
|
||
on_delete=models.PROTECT,
|
||
related_name="created_project_board_links",
|
||
)
|
||
created_at = models.DateTimeField(auto_now_add=True)
|
||
|
||
class Meta:
|
||
ordering = ["board__name", "board_id"]
|
||
constraints = [
|
||
models.UniqueConstraint(
|
||
fields=["project", "board"], name="project_board_link_unique"
|
||
)
|
||
]
|