From 0661fc995d99f3294860e6aa738305b82fb7f204 Mon Sep 17 00:00:00 2001 From: Evan Borgstrom Date: Fri, 16 Dec 2011 14:27:16 -0500 Subject: [PATCH 01/23] Handle context['queue'] as a dict or an object See: GH-70 - https://github.com/rossp/django-helpdesk/pull/70 --- helpdesk/lib.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/helpdesk/lib.py b/helpdesk/lib.py index 05469588..64999653 100644 --- a/helpdesk/lib.py +++ b/helpdesk/lib.py @@ -54,7 +54,15 @@ def send_templated_mail(template_name, email_context, recipients, sender=None, b import os context = Context(email_context) - locale = context['queue'].get('locale', 'en') + + # XXX: context['queue'] seems to able to be provided as either + # a dict or a Queue object, handle both & fallback to 'en' + if isinstance(context['queue'], dict): + locale = context['queue'].get('locale', 'en') + elif hasattr(context['queue'], 'locale'): + locale = context['queue'].locale + else: + locale = 'en' t = None try: From 969c0cdc6e2f5bb93b570679fc7914df3a1498cf Mon Sep 17 00:00:00 2001 From: Alex Garel Date: Tue, 29 Nov 2011 19:25:48 +0100 Subject: [PATCH 02/23] Merge+Fix of Alex's commit for GH-93 bug fix : on update we need followup comment for notification --- helpdesk/management/commands/get_email.py | 68 ++++++++++++----------- 1 file changed, 36 insertions(+), 32 deletions(-) diff --git a/helpdesk/management/commands/get_email.py b/helpdesk/management/commands/get_email.py index 795fc2e5..1b22c0b0 100644 --- a/helpdesk/management/commands/get_email.py +++ b/helpdesk/management/commands/get_email.py @@ -246,6 +246,39 @@ def ticket_from_message(message, queue, quiet): t.status = Ticket.REOPENED_STATUS t.save() + f = FollowUp( + ticket = t, + title = _('E-Mail Received from %(sender_email)s' % {'sender_email': sender_email}), + date = datetime.now(), + public = True, + comment = body, + ) + + if t.status == Ticket.REOPENED_STATUS: + f.new_status = Ticket.REOPENED_STATUS + f.title = _('Ticket Re-Opened by E-Mail Received from %(sender_email)s' % {'sender_email': sender_email}) + + f.save() + + if not quiet: + print (" [%s-%s] %s%s" % (t.queue.slug, t.id, t.title, update)).encode('ascii', 'replace') + + for file in files: + if file['content']: + filename = file['filename'].encode('ascii', 'replace').replace(' ', '_') + filename = re.sub('[^a-zA-Z0-9._-]+', '', filename) + a = Attachment( + followup=f, + filename=filename, + mime_type=file['type'], + size=len(file['content']), + ) + a.file.save(filename, ContentFile(file['content']), save=False) + a.save() + if not quiet: + print " - %s" % filename + + context = { 'ticket': t, 'queue': queue, @@ -281,6 +314,9 @@ def ticket_from_message(message, queue, quiet): ) else: + + context.update(comment=f.comment) + if t.status == Ticket.REOPENED_STATUS: update = _(' (Reopened)') else: @@ -304,38 +340,6 @@ def ticket_from_message(message, queue, quiet): fail_silently=True, ) - f = FollowUp( - ticket = t, - title = _('E-Mail Received from %(sender_email)s' % {'sender_email': sender_email}), - date = datetime.now(), - public = True, - comment = body, - ) - - if t.status == Ticket.REOPENED_STATUS: - f.new_status = Ticket.REOPENED_STATUS - f.title = _('Ticket Re-Opened by E-Mail Received from %(sender_email)s' % {'sender_email': sender_email}) - - f.save() - - if not quiet: - print (" [%s-%s] %s%s" % (t.queue.slug, t.id, t.title, update)).encode('ascii', 'replace') - - for file in files: - if file['content']: - filename = file['filename'].encode('ascii', 'replace').replace(' ', '_') - filename = re.sub('[^a-zA-Z0-9._-]+', '', filename) - a = Attachment( - followup=f, - filename=filename, - mime_type=file['type'], - size=len(file['content']), - ) - a.file.save(filename, ContentFile(file['content']), save=False) - a.save() - if not quiet: - print " - %s" % filename - return t From efafe8fc2c9ef59b0bc8107e81d996a9a9e5bf54 Mon Sep 17 00:00:00 2001 From: Ivan Giuliani Date: Wed, 11 Jan 2012 19:46:48 +0100 Subject: [PATCH 03/23] Added italian translation for email templates --- helpdesk/templates/helpdesk/it/email_html_base.html | 9 +++++++++ helpdesk/templates/helpdesk/it/email_text_footer.txt | 6 ++++++ 2 files changed, 15 insertions(+) create mode 100644 helpdesk/templates/helpdesk/it/email_html_base.html create mode 100644 helpdesk/templates/helpdesk/it/email_text_footer.txt diff --git a/helpdesk/templates/helpdesk/it/email_html_base.html b/helpdesk/templates/helpdesk/it/email_html_base.html new file mode 100644 index 00000000..24384435 --- /dev/null +++ b/helpdesk/templates/helpdesk/it/email_html_base.html @@ -0,0 +1,9 @@ +

{% block header %}Helpdesk{% endblock %}

+ +{% block content %}{% endblock %} + +

Cordiali saluti,

+ +

{{ queue.title }}{% if queue.email_address %}
{{ queue.email_address }}{% endif %}

+ +

Questa email vi è stata inviata in quanto utenti del nostro servizio di supporto clienti, in conformità con la nostra policy sulla privacy. Vi preghiamo di informarci se pensate di aver ricevuto questa email per errore.

diff --git a/helpdesk/templates/helpdesk/it/email_text_footer.txt b/helpdesk/templates/helpdesk/it/email_text_footer.txt new file mode 100644 index 00000000..dd66f47e --- /dev/null +++ b/helpdesk/templates/helpdesk/it/email_text_footer.txt @@ -0,0 +1,6 @@ +Cordiali saluti, + +{{ queue.title }}{% if queue.email_address %} +{{ queue.email_address }}{% endif %} + +Questa email vi è stata inviata in quanto utenti del nostro servizio di supporto clienti, in conformità con la nostra policy sulla privacy. Vi preghiamo di informarci se pensate di aver ricevuto questa email per errore. From 3ec88e4658c6814bee86be244222ef9a50937798 Mon Sep 17 00:00:00 2001 From: Ivan Giuliani Date: Wed, 11 Jan 2012 20:44:03 +0100 Subject: [PATCH 04/23] Add italian in the list of available languages --- helpdesk/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helpdesk/settings.py b/helpdesk/settings.py index 36f3f649..41386a8e 100644 --- a/helpdesk/settings.py +++ b/helpdesk/settings.py @@ -55,7 +55,7 @@ HELPDESK_SUPPORT_PERSON = getattr(settings, 'HELPDESK_SUPPORT_PERSON', False) HELPDESK_TRANSLATE_TICKET_COMMENTS = getattr(settings, 'HELPDESK_TRANSLATE_TICKET_COMMENTS', False) # list of languages to offer. if set to false, all default google translate languages will be shown. -HELPDESK_TRANSLATE_TICKET_COMMENTS_LANG = getattr(settings, 'HELPDESK_TRANSLATE_TICKET_COMMENTS_LANG', ["en", "de", "fr", "ru"]) +HELPDESK_TRANSLATE_TICKET_COMMENTS_LANG = getattr(settings, 'HELPDESK_TRANSLATE_TICKET_COMMENTS_LANG', ["en", "de", "fr", "it", "ru"]) # show link to 'change password' on 'User Settings' page? HELPDESK_SHOW_CHANGE_PASSWORD = getattr(settings, 'HELPDESK_SHOW_CHANGE_PASSWORD', False) From c3db5417d3989061847df36c6bf1164076c54117 Mon Sep 17 00:00:00 2001 From: Ivan Giuliani Date: Wed, 11 Jan 2012 21:36:02 +0100 Subject: [PATCH 05/23] Added italian translation for database-stored email templates --- helpdesk/fixtures/initial_data.json | 194 +++++++++++++++++++++++++++- 1 file changed, 193 insertions(+), 1 deletion(-) diff --git a/helpdesk/fixtures/initial_data.json b/helpdesk/fixtures/initial_data.json index a8bbffe5..18a97d24 100644 --- a/helpdesk/fixtures/initial_data.json +++ b/helpdesk/fixtures/initial_data.json @@ -766,5 +766,197 @@ "subject": "(Mis \u00e0 jour)", "template_name": "updated_submitter" } + }, + { + "pk": 65, + "model": "helpdesk.emailtemplate", + "fields": { + "locale": "it", + "template_name": "assigned_cc", + "plain_text": "Salve,\r\n\r\nTi \u00e8 stata inviata questa email per informarti che il ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") per {{ ticket.submitter_email }} {% if ticket.assigned_to %}\u00e8 stato assegnato a {{ ticket.assigned_to }}{% else %}non \u00e8 pi\u00f9 assegnato{% endif %}.\r\n\r\nID Ticket: {{ ticket.ticket }}\r\nCoda: {{ queue.title }}\r\nTitolo: {{ ticket.title }}\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}\r\nPriorit\u00e0: {{ ticket.get_priority_display }}\r\nStato: {{ ticket.get_status }}\r\nAssegnato a: {{ ticket.get_assigned_to }}\r\nVedi Online: {{ ticket.staff_url }} (richiesto login)\r\n\r\nLa descrizione del ticket era:\r\n\r\n{{ ticket.description }}", + "html": "

Salve,

\r\n\r\n

Ti \u00e8 stata inviata questa email per informarti che il ticket {{ ticket.ticket }} ({{ ticket.title }}) per {{ ticket.submitter_email }} {% if ticket.assigned_to %}\u00e8 stato assegnato a {{ ticket.assigned_to }}{% else %}non \u00e8 pi\u00f9 assegnato{% endif %}.

\r\n\r\n

\r\nTicket ID: {{ ticket.ticket }}
\r\nCoda: {{ queue.title }}
\r\nTitolo: {{ ticket.title }}
\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}
\r\nPriorit\u00e0: {{ ticket.get_priority_display }}
\r\nStato: {{ ticket.get_status }}
\r\nAssegnato a: {{ ticket.get_assigned_to }}
\r\nVedi Online per aggiornare questo ticket (richiesto login)

\r\n\r\n

Per riferimento, la descrizione del ticket era:

\r\n\r\n
{{ ticket.description }}
", + "heading": "Ticket Assegnato", + "subject": "(Assegnato)" + } + }, + { + "pk": 66, + "model": "helpdesk.emailtemplate", + "fields": { + "locale": "it", + "template_name": "assigned_owner", + "plain_text": "Salve,\r\n\r\nTi \u00e8 stata inviata questa email per informarti che ti \u00e8 stato assegnato il ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") per {{ ticket.submitter_email }}.\r\n\r\nID Ticket: {{ ticket.ticket }}\r\nCoda: {{ queue.title }}\r\nTitolo: {{ ticket.title }}\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}\r\nPriorit\u00e0: {{ ticket.get_priority_display }}\r\nStato: {{ ticket.get_status }}\r\nAssegnato a: {{ ticket.get_assigned_to }}\r\nVedi Online: {{ ticket.staff_url }} (richiesto login)\r\n\r\nLa descrizione del ticket \u00e8:\r\n\r\n{{ ticket.description }}", + "html": "

Salve,

\r\n\r\n

Ti \u00e8 stata inviata questa email per informarti che ti \u00e8 stato assegnato il ticket {{ ticket.ticket }} ({{ ticket.title }}) per {{ ticket.submitter_email }}.

\r\n\r\n

\r\nTicket ID: {{ ticket.ticket }}
\r\nCoda: {{ queue.title }}
\r\nTitolo: {{ ticket.title }}
\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}
\r\nPriorit\u00e0: {{ ticket.get_priority_display }}
\r\nStato: {{ ticket.get_status }}
\r\nAssegnato a: {{ ticket.get_assigned_to }}
\r\nVedi Online per aggiornare questo ticket (richiesto login)

\r\n\r\n

La descrizione del ticket \u00e8:

\r\n\r\n
{{ ticket.description }}
", + "heading": "Ticket Assegnato A Te", + "subject": "(Assegnato a Te)" + } + }, + { + "pk": 67, + "model": "helpdesk.emailtemplate", + "fields": { + "locale": "it", + "template_name": "closed_cc", + "plain_text": "Salve,\r\n\r\nIl ticket {{ ticket.title }} (\"{{ ticket.title }}\"){% if ticket.assigned_to %}, assegnato a {{ ticket.assigned_to }}{% endif %} \u00e8 stato chiuso.\r\n\r\nID Ticket: {{ ticket.ticket }}\r\nCoda: {{ queue.title }}\r\nTitolo: {{ ticket.title }}\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}\r\nPriorit\u00e0: {{ ticket.get_priority_display }}\r\nStato: {{ ticket.get_status }}\r\nAssegnato a: {{ ticket.get_assigned_to }}\r\nVedi Online: {{ ticket.staff_url }} (richiesto login)\r\n\r\nLa descrizione del ticket \u00e8:\r\n\r\n{{ ticket.description }}\r\n\r\nLa risoluzione fornita \u00e8:\r\n\r\n{{ resolution }}", + "html": "

Salve,

\r\n\r\n

Il ticket {{ ticket.title }} ('{{ ticket.title }}'){% if ticket.assigned_to %}, assegnato a {{ ticket.get_assigned_to }}{% endif %} \u00e8 stato chiuso.

\r\n\r\n

\r\nTicket ID: {{ ticket.ticket }}
\r\nCoda: {{ queue.title }}
\r\nTitolo: {{ ticket.title }}
\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}
\r\nPriorit\u00e0: {{ ticket.get_priority_display }}
\r\nStato: {{ ticket.get_status }}
\r\nAssegnato a: {{ ticket.get_assigned_to }}
\r\nVedi Online per aggiornare questo ticket (richiesto login)

\r\n\r\n

La descrizione del ticket \u00e8:

\r\n\r\n
{{ ticket.description }}
\r\n\r\n

La risoluzione fornita \u00e8:

\r\n\r\n
{{ resolution }}
\r\n\r\n

Se vuoi vedere questo ticket online, puoi visitare l'indirizzo {{ ticket.staff_url }}.

", + "heading": "Ticket Chiuso", + "subject": "(Closed)" + } + }, + { + "pk": 68, + "model": "helpdesk.emailtemplate", + "fields": { + "locale": "it", + "template_name": "closed_owner", + "plain_text": "Salve,\r\n\r\nIl ticket seguente, correntemente a te assegnato, \u00e8 stato chiuso.\r\n\r\nID Ticket: {{ ticket.ticket }}\r\nCoda: {{ queue.title }}\r\nTitolo: {{ ticket.title }}\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}\r\nPriorit\u00e0: {{ ticket.get_priority_display }}\r\nStato: {{ ticket.get_status }}\r\nAssegnato a: {{ ticket.get_assigned_to }}\r\nVedi Online: {{ ticket.staff_url }} (richiesto login)\r\n\r\nSe vuoi vedere il ticket online, puoi visitare l'indirizzo {{ ticket.staff_url }}.", + "html": "

Salve,

\r\n\r\n

Il ticket seguente, correntemente a te assegnato, \u00e8 stato chiuso.

\r\n\r\n

\r\nTicket ID: {{ ticket.ticket }}
\r\nCoda: {{ queue.title }}
\r\nTitolo: {{ ticket.title }}
\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}
\r\nPriorit\u00e0: {{ ticket.get_priority_display }}
\r\nStato: {{ ticket.get_status }}
\r\nAssegnato a: {{ ticket.get_assigned_to }}
\r\nVedi Online per aggiornare questo ticket (richiesto login)

\r\n\r\n

La descrizione del ticket \u00e8:

\r\n\r\n
{{ ticket.description }}
\r\n\r\n

La risoluzione fornita \u00e8:

\r\n\r\n
{{ ticket.resolution }}
", + "heading": "Ticket Chiuso", + "subject": "(Chiuso)" + } + }, + { + "pk": 69, + "model": "helpdesk.emailtemplate", + "fields": { + "locale": "it", + "template_name": "closed_submitter", + "plain_text": "Salve,\r\n\r\nHai recentemente inserito un ticket dall'oggetto \"{{ ticket.title }}\". Questa email ti \u00e8 inviata come conferma della chiusura del ticket.\r\n\r\nSe credi che ci sia bisogno di ulteriore lavoro per questo ticket, per cortesia faccelo sapere rispondendo a questa email mantenendone invariato l'oggetto.\r\n\r\nSe vuoi vedere il ticket online, puoi visitare l'indirizzo {{ ticket.ticket_url }}.\r\n\r\nLa risoluzione fornita \u00e8:\r\n\r\n{{ ticket.resolution }}", + "html": "

Salve,

\r\n\r\n

Hai recentemente inserito un ticket dall'oggetto {{ ticket.title }}. Questa email ti \u00e8 inviata come conferma della chiusura del ticket..

\r\n\r\n

La risoluzione fornita \u00e8:

\r\n\r\n
{{ ticket.resolution }}
\r\n\r\n

Se vuoi vedere il ticket online, puoi visitare l'indirizzo {{ ticket.ticket_url }}. Se credi che ci sia bisogno di ulteriore lavoro per questo ticket, per cortesia faccelo sapere rispondendo a questa email mantenendone invariato l'oggetto.\r\n

", + "heading": "Ticket Chiuso", + "subject": "(Closed)" + } + }, + { + "pk": 70, + "model": "helpdesk.emailtemplate", + "fields": { + "locale": "it", + "template_name": "escalated_cc", + "plain_text": "Salve,\r\n\r\nTi \u00e8 stata inviata questa email per informarti che la priorit\u00e0 del ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") \u00e8 stata aumentata automaticamente.\r\n\r\nID Ticket: {{ ticket.ticket }}\r\nCoda: {{ queue.title }}\r\nTitolo: {{ ticket.title }}\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}\r\nPriorit\u00e0: {{ ticket.get_priority_display }}\r\nStato: {{ ticket.get_status }}\r\nAssegnato a: {{ ticket.get_assigned_to }}\r\nVedi Online: {{ ticket.staff_url }} (richiesto login)\r\n\r\nLa descrizione originale del ticket era:\r\n\r\n{{ ticket.description }}", + "html": "

Salve,

\r\n\r\n

Ti \u00e8 stata inviata questa email per informarti che la priorit\u00e0 del ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") \u00e8 stata aumentata automaticamente.

\r\n\r\n

\r\nTicket ID: {{ ticket.ticket }}
\r\nCoda: {{ queue.title }}
\r\nTitolo: {{ ticket.title }}
\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}
\r\nPriorit\u00e0: {{ ticket.get_priority_display }}
\r\nStato: {{ ticket.get_status }}
\r\nAssegnato a: {{ ticket.get_assigned_to }}
\r\nVedi Online per aggiornare questo ticket (richiesto login)

\r\n\r\n

Per riferimento, la descrizione originale del ticket era:

\r\n\r\n
{{ ticket.description }}
", + "heading": "Priorit\u00e0 Aumentata", + "subject": "(Priorit\u00e0)" + } + }, + { + "pk": 71, + "model": "helpdesk.emailtemplate", + "fields": { + "locale": "it", + "template_name": "escalated_owner", + "plain_text": "Salve,\r\n\r\nLa priorit\u00e0 di un ticket a te assegnato \u00e8 stata automaticamente aumentata in quanto questo \u00e8 stato aperto pi\u00f9 del previsto.\r\n\r\nID Ticket: {{ ticket.ticket }}\r\nCoda: {{ queue.title }}\r\nTitolo: {{ ticket.title }}\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}\r\nPriorit\u00e0: {{ ticket.get_priority_display }}\r\nStato: {{ ticket.get_status }}\r\nAssegnato a: {{ ticket.get_assigned_to }}\r\nVedi Online: {{ ticket.staff_url }} (richiesto login)\r\n\r\nLa descrizione originale del ticket era:\r\n\r\n{{ ticket.description }}\r\n\r\nEsamina questo ticket e cerca di fornire una soluzione al pi\u00f9 presto.", + "html": "

Salve,

\r\n\r\n

La priorit\u00e0 di un ticket a te assegnato \u00e8 stata automaticamente aumentata in quanto questo \u00e8 stato aperto pi\u00f9 del previsto.

\r\n\r\n

\r\nTicket ID: {{ ticket.ticket }}
\r\nCoda: {{ queue.title }}
\r\nTitolo: {{ ticket.title }}
\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}
\r\nPriorit\u00e0: {{ ticket.get_priority_display }}
\r\nStato: {{ ticket.get_status }}
\r\nAssegnato a: {{ ticket.get_assigned_to }}
\r\nVedi Online per aggiornare questo ticket (richiesto login)

\r\n\r\n

Per riferimento, la descrizione originale del ticket era:

\r\n\r\n
{{ ticket.description }}
", + "heading": "La Priorit\u00e0 Di Un Ticket A Te Assegnato \u00e8 Stata Aumentata", + "subject": "(Priorit\u00e0)" + } + }, + { + "pk": 72, + "model": "helpdesk.emailtemplate", + "fields": { + "locale": "it", + "template_name": "escalated_submitter", + "plain_text": "Salve,\r\n\r\nHai recentemente inserito un ticket dall'oggetto \"{{ ticket.title }}\". Questa email ti \u00e8 inviata per informarti che la priorit\u00e0 del ticket \u00e8 stata automaticamente alzata in quanto questo \u00e8 stato aperto pi\u00f9 a lungo del previsto.\r\n\r\nEsamineremo a breve il ticket e cercheremo di fornire una risoluzione quanto prima.\r\n\r\nSe vuoi visitare il ticket online, puoi visitare l'indirizzo {{ ticket.ticket_url }}.", + "html": "

Salve,

\r\n\r\n

Hai recentemente inserito un ticket dall'oggetto {{ ticket.title }}. Questa email ti \u00e8 inviata per informarti che la priorit\u00e0 del ticket \u00e8 stata automaticamente alzata in quanto questo \u00e8 stato aperto pi\u00f9 a lungo del previsto.

\r\n\r\n

Esamineremo a breve il ticket e cercheremo di fornire una risoluzione quanto prima.

\r\n\r\n

Se vuoi visitare il ticket online, puoi visitare l'indirizzo {{ ticket.ticket_url }}.

", + "heading": "La Priorit\u00e0 Del Tuo Ticket \u00e8 Stata Aumentata", + "subject": "(Priorit\u00e0)" + } + }, + { + "pk": 73, + "model": "helpdesk.emailtemplate", + "fields": { + "locale": "it", + "template_name": "newticket_cc", + "plain_text": "Salve,\r\n\r\nQuesta email ti \u00e8 stata inviata per informarti che un nuovo ticket \u00e8 stato aperto.\r\n\r\nID Ticket: {{ ticket.ticket }}\r\nCoda: {{ queue.title }}\r\nTitolo: {{ ticket.title }}\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}\r\nPriorit\u00e0: {{ ticket.get_priority_display }}\r\nStato: {{ ticket.get_status }}\r\nVedi Online: {{ ticket.staff_url }} (richiesto login)\r\n\r\nDescrizione:\r\n{{ ticket.description }}", + "html": "

Salve,

\r\n\r\n

Questa email ti \u00e8 stata inviata per informarti che un nuovo ticket \u00e8 stato aperto.

\r\n\r\n

\r\nTicket ID: {{ ticket.ticket }}
\r\nCoda: {{ queue.title }}
\r\nTitolo: {{ ticket.title }}
\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}
\r\nPriorit\u00e0: {{ ticket.get_priority_display }}
\r\nStato: {{ ticket.get_status }}
\r\nVedi Online per aggiornare questo ticket (richiesto login)

\r\n\r\n

Descrizione:

\r\n\r\n
{{ ticket.description }}
", + "heading": "Nuovo Ticket Aperto", + "subject": "(Aperto)" + } + }, + { + "pk": 74, + "model": "helpdesk.emailtemplate", + "fields": { + "locale": "it", + "template_name": "newticket_submitter", + "plain_text": "Salve,\r\n\r\nQuesta email ti \u00e8 stata inviata per informarti che abbiamo ricevuto la tua richiesta di helpdesk dall'oggetto \"{{ ticket.title }}\". \r\n\r\nNon \u00e8 necessario fare altro al momento. Al tuo ticket \u00e8 stato assegnato l'identificativo {{ ticket.ticket }} e verr\u00e0 presto esaminato.\r\n\r\nSe vuoi aggiungere ulteriori dettagli o hai domande sul ticket, rispondi a questa email includendo l'id \"{{ ticket.ticket }}\" del ticket nell'oggetto. Il modo pi\u00f9 semplice per farlo \u00e8 di premere il pulsante \"rispondi\" del tuo client di posta.\r\n\r\nSe vuoi vedere questo ticket online per aggiungere ulteriori informazioni, allegare file o vedere gli aggiornamenti, puoi visitare l'indirizzo {{ ticket.ticket_url }}.\r\n\r\nAnalizzeremo la tua richiesta e cercheremo di risolverla quanto prima. Riceverai successivi aggiornamenti e la notifica di risoluzione a questo indirizzo email.", + "html": "

Salve,

\r\n\r\n

Questa email ti \u00e8 stata inviata per informarti che abbiamo ricevuto la tua richiesta di helpdesk dall'oggetto {{ ticket.title }}.

\r\n\r\n

Non \u00e8 necessario fare altro al momento. Al tuo ticket \u00e8 stato assegnato l'identificativo {{ ticket.ticket }} e verr\u00e0 presto esaminato.

\r\n\r\n

Se vuoi aggiungere ulteriori dettagli o hai domande sul ticket, rispondi a questa email includendo l'id {{ ticket.ticket}} del ticket nell'oggetto. Il modo pi\u00f9 semplice per farlo \u00e8 di premere il pulsante \"rispondi\" del tuo client di posta.

\r\n\r\n

Se vuoi vedere questo ticket online per aggiungere ulteriori informazioni, allegare file o vedere gli aggiornamenti, puoi visitare l'indirizzo {{ ticket.ticket_url }}.

\r\n\r\n

Analizzeremo la tua richiesta e cercheremo di risolverla quanto prima. Riceverai successivi aggiornamenti e la notifica di risoluzione a questo indirizzo email.

", + "heading": "Il Tuo Ticket \u00e8 Stato Aperto", + "subject": "(Aperto)" + } + }, + { + "pk": 75, + "model": "helpdesk.emailtemplate", + "fields": { + "locale": "it", + "template_name": "resolved_cc", + "plain_text": "Salve,\r\n\r\nIl seguente ticket \u00e8 stato risolto:\r\n\r\nID Ticket: {{ ticket.ticket }}\r\nCoda: {{ queue.title }}\r\nTitolo: {{ ticket.title }}\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}\r\nPriorit\u00e0: {{ ticket.get_priority_display }}\r\nStato: {{ ticket.get_status }}\r\nAssegnato a: {{ ticket.get_assigned_to }}\r\nVedi Online: {{ ticket.staff_url }} (richiesto login)\r\n\r\nLa descrizione del ticket \u00e8:\r\n\r\n{{ ticket.description }}\r\n\r\nLa risoluzione fornita \u00e8:\r\n\r\n{{ ticket.resolution }}\r\n\r\nLa risoluzione \u00e8 stata inviata al proprietario del ticket, che dovr\u00e0 verificarla prima che il ticket possa essere chiuso.", + "html": "

Salve,

\r\n\r\n

Il seguente ticket \u00e8 stato risolto:

\r\n\r\n

\r\nTicket ID: {{ ticket.ticket }}
\r\nCoda: {{ queue.title }}
\r\nTitolo: {{ ticket.title }}
\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}
\r\nPriorit\u00e0: {{ ticket.get_priority_display }}
\r\nStato: {{ ticket.get_status }}
\r\nAssegnato a: {{ ticket.get_assigned_to }}
\r\nVedi Online per aggiornare questo ticket (richiesto login)

\r\n\r\n

Per riferimento, la descrizione originale del ticket era:

\r\n\r\n
{{ ticket.description }}
\r\n\r\n

La risoluzione aggiunta era:

\r\n\r\n
{{ ticket.resolution }}
\r\n\r\n

La risoluzione \u00e8 stata inviata al proprietario del ticket, che dovr\u00e0 verificarla prima che il ticket possa essere chiuso.

", + "heading": "Ticket Risolto", + "subject": "(Risolto)" + } + }, + { + "pk": 76, + "model": "helpdesk.emailtemplate", + "fields": { + "locale": "it", + "template_name": "resolved_owner", + "plain_text": "Salve,\r\n\r\nun ticket a te assegnato \u00e8 stato risolto.\r\n\r\nID Ticket: {{ ticket.ticket }}\r\nCoda: {{ queue.title }}\r\nTitolo: {{ ticket.title }}\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}\r\nPriorit\u00e0: {{ ticket.get_priority_display }}\r\nStato: {{ ticket.get_status }}\r\nAssegnato a: {{ ticket.get_assigned_to }}\r\nVedi Online: {{ ticket.staff_url }} (richiesto login)\r\n\r\nLa descrizione del ticket \u00e8:\r\n\r\n{{ ticket.description }}\r\n\r\nLa risoluzione fornita \u00e8:\r\n\r\n{{ ticket.resolution }}\r\n\r\nLa risoluzione \u00e8 stata inviata al proprietario del ticket, che dovr\u00e0 verificarla prima che il ticket possa essere chiuso.", + "html": "

Salve,

\r\n\r\n

Un ticket a te assegnato \u00e8 stato risolto.

\r\n\r\n

\r\nTicket ID: {{ ticket.ticket }}
\r\nCoda: {{ queue.title }}
\r\nTitolo: {{ ticket.title }}
\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}
\r\nPriorit\u00e0: {{ ticket.get_priority_display }}
\r\nStato: {{ ticket.get_status }}
\r\nAssegnato a: {{ ticket.get_assigned_to }}
\r\nVedi Online per aggiornare questo ticket (richiesto login)

\r\n\r\n

La descrizione del ticket \u00e8:

\r\n\r\n
{{ ticket.description }}
\r\n\r\n

La risoluzione fornita \u00e8:

\r\n\r\n
{{ ticket.resolution }}
\r\n\r\n

La risoluzione \u00e8 stata inviata al proprietario del ticket, che dovr\u00e0 verificarla prima che il ticket possa essere chiuso.

", + "heading": "Ticket Risolto", + "subject": "(Risolto)" + } + }, + { + "pk": 77, + "model": "helpdesk.emailtemplate", + "fields": { + "locale": "it", + "template_name": "resolved_submitter", + "plain_text": "Salve,\r\n\r\nHai recentemente inserito un ticket dall'oggetto \"{{ ticket.title }}\". Questa email vi \u00e8 stata inviata per informarvi della risoluzione del ticket.\r\n\r\nLa seguente risoluzione \u00e8 stata inserita al ticket {{ ticket.ticket }}:\r\n\r\n{{ resolution }}\r\n\r\nPu\u00f2 per cortesia confermare che questa risoluzione risolve i vostri problemi in modo tale da poter chiudere il ticket? Se ha ulteriori domande, o non crede che la risoluzione adottata \u00e8 adeguata, risponda a questa email mantenendo invariato l'oggetto.\r\n\r\nSe vuole vedere il ticket online, pu\u00f2 visitare l'indirizzo {{ ticket.ticket_url }}", + "html": "

Hello,

\r\n\r\n

Hai recentemente inserito un ticket dall'oggetto {{ ticket.title }}. Questa email vi \u00e8 stata inviata per informarvi della risoluzione del ticket.

\r\n\r\n

La seguente risoluzione \u00e8 stata inserita al ticket {{ ticket.ticket }}:

\r\n\r\n
{{ resolution }}
\r\n\r\n

Pu\u00f2 per cortesia confermare che questa risoluzione risolve i vostri problemi in modo tale da poter chiudere il ticket? Se ha ulteriori domande, o non crede che la risoluzione adottata \u00e8 adeguata, risponda a questa email mantenendo invariato l'oggetto.

\r\n\r\n

Se vuole vedere il ticket online, pu\u00f2 visitare l'indirizzo {{ ticket.ticket_url }}.

", + "heading": "Il Tuo Ticket \u00e8 Stato Risolto", + "subject": "(Risolto)" + } + }, + { + "pk": 78, + "model": "helpdesk.emailtemplate", + "fields": { + "locale": "it", + "template_name": "updated_cc", + "plain_text": "Salve,\r\n\r\nQuesta email ti \u00e8 stata inviata per informarti che il ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") per {{ ticket.submitter_email }} \u00e8 stato aggiornato.\r\n\r\nID Ticket: {{ ticket.ticket }}\r\nCoda: {{ queue.title }}\r\nTitolo: {{ ticket.title }}\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}\r\nPriorit\u00e0: {{ ticket.get_priority_display }}\r\nStato: {{ ticket.get_status }}\r\nAssegnato a: {{ ticket.get_assigned_to }}\r\nVedi Online: {{ ticket.staff_url }} (richiesto login)\r\n\r\nDescrizione originale:\r\n\r\n{{ ticket.description }}\r\n\r\nIl seguente commento \u00e8 stato aggiunto:\r\n\r\n{{ comment }}\r\n\r\nQuesta informazione{% if private %} non{% endif %} \u00e8 stata inviata al proprietario del ticket.\r\n\r\nSe vuoi vedere il ticket online, puoi visitare l'indirizzo {{ ticket.staff_url }}.", + "html": "

Salve,

\r\n\r\n

Questa email ti \u00e8 stata inviata per informarti che il ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") per {{ ticket.submitter_email }} \u00e8 stato aggiornato.

\r\n\r\n

\r\nTicket ID: {{ ticket.ticket }}
\r\nCoda: {{ queue.title }}
\r\nTitolo: {{ ticket.title }}
\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}
\r\nPriorit\u00e0: {{ ticket.get_priority_display }}
\r\nStato: {{ ticket.get_status }}
\r\nAssegnato a: {{ ticket.get_assigned_to }}
\r\nVedi Online per aggiornare questo ticket (richiesto login)

\r\n\r\n

Per riferimento, la descrizione originale era:

\r\n\r\n
{{ ticket.description }}
\r\n\r\n

Il seguente commento \u00e8 stato aggiunto:

\r\n\r\n
{{ comment }}
\r\n\r\n

Questa informazione{% if private %} non{% endif %} \u00e8 stata inviata al proprietario del ticket.

", + "heading": "Ticket Aggiornato", + "subject": "(Aggiornato)" + } + }, + { + "pk": 79, + "model": "helpdesk.emailtemplate", + "fields": { + "locale": "it", + "template_name": "updated_owner", + "plain_text": "Salve,\r\n\r\nTi \u00e8 stata inviata questa email per informavi che il ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") per {{ ticket.submitter_email }}, a te assegnato, \u00e8 stato aggiornato.\r\n\r\nID Ticket: {{ ticket.ticket }}\r\nCoda: {{ queue.title }}\r\nTitolo: {{ ticket.title }}\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}\r\nPriorit\u00e0: {{ ticket.get_priority_display }}\r\nStato: {{ ticket.get_status }}\r\nAssegnato a: {{ ticket.get_assigned_to }}\r\nVedi Online: {{ ticket.staff_url }} (richiesto login)\r\n\r\nDescrizione originale:\r\n\r\n{{ ticket.description }}\r\n\r\nIl seguente commento \u00e8 stato aggiunto:\r\n\r\n{{ comment }}\r\n\r\nQuesta informazione{% if private %} non{% endif %} \u00e8 stata inviata al proprietario del ticket.\r\n\r\nSe vuoi vedere il ticket online, puoi visitare l'indirizzo {{ ticket.staff_url }}.", + "html": "

Salve,

\r\n\r\n

Ti \u00e8 stata inviata questa email per informavi che il ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") per {{ ticket.submitter_email }}, a te assegnato, \u00e8 stato aggiornato.

\r\n\r\n

\r\nTicket ID: {{ ticket.ticket }}
\r\nCoda: {{ queue.title }}
\r\nTitolo: {{ ticket.title }}
\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}
\r\nPriorit\u00e0: {{ ticket.get_priority_display }}
\r\nStato: {{ ticket.get_status }}
\r\nAssegnato a: {{ ticket.get_assigned_to }}
\r\nVedi Online per aggiornare questo ticket (richiesto login)

\r\n\r\n

Per riferimento, la descrizione originale del ticket era:

\r\n\r\n
{{ ticket.description }}
\r\n\r\n

Il seguente commento \u00e8 stato aggiunto:

\r\n\r\n
{{ comment }}
\r\n\r\n

Questa informazione{% if private %} non{% endif %} \u00e8 stata inviata al proprietario del ticket.

", + "heading": "Ticket Aggiornato", + "subject": "(Updated)" + } + }, + { + "pk": 80, + "model": "helpdesk.emailtemplate", + "fields": { + "locale": "it", + "template_name": "updated_submitter", + "plain_text": "Salve,\r\n\r\nHai recentemente inserito un ticket dall'oggetto \"{{ ticket.title }}\". Questa email ti \u00e8 stata inviata per informarti di un aggiornamento riguardo il ticket suddetto.\r\n\r\nIl seguente commento \u00e8 stato aggiunto al ticket {{ ticket.ticket }}:\r\n\r\n{{ comment }}\r\n\r\nSe c'\u00e8 bisogno di fornire informazioni aggiuntive, risponda a questa email mantenendone l'oggetto invariato. In alternativa, \u00e8 possibile vedere ed aggiornare il ticket online visitando l'indirizzo {{ ticket.ticket_url }}\r\n", + "html": "

Salve,

\r\n\r\n

Hai recentemente inserito un ticket dall'oggetto {{ ticket.title }}. Questa email ti \u00e8 stata inviata per informarti di un aggiornamento riguardo il ticket suddetto.

\r\n\r\n

Il seguente commento \u00e8 stato aggiunto al ticket {{ ticket.ticket }}:

\r\n\r\n
{{ comment }}
\r\n\r\n

Se c'\u00e8 bisogno di fornire informazioni aggiuntive, risponda a questa email mantenendone l'oggetto invariato. In alternativa, \u00e8 possibile vedere ed aggiornare il ticket online visitando l'indirizzo {{ ticket.ticket_url }}.

", + "heading": "Il Tuo Ticket \u00e8 Stato Aggiornato", + "subject": "(Aggiornato)" + } } -] + ] From 23a7f399d13d1413d60b0a96d9b5ee7afcc6f943 Mon Sep 17 00:00:00 2001 From: Ivan Giuliani Date: Thu, 12 Jan 2012 18:21:25 +0100 Subject: [PATCH 06/23] Save resolution when closing the ticket --- helpdesk/views/staff.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helpdesk/views/staff.py b/helpdesk/views/staff.py index b792094e..5037063d 100644 --- a/helpdesk/views/staff.py +++ b/helpdesk/views/staff.py @@ -344,7 +344,7 @@ def update_ticket(request, ticket_id, public=False): c.save() ticket.tags = tags - if new_status == Ticket.RESOLVED_STATUS: + if new_status in [ Ticket.RESOLVED_STATUS, Ticket.CLOSED_STATUS ]: ticket.resolution = comment messages_sent_to = [] From 599ff336654565ed82b1e2cf73060823082ebc8f Mon Sep 17 00:00:00 2001 From: Ivan Giuliani Date: Sat, 14 Jan 2012 13:06:37 +0100 Subject: [PATCH 07/23] Pass generic parameters to inherited model save() --- helpdesk/models.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/helpdesk/models.py b/helpdesk/models.py index 5432825d..c88dbf65 100644 --- a/helpdesk/models.py +++ b/helpdesk/models.py @@ -197,7 +197,7 @@ class Queue(models.Model): return u'%s <%s>' % (self.title, self.email_address) from_address = property(_from_address) - def save(self, force_insert=False, force_update=False): + def save(self, *args, **kwargs): if self.email_box_type == 'imap' and not self.email_box_imap_folder: self.email_box_imap_folder = 'INBOX' @@ -210,7 +210,7 @@ class Queue(models.Model): self.email_box_port = 995 elif self.email_box_type == 'pop3' and not self.email_box_ssl: self.email_box_port = 110 - super(Queue, self).save(force_insert, force_update) + super(Queue, self).save(*args, **kwargs) class Ticket(models.Model): @@ -436,7 +436,7 @@ class Ticket(models.Model): return ('helpdesk_view', (self.id,)) get_absolute_url = models.permalink(get_absolute_url) - def save(self, force_insert=False, force_update=False): + def save(self, *args, **kwargs): if not self.id: # This is a new ticket as no ID yet exists. self.created = datetime.now() @@ -446,7 +446,7 @@ class Ticket(models.Model): self.modified = datetime.now() - super(Ticket, self).save(force_insert, force_update) + super(Ticket, self).save(*args, **kwargs) class FollowUpManager(models.Manager): @@ -527,11 +527,11 @@ class FollowUp(models.Model): def get_absolute_url(self): return u"%s#followup%s" % (self.ticket.get_absolute_url(), self.id) - def save(self, force_insert=False, force_update=False): + def save(self, *args, **kwargs): t = self.ticket t.modified = datetime.now() t.save() - super(FollowUp, self).save(force_insert, force_update) + super(FollowUp, self).save(*args, **kwargs) class TicketChange(models.Model): @@ -843,10 +843,10 @@ class KBItem(models.Model): blank=True, ) - def save(self, force_insert=False, force_update=False): + def save(self, *args, **kwargs): if not self.last_updated: self.last_updated = datetime.now() - return super(KBItem, self).save(force_insert, force_update) + return super(KBItem, self).save(*args, **kwargs) def _score(self): if self.votes > 0: @@ -1024,10 +1024,10 @@ class IgnoreEmail(models.Model): def __unicode__(self): return u'%s' % self.name - def save(self): + def save(self, *args, **kwargs): if not self.date: self.date = datetime.now() - return super(IgnoreEmail, self).save() + return super(IgnoreEmail, self).save(*args, **kwargs) def test(self, email): """ From dc7685466719d2beca0fe5cd57cf986445208edc Mon Sep 17 00:00:00 2001 From: Ivan Giuliani Date: Sun, 15 Jan 2012 11:38:28 +0100 Subject: [PATCH 08/23] Exclude API calls from CSRF middleware. Starting from django 1.2, the CSRF middleware is enabled by default. However, API calls require parameters passing by POST requests but they cannot be served as they can't contain a CSRF token. This patch removes the CSRF middleware from API requests. --- helpdesk/views/api.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/helpdesk/views/api.py b/helpdesk/views/api.py index 0c394b86..5a88f3da 100644 --- a/helpdesk/views/api.py +++ b/helpdesk/views/api.py @@ -20,6 +20,7 @@ from django.http import HttpResponse from django.shortcuts import render_to_response from django.template import loader, Context from django.utils import simplejson +from django.views.decorators.csrf import csrf_exempt from helpdesk.forms import TicketForm from helpdesk.lib import send_templated_mail, safe_template_context @@ -33,6 +34,7 @@ STATUS_ERROR_PERMISSIONS = 403 STATUS_ERROR_BADMETHOD = 405 +@csrf_exempt def api(request, method): """ Regardless of any other paramaters, we provide a help screen From 537d403d99fa41687c9e855dd53cc6fa8d54c462 Mon Sep 17 00:00:00 2001 From: tschmidt Date: Mon, 16 Jan 2012 16:42:16 -0800 Subject: [PATCH 09/23] added HELPDESK_KB_ENABLED_STAFF --- helpdesk/settings.py | 3 +++ helpdesk/templates/helpdesk/navigation.html | 3 +++ 2 files changed, 6 insertions(+) diff --git a/helpdesk/settings.py b/helpdesk/settings.py index 36f3f649..8d7112ce 100644 --- a/helpdesk/settings.py +++ b/helpdesk/settings.py @@ -40,6 +40,9 @@ HELPDESK_PREPEND_ORG_NAME = getattr(settings, 'HELPDESK_PREPEND_ORG_NAME', False # show knowledgebase links? HELPDESK_KB_ENABLED = getattr(settings, 'HELPDESK_KB_ENABLED', True) +# show knowledgebase links on staff view? +HELPDESK_KB_ENABLED_STAFF = getattr(settings, 'HELPDESK_KB_ENABLED_STAFF', False) + # show extended navigation by default, to all users, irrespective of staff status? HELPDESK_NAVIGATION_ENABLED = getattr(settings, 'HELPDESK_NAVIGATION_ENABLED', False) diff --git a/helpdesk/templates/helpdesk/navigation.html b/helpdesk/templates/helpdesk/navigation.html index ba9bb9cd..0bb6792f 100644 --- a/helpdesk/templates/helpdesk/navigation.html +++ b/helpdesk/templates/helpdesk/navigation.html @@ -7,6 +7,9 @@ {% if helpdesk_settings.HELPDESK_NAVIGATION_STATS_ENABLED %}
  • {% trans "Stats" %}
  • {% endif %} + {% if helpdesk_settings.HELPDESK_KB_ENABLED_STAFF %} +
  • {% trans "Knowledgebase" %}
  • + {% endif %} {% if user_saved_queries_ %}