ticket.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. from django.contrib.auth import get_user_model
  2. from django.db import models, transaction
  3. from django.urls import reverse
  4. from tickets.models.ticket_list import TicketList
  5. from ..lib.tickets import Ticket as T
  6. class Ticket(models.Model):
  7. TICKET_TYPES = T.TICKET_TYPES
  8. TICKET_STATUSES_NAMES = T.TICKET_STATUSES_NAMES
  9. TICKET_TYPES_CHOICES = T.TICKET_TYPES_CHOICES
  10. LIFE_CYCLE_DICT = T.LIFE_CYCLE_DICT
  11. title = models.CharField(max_length=128)
  12. ticket_list = models.ForeignKey(TicketList, on_delete=models.CASCADE)
  13. ticket_type = models.PositiveSmallIntegerField(choices=TICKET_TYPES_CHOICES, default=1)
  14. status = models.PositiveSmallIntegerField(null=True)
  15. created_at = models.DateTimeField(auto_now_add=True, editable=False)
  16. updated_at = models.DateTimeField(auto_now=True)
  17. due_date = models.DateField()
  18. created_by = models.ForeignKey(
  19. get_user_model(),
  20. on_delete=models.SET_NULL,
  21. null=True,
  22. related_name="created_by",
  23. editable=False
  24. )
  25. assigned_to = models.ForeignKey(
  26. get_user_model(),
  27. on_delete=models.SET_NULL,
  28. null=True,
  29. blank=True,
  30. related_name="assigned_to"
  31. )
  32. note = models.TextField(blank=True, null=True)
  33. json = models.TextField(blank=True, null=True)
  34. priority = models.PositiveSmallIntegerField(default=0)
  35. def __str__(self):
  36. return self.title
  37. def _get_statuses(self) -> list:
  38. return self.LIFE_CYCLE_DICT.get(self.ticket_type)
  39. def get_available_statuses(self) -> list:
  40. for status_scenario in self._get_statuses():
  41. if status_scenario[0] == int(self.status):
  42. return status_scenario[1:] if len(status_scenario) > 1 else None
  43. def set_first_status(self):
  44. self.status = self._get_statuses()[0][0]
  45. def get_status_display(self):
  46. return self.TICKET_STATUSES_NAMES.get(self.status)
  47. def archive(self):
  48. """
  49. Архивирует текущий тикет.
  50. Создает новую запись в TicketArchive с информацией текущего тикета,
  51. а затем удаляет текущий тикет из базы данных.
  52. """
  53. with transaction.atomic():
  54. # Создаем новую запись в TicketArhive, сохраняя значения всех полей
  55. TicketArchive.objects.create(
  56. title=self.title,
  57. ticket_list=self.ticket_list,
  58. ticket_type=self.ticket_type,
  59. status=self.status,
  60. created_at=self.created_at,
  61. due_date=self.due_date,
  62. created_by=self.created_by,
  63. assigned_to=self.assigned_to,
  64. note=self.note
  65. )
  66. # Удаляем текущий тикет
  67. self.delete()
  68. def save(self, *args, **kwargs):
  69. if not self.status:
  70. self.set_first_status()
  71. super(Ticket, self).save(*args, **kwargs)
  72. def get_absolute_url(self):
  73. return reverse("tickets:ticket_detail", kwargs={"ticket_id": self.pk})
  74. class Meta:
  75. ordering = ["-priority", "created_at"]
  76. class TicketArchive(models.Model):
  77. title = models.CharField(max_length=128, editable=False)
  78. ticket_list = models.ForeignKey(TicketList, on_delete=models.CASCADE, editable=False)
  79. ticket_type = models.PositiveSmallIntegerField(choices=Ticket.TICKET_TYPES_CHOICES, editable=False)
  80. status = models.PositiveSmallIntegerField(editable=False)
  81. created_at = models.DateTimeField(editable=False)
  82. updated_at = models.DateTimeField(auto_now_add=True, editable=False)
  83. due_date = models.DateField(editable=False)
  84. created_by = models.ForeignKey(
  85. get_user_model(),
  86. on_delete=models.SET_NULL,
  87. null=True,
  88. related_name="ticket_archive_created_by",
  89. editable=False
  90. )
  91. assigned_to = models.ForeignKey(
  92. get_user_model(),
  93. on_delete=models.SET_NULL,
  94. null=True,
  95. blank=True,
  96. related_name="ticket_archive_assigned_to",
  97. editable=False
  98. )
  99. note = models.TextField(blank=True, null=True, editable=False)
  100. def get_status_display(self):
  101. return Ticket.TICKET_STATUSES_NAMES.get(self.status)