from django.db import models from django.conf import settings from django.urls import reverse from django.core.exceptions import ValidationError 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" ) ) 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) 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") note = models.TextField(blank=True, null=True) priority = models.PositiveSmallIntegerField(default=0) def __str__(self): 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] def get_available_statuses(self) -> list: for status_scenario in self._get_statuses(): if int(status_scenario[0]) == 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 save(self, *args, **kwargs): if not self.status: self.status = self._get_statuses()[0][0] super(Ticket, self).save(*args, **kwargs) def get_absolute_url(self): return reverse("tickets:ticket_detail", kwargs={"ticket_id": self.id}) class Meta: ordering = ["-priority", "created_at"]