From ab2c2f79a479d7bede7a261a37390171091b202f Mon Sep 17 00:00:00 2001 From: Sam Splunks <72095718+samsplunks@users.noreply.github.com> Date: Thu, 1 Feb 2024 15:38:02 +0100 Subject: [PATCH] Allow Tickets status choices customization --- helpdesk/forms.py | 4 +-- .../management/commands/escalate_tickets.py | 7 +++-- helpdesk/models.py | 22 ++++++--------- helpdesk/settings.py | 27 +++++++++++++++++-- helpdesk/views/feeds.py | 20 +++++++------- 5 files changed, 49 insertions(+), 31 deletions(-) diff --git a/helpdesk/forms.py b/helpdesk/forms.py index f9abe18c..e63072cd 100644 --- a/helpdesk/forms.py +++ b/helpdesk/forms.py @@ -186,10 +186,10 @@ class EditFollowUpForm(forms.ModelForm): exclude = ('date', 'user',) def __init__(self, *args, **kwargs): - """Filter not openned tickets here.""" + """Filter not opened tickets here.""" super(EditFollowUpForm, self).__init__(*args, **kwargs) self.fields["ticket"].queryset = Ticket.objects.filter( - status__in=(Ticket.OPEN_STATUS, Ticket.REOPENED_STATUS)) + status__in=Ticket.OPEN_STATUSES) class AbstractTicketForm(CustomFieldMixin, forms.Form): diff --git a/helpdesk/management/commands/escalate_tickets.py b/helpdesk/management/commands/escalate_tickets.py index d0a920a8..8abc6dcd 100644 --- a/helpdesk/management/commands/escalate_tickets.py +++ b/helpdesk/management/commands/escalate_tickets.py @@ -83,9 +83,12 @@ def escalate_tickets(queues, verbose): if verbose: print("Processing: %s" % q) + Q_OPEN_STATUSES = Q() + for open_status in Ticket.OPEN_STATUSES: + q_open_statuses |= Q(status=open_status) + for t in q.ticket_set.filter( - Q(status=Ticket.OPEN_STATUS) | - Q(status=Ticket.REOPENED_STATUS) + Q_OPEN_STATUSES ).exclude( priority=1 ).filter( diff --git a/helpdesk/models.py b/helpdesk/models.py index 02e09ca1..385281db 100644 --- a/helpdesk/models.py +++ b/helpdesk/models.py @@ -463,19 +463,14 @@ class Ticket(models.Model): the dashboard to prompt users to take ownership of them. """ - OPEN_STATUS = 1 - REOPENED_STATUS = 2 - RESOLVED_STATUS = 3 - CLOSED_STATUS = 4 - DUPLICATE_STATUS = 5 + OPEN_STATUS = helpdesk_settings.OPEN_STATUS + REOPENED_STATUS = helpdesk_settings.REOPENED_STATUS + RESOLVED_STATUS = helpdesk_settings.RESOLVED_STATUS + CLOSED_STATUS = helpdesk_settings.CLOSED_STATUS + DUPLICATE_STATUS = helpdesk_settings.DUPLICATE_STATUS - STATUS_CHOICES = ( - (OPEN_STATUS, _('Open')), - (REOPENED_STATUS, _('Reopened')), - (RESOLVED_STATUS, _('Resolved')), - (CLOSED_STATUS, _('Closed')), - (DUPLICATE_STATUS, _('Duplicate')), - ) + STATUS_CHOICES = helpdesk_settings.TICKET_STATUS_CHOICES + OPEN_STATUSES = helpdesk_settings.TICKET_OPEN_STATUSES PRIORITY_CHOICES = helpdesk_settings.TICKET_PRIORITY_CHOICES @@ -771,9 +766,8 @@ class Ticket(models.Model): True = any dependencies are resolved False = There are non-resolved dependencies """ - OPEN_STATUSES = (Ticket.OPEN_STATUS, Ticket.REOPENED_STATUS) return TicketDependency.objects.filter(ticket=self).filter( - depends_on__status__in=OPEN_STATUSES).count() == 0 + depends_on__status__in=Ticket.OPEN_STATUSES).count() == 0 can_be_resolved = property(_can_be_resolved) def get_submitter_userprofile(self): diff --git a/helpdesk/settings.py b/helpdesk/settings.py index e23a59cf..fbbc8bad 100644 --- a/helpdesk/settings.py +++ b/helpdesk/settings.py @@ -103,6 +103,29 @@ ALLOWED_URL_SCHEMES = getattr(settings, 'ALLOWED_URL_SCHEMES', ( 'file', 'ftp', 'ftps', 'http', 'https', 'irc', 'mailto', 'sftp', 'ssh', 'tel', 'telnet', 'tftp', 'vnc', 'xmpp', )) +# Ticket status choices +OPEN_STATUS = getattr(settings, 'HELPDESK_TICKET_OPEN_STATUS', 1) +REOPENED_STATUS = getattr(settings, 'HELPDESK_TICKET_REOPENED_STATUS', 2) +RESOLVED_STATUS = getattr(settings, 'HELPDESK_TICKET_RESOLVED_STATUS', 3) +CLOSED_STATUS = getattr(settings, 'HELPDESK_TICKET_CLOSED_STATUS', 4) +DUPLICATE_STATUS = getattr(settings, 'HELPDESK_TICKET_DUPLICATE_STATUS', 5) + +DEFAULT_TICKET_STATUS_CHOICES = ( + (OPEN_STATUS, _('Open')), + (REOPENED_STATUS, _('Reopened')), + (RESOLVED_STATUS, _('Resolved')), + (CLOSED_STATUS, _('Closed')), + (DUPLICATE_STATUS, _('Duplicate')), +) +TICKET_STATUS_CHOICES = getattr(settings, + 'HELPDESK_TICKET_STATUS_CHOICES', + DEFAULT_TICKET_STATUS_CHOICES) + +DEFAULT_TICKET_OPEN_STATUSES = (OPEN_STATUS, REOPENED_STATUS) +TICKET_OPEN_STATUSES = getattr(settings, + 'HELPDESK_TICKET_OPEN_STATUSES', + DEFAULT_TICKET_OPEN_STATUSES) + # Ticket priority choices DEFAULT_TICKET_PRIORITY_CHOICES = ( (1, _('1. Critical')), @@ -112,8 +135,8 @@ DEFAULT_TICKET_PRIORITY_CHOICES = ( (5, _('5. Very Low')), ) TICKET_PRIORITY_CHOICES = getattr(settings, - 'HELPDESK_TICKET_PRIORITY_CHOICES', - DEFAULT_TICKET_PRIORITY_CHOICES) + 'HELPDESK_TICKET_PRIORITY_CHOICES', + DEFAULT_TICKET_PRIORITY_CHOICES) ############################ # options for public pages # diff --git a/helpdesk/views/feeds.py b/helpdesk/views/feeds.py index cccf4b19..06656831 100644 --- a/helpdesk/views/feeds.py +++ b/helpdesk/views/feeds.py @@ -19,6 +19,11 @@ from helpdesk.models import FollowUp, Queue, Ticket User = get_user_model() +Q_OPEN_STATUSES = Q() +for open_status in Ticket.OPEN_STATUSES: + q_open_statuses |= Q(status=open_status) + + class OpenTicketsByUser(Feed): title_template = 'helpdesk/rss/ticket_title.html' description_template = 'helpdesk/rss/ticket_description.html' @@ -73,15 +78,12 @@ class OpenTicketsByUser(Feed): assigned_to=obj['user'] ).filter( queue=obj['queue'] - ).filter( - Q(status=Ticket.OPEN_STATUS) | Q(status=Ticket.REOPENED_STATUS) + ).filter(Q_OPEN_STATUSES) ) else: return Ticket.objects.filter( assigned_to=obj['user'] - ).filter( - Q(status=Ticket.OPEN_STATUS) | Q(status=Ticket.REOPENED_STATUS) - ) + ).filter(Q_OPEN_STATUSES) def item_pubdate(self, item): return item.created @@ -104,9 +106,7 @@ class UnassignedTickets(Feed): def items(self, obj): return Ticket.objects.filter( assigned_to__isnull=True - ).filter( - Q(status=Ticket.OPEN_STATUS) | Q(status=Ticket.REOPENED_STATUS) - ) + ).filter(Q_OPEN_STATUSES) def item_pubdate(self, item): return item.created @@ -157,9 +157,7 @@ class OpenTicketsByQueue(Feed): def items(self, obj): return Ticket.objects.filter( queue=obj - ).filter( - Q(status=Ticket.OPEN_STATUS) | Q(status=Ticket.REOPENED_STATUS) - ) + ).filter(Q_OPEN_STATUSES) def item_pubdate(self, item): return item.created