123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- 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)
|