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 %}
{% trans "This ticket cannot be resolved or closed until the tickets it depends on are resolved." %}
{% endif %} - {% if ticket.status == 1 %}
- - - - + {% for status_choice in ticket.STATUS_CHOICES %} + {% with status_choice_strfmt_s=status_choice.0|stringformat:"s" %} + {% if ticket.status == 1 and status_choice_strfmt_s in "2" %}{% else %} + {% if ticket.status == 2 and status_choice_strfmt_s in "1" %}{% else %} + {% if ticket.status == 3 and status_choice_strfmt_s not in "2,3,4" %}{% else %} + {% if ticket.status == 4 and status_choice_strfmt_s not in "2,4" %}{% else %} + {% if ticket.status == 5 and status_choice_strfmt_s not in "2,5" %}{% else %} + + {% endif %} + {% endif %} + {% endif %} + {% endif %} + {% endif %} + {% endwith %} + {% endfor %}
- {% endif %} - {% if ticket.status == 2 %} -
- - - - -
- {% endif %} - {% if ticket.status == 3 %} -
- - - -
- {% endif %} - {% if ticket.status == 4 %} -
-
- {% endif %} - {% if ticket.status == 5 %} -
- - -
- {% endif %} {% if helpdesk_settings.HELPDESK_UPDATE_PUBLIC_DEFAULT %} From 827c0b7ed33b8b23745db032361d31dab5b6f5a4 Mon Sep 17 00:00:00 2001 From: Sam Splunks <72095718+samsplunks@users.noreply.github.com> Date: Fri, 2 Feb 2024 15:40:08 +0100 Subject: [PATCH 08/13] Update public ticket view with new settings statuses logic --- .../helpdesk/public_view_ticket.html | 40 +++++++------------ 1 file changed, 15 insertions(+), 25 deletions(-) diff --git a/helpdesk/templates/helpdesk/public_view_ticket.html b/helpdesk/templates/helpdesk/public_view_ticket.html index cdca2de7..8c1dac4a 100644 --- a/helpdesk/templates/helpdesk/public_view_ticket.html +++ b/helpdesk/templates/helpdesk/public_view_ticket.html @@ -107,33 +107,23 @@ {% if not ticket.can_be_resolved %}
{% trans "This ticket cannot be resolved or closed until the tickets it depends on are resolved." %}
{% endif %} {% if ticket.status == 1 %} - - {% endif %} - {% if ticket.status == 2 %} + + {% else %}
- - - - + {% for status_choice in ticket.STATUS_CHOICES %} + {% with status_choice_strfmt_s=status_choice.0|stringformat:"s" %} + {% if ticket.status == 2 and status_choice_strfmt_s in "1" %}{% else %} + {% if ticket.status == 3 and status_choice_strfmt_s not in "2,3,4" %}{% else %} + {% if ticket.status == 4 and status_choice_strfmt_s not in "2,4" %}{% else %} + {% if ticket.status == 5 and status_choice_strfmt_s not in "2,5" %}{% else %} + + {% endif %} + {% endif %} + {% endif %} + {% endif %} + {% endwith %} + {% endfor %}
- {% endif %} - {% if ticket.status == 3 %} -
- - - -
- {% endif %} - {% if ticket.status == 4 %} -
-
- {% endif %} - {% if ticket.status == 5 %} -
- - -
- {% endif %} From 6498126b87d9904365b95a6f7a0f9b6869491023 Mon Sep 17 00:00:00 2001 From: Sam Splunks <72095718+samsplunks@users.noreply.github.com> Date: Fri, 2 Feb 2024 16:20:08 +0100 Subject: [PATCH 09/13] Forgot {% endif %} line while pasting code --- helpdesk/templates/helpdesk/public_view_ticket.html | 1 + 1 file changed, 1 insertion(+) diff --git a/helpdesk/templates/helpdesk/public_view_ticket.html b/helpdesk/templates/helpdesk/public_view_ticket.html index 8c1dac4a..3c3467a7 100644 --- a/helpdesk/templates/helpdesk/public_view_ticket.html +++ b/helpdesk/templates/helpdesk/public_view_ticket.html @@ -124,6 +124,7 @@ {% endwith %} {% endfor %} + {% endif %} From 8b53ef9505e761e17cda15d7d8111a2501072d90 Mon Sep 17 00:00:00 2001 From: Sam Splunks <72095718+samsplunks@users.noreply.github.com> Date: Mon, 5 Feb 2024 10:58:42 +0100 Subject: [PATCH 10/13] Passing ticket status flow logic to Ticket model --- helpdesk/models.py | 17 +++++++++++++++++ helpdesk/settings.py | 13 +++++++++++++ 2 files changed, 30 insertions(+) diff --git a/helpdesk/models.py b/helpdesk/models.py index 385281db..620cb54d 100644 --- a/helpdesk/models.py +++ b/helpdesk/models.py @@ -471,6 +471,7 @@ class Ticket(models.Model): STATUS_CHOICES = helpdesk_settings.TICKET_STATUS_CHOICES OPEN_STATUSES = helpdesk_settings.TICKET_OPEN_STATUSES + STATUS_CHOICES_FLOW = helpdesk_settings.TICKET_STATUS_CHOICES_FLOW PRIORITY_CHOICES = helpdesk_settings.TICKET_PRIORITY_CHOICES @@ -710,6 +711,22 @@ class Ticket(models.Model): return u'%s%s%s' % (self.get_status_display(), held_msg, dep_msg) get_status = property(_get_status) + def _get_allowed_status_flow(self): + """ + Returns the list of allowed ticket status modifications for current state. + """ + status_id_list = self.STATUS_CHOICES_FLOW.get(self.status, ()) + if status_id_list: + # keep defined statuses in order and add labels for display + status_dict = dict(helpdesk_settings.TICKET_STATUS_CHOICES) + new_statuses = [(status_id, status_dict.get(status_id, 1)) + for status_id in status_id_list] + else: + # defaults to all choices if status was not mapped + new_statuses = helpdesk_settings.TICKET_STATUS_CHOICES + return new_statuses + get_allowed_status_flow = property(_get_allowed_status_flow) + def _get_ticket_url(self): """ Returns a publicly-viewable URL for this ticket, used when giving diff --git a/helpdesk/settings.py b/helpdesk/settings.py index fbbc8bad..cf5ca644 100644 --- a/helpdesk/settings.py +++ b/helpdesk/settings.py @@ -121,11 +121,24 @@ TICKET_STATUS_CHOICES = getattr(settings, 'HELPDESK_TICKET_STATUS_CHOICES', DEFAULT_TICKET_STATUS_CHOICES) +# List of status choices considered as "open" DEFAULT_TICKET_OPEN_STATUSES = (OPEN_STATUS, REOPENED_STATUS) TICKET_OPEN_STATUSES = getattr(settings, 'HELPDESK_TICKET_OPEN_STATUSES', DEFAULT_TICKET_OPEN_STATUSES) +# New status list choices depending on current ticket status +DEFAULT_TICKET_STATUS_CHOICES_FLOW = { + OPEN_STATUS: (OPEN_STATUS, RESOLVED_STATUS, CLOSED_STATUS, DUPLICATE_STATUS,), + REOPENED_STATUS: (REOPENED_STATUS, RESOLVED_STATUS, CLOSED_STATUS, DUPLICATE_STATUS,), + RESOLVED_STATUS: (REOPENED_STATUS, RESOLVED_STATUS, CLOSED_STATUS,), + CLOSED_STATUS: (REOPENED_STATUS, CLOSED_STATUS,), + DUPLICATE_STATUS: (REOPENED_STATUS, DUPLICATE_STATUS,), +} +TICKET_STATUS_CHOICES_FLOW = getattr(settings, + 'HELPDESK_TICKET_STATUS_CHOICES_FLOW', + DEFAULT_TICKET_STATUS_CHOICES_FLOW) + # Ticket priority choices DEFAULT_TICKET_PRIORITY_CHOICES = ( (1, _('1. Critical')), From c7a9a1ab541aa9f40c45976842b6cd0069d3031f Mon Sep 17 00:00:00 2001 From: Sam Splunks <72095718+samsplunks@users.noreply.github.com> Date: Mon, 5 Feb 2024 11:34:56 +0100 Subject: [PATCH 11/13] Removed ticket new status logic from templates --- .../templates/helpdesk/public_view_ticket.html | 16 +++------------- helpdesk/templates/helpdesk/ticket.html | 16 ++-------------- 2 files changed, 5 insertions(+), 27 deletions(-) diff --git a/helpdesk/templates/helpdesk/public_view_ticket.html b/helpdesk/templates/helpdesk/public_view_ticket.html index 3c3467a7..62f37a43 100644 --- a/helpdesk/templates/helpdesk/public_view_ticket.html +++ b/helpdesk/templates/helpdesk/public_view_ticket.html @@ -110,19 +110,9 @@ {% else %}
- {% for status_choice in ticket.STATUS_CHOICES %} - {% with status_choice_strfmt_s=status_choice.0|stringformat:"s" %} - {% if ticket.status == 2 and status_choice_strfmt_s in "1" %}{% else %} - {% if ticket.status == 3 and status_choice_strfmt_s not in "2,3,4" %}{% else %} - {% if ticket.status == 4 and status_choice_strfmt_s not in "2,4" %}{% else %} - {% if ticket.status == 5 and status_choice_strfmt_s not in "2,5" %}{% else %} - - {% endif %} - {% endif %} - {% endif %} - {% endif %} - {% endwith %} - {% endfor %} + {% for status_choice in ticket.get_allowed_status_flow %} + + {% endfor %}
{% endif %} diff --git a/helpdesk/templates/helpdesk/ticket.html b/helpdesk/templates/helpdesk/ticket.html index 50a61a4f..b4eb61db 100644 --- a/helpdesk/templates/helpdesk/ticket.html +++ b/helpdesk/templates/helpdesk/ticket.html @@ -110,20 +110,8 @@
{% if not ticket.can_be_resolved %}
{% trans "This ticket cannot be resolved or closed until the tickets it depends on are resolved." %}
{% endif %}
- {% for status_choice in ticket.STATUS_CHOICES %} - {% with status_choice_strfmt_s=status_choice.0|stringformat:"s" %} - {% if ticket.status == 1 and status_choice_strfmt_s in "2" %}{% else %} - {% if ticket.status == 2 and status_choice_strfmt_s in "1" %}{% else %} - {% if ticket.status == 3 and status_choice_strfmt_s not in "2,3,4" %}{% else %} - {% if ticket.status == 4 and status_choice_strfmt_s not in "2,4" %}{% else %} - {% if ticket.status == 5 and status_choice_strfmt_s not in "2,5" %}{% else %} - - {% endif %} - {% endif %} - {% endif %} - {% endif %} - {% endif %} - {% endwith %} + {% for status_choice in ticket.get_allowed_status_flow %} + {% endfor %}
From 40ef247844b471ab5674ef8b43ed34b8053b5050 Mon Sep 17 00:00:00 2001 From: Sam Splunks <72095718+samsplunks@users.noreply.github.com> Date: Mon, 5 Feb 2024 11:39:45 +0100 Subject: [PATCH 12/13] Handle "no label" for status id case (shouldn't happen) --- helpdesk/models.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/helpdesk/models.py b/helpdesk/models.py index 620cb54d..b585f9ea 100644 --- a/helpdesk/models.py +++ b/helpdesk/models.py @@ -719,14 +719,14 @@ class Ticket(models.Model): if status_id_list: # keep defined statuses in order and add labels for display status_dict = dict(helpdesk_settings.TICKET_STATUS_CHOICES) - new_statuses = [(status_id, status_dict.get(status_id, 1)) + new_statuses = [(status_id, status_dict.get(status_id, _('No label'))) for status_id in status_id_list] else: # defaults to all choices if status was not mapped new_statuses = helpdesk_settings.TICKET_STATUS_CHOICES return new_statuses get_allowed_status_flow = property(_get_allowed_status_flow) - + def _get_ticket_url(self): """ Returns a publicly-viewable URL for this ticket, used when giving From bfb58a1ccf49b0eb23de9660a5ba4ab5c33825a2 Mon Sep 17 00:00:00 2001 From: Sam Splunks <72095718+samsplunks@users.noreply.github.com> Date: Mon, 5 Feb 2024 11:54:25 +0100 Subject: [PATCH 13/13] Documenting HELPDESK_TICKET_STATUS_CHOICES_FLOW setting --- docs/settings.rst | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/docs/settings.rst b/docs/settings.rst index eeb7dad5..56199046 100644 --- a/docs/settings.rst +++ b/docs/settings.rst @@ -244,6 +244,30 @@ Options that change ticket properties HELPDESK_TICKET_REOPENED_STATUS, HELPDESK_TICKET_FORKED_STATUS) +- **HELPDESK_TICKET_STATUS_CHOICES_FLOW** Customize the allowed state changes depending on the current state. + + The **default** is below:: + + HELPDESK_TICKET_STATUS_CHOICES_FLOW = { + HELPDESK_TICKET_OPEN_STATUS: (HELPDESK_TICKET_OPEN_STATUS, HELPDESK_TICKET_RESOLVED_STATUS, HELPDESK_TICKET_CLOSED_STATUS, HELPDESK_TICKET_DUPLICATE_STATUS,), + HELPDESK_TICKET_REOPENED_STATUS: (HELPDESK_TICKET_REOPENED_STATUS, HELPDESK_TICKET_RESOLVED_STATUS, HELPDESK_TICKET_CLOSED_STATUS, HELPDESK_TICKET_DUPLICATE_STATUS,), + HELPDESK_TICKET_RESOLVED_STATUS: (HELPDESK_TICKET_REOPENED_STATUS, HELPDESK_TICKET_RESOLVED_STATUS, HELPDESK_TICKET_CLOSED_STATUS,), + HELPDESK_TICKET_CLOSED_STATUS: (HELPDESK_TICKET_REOPENED_STATUS, HELPDESK_TICKET_CLOSED_STATUS,), + HELPDESK_TICKET_DUPLICATE_STATUS: (HELPDESK_TICKET_REOPENED_STATUS, HELPDESK_TICKET_DUPLICATE_STATUS,), + } + + If you wish to modify or have introduce new status choices, you may configure their status change flow like this:: + + # adding HELPDESK_TICKET_FORKED_STATUS to the other allowed states flow and defining its own flow + HELPDESK_TICKET_STATUS_CHOICES_FLOW = { + HELPDESK_TICKET_OPEN_STATUS: (HELPDESK_TICKET_OPEN_STATUS, HELPDESK_TICKET_FORKED_STATUS, HELPDESK_TICKET_RESOLVED_STATUS, HELPDESK_TICKET_CLOSED_STATUS, HELPDESK_TICKET_DUPLICATE_STATUS,), + HELPDESK_TICKET_REOPENED_STATUS: (HELPDESK_TICKET_REOPENED_STATUS, HELPDESK_TICKET_FORKED_STATUS, HELPDESK_TICKET_RESOLVED_STATUS, HELPDESK_TICKET_CLOSED_STATUS, HELPDESK_TICKET_DUPLICATE_STATUS,), + HELPDESK_TICKET_RESOLVED_STATUS: (HELPDESK_TICKET_REOPENED_STATUS, HELPDESK_TICKET_RESOLVED_STATUS, HELPDESK_TICKET_CLOSED_STATUS,), + HELPDESK_TICKET_CLOSED_STATUS: (HELPDESK_TICKET_REOPENED_STATUS, HELPDESK_TICKET_CLOSED_STATUS,), + HELPDESK_TICKET_DUPLICATE_STATUS: (HELPDESK_TICKET_REOPENED_STATUS, HELPDESK_TICKET_DUPLICATE_STATUS,), + HELPDESK_TICKET_FORKED_STATUS: (HELPDESK_TICKET_OPEN_STATUS, HELPDESK_TICKET_FORKED_STATUS, HELPDESK_TICKET_RESOLVED_STATUS, HELPDESK_TICKET_CLOSED_STATUS, HELPDESK_TICKET_DUPLICATE_STATUS,), + } + - **HELPDESK_TICKET_PRIORITY_CHOICES** Customize the priority choices for all tickets. The **default** is below::