ticket.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. from django.db import models
  2. from django.conf import settings
  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. (
  9. "111-121-149-159,110-121-149-159,121-131-149-159,131-141-149,141-151-110,149-151-110,159,151",
  10. "ST_REQUEST"
  11. ),
  12. (
  13. "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",
  14. "SERVICE_REQUEST"
  15. ),
  16. (
  17. "320-321-359,321,359",
  18. "ACCESS_REQUEST"
  19. ),
  20. (
  21. "420-421-459,421,459",
  22. "NEG_REQUEST"
  23. )
  24. )
  25. title = models.CharField(max_length=128)
  26. ticket_list = models.ForeignKey(TicketList, on_delete=models.CASCADE)
  27. ticket_type = models.CharField(max_length=1024, choices=TICKET_TYPES)
  28. status = models.PositiveSmallIntegerField(null=True)
  29. created_at = models.DateTimeField(auto_now_add=True, editable=False)
  30. updated_at = models.DateTimeField(auto_now=True)
  31. due_date = models.DateField()
  32. created_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, related_name="created_by", editable=False)
  33. assigned_to = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True, related_name="assigned_to")
  34. note = models.TextField(blank=True, null=True)
  35. priority = models.PositiveSmallIntegerField(default=0)
  36. def __str__(self):
  37. return self.title
  38. def _get_statuses(self) -> list:
  39. ticket_life_cycle = self.ticket_type
  40. ticket_life_cycle = ticket_life_cycle.split(",")
  41. return [part.split("-") for part in ticket_life_cycle]
  42. def get_available_statuses(self) -> list:
  43. for status_scenario in self._get_statuses():
  44. if int(status_scenario[0]) == self.status:
  45. return status_scenario[1:] if len(status_scenario) > 1 else None
  46. def set_next_successful_status(self):
  47. available_statuses = self.get_available_statuses()
  48. if available_statuses:
  49. self.status = available_statuses[0]
  50. self.save()
  51. else:
  52. raise ObjectDoesNotExist("Ticket closed")
  53. def save(self, *args, **kwargs):
  54. if not self.status:
  55. self.status = self._get_statuses()[0][0]
  56. super(Ticket, self).save(*args, **kwargs)
  57. def get_absolute_url(self):
  58. return reverse("tickets:ticket_detail", kwargs={"ticket_id": self.id})
  59. class Meta:
  60. ordering = ["-priority", "created_at"]