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" ) ]