ticket.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. from django.db import models
  2. from django.contrib.auth import get_user_model
  3. from django.urls import reverse
  4. from django.core.exceptions import ValidationError
  5. from tickets.models.ticket_list import TicketList
  6. class Ticket(models.Model):
  7. TICKET_TYPES = (
  8. (1, "ST_REQUEST", [[111, 121, 149, 159], [110, 121, 149, 159], [121, 131, 149, 159], [131, 141, 149], [141, 151, 110], [149, 151, 110], [159], [151]]),
  9. (2, "SERVICE_REQUEST", [[210, 211, 251], [211, 212, 220, 238, 249], [212, 221, 229, 238, 249], [221, 222, 238, 249], [220, 211, 238, 249], [229, 211, 251], [222, 231, 238, 249], [231, 241, 238, 249], [238, 231, 239, 211, 212, 221, 220, 222, 249], [239, 231, 239, 211, 212, 221, 220, 222, 249], [241, 251], [249, 251], [251]]),
  10. (3, "ACCESS_REQUEST", [[320, 321, 359], [321], [359]]),
  11. (4, "NEG_REQUEST", [[420, 421, 459], [421], [459]])
  12. )
  13. TICKET_TYPES_CHOICES = tuple((item[0], item[1]) for item in TICKET_TYPES)
  14. LIFE_CYCLE_DICT = dict((item[0], item[2]) for item in TICKET_TYPES)
  15. TICKET_TYPES_DICT = dict(TICKET_TYPES_CHOICES)
  16. title = models.CharField(max_length=128)
  17. ticket_list = models.ForeignKey(TicketList, on_delete=models.CASCADE)
  18. ticket_type = models.PositiveSmallIntegerField(choices=TICKET_TYPES_CHOICES)
  19. status = models.PositiveSmallIntegerField(null=True)
  20. created_at = models.DateTimeField(auto_now_add=True, editable=False)
  21. updated_at = models.DateTimeField(auto_now=True)
  22. due_date = models.DateField()
  23. created_by = models.ForeignKey(get_user_model(), on_delete=models.SET_NULL, null=True, related_name="created_by", editable=False)
  24. assigned_to = models.ForeignKey(get_user_model(), on_delete=models.SET_NULL, null=True, blank=True, related_name="assigned_to")
  25. note = models.TextField(blank=True, null=True)
  26. priority = models.PositiveSmallIntegerField(default=0)
  27. def __str__(self):
  28. return self.title
  29. def _get_statuses(self) -> list:
  30. return self.LIFE_CYCLE_DICT.get(self.ticket_type)
  31. def get_available_statuses(self) -> list:
  32. for status_scenario in self._get_statuses():
  33. if status_scenario[0] == int(self.status):
  34. return status_scenario[1:] if len(status_scenario) > 1 else None
  35. def set_first_status(self):
  36. self.status = self._get_statuses()[0][0]
  37. def save(self, *args, **kwargs):
  38. if not self.status:
  39. self.set_first_status()
  40. else:
  41. unique_statuses = set()
  42. for status_group in self._get_statuses():
  43. for status in status_group:
  44. unique_statuses.add(status)
  45. if self.status not in unique_statuses:
  46. self.set_first_status()
  47. super(Ticket, self).save(*args, **kwargs)
  48. def get_absolute_url(self):
  49. return reverse("tickets:ticket_detail", kwargs={"ticket_id": self.id})
  50. class Meta:
  51. ordering = ["-priority", "created_at"]