from django.contrib.auth import get_user_model from django.db import models, transaction from django.urls import reverse from tickets.models.ticket_list import TicketList from ..lib.tickets import Ticket as T class Ticket(models.Model): TICKET_TYPES = T.TICKET_TYPES TICKET_STATUSES_NAMES = T.TICKET_STATUSES_NAMES TICKET_TYPES_CHOICES = T.TICKET_TYPES_CHOICES LIFE_CYCLE_DICT = T.LIFE_CYCLE_DICT title = models.CharField(max_length=128) ticket_list = models.ForeignKey(TicketList, on_delete=models.CASCADE) ticket_type = models.PositiveSmallIntegerField(choices=TICKET_TYPES_CHOICES, default=1) status = models.PositiveSmallIntegerField(null=True) created_at = models.DateTimeField(auto_now_add=True, editable=False) updated_at = models.DateTimeField(auto_now=True) due_date = models.DateField() created_by = models.ForeignKey( get_user_model(), on_delete=models.SET_NULL, null=True, related_name="created_by", editable=False ) assigned_to = models.ForeignKey( get_user_model(), on_delete=models.SET_NULL, null=True, blank=True, related_name="assigned_to" ) note = models.TextField(blank=True, null=True) json = models.TextField(blank=True, null=True) priority = models.PositiveSmallIntegerField(default=0) def __str__(self): return self.title def _get_statuses(self) -> list: return self.LIFE_CYCLE_DICT.get(self.ticket_type) def get_available_statuses(self) -> list: for status_scenario in self._get_statuses(): if status_scenario[0] == int(self.status): return status_scenario[1:] if len(status_scenario) > 1 else None def set_first_status(self): self.status = self._get_statuses()[0][0] def get_status_display(self): return self.TICKET_STATUSES_NAMES.get(self.status) def archive(self): """ Архивирует текущий тикет. Создает новую запись в TicketArchive с информацией текущего тикета, а затем удаляет текущий тикет из базы данных. """ with transaction.atomic(): # Создаем новую запись в TicketArhive, сохраняя значения всех полей TicketArchive.objects.create( title=self.title, ticket_list=self.ticket_list, ticket_type=self.ticket_type, status=self.status, created_at=self.created_at, due_date=self.due_date, created_by=self.created_by, assigned_to=self.assigned_to, note=self.note ) # Удаляем текущий тикет self.delete() def save(self, *args, **kwargs): if not self.status: self.set_first_status() super(Ticket, self).save(*args, **kwargs) def get_absolute_url(self): return reverse("tickets:ticket_detail", kwargs={"ticket_id": self.pk}) class Meta: ordering = ["-priority", "created_at"] class TicketArchive(models.Model): title = models.CharField(max_length=128, editable=False) ticket_list = models.ForeignKey(TicketList, on_delete=models.CASCADE, editable=False) ticket_type = models.PositiveSmallIntegerField(choices=Ticket.TICKET_TYPES_CHOICES, editable=False) status = models.PositiveSmallIntegerField(editable=False) created_at = models.DateTimeField(editable=False) updated_at = models.DateTimeField(auto_now_add=True, editable=False) due_date = models.DateField(editable=False) created_by = models.ForeignKey( get_user_model(), on_delete=models.SET_NULL, null=True, related_name="ticket_archive_created_by", editable=False ) assigned_to = models.ForeignKey( get_user_model(), on_delete=models.SET_NULL, null=True, blank=True, related_name="ticket_archive_assigned_to", editable=False ) note = models.TextField(blank=True, null=True, editable=False) def get_status_display(self): return Ticket.TICKET_STATUSES_NAMES.get(self.status)