ticket.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  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. class Ticket(models.Model):
  6. TICKET_TYPES = (
  7. (1, "ST_REQUEST", [
  8. [111, 121, 149, 159],
  9. [110, 121, 149, 159],
  10. [121, 131, 149, 159],
  11. [131, 141, 149],
  12. [141, 151, 110],
  13. [149, 151, 110],
  14. [159],
  15. [151]
  16. ]),
  17. (2, "SERVICE_REQUEST", [
  18. [210, 211, 251],
  19. [211, 212, 220, 238, 249],
  20. [212, 221, 229, 238, 249],
  21. [221, 222, 238, 249],
  22. [220, 211, 238, 249],
  23. [229, 211, 251],
  24. [222, 231, 238, 249],
  25. [231, 241, 238, 249],
  26. [238, 231, 239, 211, 212, 221, 220, 222, 249],
  27. [239, 231, 239, 211, 212, 221, 220, 222, 249],
  28. [241, 251],
  29. [249, 251],
  30. [251]
  31. ]),
  32. (3, "ACCESS_REQUEST", [
  33. [320, 321, 359],
  34. [321, 359],
  35. [359]
  36. ]),
  37. (4, "NEG_REQUEST", [
  38. [420, 421, 459],
  39. [421, 459],
  40. [459]
  41. ])
  42. )
  43. TICKET_STATUSES_NAMES = {
  44. 111: "NEW",
  45. 110: "REOPENED",
  46. 121: "ASSIGNED",
  47. 131: "IN PROCESS",
  48. 149: "WONTFIX",
  49. 141: "DONE",
  50. 159: "DUPLICATE",
  51. 151: "CLOSED",
  52. 210: "TEMPLATE",
  53. 211: "BOOKED",
  54. 212: "ASSIGNED",
  55. 221: "ACCEPTED",
  56. 220: "PENDING",
  57. 229: "DECLINED",
  58. 222: "PRE-START",
  59. 231: "PROCESS",
  60. 238: "PRE-FORCEMAJEUER",
  61. 239: "FORCEMAJEUER",
  62. 241: "DONE",
  63. 249: "CANCELLED",
  64. 251: "CLOSED",
  65. 320: "PENDING",
  66. 321: "ACCEPTED",
  67. 359: "DECLINED",
  68. 420: "PENDING",
  69. 421: "ACCEPTED",
  70. 459: "DECLINED"
  71. }
  72. TICKET_TYPES_CHOICES = tuple((item[0], item[1]) for item in TICKET_TYPES)
  73. LIFE_CYCLE_DICT = dict((item[0], item[2]) for item in TICKET_TYPES)
  74. title = models.CharField(max_length=128)
  75. ticket_list = models.ForeignKey(TicketList, on_delete=models.CASCADE)
  76. ticket_type = models.PositiveSmallIntegerField(choices=TICKET_TYPES_CHOICES, default=1)
  77. status = models.PositiveSmallIntegerField(null=True)
  78. created_at = models.DateTimeField(auto_now_add=True, editable=False)
  79. updated_at = models.DateTimeField(auto_now=True)
  80. due_date = models.DateField()
  81. created_by = models.ForeignKey(
  82. get_user_model(),
  83. on_delete=models.SET_NULL,
  84. null=True,
  85. related_name="created_by",
  86. editable=False
  87. )
  88. assigned_to = models.ForeignKey(
  89. get_user_model(),
  90. on_delete=models.SET_NULL,
  91. null=True,
  92. blank=True,
  93. related_name="assigned_to"
  94. )
  95. note = models.TextField(blank=True, null=True)
  96. json = models.TextField(blank=True, null=True)
  97. priority = models.PositiveSmallIntegerField(default=0)
  98. def __str__(self):
  99. return self.title
  100. def _get_statuses(self) -> list:
  101. return self.LIFE_CYCLE_DICT.get(self.ticket_type)
  102. def get_available_statuses(self) -> list:
  103. for status_scenario in self._get_statuses():
  104. if status_scenario[0] == int(self.status):
  105. return status_scenario[1:] if len(status_scenario) > 1 else None
  106. def set_first_status(self):
  107. self.status = self._get_statuses()[0][0]
  108. def get_status_display(self):
  109. return self.TICKET_STATUSES_NAMES.get(self.status)
  110. def archive(self):
  111. """
  112. Архивирует текущий тикет.
  113. Создает новую запись в TicketArchive с информацией текущего тикета,
  114. а затем удаляет текущий тикет из базы данных.
  115. """
  116. with transaction.atomic():
  117. # Создаем новую запись в TicketArhive, сохраняя значения всех полей
  118. TicketArchive.objects.create(
  119. title=self.title,
  120. ticket_list=self.ticket_list,
  121. ticket_type=self.ticket_type,
  122. status=self.status,
  123. created_at=self.created_at,
  124. due_date=self.due_date,
  125. created_by=self.created_by,
  126. assigned_to=self.assigned_to,
  127. note=self.note
  128. )
  129. # Удаляем текущий тикет
  130. self.delete()
  131. def save(self, *args, **kwargs):
  132. if not self.status:
  133. self.set_first_status()
  134. super(Ticket, self).save(*args, **kwargs)
  135. def get_absolute_url(self):
  136. return reverse("tickets:ticket_detail", kwargs={"ticket_id": self.pk})
  137. class Meta:
  138. ordering = ["-priority", "created_at"]
  139. class TicketArchive(models.Model):
  140. title = models.CharField(max_length=128, editable=False)
  141. ticket_list = models.ForeignKey(TicketList, on_delete=models.CASCADE, editable=False)
  142. ticket_type = models.PositiveSmallIntegerField(choices=Ticket.TICKET_TYPES_CHOICES, editable=False)
  143. status = models.PositiveSmallIntegerField(editable=False)
  144. created_at = models.DateTimeField(editable=False)
  145. updated_at = models.DateTimeField(auto_now_add=True, editable=False)
  146. due_date = models.DateField(editable=False)
  147. created_by = models.ForeignKey(
  148. get_user_model(),
  149. on_delete=models.SET_NULL,
  150. null=True,
  151. related_name="ticket_archive_created_by",
  152. editable=False
  153. )
  154. assigned_to = models.ForeignKey(
  155. get_user_model(),
  156. on_delete=models.SET_NULL,
  157. null=True,
  158. blank=True,
  159. related_name="ticket_archive_assigned_to",
  160. editable=False
  161. )
  162. note = models.TextField(blank=True, null=True, editable=False)
  163. def get_status_display(self):
  164. return Ticket.TICKET_STATUSES_NAMES.get(self.status)