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 01/13] 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 From 3e6e39fc39370c5d74083cc0de8791b8e5359c7f Mon Sep 17 00:00:00 2001 From: Sam Splunks <72095718+samsplunks@users.noreply.github.com> Date: Thu, 1 Feb 2024 15:43:56 +0100 Subject: [PATCH 02/13] Fixing missing capitalized Q_OPEN_STATUSES variable --- helpdesk/management/commands/escalate_tickets.py | 2 +- helpdesk/views/feeds.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/helpdesk/management/commands/escalate_tickets.py b/helpdesk/management/commands/escalate_tickets.py index 8abc6dcd..82cb1948 100644 --- a/helpdesk/management/commands/escalate_tickets.py +++ b/helpdesk/management/commands/escalate_tickets.py @@ -85,7 +85,7 @@ def escalate_tickets(queues, verbose): Q_OPEN_STATUSES = Q() for open_status in Ticket.OPEN_STATUSES: - q_open_statuses |= Q(status=open_status) + Q_OPEN_STATUSES |= Q(status=open_status) for t in q.ticket_set.filter( Q_OPEN_STATUSES diff --git a/helpdesk/views/feeds.py b/helpdesk/views/feeds.py index 06656831..5460f4fa 100644 --- a/helpdesk/views/feeds.py +++ b/helpdesk/views/feeds.py @@ -21,7 +21,7 @@ User = get_user_model() Q_OPEN_STATUSES = Q() for open_status in Ticket.OPEN_STATUSES: - q_open_statuses |= Q(status=open_status) + Q_OPEN_STATUSES |= Q(status=open_status) class OpenTicketsByUser(Feed): From 06dab282b9fa83769207e0a33aad5e78d27a9f06 Mon Sep 17 00:00:00 2001 From: Sam Splunks <72095718+samsplunks@users.noreply.github.com> Date: Thu, 1 Feb 2024 16:16:39 +0100 Subject: [PATCH 03/13] Documentation for STATUS_CHOICES customization --- docs/settings.rst | 51 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/docs/settings.rst b/docs/settings.rst index 97f51768..9d868f8d 100644 --- a/docs/settings.rst +++ b/docs/settings.rst @@ -179,6 +179,57 @@ Options that change ticket updates Options that change ticket properties ------------------------------------- +- **HELPDESK_TICKET_OPEN_STATUS** Customize the id of OPEN_STATUS tickets status. + + **Default:** ``HELPDESK_TICKET_OPEN_STATUS = 1`` + +- **HELPDESK_TICKET_REOPENED_STATUS** Customize the id of REOPENED_STATUS tickets status. + + **Default:** ``HELPDESK_TICKET_REOPENED_STATUS = 2`` + +- **HELPDESK_TICKET_RESOLVED_STATUS** Customize the id of RESOLVED_STATUS tickets status + + **Default:** ``HELPDESK_TICKET_RESOLVED_STATUS = 3`` + +- **HELPDESK_TICKET_CLOSED_STATUS** Customize the id of CLOSED_STATUS tickets status + + **Default:** ``HELPDESK_TICKET_CLOSED_STATUS = 4`` + +- **HELPDESK_TICKET_DUPLICATE_STATUS** Customize the id of DUPLICATE_STATUS tickets status + + **Default:** ``HELPDESK_TICKET_DUPLICATE_STATUS = 5`` + +- **HELPDESK_TICKET_STATUS_CHOICES** Customize the list of status choices for all tickets. + + The **default** is below:: + + HELPDESK_TICKET_STATUS_CHOICES = ( + (OPEN_STATUS, _('Open')), + (REOPENED_STATUS, _('Reopened')), + (RESOLVED_STATUS, _('Resolved')), + (CLOSED_STATUS, _('Closed')), + (DUPLICATE_STATUS, _('Duplicate')), + ) + + If you wish to introduce a new status choice for all tickets, you may add them like this:: + + HELPDESK_TICKET_STATUS_CHOICES = ( + (OPEN_STATUS, _('Open')), + (REOPENED_STATUS, _('Reopened')), + (RESOLVED_STATUS, _('Resolved')), + (CLOSED_STATUS, _('Closed')), + (DUPLICATE_STATUS, _('Duplicate')), + (6, _('Opened by bot')), + ) + +- **HELPDESK_TICKET_OPEN_STATUSES** Define the list of statuses to be considered as a type of open status. + + **Default:** ``HELPDESK_TICKET_OPEN_STATUSES = (OPEN_STATUS, REOPENED_STATUS)`` + + If you have added the ``(6, _('Opened by bot'))`` status and wish to have django-helpdesk treat it as an open status choice, add it to the list of OPEN_STATUSES like this:: + + HELPDESK_TICKET_OPEN_STATUSES = (OPEN_STATUS, REOPENED_STATUS, 6) + - **HELPDESK_TICKET_PRIORITY_CHOICES** Customize the priority choices for all tickets. The **default** is below:: From c9628e32347e134df683dd259b1642076ad58d73 Mon Sep 17 00:00:00 2001 From: Sam Splunks <72095718+samsplunks@users.noreply.github.com> Date: Thu, 1 Feb 2024 16:23:18 +0100 Subject: [PATCH 04/13] Documentation text editing --- docs/settings.rst | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/settings.rst b/docs/settings.rst index 9d868f8d..802b55f1 100644 --- a/docs/settings.rst +++ b/docs/settings.rst @@ -179,23 +179,23 @@ Options that change ticket updates Options that change ticket properties ------------------------------------- -- **HELPDESK_TICKET_OPEN_STATUS** Customize the id of OPEN_STATUS tickets status. +- **HELPDESK_TICKET_OPEN_STATUS** Customize the id of OPEN_STATUS status. **Default:** ``HELPDESK_TICKET_OPEN_STATUS = 1`` -- **HELPDESK_TICKET_REOPENED_STATUS** Customize the id of REOPENED_STATUS tickets status. +- **HELPDESK_TICKET_REOPENED_STATUS** Customize the id of REOPENED_STATUS status. **Default:** ``HELPDESK_TICKET_REOPENED_STATUS = 2`` -- **HELPDESK_TICKET_RESOLVED_STATUS** Customize the id of RESOLVED_STATUS tickets status +- **HELPDESK_TICKET_RESOLVED_STATUS** Customize the id of RESOLVED_STATUS status. **Default:** ``HELPDESK_TICKET_RESOLVED_STATUS = 3`` -- **HELPDESK_TICKET_CLOSED_STATUS** Customize the id of CLOSED_STATUS tickets status +- **HELPDESK_TICKET_CLOSED_STATUS** Customize the id of CLOSED_STATUS status. **Default:** ``HELPDESK_TICKET_CLOSED_STATUS = 4`` -- **HELPDESK_TICKET_DUPLICATE_STATUS** Customize the id of DUPLICATE_STATUS tickets status +- **HELPDESK_TICKET_DUPLICATE_STATUS** Customize the id of DUPLICATE_STATUS status. **Default:** ``HELPDESK_TICKET_DUPLICATE_STATUS = 5`` @@ -211,7 +211,7 @@ Options that change ticket properties (DUPLICATE_STATUS, _('Duplicate')), ) - If you wish to introduce a new status choice for all tickets, you may add them like this:: + If you wish to introduce new status choices, you may add them like this:: HELPDESK_TICKET_STATUS_CHOICES = ( (OPEN_STATUS, _('Open')), @@ -219,14 +219,14 @@ Options that change ticket properties (RESOLVED_STATUS, _('Resolved')), (CLOSED_STATUS, _('Closed')), (DUPLICATE_STATUS, _('Duplicate')), - (6, _('Opened by bot')), + (6, _('Forked')), ) - **HELPDESK_TICKET_OPEN_STATUSES** Define the list of statuses to be considered as a type of open status. **Default:** ``HELPDESK_TICKET_OPEN_STATUSES = (OPEN_STATUS, REOPENED_STATUS)`` - If you have added the ``(6, _('Opened by bot'))`` status and wish to have django-helpdesk treat it as an open status choice, add it to the list of OPEN_STATUSES like this:: + If you have added the ``(6, _('Forked'))`` status and wish to have django-helpdesk treat it as an open status choice, add it to the list of OPEN_STATUSES like this:: HELPDESK_TICKET_OPEN_STATUSES = (OPEN_STATUS, REOPENED_STATUS, 6) From 2ff266a612ed3cf1ad0d931e350ec913babbc7cb Mon Sep 17 00:00:00 2001 From: Sam Splunks <72095718+samsplunks@users.noreply.github.com> Date: Thu, 1 Feb 2024 16:28:26 +0100 Subject: [PATCH 05/13] Fixed pairing parenthesis --- helpdesk/views/feeds.py | 1 - 1 file changed, 1 deletion(-) diff --git a/helpdesk/views/feeds.py b/helpdesk/views/feeds.py index 5460f4fa..0653a242 100644 --- a/helpdesk/views/feeds.py +++ b/helpdesk/views/feeds.py @@ -79,7 +79,6 @@ class OpenTicketsByUser(Feed): ).filter( queue=obj['queue'] ).filter(Q_OPEN_STATUSES) - ) else: return Ticket.objects.filter( assigned_to=obj['user'] From ec49ac07bb8be025c6a2e0685a5b2db56e4d4825 Mon Sep 17 00:00:00 2001 From: Sam Splunks <72095718+samsplunks@users.noreply.github.com> Date: Fri, 2 Feb 2024 12:11:17 +0100 Subject: [PATCH 06/13] Update settings.rst with explicit settings for STATUS_CHOICES --- docs/settings.rst | 44 +++++++++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/docs/settings.rst b/docs/settings.rst index 802b55f1..eeb7dad5 100644 --- a/docs/settings.rst +++ b/docs/settings.rst @@ -204,31 +204,45 @@ Options that change ticket properties The **default** is below:: HELPDESK_TICKET_STATUS_CHOICES = ( - (OPEN_STATUS, _('Open')), - (REOPENED_STATUS, _('Reopened')), - (RESOLVED_STATUS, _('Resolved')), - (CLOSED_STATUS, _('Closed')), - (DUPLICATE_STATUS, _('Duplicate')), + (HELPDESK_TICKET_OPEN_STATUS, _('Open')), + (HELPDESK_TICKET_REOPENED_STATUS, _('Reopened')), + (HELPDESK_TICKET_RESOLVED_STATUS, _('Resolved')), + (HELPDESK_TICKET_CLOSED_STATUS, _('Closed')), + (HELPDESK_TICKET_DUPLICATE_STATUS, _('Duplicate')), ) - If you wish to introduce new status choices, you may add them like this:: + If you wish to modify or introduce new status choices, you may add them like this:: + + # don't forget to import the gettext_lazy function at the begining of your settings file + from django.utils.translation import gettext_lazy as _ + # explicitly define status list integer values + HELPDESK_TICKET_OPEN_STATUS = 1 + HELPDESK_TICKET_REOPENED_STATUS = 2 + HELPDESK_TICKET_RESOLVED_STATUS = 3 + HELPDESK_TICKET_CLOSED_STATUS = 4 + HELPDESK_TICKET_DUPLICATE_STATUS = 5 + HELPDESK_TICKET_FORKED_STATUS = 6 + + # create the list with associated labels HELPDESK_TICKET_STATUS_CHOICES = ( - (OPEN_STATUS, _('Open')), - (REOPENED_STATUS, _('Reopened')), - (RESOLVED_STATUS, _('Resolved')), - (CLOSED_STATUS, _('Closed')), - (DUPLICATE_STATUS, _('Duplicate')), - (6, _('Forked')), + (HELPDESK_TICKET_OPEN_STATUS, _('Open')), + (HELPDESK_TICKET_REOPENED_STATUS, _('Reopened')), + (HELPDESK_TICKET_RESOLVED_STATUS, _('Resolved')), + (HELPDESK_TICKET_CLOSED_STATUS, _('Closed')), + (HELPDESK_TICKET_DUPLICATE_STATUS, _('Duplicate')), + (HELPDESK_TICKET_FORKED_STATUS, _('Forked')), ) - **HELPDESK_TICKET_OPEN_STATUSES** Define the list of statuses to be considered as a type of open status. - **Default:** ``HELPDESK_TICKET_OPEN_STATUSES = (OPEN_STATUS, REOPENED_STATUS)`` + **Default:** ``HELPDESK_TICKET_OPEN_STATUSES = (HELPDESK_TICKET_OPEN_STATUS, HELPDESK_TICKET_REOPENED_STATUS)`` - If you have added the ``(6, _('Forked'))`` status and wish to have django-helpdesk treat it as an open status choice, add it to the list of OPEN_STATUSES like this:: + If you have added the ``HELPDESK_TICKET_FORKED_STATUS`` status and wish to have django-helpdesk treat it as an open status choice, add it to the list of OPEN_STATUSES like this:: - HELPDESK_TICKET_OPEN_STATUSES = (OPEN_STATUS, REOPENED_STATUS, 6) + HELPDESK_TICKET_OPEN_STATUSES = (HELPDESK_TICKET_OPEN_STATUS, + HELPDESK_TICKET_REOPENED_STATUS, + HELPDESK_TICKET_FORKED_STATUS) - **HELPDESK_TICKET_PRIORITY_CHOICES** Customize the priority choices for all tickets. From 71047e1facd400f3963ec41eb1741b50b7a9843c Mon Sep 17 00:00:00 2001 From: Sam Splunks <72095718+samsplunks@users.noreply.github.com> Date: Fri, 2 Feb 2024 15:32:12 +0100 Subject: [PATCH 07/13] Allow new settings statuses in "Respond to this ticket" status changes --- helpdesk/templates/helpdesk/ticket.html | 46 ++++++++----------------- 1 file changed, 15 insertions(+), 31 deletions(-) diff --git a/helpdesk/templates/helpdesk/ticket.html b/helpdesk/templates/helpdesk/ticket.html index b3d814c0..50a61a4f 100644 --- a/helpdesk/templates/helpdesk/ticket.html +++ b/helpdesk/templates/helpdesk/ticket.html @@ -109,39 +109,23 @@
{% if not ticket.can_be_resolved %}