|
@@ -1,5 +1,5 @@
|
|
|
from django.db import models
|
|
|
-from django.conf import settings
|
|
|
+from django.contrib.auth import get_user_model
|
|
|
from django.urls import reverse
|
|
|
from django.core.exceptions import ValidationError
|
|
|
|
|
@@ -8,33 +8,26 @@ from tickets.models.ticket_list import TicketList
|
|
|
|
|
|
class Ticket(models.Model):
|
|
|
TICKET_TYPES = (
|
|
|
- (
|
|
|
- "111-121-149-159,110-121-149-159,121-131-149-159,131-141-149,141-151-110,149-151-110,159,151",
|
|
|
- "ST_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",
|
|
|
- "SERVICE_REQUEST"
|
|
|
- ),
|
|
|
- (
|
|
|
- "320-321-359,321,359",
|
|
|
- "ACCESS_REQUEST"
|
|
|
- ),
|
|
|
- (
|
|
|
- "420-421-459,421,459",
|
|
|
- "NEG_REQUEST"
|
|
|
- )
|
|
|
+ (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]]),
|
|
|
+ (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]]),
|
|
|
+ (3, "ACCESS_REQUEST", [[320, 321, 359], [321], [359]]),
|
|
|
+ (4, "NEG_REQUEST", [[420, 421, 459], [421], [459]])
|
|
|
)
|
|
|
-
|
|
|
+
|
|
|
+ TICKET_TYPES_CHOICES = tuple((item[0], item[1]) for item in TICKET_TYPES)
|
|
|
+
|
|
|
+ LIFE_CYCLE_DICT = dict((item[0], item[2]) for item in TICKET_TYPES)
|
|
|
+ TICKET_TYPES_DICT = dict(TICKET_TYPES_CHOICES)
|
|
|
+
|
|
|
title = models.CharField(max_length=128)
|
|
|
ticket_list = models.ForeignKey(TicketList, on_delete=models.CASCADE)
|
|
|
- ticket_type = models.CharField(max_length=1024, choices=TICKET_TYPES)
|
|
|
+ ticket_type = models.PositiveSmallIntegerField(choices=TICKET_TYPES_CHOICES)
|
|
|
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(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, related_name="created_by", editable=False)
|
|
|
- assigned_to = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True, related_name="assigned_to")
|
|
|
+ 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)
|
|
|
priority = models.PositiveSmallIntegerField(default=0)
|
|
|
|
|
@@ -42,26 +35,27 @@ class Ticket(models.Model):
|
|
|
return self.title
|
|
|
|
|
|
def _get_statuses(self) -> list:
|
|
|
- ticket_life_cycle = self.ticket_type
|
|
|
- ticket_life_cycle = ticket_life_cycle.split(",")
|
|
|
- return [part.split("-") for part in ticket_life_cycle]
|
|
|
+ return self.LIFE_CYCLE_DICT.get(self.ticket_type)
|
|
|
|
|
|
def get_available_statuses(self) -> list:
|
|
|
for status_scenario in self._get_statuses():
|
|
|
- if int(status_scenario[0]) == self.status:
|
|
|
+ if status_scenario[0] == int(self.status):
|
|
|
return status_scenario[1:] if len(status_scenario) > 1 else None
|
|
|
|
|
|
- def set_next_successful_status(self):
|
|
|
- available_statuses = self.get_available_statuses()
|
|
|
- if available_statuses:
|
|
|
- self.status = available_statuses[0]
|
|
|
- self.save()
|
|
|
- else:
|
|
|
- raise ObjectDoesNotExist("Ticket closed")
|
|
|
+ def set_first_status(self):
|
|
|
+ self.status = self._get_statuses()[0][0]
|
|
|
|
|
|
def save(self, *args, **kwargs):
|
|
|
if not self.status:
|
|
|
- self.status = self._get_statuses()[0][0]
|
|
|
+ self.set_first_status()
|
|
|
+ else:
|
|
|
+ unique_statuses = set()
|
|
|
+ for status_group in self._get_statuses():
|
|
|
+ for status in status_group:
|
|
|
+ unique_statuses.add(status)
|
|
|
+
|
|
|
+ if self.status not in unique_statuses:
|
|
|
+ self.set_first_status()
|
|
|
|
|
|
super(Ticket, self).save(*args, **kwargs)
|
|
|
|