diff --git a/docs/install.rst b/docs/install.rst index 82a55c78..da306c6c 100644 --- a/docs/install.rst +++ b/docs/install.rst @@ -56,11 +56,7 @@ Adding To Your Django Project ./manage.py syncdb - If you're wise enough to use South, the first migration will need to be a fake:: - - ./manage.py migrate helpdesk 0001 --fake - - After the initial migration, all others are done in the usual way:: + Then migrate using South ./manage.py migrate helpdesk diff --git a/docs/settings.rst b/docs/settings.rst index 6e9d250a..c1e89089 100644 --- a/docs/settings.rst +++ b/docs/settings.rst @@ -1,6 +1,14 @@ Settings ======== +First, django-helpdesk needs ``django.core.context_processors.request`` activated, so in your ``settings.py`` add:: + + from django.conf import global_settings + TEMPLATE_CONTEXT_PROCESSORS = ( + global_settings.TEMPLATE_CONTEXT_PROCESSORS + + ('django.core.context_processors.request',) + ) + The following settings can be changed in your ``settings.py`` file to help change the way django-helpdesk operates. HELPDESK_DEFAULT_SETTINGS diff --git a/helpdesk/fixtures/initial_data.json b/helpdesk/fixtures/initial_data.json index 1ecb3262..18a97d24 100644 --- a/helpdesk/fixtures/initial_data.json +++ b/helpdesk/fixtures/initial_data.json @@ -574,5 +574,389 @@ "subject": "(Aktualisiert)", "locale": "de" } + }, + { + "pk": 49, + "model": "helpdesk.emailtemplate", + "fields": { + "heading": "Ticket Assign\u00e9", + "html": "

Bonjour,

\r\n\r\n

Ce courriel indicatif permet de vous pr\u00e9venir que le ticket {{ ticket.ticket }} ({{ ticket.title }}) par {{ ticket.submitter_email }} {% if ticket.assigned_to %}a \u00e9t\u00e9 assign\u00e9 \u00e0 {{ ticket.assigned_to }}{% else %} n'est plus assign\u00e9 \u00e0 personne{% endif %}.

\r\n\r\n

\r\nFile d'attente : {{ ticket.ticket }}
\r\nQueue : {{ queue.title }}
\r\nTitre : {{ ticket.title }}
\r\nOuvert le : {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nSoumis par : {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriorit\u00e9 : {{ ticket.get_priority_display }}
\r\nStatut : {{ ticket.get_status }}
\r\nAssign\u00e9 \u00e0 : {{ ticket.get_assigned_to }}
\r\nVoir le ticket en ligne pour le mettre \u00e0 jour (apr\u00e8s authentification)

\r\n\r\n

Pour m\u00e9moire, la description originelle \u00e9tait :

\r\n\r\n
{{ ticket.description }}
", + "locale": "fr", + "plain_text": "Bonjour,\r\n\r\nCe courriel indicatif permet de vous pr\u00e9venir que le ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") par {{ ticket.submitter_email }} {% if ticket.assigned_to %} a \u00e9t\u00e9 assign\u00e9 \u00e0 {{ ticket.assigned_to }}{% else %} n'est plus assign\u00e9 \u00e0 personne{% endif %}.\r\n\r\nIdentifiant\u00a0: {{ ticket.ticket }}\r\nFile d'attente\u00a0: {{ queue.title }}\r\nTitre\u00a0: {{ ticket.title }}\r\nOuvert le\u00a0: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nSoumis par\u00a0: {{ ticket.submitter_email|default:\"Unknown\" }}\r\nPriorit\u00e9\u00a0: {{ ticket.get_priority_display }}\r\nStatut\u00a0: {{ ticket.get_status }}\r\nAssign\u00e9 \u00e0\u00a0: {{ ticket.get_assigned_to }}\r\nAdresse\u00a0: {{ ticket.staff_url }}\r\n\r\nLa description originelle \u00e9tait\u00a0:\r\n\r\n{{ ticket.description }}\r\n\r\n", + "subject": "(Assign\u00e9)", + "template_name": "assigned_cc" + } + }, + { + "pk": 50, + "model": "helpdesk.emailtemplate", + "fields": { + "heading": "Le ticket vous est assign\u00e9", + "html": "

Bonjour,

\r\n\r\n

Ce courriel indicatif permet de vous pr\u00e9venir que le ticket {{ ticket.ticket }} ({{ ticket.title }}) pour {{ ticket.submitter_email }} vous a \u00e9t\u00e9 assign\u00e9.

\r\n\r\n

\r\nFile d'attente : {{ ticket.ticket }}
\r\nQueue : {{ queue.title }}
\r\nTitre : {{ ticket.title }}
\r\nOuvert le : {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nSoumis par : {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriorit\u00e9 : {{ ticket.get_priority_display }}
\r\nStatut : {{ ticket.get_status }}
\r\nAssign\u00e9 \u00e0 : {{ ticket.get_assigned_to }}
\r\nVoir le ticket en ligne pour le mettre \u00e0 jour (apr\u00e8s authentification)

\r\n\r\n

Pour m\u00e9moire, la description originelle \u00e9tait :

\r\n\r\n
{{ ticket.description }}
", + "locale": "fr", + "plain_text": "Bonjour,\r\n\r\nCe courriel indicatif permet de vous pr\u00e9venir que le ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") pour {{ ticket.submitter_email }} vous a \u00e9t\u00e9 assign\u00e9.\r\n\r\nIdentifiant : {{ ticket.ticket }}\r\nFile d'attente : {{ queue.title }}\r\nTitre : {{ ticket.title }}\r\nOuvert le : {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nSoumis par : {{ ticket.submitter_email|default:\"Unknown\" }}\r\nPriorit\u00e9 : {{ ticket.get_priority_display }}\r\nStatut : {{ ticket.get_status }}\r\nAssign\u00e9 \u00e0 : {{ ticket.get_assigned_to }}\r\nAdresse : {{ ticket.staff_url }}\r\n\r\nLa description originelle \u00e9tait :\r\n\r\n{{ ticket.description }}", + "subject": "(Pour vous)", + "template_name": "assigned_owner" + } + }, + { + "pk": 51, + "model": "helpdesk.emailtemplate", + "fields": { + "heading": "Ticket Ferm\u00e9", + "html": "

Bonjour,

\r\n\r\n

Le ticket {{ ticket.title }} ('{{ ticket.title }}'){% if ticket.assigned_to %}, assign\u00e9 \u00e0 {{ ticket.get_assigned_to }}{% endif %} a \u00e9t\u00e9 ferm\u00e9.

\r\n\r\n

\r\nFile d'attente : {{ ticket.ticket }}
\r\nQueue : {{ queue.title }}
\r\nTitre : {{ ticket.title }}
\r\nOuvert le : {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nSoumis par : {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriorit\u00e9 : {{ ticket.get_priority_display }}
\r\nStatut : {{ ticket.get_status }}
\r\nAssign\u00e9 \u00e0 : {{ ticket.get_assigned_to }}
\r\nVoir le ticket en ligne pour le mettre \u00e0 jour (apr\u00e8s authentification)

\r\n\r\n

Pour m\u00e9moire, la description originelle \u00e9tait :

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

La motivation de r\u00e9solution est:

\r\n\r\n
{{ resolution }}
", + "locale": "fr", + "plain_text": "Bonjour,\r\n\r\nLe ticket {{ ticket.title }} (\"{{ ticket.title }}\"){% if ticket.assigned_to %}, assign\u00e9 \u00e0 {{ ticket.assigned_to }}{% endif %} a \u00e9t\u00e9 ferm\u00e9.\r\n\r\nIdentifiant : {{ ticket.ticket }}\r\nFile d'attente : {{ queue.title }}\r\nTitre : {{ ticket.title }}\r\nOuvert le : {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nSoumis par : {{ ticket.submitter_email|default:\"Unknown\" }}\r\nPriorit\u00e9 : {{ ticket.get_priority_display }}\r\nStatut : {{ ticket.get_status }}\r\nAssign\u00e9 \u00e0 : {{ ticket.get_assigned_to }}\r\nAdresse : {{ ticket.staff_url }}\r\n\r\nLa description originelle \u00e9tait :\r\n\r\n{{ ticket.description }}\r\n\r\nLa motivation de r\u00e9solution est:\r\n\r\n{{ resolution }}\r\n\r\n", + "subject": "(Ferm\u00e9)", + "template_name": "closed_cc" + } + }, + { + "pk": 52, + "model": "helpdesk.emailtemplate", + "fields": { + "heading": "Ticket Ferm\u00e9", + "html": "

Bonjour,

\r\n\r\n

\r\nLe ticket suivant qui vous est actuellement assign\u00e9 a \u00e9t\u00e9 ferm\u00e9.

\r\n\r\n

\r\nFile d'attente : {{ ticket.ticket }}
\r\nQueue : {{ queue.title }}
\r\nTitre : {{ ticket.title }}
\r\nOuvert le : {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nSoumis par : {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriorit\u00e9 : {{ ticket.get_priority_display }}
\r\nStatut : {{ ticket.get_status }}
\r\nAssign\u00e9 \u00e0 : {{ ticket.get_assigned_to }}
\r\nVoir le ticket en ligne pour le mettre \u00e0 jour (apr\u00e8s authentification)

\r\n\r\n

Pour m\u00e9moire, la description originelle \u00e9tait :

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

La motivation de r\u00e9solution est:

\r\n\r\n
{{ resolution }}
\r\n", + "locale": "fr", + "plain_text": "Bonjour,\r\n\r\nLe ticket suivant qui vous est actuellement assign\u00e9 a \u00e9t\u00e9 ferm\u00e9.\r\n\r\n\r\nIdentifiant : {{ ticket.ticket }}\r\nFile d'attente : {{ queue.title }}\r\nTitre : {{ ticket.title }}\r\nOuvert le : {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nSoumis par : {{ ticket.submitter_email|default:\"Unknown\" }}\r\nPriorit\u00e9 : {{ ticket.get_priority_display }}\r\nStatut : {{ ticket.get_status }}\r\nAssign\u00e9 \u00e0 : {{ ticket.get_assigned_to }}\r\nAdresse : {{ ticket.staff_url }} (authentification obligatoire)\r\n\r\nLa description originelle \u00e9tait :\r\n\r\n{{ ticket.description }}\r\n\r\nLa motivation de r\u00e9solution est:\r\n\r\n{{ resolution }}", + "subject": "(Ferm\u00e9 - \u00e0 vous)", + "template_name": "closed_owner" + } + }, + { + "pk": 53, + "model": "helpdesk.emailtemplate", + "fields": { + "heading": "Ticket Ferm\u00e9", + "html": "

Bonjour,

\r\n\r\n

Vous avez r\u00e9cemment ouvert chez nous un ticket dont le sujet est {{ ticket.title }}. Ce courriel vous confirme que ce ticket a \u00e9t\u00e9 ferm\u00e9.

\r\n\r\n

\"La r\u00e9solution a \u00e9t\u00e9 motiv\u00e9e ainsi :

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

Vous pouvez visualiser ce ticket en ligne, en vous rendant \u00e0 l'adresse {{ ticket.ticket_url }}.

\r\n\r\n

Si vous pensez que nous devons encore travailler sur ce probl\u00e8me, faites le nous savoir en r\u00e9pondant \u00e0 ce courriel en conservant le sujet tel-quel..

", + "locale": "fr", + "plain_text": "Bonjour,\r\n\r\nVous avez r\u00e9cemment ouvert chez nous un ticket dont le sujet est \"{{ ticket.title }}\". Ce courriel vous confirme que ce ticket a \u00e9t\u00e9 ferm\u00e9.\r\n\r\nSi vous pensez que nous devons encore travailler sur ce probl\u00e8me, faites le nous savoir en r\u00e9pondant \u00e0 ce courriel en conservant le sujet tel-quel.\r\n\r\nVous pouvez visualiser ce ticket en ligne, en vous rendant \u00e0 l'adresse {{ ticket.ticket_url }}.\r\n\r\nLa r\u00e9solution a \u00e9t\u00e9 motiv\u00e9e ainsi\u00a0:\r\n\r\n{{ ticket.resolution }}\r\n\r\n", + "subject": "(Ferm\u00e9)", + "template_name": "closed_submitter" + } + }, + { + "pk": 54, + "model": "helpdesk.emailtemplate", + "fields": { + "heading": "Priorit\u00e9 du ticket augment\u00e9e", + "html": "

Bonjour,

\r\n\r\n

Ce courriel indicatif permet de vous pr\u00e9venir que le ticket {{ ticket.ticket }} ('{{ ticket.title }}') a vu sa priorit\u00e9 augment\u00e9 de mani\u00e8re automatique.

\r\n

\r\nFile d'attente : {{ ticket.ticket }}
\r\nQueue : {{ queue.title }}
\r\nTitre : {{ ticket.title }}
\r\nOuvert le : {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nSoumis par : {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriorit\u00e9 : {{ ticket.get_priority_display }}
\r\nStatut : {{ ticket.get_status }}
\r\nAssign\u00e9 \u00e0 : {{ ticket.get_assigned_to }}
\r\nVoir le ticket en ligne pour le mettre \u00e0 jour (apr\u00e8s authentification)

\r\n\r\n

Pour m\u00e9moire, la description originelle \u00e9tait :

\r\n\r\n
{{ ticket.description }}
", + "locale": "fr", + "plain_text": "Bonjour,\r\n\r\nCe courriel indicatif permet de vous pr\u00e9venir que le ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") a vu sa priorit\u00e9 augment\u00e9 de mani\u00e8re automatique.\r\n\r\nIdentifiant : {{ ticket.ticket }}\r\nFile d'attente : {{ queue.title }}\r\nTitre : {{ ticket.title }}\r\nOuvert le : {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nSoumis par : {{ ticket.submitter_email|default:\"Unknown\" }}\r\nPriorit\u00e9 : {{ ticket.get_priority_display }}\r\nStatut : {{ ticket.get_status }}\r\nAssign\u00e9 \u00e0 : {{ ticket.get_assigned_to }}\r\nAdresse : {{ ticket.staff_url }}\r\n\r\nLa description originelle \u00e9tait :\r\n\r\n{{ ticket.description }}\r\n", + "subject": "(Priorit\u00e9 augment\u00e9e)", + "template_name": "escalated_cc" + } + }, + { + "pk": 55, + "model": "helpdesk.emailtemplate", + "fields": { + "heading": "Votre ticket a vu sa priorit\u00e9 augment\u00e9e", + "html": "

Bonjour,

\r\n\r\n

Vous avez r\u00e9cemment ouvert chez nous un ticket dont le sujet est {{ ticket.title }} . Ce courriel vous informe que ce ticket a vu sa priorit\u00e9 augment\u00e9 de mani\u00e8re automatique, vu son d\u00e9lai de r\u00e9solution plus long que pr\u00e9vu.

\r\n\r\n

Nous allons reprendre rapidement ce ticket afin d'essayer de le r\u00e9soudre le plus vite possible.

\r\n\r\n

Vous pouvez visualiser ce ticket en ligne, en vous rendant \u00e0 l'adresse {{ ticket.ticket_url }}.

", + "locale": "fr", + "plain_text": "Bonjour,\r\n\r\n\r\nVous avez r\u00e9cemment ouvert chez nous un ticket dont le sujet est \"{{ ticket.title }}\". Ce courriel vous informe que ce ticket a vu sa priorit\u00e9 augment\u00e9 de mani\u00e8re automatique, vu son d\u00e9lai de r\u00e9solution plus long que pr\u00e9vu.\r\n\r\nNous allons reprendre rapidement ce ticket afin d'essayer de le r\u00e9soudre le plus vite possible.\r\n\r\nVous pouvez visualiser ce ticket en ligne, en vous rendant \u00e0 l'adresse {{ ticket.ticket_url }}.\r\n\r\n", + "subject": "(Priorit\u00e9 augment\u00e9e)", + "template_name": "escalated_submitter" + } + }, + { + "pk": 56, + "model": "helpdesk.emailtemplate", + "fields": { + "heading": "Priorit\u00e9 de votre ticket augment\u00e9e", + "html": "

Bonjour,

\r\n\r\n

Un ticket qui vous est assign\u00e9 a vu sa priorit\u00e9 augment\u00e9 vu son d\u00e9lai de r\u00e9solution plus long que pr\u00e9vu.

\r\n\r\n

\r\nFile d'attente : {{ ticket.ticket }}
\r\nQueue : {{ queue.title }}
\r\nTitre : {{ ticket.title }}
\r\nOuvert le : {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nSoumis par : {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriorit\u00e9 : {{ ticket.get_priority_display }}
\r\nStatut : {{ ticket.get_status }}
\r\nAssign\u00e9 \u00e0 : {{ ticket.get_assigned_to }}
\r\nVoir le ticket en ligne pour le mettre \u00e0 jour (apr\u00e8s authentification)

\r\n\r\n

Pour m\u00e9moire, la description originelle \u00e9tait :

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

Merci de reprendre ce ticket afin d'essayer de le r\u00e9soudre le plus vite possible..

", + "locale": "fr", + "plain_text": "Bonjour,\r\n\r\nUn ticket qui vous est assign\u00e9 a vu sa priorit\u00e9 augment\u00e9 vu son d\u00e9lai de r\u00e9solution plus long que pr\u00e9vu.\r\n\r\nIdentifiant : {{ ticket.ticket }}\r\nFile d'attente : {{ queue.title }}\r\nTitre : {{ ticket.title }}\r\nOuvert le : {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nSoumis par : {{ ticket.submitter_email|default:\"Unknown\" }}\r\nPriorit\u00e9 : {{ ticket.get_priority_display }}\r\nStatut : {{ ticket.get_status }}\r\nAssign\u00e9 \u00e0 : {{ ticket.get_assigned_to }}\r\nAdresse : {{ ticket.staff_url }}\r\n\r\nLa description originelle \u00e9tait :\r\n\r\n{{ ticket.description }}\r\n\r\nMerci de reprendre ce ticket afin d'essayer de le r\u00e9soudre le plus vite possible.\r\n", + "subject": "(Priorit\u00e9 augment\u00e9e - \u00e0 vous)", + "template_name": "escalated_owner" + } + }, + { + "pk": 57, + "model": "helpdesk.emailtemplate", + "fields": { + "heading": "Nouveau ticket ouvert", + "html": "

Bonjour,

\r\n\r\n

Ce courriel indicatif permet de vous pr\u00e9venir qu'un nouveau ticket a \u00e9t\u00e9 ouvert.

\r\n\r\n

\r\nFile d'attente : {{ ticket.ticket }}
\r\nQueue : {{ queue.title }}
\r\nTitre : {{ ticket.title }}
\r\nOuvert le : {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nSoumis par : {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriorit\u00e9 : {{ ticket.get_priority_display }}
\r\nStatut : {{ ticket.get_status }}
\r\nAssign\u00e9 \u00e0 : {{ ticket.get_assigned_to }}
\r\nVoir le ticket en ligne pour le mettre \u00e0 jour (apr\u00e8s authentification)

\r\n\r\n

Description :

\r\n\r\n
{{ ticket.description }}
", + "locale": "fr", + "plain_text": "Bonjour,\r\n\r\nCe courriel indicatif permet de vous pr\u00e9venir qu'un nouveau ticket a \u00e9t\u00e9 ouvert.\r\n\r\nIdentifiant : {{ ticket.ticket }}\r\nFile d'attente : {{ queue.title }}\r\nTitre : {{ ticket.title }}\r\nOuvert le : {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nSoumis par : {{ ticket.submitter_email|default:\"Unknown\" }}\r\nPriorit\u00e9 : {{ ticket.get_priority_display }}\r\nStatut : {{ ticket.get_status }}\r\nAssign\u00e9 \u00e0 : {{ ticket.get_assigned_to }}\r\nAdresse : {{ ticket.staff_url }}\r\n\r\nDescription\u00a0:\r\n{{ ticket.description }}\r\n\r\n", + "subject": "(Ouvert)", + "template_name": "newticket_cc" + } + }, + { + "pk": 58, + "model": "helpdesk.emailtemplate", + "fields": { + "heading": "Votre ticket est d\u00e9sormais ouvert", + "html": "

Bonjour,

\r\n\r\n

Ce courriel permet de vous informer que nous avons re\u00e7u votre demande de support dont le sujet est {{ ticket.title }}.

\r\n\r\n

\"Vous n'avez rien de plus \u00e0 faire pour le moment. Votre ticket porte l'identifiant {{ ticket.ticket }} et sera trait\u00e9 rapidement.

\r\n\r\n

Si vous voulez nous donner plus de d\u00e9tails ou si vous avez une question concernant ce ticket, merci d'inclure la r\u00e9f\u00e9rence {{ ticket.ticket }} dans le sujet du message. Le plus simple \u00e9tant d'utiliser la fonction 'r\u00e9pondre' de votre logiciel de messagerie.

\r\n\r\n

Vous pouvez visualiser ce ticket en ligne et y ajouter des informations ou des pi\u00e8ces jointes ainsi que voir les derni\u00e8res mies \u00e0 jour en vous rendant \u00e0 l'adresse {{ ticket.ticket_url }}.

\r\n\r\n

Nous allons traiter votre demande afin, si possible, de la r\u00e9soudre au plus vite. Vous recevrez des mise \u00e0 jour ou la r\u00e9ponse au ticket \u00e0 cette adresse mail.

", + "locale": "fr", + "plain_text": "Bonjour,\r\n\r\nCe courriel permet de vous informer que nous avons re\u00e7u votre demande de support dont le sujet est \"{{ ticket.title }}\".\r\n\r\nVous n'avez rien de plus \u00e0 faire pour le moment. Votre ticket porte l'identifiant {{ ticket.ticket }} et sera trait\u00e9 rapidement.\r\n\r\nSi vous voulez nous donner plus de d\u00e9tails ou si vous avez une question concernant ce ticket, merci d'inclure la r\u00e9f\u00e9rence '{{ ticket.ticket }}' dans le sujet du message. Le plus simple \u00e9tant d'utiliser la fonction 'r\u00e9pondre' de votre logiciel de messagerie.\r\n\r\nVous pouvez visualiser ce ticket en ligne et y ajouter des informations ou des pi\u00e8ces jointes ainsi que voir les derni\u00e8res mies \u00e0 jour en vous rendant \u00e0 l'adresse {{ ticket.ticket_url }}.\r\n\r\nNous allons traiter votre demande afin, si possible, de la r\u00e9soudre au plus vite. Vous recevrez des mise \u00e0 jour ou la r\u00e9ponse au ticket \u00e0 cette adresse mail.", + "subject": "(Ouvert)", + "template_name": "newticket_submitter" + } + }, + { + "pk": 59, + "model": "helpdesk.emailtemplate", + "fields": { + "heading": "Ticket r\u00e9solu", + "html": "

Bonjour,

\r\n\r\n

Le ticket suivant a \u00e9t\u00e9 r\u00e9solu.

\r\n\r\n

\r\nFile d'attente : {{ ticket.ticket }}
\r\nQueue : {{ queue.title }}
\r\nTitre : {{ ticket.title }}
\r\nOuvert le : {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nSoumis par : {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriorit\u00e9 : {{ ticket.get_priority_display }}
\r\nStatut : {{ ticket.get_status }}
\r\nAssign\u00e9 \u00e0 : {{ ticket.get_assigned_to }}
\r\nVoir le ticket en ligne pour le mettre \u00e0 jour (apr\u00e8s authentification)

\r\n\r\n

Pour m\u00e9moire, la description originelle \u00e9tait :

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

La motivation de r\u00e9solution est:

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

\r\nCette information a \u00e9t\u00e9 envoy\u00e9 au cr\u00e9ateur de ce ticket, qui la confirmera avant que vous puissiez fermer ce ticket.

", + "locale": "fr", + "plain_text": "Bonjour,\r\n\r\nLe ticket suivant a \u00e9t\u00e9 r\u00e9solu.\r\n\r\nIdentifiant : {{ ticket.ticket }}\r\nFile d'attente : {{ queue.title }}\r\nTitre : {{ ticket.title }}\r\nOuvert le : {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nSoumis par : {{ ticket.submitter_email|default:\"Unknown\" }}\r\nPriorit\u00e9 : {{ ticket.get_priority_display }}\r\nStatut : {{ ticket.get_status }}\r\nAssign\u00e9 \u00e0 : {{ ticket.get_assigned_to }}\r\nAdresse : {{ ticket.staff_url }}\r\n\r\nLa description originelle \u00e9tait :\r\n\r\n{{ ticket.description }}\r\n\r\nLa motivation de r\u00e9solution est:\r\n\r\n{{ resolution }}\r\n\r\nCette information a \u00e9t\u00e9 envoy\u00e9 au cr\u00e9ateur de ce ticket, qui la confirmera avant que vous puissiez fermer ce ticket.\r\n\r\n", + "subject": "(R\u00e9solu)", + "template_name": "resolved_cc" + } + }, + { + "pk": 60, + "model": "helpdesk.emailtemplate", + "fields": { + "heading": "Ticket r\u00e9solu", + "html": "

Bonjour,

\r\n\r\n

Un ticket qui vous est assign\u00e9 a \u00e9t\u00e9 r\u00e9solu.

\r\n\r\n

\r\nFile d'attente : {{ ticket.ticket }}
\r\nQueue : {{ queue.title }}
\r\nTitre : {{ ticket.title }}
\r\nOuvert le : {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nSoumis par : {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriorit\u00e9 : {{ ticket.get_priority_display }}
\r\nStatut : {{ ticket.get_status }}
\r\nAssign\u00e9 \u00e0 : {{ ticket.get_assigned_to }}
\r\nVoir le ticket en ligne pour le mettre \u00e0 jour (apr\u00e8s authentification)

\r\n\r\n

Pour m\u00e9moire, la description originelle \u00e9tait :

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

La motivation de r\u00e9solution est:

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

\r\nCette information a \u00e9t\u00e9 envoy\u00e9 au cr\u00e9ateur de ce ticket, qui la confirmera avant que vous puissiez fermer ce ticket.

", + "locale": "fr", + "plain_text": "Bonjour,\r\n\r\nUn ticket qui vous est assign\u00e9 a \u00e9t\u00e9 r\u00e9solu.\r\n\r\n\r\nIdentifiant : {{ ticket.ticket }}\r\nFile d'attente : {{ queue.title }}\r\nTitre : {{ ticket.title }}\r\nOuvert le : {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nSoumis par : {{ ticket.submitter_email|default:\"Unknown\" }}\r\nPriorit\u00e9 : {{ ticket.get_priority_display }}\r\nStatut : {{ ticket.get_status }}\r\nAssign\u00e9 \u00e0 : {{ ticket.get_assigned_to }}\r\nAdresse : {{ ticket.staff_url }}\r\n\r\nLa description originelle \u00e9tait :\r\n\r\n{{ ticket.description }}\r\n\r\nLa motivation de r\u00e9solution est:\r\n\r\n{{ resolution }}\r\n\r\nCette information a \u00e9t\u00e9 envoy\u00e9 au cr\u00e9ateur de ce ticket, qui la confirmera avant que vous puissiez fermer ce ticket.\r\n\r\n", + "subject": "(R\u00e9solu - \u00e0 vous)", + "template_name": "resolved_owner" + } + }, + { + "pk": 61, + "model": "helpdesk.emailtemplate", + "fields": { + "heading": "Votre ticket a \u00e9t\u00e9 r\u00e9solu", + "html": "

Bonjour,

\r\n\r\n

Vous avez r\u00e9cemment ouvert chez nous un ticket dont le sujet est {{ ticket.title }}. Ce message vous informe d'une r\u00e9solution de la demande.

\r\n\r\n

La solution suivante a \u00e9t\u00e9 donn\u00e9e au ticket {{ ticket.ticket }}:

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

Merci de confirmer que cette solution vous convient afin que nous puissions clore le ticket. Si vous avez d'autre demandes, o\u00f9 si vous pensez que cette solution n'est pas adapt\u00e9e, merci de r\u00e9pondre \u00e0 ce mail en conservant le sujet tel-quel.

\r\n\r\n

Vous pouvez visualiser ce ticket en ligne, en vous rendant \u00e0 l'adresse {{ ticket.ticket_url }}.

", + "locale": "fr", + "plain_text": "Bonjour,\r\n\r\nVous avez r\u00e9cemment ouvert chez nous un ticket dont le sujet est \"{{ ticket.title }}\" . Ce message vous informe d'une r\u00e9solution de la demande.\r\n\r\nLa solution suivante a \u00e9t\u00e9 donn\u00e9e au ticket {{ ticket.ticket }}:\r\n\r\n{{ resolution }}\r\n\r\nMerci de confirmer que cette solution vous convient afin que nous puissions clore le ticket. Si vous avez d'autre demandes, o\u00f9 si vous pensez que cette solution n'est pas adapt\u00e9e, merci de r\u00e9pondre \u00e0 ce mail en conservant le sujet tel-quel.\r\n\r\nVous pouvez visualiser ce ticket en ligne, en vous rendant \u00e0 l'adresse {{ ticket.ticket_url }}.\r\n\r\n", + "subject": "(R\u00e9solu)", + "template_name": "resolved_submitter" + } + }, + { + "pk": 62, + "model": "helpdesk.emailtemplate", + "fields": { + "heading": "Ticket mis \u00e0 jour", + "html": "

Bonjour,

\r\n\r\n

Ce courriel indicatif permet de vous pr\u00e9venir que le ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") par {{ ticket.submitter_email }} a \u00e9t\u00e9 mis \u00e0 jour.

\r\n\r\n

\r\nFile d'attente : {{ ticket.ticket }}
\r\nQueue : {{ queue.title }}
\r\nTitre : {{ ticket.title }}
\r\nOuvert le : {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nSoumis par : {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriorit\u00e9 : {{ ticket.get_priority_display }}
\r\nStatut : {{ ticket.get_status }}
\r\nAssign\u00e9 \u00e0 : {{ ticket.get_assigned_to }}
\r\nVoir le ticket en ligne pour le mettre \u00e0 jour (apr\u00e8s authentification)

\r\n\r\n

Pour m\u00e9moire, la description originelle \u00e9tait :

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

Le commentaire suivant a \u00e9t\u00e9 ajout\u00e9 :

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

Cette information {% if private %} n' a pas {% else %} a {% endif %} \u00e9t\u00e9 envoy\u00e9 par mail \u00e0 l'\u00e9metteur.

", + "locale": "fr", + "plain_text": "Bonjour,\r\n\r\nCe courriel indicatif permet de vous pr\u00e9venir que le ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") par {{ ticket.submitter_email }} a \u00e9t\u00e9 mis \u00e0 jour.\r\n\r\nIdentifiant : {{ ticket.ticket }}\r\nFile d'attente : {{ queue.title }}\r\nTitre : {{ ticket.title }}\r\nOuvert le : {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nSoumis par : {{ ticket.submitter_email|default:\"Unknown\" }}\r\nPriorit\u00e9 : {{ ticket.get_priority_display }}\r\nStatut : {{ ticket.get_status }}\r\nAssign\u00e9 \u00e0 : {{ ticket.get_assigned_to }}\r\nAdresse : {{ ticket.staff_url }}\r\n\r\nDescription originelle :\r\n\r\n{{ ticket.description }}\r\n\r\nLe commentaire suivant a \u00e9t\u00e9 ajout\u00e9\u00a0:\r\n\r\n{{ comment }}\r\n\r\nCette information {% if private %} n' a pas {% else %} a {% endif %} \u00e9t\u00e9 envoy\u00e9 par mail \u00e0 l'\u00e9metteur.\r\n\r\n", + "subject": "(Mis \u00e0 jour)", + "template_name": "updated_cc" + } + }, + { + "pk": 63, + "model": "helpdesk.emailtemplate", + "fields": { + "heading": "Ticket mis \u00e0 jour", + "html": "

Bonjour,

\r\n\r\n

Ce courriel indicatif permet de vous pr\u00e9venir que le ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") par {{ ticket.submitter_email }}, qui vous est assign\u00e9, a \u00e9t\u00e9 mis \u00e0 jour.

\r\n\r\n

\r\nFile d'attente : {{ ticket.ticket }}
\r\nQueue : {{ queue.title }}
\r\nTitre : {{ ticket.title }}
\r\nOuvert le : {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}
\r\nSoumis par : {{ ticket.submitter_email|default:\"Unknown\" }}
\r\nPriorit\u00e9 : {{ ticket.get_priority_display }}
\r\nStatut : {{ ticket.get_status }}
\r\nAssign\u00e9 \u00e0 : {{ ticket.get_assigned_to }}
\r\nVoir le ticket en ligne pour le mettre \u00e0 jour (apr\u00e8s authentification)

\r\n\r\n

Pour m\u00e9moire, la description originelle \u00e9tait :

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

Le commentaire suivant a \u00e9t\u00e9 ajout\u00e9 :

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

Cette information {% if private %} n' a pas {% else %} a {% endif %} \u00e9t\u00e9 envoy\u00e9 par mail \u00e0 l'\u00e9metteur.

", + "locale": "fr", + "plain_text": "Hello,\r\n\r\nCe courriel indicatif permet de vous pr\u00e9venir que le ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") par {{ ticket.submitter_email }}, qui vous est assign\u00e9, a \u00e9t\u00e9 mis \u00e0 jour.\r\n\r\nIdentifiant : {{ ticket.ticket }}\r\nFile d'attente : {{ queue.title }}\r\nTitre : {{ ticket.title }}\r\nOuvert le : {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nSoumis par : {{ ticket.submitter_email|default:\"Unknown\" }}\r\nPriorit\u00e9 : {{ ticket.get_priority_display }}\r\nStatut : {{ ticket.get_status }}\r\nAssign\u00e9 \u00e0 : {{ ticket.get_assigned_to }}\r\nAdresse : {{ ticket.staff_url }}\r\n\r\nDescription originelle :\r\n\r\n{{ ticket.description }}\r\n\r\nLe commentaire suivant a \u00e9t\u00e9 ajout\u00e9 :\r\n\r\n{{ comment }}\r\n\r\nCette information {% if private %} n' a pas {% else %} a {% endif %} \u00e9t\u00e9 envoy\u00e9 par mail \u00e0 l'\u00e9metteur.\r\n\r\n", + "subject": "(Mis \u00e0 jour - \u00e0 vous)", + "template_name": "updated_owner" + } + }, + { + "model": "helpdesk.emailtemplate", + "pk": 64, + "fields": { + "heading": "Votre ticket a \u00e9t\u00e9 mis \u00e0 jour", + "html": "

Bonjour,

\r\n\r\n

Vous avez r\u00e9cemment ouvert chez nous un ticket dont le sujet est {{ ticket.title }} . Ce message vous informe d'une mise \u00e0 jour du ticket.

\r\n\r\n

Le commentaire suivant a \u00e9t\u00e9 ajout\u00e9 au ticket {{ ticket.ticket }}:

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

\"Si vous voulez nous fournir d'autres informations, merci de r\u00e9pondre \u00e0 ce mail en conservant le sujet tel-quel. Vous pouvez \u00e9galement voir et mettre \u00e0 jour ce ticket en ligne \u00e0 l'adresse {{ ticket.ticket_url }}.

", + "locale": "fr", + "plain_text": "Bonjour,\r\n\r\nVous avez r\u00e9cemment ouvert chez nous un ticket dont le sujet est \"{{ ticket.title }}\". Ce message vous informe d'une mise \u00e0 jour du ticket.\r\n\r\nLe commentaire suivant a \u00e9t\u00e9 ajout\u00e9 au ticket {{ ticket.ticket }}\u00a0:\r\n\r\n{{ comment }}\r\n\r\nSi vous voulez nous fournir d'autres informations, merci de r\u00e9pondre \u00e0 ce mail en conservant le sujet tel-quel. Vous pouvez \u00e9galement voir et mettre \u00e0 jour ce ticket en ligne \u00e0 l'adresse {{ ticket.ticket_url }}", + "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)" + } } -] + ] diff --git a/helpdesk/forms.py b/helpdesk/forms.py index 502a90bb..9951a6fd 100644 --- a/helpdesk/forms.py +++ b/helpdesk/forms.py @@ -11,13 +11,15 @@ from datetime import datetime from StringIO import StringIO from django import forms +from django.forms import extras from django.conf import settings from django.contrib.auth.models import User from django.utils.translation import ugettext as _ -from helpdesk.lib import send_templated_mail +from helpdesk.lib import send_templated_mail, safe_template_context from helpdesk.models import Ticket, Queue, FollowUp, Attachment, IgnoreEmail, TicketCC, CustomField, TicketCustomFieldValue, TicketDependency from helpdesk.settings import HAS_TAG_SUPPORT +from helpdesk import settings as helpdesk_settings class EditTicketForm(forms.ModelForm): class Meta: @@ -57,7 +59,10 @@ class EditTicketForm(forms.ModelForm): instanceargs['max_digits'] = field.max_length elif field.data_type == 'list': fieldclass = forms.ChoiceField - instanceargs['choices'] = field.choices_as_array + choices = field.choices_as_array + if field.empty_selection_list: + choices.insert(0, ('','---------' ) ) + instanceargs['choices'] = choices elif field.data_type == 'boolean': fieldclass = forms.BooleanField elif field.data_type == 'date': @@ -113,19 +118,20 @@ class TicketForm(forms.Form): title = forms.CharField( max_length=100, required=True, - widget=forms.TextInput(), + widget=forms.TextInput(attrs={'size':'60'}), label=_('Summary of the problem'), ) submitter_email = forms.EmailField( required=False, label=_('Submitter E-Mail Address'), + widget=forms.TextInput(attrs={'size':'60'}), help_text=_('This e-mail address will receive copies of all public ' 'updates to this ticket.'), ) body = forms.CharField( - widget=forms.Textarea(), + widget=forms.Textarea(attrs={'cols': 47, 'rows': 15}), label=_('Description of Issue'), required=True, ) @@ -147,6 +153,19 @@ class TicketForm(forms.Form): 'as \'3\'.'), ) + due_date = forms.DateTimeField( + widget=extras.SelectDateWidget, + required=False, + label=_('Due on'), + ) + + def clean_due_date(self): + data = self.cleaned_data['due_date'] + #TODO: add Google calendar update hook + #if not hasattr(self, 'instance') or self.instance.due_date != new_data: + # print "you changed!" + return data + attachment = forms.FileField( required=False, label=_('Attach File'), @@ -190,11 +209,15 @@ class TicketForm(forms.Form): instanceargs['max_digits'] = field.max_length elif field.data_type == 'list': fieldclass = forms.ChoiceField - instanceargs['choices'] = field.choices_as_array + choices = field.choices_as_array + if field.empty_selection_list: + choices.insert(0, ('','---------' ) ) + instanceargs['choices'] = choices elif field.data_type == 'boolean': fieldclass = forms.BooleanField elif field.data_type == 'date': fieldclass = forms.DateField + instanceargs['widget'] = extras.SelectDateWidget elif field.data_type == 'time': fieldclass = forms.TimeField elif field.data_type == 'datetime': @@ -225,6 +248,7 @@ class TicketForm(forms.Form): queue = q, description = self.cleaned_data['body'], priority = self.cleaned_data['priority'], + due_date = self.cleaned_data['due_date'], ) if HAS_TAG_SUPPORT: @@ -280,11 +304,8 @@ class TicketForm(forms.Form): # settings.MAX_EMAIL_ATTACHMENT_SIZE) are sent via email. files.append(a.file.path) - context = { - 'ticket': t, - 'queue': q, - 'comment': f.comment, - } + context = safe_template_context(t) + context['comment'] = f.comment messages_sent_to = [] @@ -370,6 +391,12 @@ class PublicTicketForm(forms.Form): help_text=_('Please select a priority carefully.'), ) + due_date = forms.DateTimeField( + widget=extras.SelectDateWidget, + required=False, + label=_('Due on'), + ) + attachment = forms.FileField( required=False, label=_('Attach File'), @@ -402,9 +429,9 @@ class PublicTicketForm(forms.Form): instanceargs['max_digits'] = field.max_length elif field.data_type == 'list': fieldclass = forms.ChoiceField - choices = [] - for line in field.list_values.split("\n"): - choices.append((line, line)) + choices = field.choices_as_array + if field.empty_selection_list: + choices.insert(0, ('','---------' ) ) instanceargs['choices'] = choices elif field.data_type == 'boolean': fieldclass = forms.BooleanField @@ -440,6 +467,7 @@ class PublicTicketForm(forms.Form): queue = q, description = self.cleaned_data['body'], priority = self.cleaned_data['priority'], + due_date = self.cleaned_data['due_date'], ) t.save() @@ -482,10 +510,7 @@ class PublicTicketForm(forms.Form): # settings.MAX_EMAIL_ATTACHMENT_SIZE) are sent via email. files.append(a.file.path) - context = { - 'ticket': t, - 'queue': q, - } + context = safe_template_context(t) messages_sent_to = [] @@ -569,7 +594,11 @@ class EmailIgnoreForm(forms.ModelForm): class TicketCCForm(forms.ModelForm): def __init__(self, *args, **kwargs): super(TicketCCForm, self).__init__(*args, **kwargs) - self.fields['user'].queryset = User.objects.filter(is_active=True).order_by('username') + if helpdesk_settings.HELPDESK_STAFF_ONLY_TICKET_CC: + users = User.objects.filter(is_active=True, is_staff=True).order_by('username') + else: + users = User.objects.filter(is_active=True).order_by('username') + self.fields['user'].queryset = users class Meta: model = TicketCC exclude = ('ticket',) diff --git a/helpdesk/lib.py b/helpdesk/lib.py index 64999653..b7972633 100644 --- a/helpdesk/lib.py +++ b/helpdesk/lib.py @@ -17,6 +17,9 @@ try: except ImportError: from base64 import decodestring as b64decode +import logging +logger = logging.getLogger('helpdesk') + from django.utils.encoding import smart_str def send_templated_mail(template_name, email_context, recipients, sender=None, bcc=None, fail_silently=False, files=None): @@ -55,13 +58,11 @@ def send_templated_mail(template_name, email_context, recipients, sender=None, b context = Context(email_context) - # 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 + if hasattr(context['queue'], 'locale'): + locale = getattr(context['queue'], 'locale', '') else: + locale = context['queue'].get('locale', 'en') + if not locale: locale = 'en' t = None @@ -74,6 +75,8 @@ def send_templated_mail(template_name, email_context, recipients, sender=None, b try: t = EmailTemplate.objects.get(template_name__iexact=template_name, locale__isnull=True) except EmailTemplate.DoesNotExist: + logger.warning('template "%s" does not exist, no mail sent' % + template_name) return # just ignore if template doesn't exist if not sender: @@ -104,7 +107,7 @@ def send_templated_mail(template_name, email_context, recipients, sender=None, b "{{ ticket.ticket }} {{ ticket.title|safe }} %s" % t.subject ).render(context) - if type(recipients) == str: + if isinstance(recipients,(str,unicode)): if recipients.find(','): recipients = recipients.split(',') elif type(recipients) != list: @@ -170,10 +173,12 @@ def apply_query(queryset, params): # eg a Q() set queryset = queryset.filter(params['other_filter']) - if params.get('sorting', None): - if params.get('sortreverse', None): - params['sorting'] = "-%s" % params['sorting'] - queryset = queryset.order_by(params['sorting']) + sorting = params.get('sorting', None) + if not sorting: + sortreverse = params.get('sortreverse', None) + if sortreverse: + sorting = "-%s" % sorting + queryset = queryset.order_by(sorting) return queryset diff --git a/helpdesk/locale/de/LC_MESSAGES/django.mo b/helpdesk/locale/de/LC_MESSAGES/django.mo index d7405ae6..130db154 100644 Binary files a/helpdesk/locale/de/LC_MESSAGES/django.mo and b/helpdesk/locale/de/LC_MESSAGES/django.mo differ diff --git a/helpdesk/locale/de/LC_MESSAGES/django.po b/helpdesk/locale/de/LC_MESSAGES/django.po index b57ea248..70b228bf 100644 --- a/helpdesk/locale/de/LC_MESSAGES/django.po +++ b/helpdesk/locale/de/LC_MESSAGES/django.po @@ -1,7 +1,7 @@ # django-helpdesk English language translation # Copyright (C) 2011 Ross Poulton # This file is distributed under the same license as the django-helpdesk package. -# +# # Translators: # Jannis Leidel , 2011. # Marc-Stefan Cassola , 2011. @@ -9,51 +9,52 @@ msgid "" msgstr "" "Project-Id-Version: django-helpdesk\n" -"Report-Msgid-Bugs-To: http://github.com/RossP/django-helpdesk/issues\n" -"POT-Creation-Date: 2011-05-11 15:05+1000\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2011-11-29 15:20+0100\n" "PO-Revision-Date: 2011-11-05 00:48+0000\n" "Last-Translator: rossp \n" -"Language-Team: German (http://www.transifex.net/projects/p/django-helpdesk/team/de/)\n" +"Language-Team: German (http://www.transifex.net/projects/p/django-helpdesk/" +"team/de/)\n" +"Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: forms.py:108 forms.py:339 models.py:262 -#: templates/helpdesk/dashboard.html:10 templates/helpdesk/dashboard.html:26 -#: templates/helpdesk/dashboard.html:44 templates/helpdesk/rss_list.html:23 -#: templates/helpdesk/ticket_list.html:54 -#: templates/helpdesk/ticket_list.html:75 -#: templates/helpdesk/ticket_list.html:186 views/staff.py:846 -#: views/staff.py:852 views/staff.py:858 +#: forms.py:109 forms.py:342 models.py:262 +#: templates/helpdesk/dashboard.html:11 templates/helpdesk/dashboard.html:37 +#: templates/helpdesk/dashboard.html:57 templates/helpdesk/dashboard.html:77 +#: templates/helpdesk/dashboard.html:99 templates/helpdesk/rss_list.html:23 +#: templates/helpdesk/ticket_list.html:56 +#: templates/helpdesk/ticket_list.html:78 +#: templates/helpdesk/ticket_list.html:199 views/staff.py:908 +#: views/staff.py:914 views/staff.py:920 msgid "Queue" msgstr "Ticketsammlung" -#: forms.py:117 +#: forms.py:118 msgid "Summary of the problem" msgstr "Zusammenfassung des Problems" -#: forms.py:122 +#: forms.py:123 msgid "Submitter E-Mail Address" msgstr "E-Mail-Adresse des Erstellers" -#: forms.py:123 +#: forms.py:125 msgid "" -"This e-mail address will receive copies of all public updates to this " -"ticket." +"This e-mail address will receive copies of all public updates to this ticket." msgstr "" "Alle öffentlichen Ticket-Updates werden an diese E-Mail-Adresse geschickt" -#: forms.py:129 +#: forms.py:131 msgid "Description of Issue" msgstr "Problembeschreibung" -#: forms.py:136 +#: forms.py:138 msgid "Case owner" msgstr "Verantwortlicher" -#: forms.py:137 +#: forms.py:139 msgid "" "If you select an owner other than yourself, they'll be e-mailed details of " "this ticket immediately." @@ -61,38 +62,38 @@ msgstr "" "Wenn Sie andere Verantwortliche als sich selbst auswählen, werden diese " "sofort per E-Mail mit den Details zum Ticket benachrichtigt." -#: forms.py:145 models.py:322 management/commands/escalate_tickets.py:152 +#: forms.py:147 models.py:322 management/commands/escalate_tickets.py:152 #: templates/helpdesk/public_view_ticket.html:21 -#: templates/helpdesk/ticket.html:129 -#: templates/helpdesk/ticket_desc_table.html:22 -#: templates/helpdesk/ticket_list.html:81 views/staff.py:265 +#: templates/helpdesk/ticket.html:163 +#: templates/helpdesk/ticket_desc_table.html:31 +#: templates/helpdesk/ticket_list.html:84 views/staff.py:316 msgid "Priority" msgstr "Priorität" -#: forms.py:146 +#: forms.py:148 msgid "Please select a priority carefully. If unsure, leave it as '3'." msgstr "" "Wählen Sie die Priorität mit Bedacht. Im Zweifel lassen Sie sie bei '3'." -#: forms.py:152 forms.py:375 +#: forms.py:154 forms.py:378 msgid "Attach File" msgstr "Datei anhängen" -#: forms.py:153 forms.py:376 +#: forms.py:155 forms.py:379 msgid "You can attach a file such as a document or screenshot to this ticket." msgstr "" "Sie können eine Datei (z.B. ein Dokument oder ein Bildschirmphoto) an das " "Ticket anhängen." -#: forms.py:161 templates/helpdesk/public_view_ticket.html:33 -#: templates/helpdesk/ticket.html:132 -#: templates/helpdesk/ticket_desc_table.html:33 -#: templates/helpdesk/ticket_list.html:58 -#: templates/helpdesk/ticket_list.html:186 views/staff.py:276 +#: forms.py:163 templates/helpdesk/public_view_ticket.html:33 +#: templates/helpdesk/ticket.html:166 +#: templates/helpdesk/ticket_desc_table.html:42 +#: templates/helpdesk/ticket_list.html:61 +#: templates/helpdesk/ticket_list.html:199 views/staff.py:327 msgid "Tags" msgstr "Tags" -#: forms.py:162 +#: forms.py:164 msgid "" "Words, separated by spaces, or phrases separated by commas. These should " "communicate significant characteristics of this ticket" @@ -101,33 +102,33 @@ msgstr "" "Formulierungen. Diese sollten die wichtigsten Charakteristika des Tickets " "beschreiben." -#: forms.py:251 +#: forms.py:254 msgid "Ticket Opened" msgstr "Ticket geöffnet" -#: forms.py:258 +#: forms.py:261 #, python-format msgid "Ticket Opened & Assigned to %(name)s" msgstr "Ticket geöffnet und %(name)s zugewiesen " -#: forms.py:348 +#: forms.py:351 msgid "Summary of your query" msgstr "Zusammenfassung Ihrer Anfrage" -#: forms.py:353 +#: forms.py:356 msgid "Your E-Mail Address" msgstr "Ihre E-Mail-Adresse" -#: forms.py:354 +#: forms.py:357 msgid "We will e-mail you when your ticket is updated." msgstr "" "Wir werden Ihnen eine E-Mail schicken, wenn Ihr Ticket geupdated wurde." -#: forms.py:359 +#: forms.py:362 msgid "Description of your issue" msgstr "Beschreibung Ihres Problems" -#: forms.py:361 +#: forms.py:364 msgid "" "Please be as descriptive as possible, including any details we may need to " "address your query." @@ -135,87 +136,88 @@ msgstr "" "Bitten beschreiben Sie alle Details, die wir zur Bearbeitung Ihrer Anfrage " "benötigen könnten." -#: forms.py:369 +#: forms.py:372 msgid "Urgency" msgstr "Dringlichkeit" -#: forms.py:370 +#: forms.py:373 msgid "Please select a priority carefully." msgstr "Wählen Sie die Priorität mit Bedacht. " -#: forms.py:458 +#: forms.py:461 msgid "Ticket Opened Via Web" msgstr "Ticket über das Web geöffnet" -#: forms.py:528 +#: forms.py:531 msgid "Show Ticket List on Login?" msgstr "Liste mit Tickets beim Anmelden zeigen?" -#: forms.py:529 +#: forms.py:532 msgid "Display the ticket list upon login? Otherwise, the dashboard is shown." msgstr "" "Liste mit Tickets bei der Anmeldung zeigen? Sonst wird eine Übersicht " "angezeigt." -#: forms.py:534 +#: forms.py:537 msgid "E-mail me on ticket change?" msgstr "Bei Änderungen am Ticket per E-Mail benachrichtigen?" -#: forms.py:535 +#: forms.py:538 msgid "" -"If you're the ticket owner and the ticket is changed via the web by somebody" -" else, do you want to receive an e-mail?" +"If you're the ticket owner and the ticket is changed via the web by somebody " +"else, do you want to receive an e-mail?" msgstr "" "Wenn Sie der Verantwortliche für ein Ticket sind und dieses wird über das " "Web von jemandem bearbeitet, wollen Sie per E-Mail benachrichtigt werden?" -#: forms.py:540 +#: forms.py:543 msgid "E-mail me when assigned a ticket?" msgstr "Per E-Mail benachrichtigen, wenn Ihnen ein Ticket zugewiesen wird?" -#: forms.py:541 +#: forms.py:544 msgid "" "If you are assigned a ticket via the web, do you want to receive an e-mail?" msgstr "" "Möchten Sie eine E-Mail erhalten, wenn Ihnen ein Ticket über das Web " "zugewiesen wird?" -#: forms.py:546 +#: forms.py:549 msgid "E-mail me when a ticket is changed via the API?" msgstr "" "Per E-Mail benachrichtigen, wenn ein Ticket über die API bearbeitet wird?" -#: forms.py:547 +#: forms.py:550 msgid "If a ticket is altered by the API, do you want to receive an e-mail?" msgstr "" "Per E-Mail benachrichtigen, wenn ein Ticket über die API bearbeitet wird?" -#: forms.py:552 +#: forms.py:555 msgid "Number of tickets to show per page" msgstr "Anzahl der pro Seite anzuzeigenden Tickets" -#: forms.py:553 +#: forms.py:556 msgid "How many tickets do you want to see on the Ticket List page?" msgstr "Wie viele Tickets möchten Sie auf der Ticket-Liste sehen?" -#: forms.py:560 +#: forms.py:563 msgid "Use my e-mail address when submitting tickets?" msgstr "Ihre E-Mail-Adresse beim Erstellen von Tickets verwenden?" -#: forms.py:561 +#: forms.py:564 msgid "" "When you submit a ticket, do you want to automatically use your e-mail " "address as the submitter address? You can type a different e-mail address " "when entering the ticket if needed, this option only changes the default." msgstr "" -"Soll Ihre E-Mail-Adresse automatisch als Absender verwendet werden, wenn Sie" -" ein Ticket erstellen? Sie können auch eine andere E-Mail-Adresse eingeben, " +"Soll Ihre E-Mail-Adresse automatisch als Absender verwendet werden, wenn Sie " +"ein Ticket erstellen? Sie können auch eine andere E-Mail-Adresse eingeben, " "diese Option legt lediglich das Standardverhalten fest." #: models.py:32 models.py:256 models.py:484 models.py:781 models.py:815 -#: templates/helpdesk/dashboard.html:26 templates/helpdesk/dashboard.html:44 -#: templates/helpdesk/ticket.html:123 templates/helpdesk/ticket_list.html:72 -#: templates/helpdesk/ticket_list.html:186 views/staff.py:255 +#: templates/helpdesk/dashboard.html:37 templates/helpdesk/dashboard.html:57 +#: templates/helpdesk/dashboard.html:77 templates/helpdesk/dashboard.html:99 +#: templates/helpdesk/ticket.html:157 templates/helpdesk/ticket_list.html:75 +#: templates/helpdesk/ticket_list.html:199 views/staff.py:306 msgid "Title" msgstr "Titel" @@ -228,8 +230,8 @@ msgid "" "This slug is used when building ticket ID's. Once set, try not to change it " "or e-mailing may get messy." msgstr "" -"Diese Kennung wird zur Erstellung der Ticket-IDs verwendet. Bitte ändern Sie" -" sie nach der Festlegung nicht mehr, sonst könnte es Probleme beim E-Mail " +"Diese Kennung wird zur Erstellung der Ticket-IDs verwendet. Bitte ändern Sie " +"sie nach der Festlegung nicht mehr, sonst könnte es Probleme beim E-Mail " "Versand geben." #: models.py:43 models.py:1009 models.py:1079 models.py:1149 @@ -240,8 +242,8 @@ msgstr "E-Mail-Adresse" #: models.py:46 msgid "" -"All outgoing e-mails for this queue will use this e-mail address. If you use" -" IMAP or POP3, this should be the e-mail address for that mailbox." +"All outgoing e-mails for this queue will use this e-mail address. If you use " +"IMAP or POP3, this should be the e-mail address for that mailbox." msgstr "" "Alle ausgehenden E-Mails dieser Ticketsammlung werden diese E-mail Adresse " "benutzen. Falls Sie IMAP oder POP3 benutzen, sollte dies die E-Mail-Adresse " @@ -284,8 +286,8 @@ msgid "" "For tickets which are not held, how often do you wish to increase their " "priority? Set to 0 for no escalation." msgstr "" -"Wie oft soll die Priorität von nicht zurückgehaltenen Tickets erhöht werden?" -" Geben sie 0 an, falls sie keine Eskalation wünschen." +"Wie oft soll die Priorität von nicht zurückgehaltenen Tickets erhöht werden? " +"Geben sie 0 an, falls sie keine Eskalation wünschen." #: models.py:84 msgid "New Ticket CC Address" @@ -294,11 +296,11 @@ msgstr "Ticketerstellung auch melden an" #: models.py:88 msgid "" "If an e-mail address is entered here, then it will receive notification of " -"all new tickets created for this queue. Enter a comma between multiple " -"e-mail addresses." +"all new tickets created for this queue. Enter a comma between multiple e-" +"mail addresses." msgstr "" -"Jede eingegebene E-Mail Adresse wird benachrichtigt wenn ein neues Ticket in" -" dieser Sammlung erstellt wird. Mehrere E-Mail Adressen durch Kommata " +"Jede eingegebene E-Mail Adresse wird benachrichtigt wenn ein neues Ticket in " +"dieser Sammlung erstellt wird. Mehrere E-Mail Adressen durch Kommata " "getrennt." #: models.py:94 @@ -332,8 +334,8 @@ msgid "" "E-Mail server type for creating tickets automatically from a mailbox - both " "POP3 and IMAP are supported." msgstr "" -"Art des E-Mail-Servers, von dem Tickets automatisch aus der Mailbox erstellt" -" werden - sowohl POP3 als auch IMAP werden unterstützt." +"Art des E-Mail-Servers, von dem Tickets automatisch aus der Mailbox erstellt " +"werden - sowohl POP3 als auch IMAP werden unterstützt." #: models.py:115 msgid "E-Mail Hostname" @@ -410,31 +412,31 @@ msgstr "E-Mail-Abrufintervall" msgid "How often do you wish to check this mailbox? (in Minutes)" msgstr "Wie oft soll das E-mail Konto abgerufen werden? (in Minuten)" -#: models.py:240 templates/helpdesk/dashboard.html:10 -#: templates/helpdesk/ticket.html:87 +#: models.py:240 templates/helpdesk/dashboard.html:11 +#: templates/helpdesk/ticket.html:117 msgid "Open" msgstr "Offen" -#: models.py:241 templates/helpdesk/ticket.html:93 -#: templates/helpdesk/ticket.html.py:99 templates/helpdesk/ticket.html:104 -#: templates/helpdesk/ticket.html.py:108 +#: models.py:241 templates/helpdesk/ticket.html:123 +#: templates/helpdesk/ticket.html.py:129 templates/helpdesk/ticket.html:134 +#: templates/helpdesk/ticket.html.py:138 msgid "Reopened" msgstr "Wieder geöffnet" -#: models.py:242 templates/helpdesk/dashboard.html:10 -#: templates/helpdesk/ticket.html:88 templates/helpdesk/ticket.html.py:94 -#: templates/helpdesk/ticket.html:100 +#: models.py:242 templates/helpdesk/dashboard.html:11 +#: templates/helpdesk/ticket.html:118 templates/helpdesk/ticket.html.py:124 +#: templates/helpdesk/ticket.html:130 msgid "Resolved" msgstr "Gelöst" -#: models.py:243 templates/helpdesk/ticket.html:89 -#: templates/helpdesk/ticket.html.py:95 templates/helpdesk/ticket.html:101 -#: templates/helpdesk/ticket.html.py:105 +#: models.py:243 templates/helpdesk/dashboard.html:11 +#: templates/helpdesk/ticket.html:119 templates/helpdesk/ticket.html.py:125 +#: templates/helpdesk/ticket.html:131 templates/helpdesk/ticket.html.py:135 msgid "Closed" msgstr "Geschlossen" -#: models.py:244 templates/helpdesk/ticket.html:90 -#: templates/helpdesk/ticket.html.py:96 templates/helpdesk/ticket.html:109 +#: models.py:244 templates/helpdesk/ticket.html:120 +#: templates/helpdesk/ticket.html.py:126 templates/helpdesk/ticket.html:139 msgid "Duplicate" msgstr "Duplikat" @@ -458,9 +460,9 @@ msgstr "Niedrig" msgid "5. Very Low" msgstr "Sehr niedrig" -#: models.py:266 templates/helpdesk/dashboard.html:44 -#: templates/helpdesk/ticket_list.html:69 -#: templates/helpdesk/ticket_list.html:186 +#: models.py:266 templates/helpdesk/dashboard.html:77 +#: templates/helpdesk/ticket_list.html:72 +#: templates/helpdesk/ticket_list.html:199 msgid "Created" msgstr "Erstellt" @@ -477,7 +479,7 @@ msgid "Date this ticket was most recently changed." msgstr "Bearbeitungsdatum des Tickets" #: models.py:278 templates/helpdesk/public_view_ticket.html:16 -#: templates/helpdesk/ticket_desc_table.html:17 +#: templates/helpdesk/ticket_desc_table.html:26 msgid "Submitter E-Mail" msgstr "E-Mail-Adresse des Erstellers" @@ -493,10 +495,11 @@ msgstr "" msgid "Assigned to" msgstr "Zugewiesen" -#: models.py:294 templates/helpdesk/dashboard.html:26 -#: templates/helpdesk/ticket_list.html:55 -#: templates/helpdesk/ticket_list.html:78 -#: templates/helpdesk/ticket_list.html:186 +#: models.py:294 templates/helpdesk/dashboard.html:37 +#: templates/helpdesk/dashboard.html:57 templates/helpdesk/dashboard.html:99 +#: templates/helpdesk/ticket_list.html:57 +#: templates/helpdesk/ticket_list.html:81 +#: templates/helpdesk/ticket_list.html:199 msgid "Status" msgstr "Status" @@ -509,7 +512,7 @@ msgid "If a ticket is on hold, it will not automatically be escalated." msgstr "Ein zurückgehaltenes Ticket wird nicht automatisch eskaliert." #: models.py:308 models.py:790 templates/helpdesk/public_view_ticket.html:39 -#: templates/helpdesk/ticket_desc_table.html:58 +#: templates/helpdesk/ticket_desc_table.html:67 msgid "Description" msgstr "Beschreibung" @@ -518,7 +521,7 @@ msgid "The content of the customers query." msgstr "Die Anfrage des Kunden." #: models.py:315 templates/helpdesk/public_view_ticket.html:46 -#: templates/helpdesk/ticket_desc_table.html:65 +#: templates/helpdesk/ticket_desc_table.html:74 msgid "Resolution" msgstr "Lösung" @@ -539,8 +542,8 @@ msgstr "" "Das Datum, an dem dieses Ticket zuletzt eskaliert wurde - wird von " "management/commands/escalate_tickets.py automatisch aktualisiert." -#: models.py:342 templates/helpdesk/ticket_desc_table.html:13 -#: views/feeds.py:91 views/feeds.py:117 views/feeds.py:171 views/staff.py:212 +#: models.py:342 templates/helpdesk/ticket_desc_table.html:22 +#: views/feeds.py:91 views/feeds.py:117 views/feeds.py:171 views/staff.py:263 msgid "Unassigned" msgstr "Nicht zugeordnet" @@ -549,7 +552,7 @@ msgid " - On Hold" msgstr " - Zurückgehalten" #: models.py:475 models.py:1067 models.py:1207 models.py:1232 -#: templates/helpdesk/public_homepage.html:9 +#: templates/helpdesk/public_homepage.html:10 #: templates/helpdesk/public_view_form.html:12 msgid "Ticket" msgstr "Ticket" @@ -558,7 +561,7 @@ msgstr "Ticket" msgid "Date" msgstr "Datum" -#: models.py:491 views/staff.py:226 +#: models.py:491 views/staff.py:277 msgid "Comment" msgstr "Kommentar" @@ -574,12 +577,12 @@ msgstr "" "Öffentliche Tickets sind vom Ersteller und allen Mitarbeitern einsehbar, " "nicht-öffentliche Tickets nur von den Mitarbeitern." -#: models.py:508 models.py:882 models.py:1075 views/staff.py:822 -#: views/staff.py:828 views/staff.py:834 views/staff.py:840 +#: models.py:508 models.py:882 models.py:1075 views/staff.py:884 +#: views/staff.py:890 views/staff.py:896 views/staff.py:902 msgid "User" msgstr "Benutzer" -#: models.py:512 templates/helpdesk/ticket.html:84 +#: models.py:512 templates/helpdesk/ticket.html:114 msgid "New Status" msgstr "Neuer Status" @@ -643,8 +646,7 @@ msgid "" "queues you wish to limit this reply to." msgstr "" "Leerlassen, um diese Antwort für alle Ticketsammlungen zu verwenden, oder " -"die Ticketsammlungen auswählen, auf die Sie diese Antwort beschränken " -"wollen." +"die Ticketsammlungen auswählen, auf die Sie diese Antwort beschränken wollen." #: models.py:662 models.py:703 models.py:997 #: templates/helpdesk/email_ignore_list.html:13 @@ -664,19 +666,19 @@ msgstr "Textkörper" #: models.py:670 msgid "" -"Context available: {{ ticket }} - ticket object (eg {{ ticket.title }}); {{ " -"queue }} - The queue; and {{ user }} - the current user." +"Context available: {{ ticket }} - ticket object (eg {{ ticket.title }}); " +"{{ queue }} - The queue; and {{ user }} - the current user." msgstr "" -"Verfügbarer Kontext: {{ ticket }} - Ticket Objekt (z.B. {{ ticket.title }});" -" {{ queue }} - Die Ticketsammlung; und {{ user }} - der aktuelle Benutzer." +"Verfügbarer Kontext: {{ ticket }} - Ticket Objekt (z.B. {{ ticket.title }}); " +"{{ queue }} - Die Ticketsammlung; und {{ user }} - der aktuelle Benutzer." #: models.py:697 msgid "" "Leave blank for this exclusion to be applied to all queues, or select those " "queues you wish to exclude with this entry." msgstr "" -"Leerlassen, um diese Ausnahme auf alle Ticketsammlungen anzuwenden, oder die" -" Ticketsammlungen auswählen, die damit ausgeschlossen werden sollen." +"Leerlassen, um diese Ausnahme auf alle Ticketsammlungen anzuwenden, oder die " +"Ticketsammlungen auswählen, die damit ausgeschlossen werden sollen." #: models.py:709 msgid "Date on which escalation should not happen" @@ -693,12 +695,12 @@ msgstr "Betreff" #: models.py:733 msgid "" "This will be prefixed with \"[ticket.ticket] ticket.title\". We recommend " -"something simple such as \"(Updated\") or \"(Closed)\" - the same context is" -" available as in plain_text, below." +"something simple such as \"(Updated\") or \"(Closed)\" - the same context is " +"available as in plain_text, below." msgstr "" -"Wird mit \"[ticket.ticket] ticket.title\" vorangestellt. Wir empfehlen etwas" -" einfaches wie \"(Aktualisiert\") or \"(Geschlossen)\" - der gleiche Kontext" -" ist als einfacher Text weiter unten verfügbar." +"Wird mit \"[ticket.ticket] ticket.title\" vorangestellt. Wir empfehlen etwas " +"einfaches wie \"(Aktualisiert\") or \"(Geschlossen)\" - der gleiche Kontext " +"ist als einfacher Text weiter unten verfügbar." #: models.py:739 msgid "Heading" @@ -706,8 +708,8 @@ msgstr "Überschrift" #: models.py:741 msgid "" -"In HTML e-mails, this will be the heading at the top of the email - the same" -" context is available as in plain_text, below." +"In HTML e-mails, this will be the heading at the top of the email - the same " +"context is available as in plain_text, below." msgstr "" "Die Überschrift für HTML-E-Mails – der selbe Kontext is weiter unten als " "einfacher Text verfügbar." @@ -721,8 +723,8 @@ msgid "" "The context available to you includes {{ ticket }}, {{ queue }}, and " "depending on the time of the call: {{ resolution }} or {{ comment }}." msgstr "" -"Der zur Verfügung stehende Kontext beinhaltet {{ ticket }}, {{ queue }} und," -" je nachdem wann aufgerufen: {{ resolution }} oder {{ comment }}." +"Der zur Verfügung stehende Kontext beinhaltet {{ ticket }}, {{ queue }} und, " +"je nachdem wann aufgerufen: {{ resolution }} oder {{ comment }}." #: models.py:754 msgid "HTML" @@ -776,7 +778,7 @@ msgstr "Datum, an dem diese Frage zuletzt bearbeitet wurde." msgid "Unrated" msgstr "Unbewertet" -#: models.py:886 templates/helpdesk/ticket_list.html:145 +#: models.py:886 templates/helpdesk/ticket_list.html:158 msgid "Query Name" msgstr "Name der Abfrage" @@ -877,8 +879,8 @@ msgstr "Feldname" #: models.py:1122 msgid "" -"As used in the database and behind the scenes. Must be unique and consist of" -" only lowercase letters with no punctuation." +"As used in the database and behind the scenes. Must be unique and consist of " +"only lowercase letters with no punctuation." msgstr "" "Wird in der Datenbank verwendet, muss unique sein und darf nur aus " "Kleinbuchstaben ohne Zeichensetzung bestehen." @@ -965,8 +967,7 @@ msgstr "Listwerte" #: models.py:1177 msgid "For list fields only. Enter one option per line." -msgstr "" -"Ausschließlich für Listenfelder. Bitte eine Option je Zeile eingeben. " +msgstr "Ausschließlich für Listenfelder. Bitte eine Option je Zeile eingeben. " #: models.py:1191 msgid "Required?" @@ -1016,11 +1017,10 @@ msgstr "Unbekannter Absender" #: management/commands/get_email.py:204 msgid "" -"No plain-text email body available. Please see attachment " -"email_html_body.html." +"No plain-text email body available. Please see attachment email_html_body." +"html." msgstr "" -"E-Mail nicht als einfacher Text verfügbar. Siehe Anhang " -"email_html_body.html." +"E-Mail nicht als einfacher Text verfügbar. Siehe Anhang email_html_body.html." #: management/commands/get_email.py:208 msgid "email_html_body.html" @@ -1044,30 +1044,7 @@ msgstr "E-Mail empfangen von %(sender_email)s" msgid "Ticket Re-Opened by E-Mail Received from %(sender_email)s" msgstr "Ticket wieder geöffnet durch empfangene E-Mail von %(sender_email)s" -#: templates/helpdesk/base.html:7 -msgid "Powered by django-helpdesk" -msgstr "Powered by django-helpdesk" - -#: templates/helpdesk/base.html:12 templates/helpdesk/rss_list.html:9 -#: templates/helpdesk/rss_list.html:23 templates/helpdesk/rss_list.html:28 -msgid "My Open Tickets" -msgstr "Meine offenen Tickets" - -#: templates/helpdesk/base.html:13 -msgid "All Recent Activity" -msgstr "Letzte Aktivitäten" - -#: templates/helpdesk/base.html:14 templates/helpdesk/dashboard.html:43 -#: templates/helpdesk/rss_list.html:15 -msgid "Unassigned Tickets" -msgstr "Nicht zugeordnete Tickets" - -#: templates/helpdesk/base.html:45 templates/helpdesk/public_base.html:3 -#: templates/helpdesk/public_base.html:11 -msgid "Helpdesk" -msgstr "Helpdesk" - -#: templates/helpdesk/base.html:54 +#: templates/helpdesk/attribution.html:2 msgid "" "Powered by django-" "helpdesk." @@ -1075,31 +1052,62 @@ msgstr "" "Powered by django-" "helpdesk." -#: templates/helpdesk/base.html:54 templates/helpdesk/rss_list.html:9 +#: templates/helpdesk/attribution.html:4 +msgid "For technical support please contact:" +msgstr "Benötigen Sie Hilfe oder haben Sie Fragen? Kontaktieren Sie dazu bitte:" + +#: templates/helpdesk/base.html:9 +msgid "Powered by django-helpdesk" +msgstr "Powered by django-helpdesk" + +#: templates/helpdesk/base.html:15 templates/helpdesk/rss_list.html:9 +#: templates/helpdesk/rss_list.html:23 templates/helpdesk/rss_list.html:28 +msgid "My Open Tickets" +msgstr "Meine offenen Tickets" + +#: templates/helpdesk/base.html:16 +msgid "All Recent Activity" +msgstr "Letzte Aktivitäten" + +#: templates/helpdesk/base.html:17 templates/helpdesk/dashboard.html:76 +#: templates/helpdesk/rss_list.html:15 +msgid "Unassigned Tickets" +msgstr "Nicht zugeordnete Tickets" + +#: templates/helpdesk/base.html:88 templates/helpdesk/public_base.html:6 +#: templates/helpdesk/public_base.html:14 +msgid "Helpdesk" +msgstr "Helpdesk" + +#: templates/helpdesk/base.html:98 templates/helpdesk/rss_list.html:9 #: templates/helpdesk/rss_list.html:12 templates/helpdesk/rss_list.html:15 #: templates/helpdesk/rss_list.html:27 templates/helpdesk/rss_list.html:28 msgid "RSS Icon" msgstr "RSS Icon" -#: templates/helpdesk/base.html:54 templates/helpdesk/rss_list.html:2 +#: templates/helpdesk/base.html:98 templates/helpdesk/rss_list.html:2 #: templates/helpdesk/rss_list.html.py:4 msgid "RSS Feeds" msgstr "RSS Feeds" -#: templates/helpdesk/base.html:54 +#: templates/helpdesk/base.html:99 msgid "API" msgstr "API" -#: templates/helpdesk/base.html:54 +#: templates/helpdesk/base.html:100 msgid "User Settings" msgstr "Benutzereinstellungen" -#: templates/helpdesk/base.html:54 +#: templates/helpdesk/base.html:102 +msgid "Change Language" +msgstr "Sprache ändern" + +#: templates/helpdesk/base.html:104 msgid "System Settings" msgstr "Systemeinstellungen" #: templates/helpdesk/confirm_delete_saved_query.html:3 -#: templates/helpdesk/ticket_list.html:134 +#: templates/helpdesk/ticket_list.html:144 msgid "Delete Saved Query" msgstr "Gespeicherte Abfrage löschen" @@ -1109,20 +1117,26 @@ msgid "" "\n" "

Delete Query

\n" "\n" -"

Are you sure you want to delete this saved filter (%(query_title)s)? To re-create it, you will need to manually re-filter your ticket listing.

\n" +"

Are you sure you want to delete this saved filter (%(query_title)s)? To re-create it, you will need to manually re-filter your ticket " +"listing.

\n" msgstr "" "\n" "

Abfrage Löschen

\n" "\n" -"

Sind Sie sicher, dass Sie diesen gespeicherten Filter löschen wollen: (%(query_title)s)? Er lässt sich nur manuell wieder herstellen.

\n" +"

Sind Sie sicher, dass Sie diesen gespeicherten Filter löschen wollen: " +"(%(query_title)s)? Er lässt sich nur manuell wieder herstellen.\n" #: templates/helpdesk/confirm_delete_saved_query.html:11 msgid "" "\n" -"

You have shared this query, so other users may be using it. If you delete it, they will have to manually create their own query.

\n" +"

You have shared this query, so other users may be using it. If you delete " +"it, they will have to manually create their own query.

\n" msgstr "" "\n" -"

Sie haben diese Abfrage anderen Benutzern zur verfügung gestellt. Wenn Sie sie löschen, müssen diese manuell ihre eigene Abfrage erstellen.

\n" +"

Sie haben diese Abfrage anderen Benutzern zur verfügung gestellt. Wenn " +"Sie sie löschen, müssen diese manuell ihre eigene Abfrage erstellen.

\n" #: templates/helpdesk/confirm_delete_saved_query.html:15 #: templates/helpdesk/delete_ticket.html:11 @@ -1142,20 +1156,22 @@ msgstr "Ticket erstellen" msgid "" "

Submit a Ticket

\n" "\n" -"

Unless otherwise stated, all fields are required. Please provide as descriptive a title and description as possible.

" +"

Unless otherwise stated, all fields are required. Please provide as " +"descriptive a title and description as possible.

" msgstr "" "

Ein Ticket erstellen

\n" "\n" -"

Alle Felder sind Pflichtfelder, solange nicht anders vermerkt. Bitte geben Sie einen aussagekräftigen Titel und eine präzise Beschreibung.

" +"

Alle Felder sind Pflichtfelder, solange nicht anders vermerkt. Bitte " +"geben Sie einen aussagekräftigen Titel und eine präzise Beschreibung.

" #: templates/helpdesk/create_ticket.html:17 #: templates/helpdesk/edit_ticket.html:19 -#: templates/helpdesk/public_homepage.html:31 +#: templates/helpdesk/public_homepage.html:34 msgid "(Optional)" msgstr "(Optional)" #: templates/helpdesk/create_ticket.html:26 -#: templates/helpdesk/public_homepage.html:40 +#: templates/helpdesk/public_homepage.html:43 msgid "Submit Ticket" msgstr "Ticket erstellen" @@ -1163,54 +1179,79 @@ msgstr "Ticket erstellen" msgid "Helpdesk Dashboard" msgstr "Helpdesk Übersicht" -#: templates/helpdesk/dashboard.html:9 +#: templates/helpdesk/dashboard.html:10 msgid "Helpdesk Summary" msgstr "Helpdesk Zusammenfassung" -#: templates/helpdesk/dashboard.html:20 +#: templates/helpdesk/dashboard.html:25 +msgid "" +"Welcome to your Helpdesk Dashboard! From here you can quickly see tickets " +"submitted by you, tickets you are working on, and those tickets that have no " +"owner." +msgstr "" +"Willkommen auf dem Helpdesk Dashboard! Hier sehen Sie die von Ihnen " +"übermittelten und die Ihnen zugewiesenen " +"Tickets und außerdem solche, die noch niemandem zugewiesen worden sind." + +#: templates/helpdesk/dashboard.html:27 msgid "" "Welcome to your Helpdesk Dashboard! From here you can quickly see your own " "tickets, and those tickets that have no owner. Why not pick up an orphan " "ticket and sort it out for a customer?" msgstr "" -"Willkommen auf dem Helpdesk Dashboard! Hier sehen Sie die Ihnen zugewiesenen" -" Tickets und außerdem solche, die noch niemandem zugewiesen wurden. Wieso " +"Willkommen auf dem Helpdesk Dashboard! Hier sehen Sie die Ihnen zugewiesenen " +"Tickets und außerdem solche, die noch niemandem zugewiesen wurden. Wieso " "fangen Sie nicht bei einem der noch offenen Tickets an und lösen es?" -#: templates/helpdesk/dashboard.html:25 -msgid "Your Tickets" -msgstr "Ihre Tickets" +#: templates/helpdesk/dashboard.html:36 +msgid "All Tickets submitted by you" +msgstr "Alle von Ihnen übermittelten Tickets." -#: templates/helpdesk/dashboard.html:26 templates/helpdesk/dashboard.html:44 -#: templates/helpdesk/ticket_list.html:186 +#: templates/helpdesk/dashboard.html:37 templates/helpdesk/dashboard.html:57 +#: templates/helpdesk/dashboard.html:77 templates/helpdesk/dashboard.html:99 +#: templates/helpdesk/ticket_list.html:199 msgid "Pr" msgstr "Pr" -#: templates/helpdesk/dashboard.html:26 +#: templates/helpdesk/dashboard.html:37 templates/helpdesk/dashboard.html:57 +#: templates/helpdesk/dashboard.html:99 msgid "Last Update" msgstr "Letzte Aktualisierung" -#: templates/helpdesk/dashboard.html:38 +#: templates/helpdesk/dashboard.html:56 +msgid "Open Tickets assigned to you (you are working on this ticket)" +msgstr "Alle Ihnen zugeordneten Tickets (an denen Sie arbeiten)." + +#: templates/helpdesk/dashboard.html:69 msgid "You have no tickets assigned to you." msgstr "Sie haben keine Ihnen zugeordneten Tickets." -#: templates/helpdesk/dashboard.html:52 -#: templates/helpdesk/ticket_desc_table.html:13 +#: templates/helpdesk/dashboard.html:76 +msgid "(pick up a ticket if you start to work on it)" +msgstr "(nehmen Sie ein Ticket sobald Sie daran arbeiten)" + +#: templates/helpdesk/dashboard.html:85 +#: templates/helpdesk/ticket_desc_table.html:22 msgid "Take" msgstr "Nehmen" -#: templates/helpdesk/dashboard.html:52 +#: templates/helpdesk/dashboard.html:85 #: templates/helpdesk/email_ignore_list.html:13 #: templates/helpdesk/email_ignore_list.html:23 #: templates/helpdesk/ticket_cc_list.html:15 #: templates/helpdesk/ticket_cc_list.html:23 +#: templates/helpdesk/ticket_list.html:234 msgid "Delete" msgstr "Löschen" -#: templates/helpdesk/dashboard.html:56 +#: templates/helpdesk/dashboard.html:89 msgid "There are no unassigned tickets." msgstr "Es gibt keine nicht zugeordneten Tickets." +#: templates/helpdesk/dashboard.html:98 +msgid "Closed & resolved Tickets you used to work on" +msgstr "Geschlossene & gelöste Tickets and denen Sie gearbeitet haben." + #: templates/helpdesk/delete_ticket.html:3 msgid "Delete Ticket" msgstr "Ticket löschen" @@ -1221,12 +1262,16 @@ msgid "" "\n" "

Delete Ticket

\n" "\n" -"

Are you sure you want to delete this ticket (%(ticket_title)s)? All traces of the ticket, including followups, attachments, and updates will be irreversably removed.

\n" +"

Are you sure you want to delete this ticket (%(ticket_title)s)? " +"All traces of the ticket, including followups, attachments, and updates will " +"be irreversably removed.

\n" msgstr "" "\n" "

Ticket löschent

\n" "\n" -"

Sind Sie sicher, dass Sie dieses Ticket löschen wollen: (%(ticket_title)s)? Sämtliche Details des Tickets, inklusive Nachfragen, Anhänge und Aktualisierungen werden endgültig gelöscht.

\n" +"

Sind Sie sicher, dass Sie dieses Ticket löschen wollen: (" +"%(ticket_title)s)? Sämtliche Details des Tickets, inklusive Nachfragen, " +"Anhänge und Aktualisierungen werden endgültig gelöscht.

\n" #: templates/helpdesk/edit_ticket.html:3 msgid "Edit Ticket" @@ -1236,14 +1281,22 @@ msgstr "Ticket bearbeiten" msgid "" "

Edit a Ticket

\n" "\n" -"

Unless otherwise stated, all fields are required. Please provide as descriptive a title and description as possible.

\n" +"

Unless otherwise stated, all fields are required. Please provide as " +"descriptive a title and description as possible.

\n" "\n" -"

Note: Editing a ticket does not send an e-mail to the ticket owner or submitter. No new details should be entered, this form should only be used to fix incorrect details or clean up the submission.

" +"

Note: Editing a ticket does not send an e-mail " +"to the ticket owner or submitter. No new details should be entered, this " +"form should only be used to fix incorrect details or clean up the submission." +"

" msgstr "" "

Ein Ticket bearbeiten

\n" "\n" -"

Alle Felder sind Pflichtfelder, solange nicht anders vermerkt. Bitte geben Sie einen aussagekräftigen Titel und eine präzise Beschreibung.

\n" -"

Achtung: Das Bearbeiten eines Tickets schickt keine E-Mail an den Ersteller und den Verantwortlichen. Dieses Formular sollte daher nur zur Korrektur von Fehlern oder zur saubereren Darstellung benutzt werden, es sollten keinen neuen Details hinzugefügt werden.

" +"

Alle Felder sind Pflichtfelder, solange nicht anders vermerkt. Bitte " +"geben Sie einen aussagekräftigen Titel und eine präzise Beschreibung.

\n" +"

Achtung: Das Bearbeiten eines Tickets schickt " +"keine E-Mail an den Ersteller und den Verantwortlichen. Dieses Formular " +"sollte daher nur zur Korrektur von Fehlern oder zur saubereren Darstellung " +"benutzt werden, es sollten keinen neuen Details hinzugefügt werden.

" #: templates/helpdesk/edit_ticket.html:28 msgid "Save Changes" @@ -1259,16 +1312,22 @@ msgid "" "\n" "

Ignore E-Mail Address

\n" "\n" -"

To ignore an e-mail address and prevent any emails from that address creating tickets automatically, enter the e-mail address below.

\n" +"

To ignore an e-mail address and prevent any emails from that address " +"creating tickets automatically, enter the e-mail address below.

\n" "\n" -"

You can either enter a whole e-mail address such as email@domain.com or a portion of an e-mail address with a wildcard, such as *@domain.com or user@*.

" +"

You can either enter a whole e-mail address such as email@domain.com or a portion of an e-mail address with a wildcard, such as *@domain." +"com or user@*.

" msgstr "" "\n" "

E-Mail-Adresse ignorieren

\n" "\n" -"

Um eine E-Mail-Adresse ignorieren und zu verhindern dass Tickets von ihr erstellt werden, geben sie die entsprechende E-Mail-Adresse hier an.

\n" +"

Um eine E-Mail-Adresse ignorieren und zu verhindern dass Tickets von ihr " +"erstellt werden, geben sie die entsprechende E-Mail-Adresse hier an.

\n" "\n" -"Sie können entweder eine vollständige E-Mail-Adresse wie email@domain.com oder einen Teil mit Platzhaltern, wie z.B. *@domain.com oder user@* angeben." +"Sie können entweder eine vollständige E-Mail-Adresse wie email@domain." +"com oder einen Teil mit Platzhaltern, wie z.B. *@domain.com " +"oder user@* angeben." #: templates/helpdesk/email_ignore_del.html:3 msgid "Delete Ignored E-Mail Address" @@ -1280,12 +1339,16 @@ msgid "" "\n" "

Un-Ignore E-Mail Address

\n" "\n" -"

Are you sure you wish to stop removing this email address (%(email_address)s) and allow their e-mails to automatically create tickets in your system? You can re-add this e-mail address at any time.

\n" +"

Are you sure you wish to stop removing this email address (" +"%(email_address)s) and allow their e-mails to automatically create " +"tickets in your system? You can re-add this e-mail address at any time.

\n" msgstr "" "\n" "

Ignorierte E-Mail-Adresse wieder berücksichtigen

\n" "\n" -"

Sind Sie sicher, dass Sie diese E-Mail-Adresse nicht mehr entfernen wollen (%(email_address)s) und ihr erlauben wollen, Tickets im System zu erstellen? Sie können sie jederzeit wieder hinzufügen.

\n" +"

Sind Sie sicher, dass Sie diese E-Mail-Adresse nicht mehr entfernen " +"wollen (%(email_address)s) und ihr erlauben wollen, Tickets im " +"System zu erstellen? Sie können sie jederzeit wieder hinzufügen.

\n" #: templates/helpdesk/email_ignore_del.html:11 msgid "Keep Ignoring It" @@ -1305,12 +1368,16 @@ msgid "" "\n" "

Ignored E-Mail Addresses

\n" "\n" -"

The following e-mail addresses are currently being ignored by the incoming e-mail processor. You can add a new e-mail address to the list or delete any of the items below as required.

" +"

The following e-mail addresses are currently being ignored by the " +"incoming e-mail processor. You can add a new e-mail address " +"to the list or delete any of the items below as required.

" msgstr "" "\n" "

Ignorierte E-Mail-Adressen

\n" "\n" -"

Folgende E-Mail-Adressen werden zur Zeit ignoriert. Sie können eine neue E-Mail zur Liste hinzufügen oder aber eine der aufgelisteten Adressen löschen.

" +"

Folgende E-Mail-Adressen werden zur Zeit ignoriert. Sie können eine neue E-Mail zur Liste hinzufügen oder aber eine der " +"aufgelisteten Adressen löschen.

" #: templates/helpdesk/email_ignore_list.html:13 msgid "Date Added" @@ -1325,6 +1392,7 @@ msgid "Keep in mailbox?" msgstr "Im Postfach aufbewahren" #: templates/helpdesk/email_ignore_list.html:21 +#: templates/helpdesk/ticket_list.html:232 msgid "All" msgstr "Alle" @@ -1375,7 +1443,7 @@ msgstr "Sie sehen alle Einträge der Kategorie %(kbcat)s." msgid "Article" msgstr "Artikel" -#: templates/helpdesk/kb_index.html:4 templates/helpdesk/navigation.html:26 +#: templates/helpdesk/kb_index.html:4 templates/helpdesk/navigation.html:30 msgid "Knowledgebase" msgstr "Wissendatenbank" @@ -1401,9 +1469,8 @@ msgstr "Wissensdatenbank: %(item)s" #: templates/helpdesk/kb_item.html:13 #, python-format msgid "" -"View other %(category_title)s " -"articles, or continue viewing other knowledgebase " -"articles." +"View other %(category_title)s articles, or continue viewing other knowledgebase articles." msgstr "" "Andere Artikel aus %(category_title)s " "ansehen, oder Artikel aus anderen Kategorien ansehen." @@ -1454,7 +1521,7 @@ msgid "Dashboard" msgstr "Übersicht" #: templates/helpdesk/navigation.html:5 -#: templates/helpdesk/ticket_list.html:185 +#: templates/helpdesk/ticket_list.html:198 msgid "Tickets" msgstr "Tickets" @@ -1462,67 +1529,68 @@ msgstr "Tickets" msgid "New Ticket" msgstr "Neues Ticket" -#: templates/helpdesk/navigation.html:7 +#: templates/helpdesk/navigation.html:8 msgid "Stats" msgstr "Statistiken" -#: templates/helpdesk/navigation.html:20 +#: templates/helpdesk/navigation.html:22 templates/helpdesk/navigation.html:32 msgid "Logout" msgstr "Abmelden" -#: templates/helpdesk/navigation.html:21 +#: templates/helpdesk/navigation.html:23 msgid "Search..." msgstr "Suche..." -#: templates/helpdesk/navigation.html:21 +#: templates/helpdesk/navigation.html:23 msgid "Enter a keyword, or a ticket number to jump straight to that ticket." msgstr "" -"Geben Sie einen Suchbegriff oder eine Ticketnummer ein, um direkt zum Ticket" -" zu springen." +"Geben Sie einen Suchbegriff oder eine Ticketnummer ein, um direkt zum Ticket " +"zu springen." -#: templates/helpdesk/navigation.html:25 +#: templates/helpdesk/navigation.html:28 msgid "Submit A Ticket" msgstr "Ein Ticket erstellen" -#: templates/helpdesk/navigation.html:27 +#: templates/helpdesk/navigation.html:32 msgid "Log In" msgstr "Anmelden" -#: templates/helpdesk/public_base.html:18 -msgid "" -"Powered by django-" -"helpdesk." -msgstr "" -"Powered by django-" -"helpdesk." - -#: templates/helpdesk/public_homepage.html:4 +#: templates/helpdesk/public_change_language.html:2 +#: templates/helpdesk/public_homepage.html:5 #: templates/helpdesk/public_view_form.html:4 #: templates/helpdesk/public_view_ticket.html:2 msgid "View a Ticket" msgstr "Ein Ticket anschauen" -#: templates/helpdesk/public_homepage.html:12 +#: templates/helpdesk/public_change_language.html:5 +msgid "Change the display language" +msgstr "Anzeigesprache ändern" + +#: templates/helpdesk/public_homepage.html:13 #: templates/helpdesk/public_view_form.html:15 msgid "Your E-mail Address" msgstr "Ihre E-Mail-Adresse" -#: templates/helpdesk/public_homepage.html:16 +#: templates/helpdesk/public_homepage.html:17 #: templates/helpdesk/public_view_form.html:19 msgid "View Ticket" msgstr "Ticket anschauen" -#: templates/helpdesk/public_homepage.html:20 +#: templates/helpdesk/public_homepage.html:23 msgid "Submit a Ticket" msgstr "Ein Ticket erstellen" -#: templates/helpdesk/public_homepage.html:22 +#: templates/helpdesk/public_homepage.html:25 msgid "" "All fields are required. Please provide as descriptive a title and " "description as possible." msgstr "" -"Alle Felder sind Pflichtfelder. Bitte geben Sie einen aussagekräftigen Titel" -" und eine präzise Beschreibung." +"Alle Felder sind Pflichtfelder. Bitte geben Sie einen aussagekräftigen Titel " +"und eine präzise Beschreibung." + +#: templates/helpdesk/public_homepage.html:51 +msgid "Please use button at upper right to login first." +msgstr "" #: templates/helpdesk/public_spam.html:4 msgid "Unable To Open Ticket" @@ -1532,15 +1600,25 @@ msgstr "Ticket kann nicht geöffnet werden" msgid "" "

Sorry, but there has been an error trying to submit your ticket.

\n" "\n" -"

Our system has marked your submission as spam, so we are unable to save it. If this is not spam, please press back and re-type your message. Be careful to avoid sounding 'spammy', and if you have heaps of links please try removing them if possible.

\n" +"

Our system has marked your submission as spam, so we are " +"unable to save it. If this is not spam, please press back and re-type your " +"message. Be careful to avoid sounding 'spammy', and if you have heaps of " +"links please try removing them if possible.

\n" "\n" -"

We are sorry for any inconvenience, however this check is required to avoid our helpdesk resources being overloaded by spammers.

\n" +"

We are sorry for any inconvenience, however this check is required to " +"avoid our helpdesk resources being overloaded by spammers.

\n" msgstr "" "

Leider ist ein Fehler bei der Erstellung Ihres Tickets aufgetreten.

\n" "\n" -"

Das System hat Ihre Anfrage als markiert und deswegen nicht gespeichert. Falls es sich nicht um Spam handelt, benutzen Sie den 'Zurück'-Knopf Ihres Browsers und geben Sie Ihre Anfrage erneut ein. Achten Sie darauf, dass Ihre Formulierungen nicht mit Spam verwechselt werden können, und falls Sie eine Vielzahl an Links gesetzt haben, dann entfernen Sie diese, wenn möglich.

\n" +"

Das System hat Ihre Anfrage als markiert und " +"deswegen nicht gespeichert. Falls es sich nicht um Spam handelt, benutzen " +"Sie den 'Zurück'-Knopf Ihres Browsers und geben Sie Ihre Anfrage erneut ein. " +"Achten Sie darauf, dass Ihre Formulierungen nicht mit Spam verwechselt " +"werden können, und falls Sie eine Vielzahl an Links gesetzt haben, dann " +"entfernen Sie diese, wenn möglich.

\n" "\n" -"

Wir entschuldigen uns für die Unanehmlichkeiten, leider ist die Prüfung auf Spam notwendig um zu verhindern, dass der Helpdesk überlastet wird.

\n" +"

Wir entschuldigen uns für die Unanehmlichkeiten, leider ist die Prüfung " +"auf Spam notwendig um zu verhindern, dass der Helpdesk überlastet wird.

\n" #: templates/helpdesk/public_view_form.html:8 msgid "Error:" @@ -1552,27 +1630,27 @@ msgid "Queue: %(queue_name)s" msgstr "Ticketsammlung: %(queue_name)s" #: templates/helpdesk/public_view_ticket.html:11 -#: templates/helpdesk/ticket_desc_table.html:7 +#: templates/helpdesk/ticket_desc_table.html:16 msgid "Submitted On" msgstr "Erstellt am" #: templates/helpdesk/public_view_ticket.html:46 -#: templates/helpdesk/ticket_desc_table.html:65 +#: templates/helpdesk/ticket_desc_table.html:74 msgid "Accept" msgstr "Akzeptiert" #: templates/helpdesk/public_view_ticket.html:46 -#: templates/helpdesk/ticket_desc_table.html:65 +#: templates/helpdesk/ticket_desc_table.html:74 msgid "Accept and Close" msgstr "Akzeptiert und geschlossen" #: templates/helpdesk/public_view_ticket.html:55 -#: templates/helpdesk/ticket.html:48 +#: templates/helpdesk/ticket.html:52 msgid "Follow-Ups" msgstr "Weiterbearbeitungen" #: templates/helpdesk/public_view_ticket.html:63 -#: templates/helpdesk/ticket.html:59 +#: templates/helpdesk/ticket.html:80 #, python-format msgid "Changed %(field)s from %(old_value)s to %(new_value)s." msgstr "%(field)s von %(old_value)s zu %(new_value)s geändert." @@ -1617,6 +1695,25 @@ msgstr "nach Monat" msgid "Reports By Queue" msgstr "Berichte nach Sammlung" +#: templates/helpdesk/report_output.html:19 +msgid "" +"You can run this query on filtered data by using one of your saved queries." +msgstr "" + +#: templates/helpdesk/report_output.html:21 +msgid "Select Query:" +msgstr "Abfrage auswählen" + +#: templates/helpdesk/report_output.html:26 +msgid "Filter Report" +msgstr "" + +#: templates/helpdesk/report_output.html:29 +msgid "" +"Want to filter this report to just show a subset of data? Go to the Ticket " +"List, filter your query, and save your query." +msgstr "" + #: templates/helpdesk/rss_list.html:6 msgid "" "The following RSS feeds are available for you to monitor using your " @@ -1624,8 +1721,8 @@ msgid "" "all feeds provide information only on Open and Reopened cases. This ensures " "your RSS reader isn't full of information about closed or historical tasks." msgstr "" -"Folgende RSS Feeds stehen zur Überwachung für Sie zur Verfügung. Alle Feeds," -" mit Ausnahme des 'Letzte Aktivitäten' Feeds, enthalten nur Nachrichtenzu " +"Folgende RSS Feeds stehen zur Überwachung für Sie zur Verfügung. Alle Feeds, " +"mit Ausnahme des 'Letzte Aktivitäten' Feeds, enthalten nur Nachrichtenzu " "offenen oder wiedergeöffneten Tickets. So wird sichergestellt, dass Ihr RSS " "Aggregatornicht voller Mitteilungen zu alten oder geschlossenen Tickets ist." @@ -1646,8 +1743,8 @@ msgid "" "A summary of all helpdesk activity - including comments, emails, " "attachments, and more" msgstr "" -"Eine Übersicht sämtlicher Helpdesk-Aktivitäten - inklusive Kommentare, " -"E-Mails, Anhänge und mehr" +"Eine Übersicht sämtlicher Helpdesk-Aktivitäten - inklusive Kommentare, E-" +"Mails, Anhänge und mehr" #: templates/helpdesk/rss_list.html:16 msgid "" @@ -1695,7 +1792,8 @@ msgstr "" "\n" "

Systemeinstellungen

\n" "\n" -"

Die folgenden Dinge können von Ihnen oder anderen Administratoren gepflegt werden:

" +"

Die folgenden Dinge können von Ihnen oder anderen Administratoren " +"gepflegt werden:

" #: templates/helpdesk/system_settings.html:11 msgid "E-Mail Ignore list" @@ -1733,23 +1831,27 @@ msgstr "Ticketdetails ansehen" msgid "Attach another File" msgstr "Weitere Datei anhängen" -#: templates/helpdesk/ticket.html:34 templates/helpdesk/ticket.html.py:147 +#: templates/helpdesk/ticket.html:34 templates/helpdesk/ticket.html.py:181 msgid "Add Another File" msgstr "Weitere Datei hinzufügen" -#: templates/helpdesk/ticket.html:53 +#: templates/helpdesk/ticket.html:45 +msgid "Translate ticket comments into" +msgstr "Ticket Kommentare übersetzen nach" + +#: templates/helpdesk/ticket.html:59 templates/helpdesk/ticket.html.py:69 msgid "Private" msgstr "Privat" -#: templates/helpdesk/ticket.html:70 +#: templates/helpdesk/ticket.html:98 msgid "Respond to this ticket" msgstr "Auf dieses Ticket antworten" -#: templates/helpdesk/ticket.html:76 +#: templates/helpdesk/ticket.html:105 msgid "Use a Pre-set Reply" msgstr "Vorgefertigte Antwort benutzen" -#: templates/helpdesk/ticket.html:78 +#: templates/helpdesk/ticket.html:107 msgid "" "Selecting a pre-set reply will over-write your comment below. You can then " "modify the pre-set reply to your liking before saving this update." @@ -1758,11 +1860,11 @@ msgstr "" "überschrieben. Sie können aber die vorgefertigte Antwort dann an Ihre " "Bedürfnisse anpassen, bevor Sie die Änderung speichern." -#: templates/helpdesk/ticket.html:80 +#: templates/helpdesk/ticket.html:110 msgid "Comment / Resolution" msgstr "Kommentar / Lösung" -#: templates/helpdesk/ticket.html:82 +#: templates/helpdesk/ticket.html:112 msgid "" "You can insert ticket and queue details in your message. For more " "information, see the context help page." @@ -1771,49 +1873,48 @@ msgstr "" "angeben. Weitere Informationen finden Sie auf " "der Kontext-Hilfeseite." -#: templates/helpdesk/ticket.html:85 +#: templates/helpdesk/ticket.html:115 msgid "" -"This ticket cannot be resolved or closed until the tickets it depends on are" -" resolved." +"This ticket cannot be resolved or closed until the tickets it depends on are " +"resolved." msgstr "" "Dieses Ticket kann gelöst oder geschlossen werden, bis die Tickets, von " "denen dieses abhängt, gelöst werden." -#: templates/helpdesk/ticket.html:112 +#: templates/helpdesk/ticket.html:145 msgid "Is this update public?" msgstr "Ist diese Änderung öffentlich?" -#: templates/helpdesk/ticket.html:114 +#: templates/helpdesk/ticket.html:147 msgid "" -"If this is public, the submitter will be e-mailed your comment or " -"resolution." +"If this is public, the submitter will be e-mailed your comment or resolution." msgstr "" "Wenn die Änderung öffentlich ist, wird der Ersteller per E-Mail über Ihren " "Kommentar oder Ihre Lösung informiert werden." -#: templates/helpdesk/ticket.html:117 +#: templates/helpdesk/ticket.html:151 msgid "Change Further Details »" msgstr "Weitere Details anpassen »" -#: templates/helpdesk/ticket.html:126 templates/helpdesk/ticket_list.html:53 -#: templates/helpdesk/ticket_list.html:84 -#: templates/helpdesk/ticket_list.html:186 +#: templates/helpdesk/ticket.html:160 templates/helpdesk/ticket_list.html:55 +#: templates/helpdesk/ticket_list.html:87 +#: templates/helpdesk/ticket_list.html:199 msgid "Owner" msgstr "Verantwortlicher" -#: templates/helpdesk/ticket.html:127 +#: templates/helpdesk/ticket.html:161 msgid "Unassign" msgstr "Zuordnung aufheben" -#: templates/helpdesk/ticket.html:140 +#: templates/helpdesk/ticket.html:174 msgid "Attach File(s) »" msgstr "Datei(en) anhängen »" -#: templates/helpdesk/ticket.html:146 +#: templates/helpdesk/ticket.html:180 msgid "Attach a File" msgstr "Eine Datei anhängen" -#: templates/helpdesk/ticket.html:154 +#: templates/helpdesk/ticket.html:188 msgid "Update This Ticket" msgstr "Dieses Ticket aktualisieren" @@ -1826,12 +1927,15 @@ msgid "" "\n" "

Add Ticket CC

\n" "\n" -"

To automatically send an email to a user or e-mail address when this ticket is updated, select the user or enter an e-mail address below.

" +"

To automatically send an email to a user or e-mail address when this " +"ticket is updated, select the user or enter an e-mail address below.

" msgstr "" "\n" "

Ticket CC hinzufügen

\n" "\n" -"

Wählen Sie einen Benutzer oder geben Sie eine E-Mail-Adresse ein, die bei Aktualisierungen dieses Tickets automatisch per Mail benachrichtig werden sollen.

" +"

Wählen Sie einen Benutzer oder geben Sie eine E-Mail-Adresse ein, die bei " +"Aktualisierungen dieses Tickets automatisch per Mail benachrichtig werden " +"sollen.

" #: templates/helpdesk/ticket_cc_add.html:21 msgid "Save Ticket CC" @@ -1847,12 +1951,16 @@ msgid "" "\n" "

Delete Ticket CC

\n" "\n" -"

Are you sure you wish to delete this email address (%(email_address)s) from the CC list for this ticket? They will stop receiving updates.

\n" +"

Are you sure you wish to delete this email address (" +"%(email_address)s) from the CC list for this ticket? They will stop " +"receiving updates.

\n" msgstr "" "\n" "\n" "\n" -"

Sind Sie sicher, dass Sie diese E-Mail-Adresse (%(email_address)s) von der CC Liste löschen wollen? Sie wird keine Aktualisierungsbenachrichtigungen mehr erhalten.

\n" +"

Sind Sie sicher, dass Sie diese E-Mail-Adresse (%(email_address)s) von der CC Liste löschen wollen? Sie wird keine " +"Aktualisierungsbenachrichtigungen mehr erhalten.

\n" #: templates/helpdesk/ticket_cc_del.html:11 #: templates/helpdesk/ticket_dependency_del.html:11 @@ -1874,16 +1982,23 @@ msgid "" "\n" "

Ticket CC Settings

\n" "\n" -"

The following people will receive an e-mail whenever %(ticket_title)s is updated. Some people can also view or edit the ticket via the public ticket views.

\n" +"

The following people will receive an e-mail whenever " +"%(ticket_title)s is updated. Some people can also view or edit the " +"ticket via the public ticket views.

\n" "\n" -"

You can add a new e-mail address to the list or delete any of the items below as required.

" +"

You can add a new e-mail address to the list or delete " +"any of the items below as required.

" msgstr "" "\n" "

Ticket CC Einstellungen

\n" "\n" -"

Die folgenden Personen erhalten eine E-Mail, wenn das Ticket %(ticket_title)s aktualisiert wird. Manche Personen können das Ticket auch die öffentliche Ticketanzeige ansehen oder bearbeiten.

\n" +"

Die folgenden Personen erhalten eine E-Mail, wenn das Ticket %(ticket_title)s aktualisiert wird. Manche Personen " +"können das Ticket auch die öffentliche Ticketanzeige ansehen oder bearbeiten." +"

\n" "\n" -"

Sie können der Liste neue E-Mail-Adressen hinzufügen oder jede der unten aufgeführten Adressen löschen.

" +"

Sie können der Liste neue E-Mail-Adressen hinzufügen " +"oder jede der unten aufgeführten Adressen löschen.

" #: templates/helpdesk/ticket_cc_list.html:14 msgid "Ticket CC List" @@ -1911,12 +2026,14 @@ msgid "" "\n" "

Add Ticket Dependency

\n" "\n" -"

Adding a dependency will stop you resolving this ticket until the dependent ticket has been resolved or closed.

" +"

Adding a dependency will stop you resolving this ticket until the " +"dependent ticket has been resolved or closed.

" msgstr "" "\n" "

Ticket Abhängigkeit hinzufügen

\n" "\n" -"

Das Hinzufügen einer Abhängigkeit verhindert die Lösung dieses Tickets bis alle abhängigen Tickets gelöst oder geschlossen wurden.

" +"

Das Hinzufügen einer Abhängigkeit verhindert die Lösung dieses Tickets " +"bis alle abhängigen Tickets gelöst oder geschlossen wurden.

" #: templates/helpdesk/ticket_dependency_add.html:21 msgid "Save Ticket Dependency" @@ -1936,126 +2053,209 @@ msgstr "" "\n" "

Ticket Abhängigkeit löschen

\n" "\n" -"

Sind Sie sicher, dass Sie die Abhängigkeit von diesem Ticket entfernen möchten?

\n" +"

Sind Sie sicher, dass Sie die Abhängigkeit von diesem Ticket entfernen " +"möchten?

\n" -#: templates/helpdesk/ticket_desc_table.html:3 +#: templates/helpdesk/ticket_desc_table.html:11 msgid "Unhold" msgstr "Wieder freigeben" -#: templates/helpdesk/ticket_desc_table.html:3 +#: templates/helpdesk/ticket_desc_table.html:11 msgid "Hold" msgstr "Zurückhalten" -#: templates/helpdesk/ticket_desc_table.html:4 +#: templates/helpdesk/ticket_desc_table.html:13 #, python-format msgid "Queue: %(queue)s" msgstr "Ticketsammlung: %(queue)s" -#: templates/helpdesk/ticket_desc_table.html:12 +#: templates/helpdesk/ticket_desc_table.html:21 msgid "Assigned To" msgstr "Zugeordnet " -#: templates/helpdesk/ticket_desc_table.html:18 +#: templates/helpdesk/ticket_desc_table.html:27 msgid "Ignore" msgstr "Ignorieren" -#: templates/helpdesk/ticket_desc_table.html:27 +#: templates/helpdesk/ticket_desc_table.html:36 msgid "Copies To" msgstr "Kopie an" -#: templates/helpdesk/ticket_desc_table.html:28 +#: templates/helpdesk/ticket_desc_table.html:37 msgid "Manage" msgstr "Verwalten" -#: templates/helpdesk/ticket_desc_table.html:39 +#: templates/helpdesk/ticket_desc_table.html:37 +msgid "" +"Click here to add / remove people who should receive an e-mail whenever this " +"ticket is updated." +msgstr "" +"Klicken Sie hier um zusätzliche Email Empfänger zu verwalten, welche benachrichtigt werden, " +"wenn das Ticket aktualisiert wird." + +#: templates/helpdesk/ticket_desc_table.html:48 msgid "Dependencies" msgstr "Abhängigkeiten" -#: templates/helpdesk/ticket_desc_table.html:41 +#: templates/helpdesk/ticket_desc_table.html:50 msgid "" "This ticket cannot be resolved until the following ticket(s) are resolved" msgstr "" "Dieses Ticket kann nicht gelöst werden, bis die folgenden Ticket(s) gelöst " "werden" -#: templates/helpdesk/ticket_desc_table.html:42 +#: templates/helpdesk/ticket_desc_table.html:51 msgid "Remove Dependency" msgstr "Abhängigkeit entfernen" -#: templates/helpdesk/ticket_desc_table.html:45 +#: templates/helpdesk/ticket_desc_table.html:54 msgid "This ticket has no dependencies." msgstr "Dieses Ticket hat keine Abhängigkeiten." -#: templates/helpdesk/ticket_desc_table.html:47 +#: templates/helpdesk/ticket_desc_table.html:56 msgid "Add Dependency" msgstr "Abhängigkeit hinzufügen" +#: templates/helpdesk/ticket_desc_table.html:56 +msgid "" +"Click on 'Add Dependency', if you want to make this ticket dependent on " +"another ticket. A ticket may not be closed until all tickets it depends on " +"are closed." +msgstr "" +"Klicken Sie auf 'Abhängigkeit hinzufügen', wenn Sie dieses Ticket abhängig von einem " +"anderen Ticket machen wollen. Tickets können nur geschlossen werden, wenn alle " +"Tickets von denen es abhängt, geschlossen worden sind." + #: templates/helpdesk/ticket_list.html:2 msgid "Ticket Listing" msgstr "Ticket Aufzählung" -#: templates/helpdesk/ticket_list.html:49 +#: templates/helpdesk/ticket_list.html:41 +msgid "Query Options" +msgstr "Abfrage Optionen" + +#: templates/helpdesk/ticket_list.html:43 +msgid "Save This Query" +msgstr "Abfrage speichern" + +#: templates/helpdesk/ticket_list.html:46 +msgid "Load Saved Query" +msgstr "Abfrage laden" + +#: templates/helpdesk/ticket_list.html:51 msgid "Change Query" msgstr "Abfrage ändern" -#: templates/helpdesk/ticket_list.html:52 +#: templates/helpdesk/ticket_list.html:54 +#: templates/helpdesk/ticket_list.html:69 msgid "Sorting" msgstr "Sortierung" -#: templates/helpdesk/ticket_list.html:56 -#: templates/helpdesk/ticket_list.html:127 +#: templates/helpdesk/ticket_list.html:58 +#: templates/helpdesk/ticket_list.html:137 msgid "Keywords" msgstr "Schlagworte" -#: templates/helpdesk/ticket_list.html:94 +#: templates/helpdesk/ticket_list.html:59 +msgid "Date Range" +msgstr "Zeitspanne" + +#: templates/helpdesk/ticket_list.html:90 +msgid "Reverse" +msgstr "" + +#: templates/helpdesk/ticket_list.html:92 +msgid "Ordering applied to tickets" +msgstr "" + +#: templates/helpdesk/ticket_list.html:97 msgid "Owner(s)" msgstr "Verantwortlich" -#: templates/helpdesk/ticket_list.html:107 +#: templates/helpdesk/ticket_list.html:101 +msgid "(ME)" +msgstr "" + +#: templates/helpdesk/ticket_list.html:105 +msgid "Ctrl-Click to select multiple options" +msgstr "" + +#: templates/helpdesk/ticket_list.html:110 msgid "Queue(s)" msgstr "Ticketsammlung(en)" -#: templates/helpdesk/ticket_list.html:113 +#: templates/helpdesk/ticket_list.html:111 +#: templates/helpdesk/ticket_list.html:117 +#: templates/helpdesk/ticket_list.html:131 +msgid "Ctrl-click to select multiple options" +msgstr "" + +#: templates/helpdesk/ticket_list.html:116 msgid "Status(es)" msgstr "Status" -#: templates/helpdesk/ticket_list.html:120 +#: templates/helpdesk/ticket_list.html:122 +msgid "Date (From)" +msgstr "Datum (von)" + +#: templates/helpdesk/ticket_list.html:123 +msgid "Date (To)" +msgstr "Datum (bis)" + +#: templates/helpdesk/ticket_list.html:124 +msgid "Use YYYY-MM-DD date format, eg 2011-05-29" +msgstr "" + +#: templates/helpdesk/ticket_list.html:130 msgid "Tag(s)" msgstr "Tag(s)" -#: templates/helpdesk/ticket_list.html:132 +#: templates/helpdesk/ticket_list.html:138 +msgid "" +"Keywords are case-insensitive, and will be looked for in the title, body and " +"submitter fields." +msgstr "" + +#: templates/helpdesk/ticket_list.html:142 msgid "Apply Filter" msgstr "Filter anwenden" -#: templates/helpdesk/ticket_list.html:134 +#: templates/helpdesk/ticket_list.html:144 #, python-format msgid "You are currently viewing saved query %(query_name)s." msgstr "Sie sehen die gespeicherte Abfrage %(query_name)s." -#: templates/helpdesk/ticket_list.html:141 -#: templates/helpdesk/ticket_list.html:156 +#: templates/helpdesk/ticket_list.html:147 +#, python-format +msgid "" +"Run a report on this " +"query to see stats and charts for the data listed below." +msgstr "" + +#: templates/helpdesk/ticket_list.html:154 +#: templates/helpdesk/ticket_list.html:169 msgid "Save Query" msgstr "Abfrage speichern" -#: templates/helpdesk/ticket_list.html:147 +#: templates/helpdesk/ticket_list.html:160 msgid "" "This name appears in the drop-down list of saved queries. If you share your " "query, other users will see this name, so choose something clear and " "descriptive!" msgstr "" -"Dieser Name erscheint in der Liste der gespeicherten Abfragen. Wenn Sie Ihre" -" Abfrage teilen, sehen andere Benutzer diesen Namen und können Ihre Abfrage " +"Dieser Name erscheint in der Liste der gespeicherten Abfragen. Wenn Sie Ihre " +"Abfrage teilen, sehen andere Benutzer diesen Namen und können Ihre Abfrage " "benutzen. Wählen Sie also einen aussagekräftigen Namen!" -#: templates/helpdesk/ticket_list.html:149 +#: templates/helpdesk/ticket_list.html:162 msgid "Shared?" msgstr "Geteilt?" -#: templates/helpdesk/ticket_list.html:150 +#: templates/helpdesk/ticket_list.html:163 msgid "Yes, share this query with other users." msgstr "Ja, diese Abfrage mit anderen Benutzern teilen." -#: templates/helpdesk/ticket_list.html:151 +#: templates/helpdesk/ticket_list.html:164 msgid "" "If you share this query, it will be visible by all other logged-in " "users." @@ -2063,52 +2263,95 @@ msgstr "" "Wenn Sie diese Abfrage teilen, wird Sie für alle anderen " "angemeldeten Benutzer sichtbar sein." -#: templates/helpdesk/ticket_list.html:163 +#: templates/helpdesk/ticket_list.html:176 msgid "Use Saved Query" msgstr "Gespeicherte Abfrage benutzen" -#: templates/helpdesk/ticket_list.html:165 +#: templates/helpdesk/ticket_list.html:178 msgid "Query" msgstr "Abfrage" -#: templates/helpdesk/ticket_list.html:170 +#: templates/helpdesk/ticket_list.html:183 msgid "Run Query" msgstr "Abfrage starten" -#: templates/helpdesk/ticket_list.html:200 +#: templates/helpdesk/ticket_list.html:213 msgid "No Tickets Match Your Selection" msgstr "Ihrer Auswahl entsprechen keine Tickets" -#: templates/helpdesk/ticket_list.html:206 +#: templates/helpdesk/ticket_list.html:219 msgid "Previous" msgstr "Vorherige" -#: templates/helpdesk/ticket_list.html:210 +#: templates/helpdesk/ticket_list.html:223 #, python-format msgid "Page %(ticket_num)s of %(num_pages)s." msgstr "Seite %(ticket_num)s von %(num_pages)s." -#: templates/helpdesk/ticket_list.html:214 +#: templates/helpdesk/ticket_list.html:227 msgid "Next" msgstr "Nächste" +#: templates/helpdesk/ticket_list.html:232 +msgid "Select:" +msgstr "Auswahl:" + +#: templates/helpdesk/ticket_list.html:232 +msgid "None" +msgstr "Keine" + +#: templates/helpdesk/ticket_list.html:232 +msgid "Inverse" +msgstr "Invertiert" + +#: templates/helpdesk/ticket_list.html:234 +msgid "With Selected Tickets:" +msgstr "Ausgewählte Tickets:" + +#: templates/helpdesk/ticket_list.html:234 +msgid "Take (Assign to me)" +msgstr "Nehmen (und mir zuweisen)" + +#: templates/helpdesk/ticket_list.html:234 +msgid "Close" +msgstr "Schliessen" + +#: templates/helpdesk/ticket_list.html:234 +msgid "Close (Don't Send E-Mail)" +msgstr "Schliessen (keine Email verschicken)" + +#: templates/helpdesk/ticket_list.html:234 +msgid "Close (Send E-Mail)" +msgstr "Schliessen (Email verschicken)" + +#: templates/helpdesk/ticket_list.html:234 +msgid "Assign To" +msgstr "Zuordnen" + +#: templates/helpdesk/ticket_list.html:234 +msgid "Nobody (Unassign)" +msgstr "Zuordnung aufheben" + #: templates/helpdesk/user_settings.html:3 msgid "Change User Settings" msgstr "Benutzereinstellungen ändern" -#: templates/helpdesk/user_settings.html:5 +#: templates/helpdesk/user_settings.html:14 msgid "" "\n" "

User Settings

\n" "\n" -"

Use the following options to change the way your helpdesk system works for you. These settings do not impact any other user.

" +"

Use the following options to change the way your helpdesk system works " +"for you. These settings do not impact any other user.

\n" msgstr "" "\n" "

Benutzereinstellungen

\n" "\n" -"

Mit den folgenden Einstellungen können Sie den Helpdesk an Ihre Bedürfnisse anpassen. Die Einstellungen haben keine Auswirkung auf andere Benutzer.

" +"

Mit den folgenden Einstellungen können Sie den Helpdesk an Ihre " +"Bedürfnisse anpassen. Die Einstellungen haben keine Auswirkung auf andere " +"Benutzer.

\n" -#: templates/helpdesk/user_settings.html:19 +#: templates/helpdesk/user_settings.html:29 msgid "Save Options" msgstr "Einstellungen speichern" @@ -2121,25 +2364,27 @@ msgid "" "\n" "

Logged Out

\n" "\n" -"

Thanks for being here. Hopefully you've helped resolve a few tickets and make the world a better place.

\n" +"

Thanks for being here. Hopefully you've helped resolve a few tickets and " +"make the world a better place.

\n" "\n" msgstr "" "\n" "

Abgemeldet

\n" "\n" -"

Vielen Dank für den Besuch! Hoffentlich konnten Sie einige Tickets beantworten und so einige Benutzer glücklich machen.

\n" +"

Vielen Dank für den Besuch! Hoffentlich konnten Sie einige Tickets " +"beantworten und so einige Benutzer glücklich machen.

\n" "\n" #: templates/helpdesk/registration/login.html:2 msgid "Helpdesk Login" msgstr "Helpdesk Anmeldung" -#: templates/helpdesk/registration/login.html:5 -#: templates/helpdesk/registration/login.html:17 +#: templates/helpdesk/registration/login.html:9 +#: templates/helpdesk/registration/login.html:21 msgid "Login" msgstr "Anmeldung" -#: templates/helpdesk/registration/login.html:7 +#: templates/helpdesk/registration/login.html:11 msgid "" "To log in and begin responding to cases, simply enter your username and " "password below." @@ -2147,17 +2392,17 @@ msgstr "" "Um sich anzumelden und Tickets zu bearbeiten, geben Sie einfach Ihren " "Benutzernamen und Ihr Passwort ein." -#: templates/helpdesk/registration/login.html:10 +#: templates/helpdesk/registration/login.html:14 msgid "Your username and password didn't match. Please try again." msgstr "" -"Benutzername und Passwort passen nicht zusammen. Bitte versuchen Sie es noch" -" einmal." +"Benutzername und Passwort passen nicht zusammen. Bitte versuchen Sie es noch " +"einmal." -#: templates/helpdesk/registration/login.html:12 +#: templates/helpdesk/registration/login.html:16 msgid "Username" msgstr "Benutzername" -#: templates/helpdesk/registration/login.html:14 +#: templates/helpdesk/registration/login.html:18 msgid "Password" msgstr "Passwort" @@ -2200,8 +2445,8 @@ msgid "" "Recent FollowUps, such as e-mail replies, comments, attachments and " "resolutions" msgstr "" -"Kürzliche Weiterbearbeitungen wie E-Mail-Antworten, Kommentare, Anhänge oder" -" Lösungen" +"Kürzliche Weiterbearbeitungen wie E-Mail-Antworten, Kommentare, Anhänge oder " +"Lösungen" #: views/feeds.py:142 #, python-format @@ -2213,144 +2458,152 @@ msgstr "Helpdesk: Offene Tickets in Ticketsammlung %(queue)s" msgid "Open and Reopened Tickets in queue %(queue)s" msgstr "Offene und wiedergeöffnete Tickets in Ticketsammlung %(queue)s" -#: views/public.py:83 +#: views/public.py:88 msgid "Invalid ticket ID or e-mail address. Please try again." msgstr "" "Ungültige Ticket-ID oder E-Mail-Adresse. Bitte versuchen Sie es erneut." -#: views/public.py:101 +#: views/public.py:106 msgid "Submitter accepted resolution and closed ticket" msgstr "Ersteller akzeptiert die Lösung und hat das Ticket geschlossen." -#: views/staff.py:155 +#: views/staff.py:198 msgid "Accepted resolution and closed ticket" msgstr "Lösung akzeptiert und Ticket geschlossen" -#: views/staff.py:173 +#: views/staff.py:216 msgid "Sorry, you need to login to do that." msgstr "Dafür müssen Sie sich leider anmelden." -#: views/staff.py:206 +#: views/staff.py:256 #, python-format msgid "Assigned to %(username)s" msgstr "%(username)s zugeordnet" -#: views/staff.py:228 +#: views/staff.py:279 msgid "Updated" msgstr "Aktualisiert" -#: views/staff.py:395 +#: views/staff.py:446 #, python-format msgid "Assigned to %(username)s in bulk update" msgstr "%(username)s zugeordnet in Massenaktualisierung" -#: views/staff.py:400 +#: views/staff.py:451 msgid "Unassigned in bulk update" msgstr "Zuordnung in Massenaktualisierung aufgehoben" -#: views/staff.py:405 views/staff.py:410 +#: views/staff.py:456 views/staff.py:461 msgid "Closed in bulk update" msgstr "In Massenaktualisierung geschlossen" -#: views/staff.py:606 +#: views/staff.py:666 msgid "" "

Note: Your keyword search is case sensitive because of " "your database. This means the search will not be accurate. " "By switching to a different database system you will gain better searching! " -"For more information, read the Django Documentation on string matching in SQLite." +"For more information, read the Django Documentation on string " +"matching in SQLite." msgstr "" "

Achtung: Ihre Schlagwortsuche achtet wegen Ihrer " "Datenbank auf Groß- und Kleinschreibung. Das bedeutet, dass die Suche " "nicht genau ist. Durch den Wechsel auf eine andere " "Datenbank werden Sie eine bessere Suche erhalten. Weitere Informationen " -"finden Sie in der Django Dokumentation zur Stringerkennung in SQLite." +"finden Sie in der Django Dokumentation zur Stringerkennung " +"in SQLite." -#: views/staff.py:713 +#: views/staff.py:775 msgid "Ticket taken off hold" msgstr "Ticket wieder freigegeben" -#: views/staff.py:716 +#: views/staff.py:778 msgid "Ticket placed on hold" msgstr "Ticket zurückgehalten" -#: views/staff.py:784 +#: views/staff.py:846 msgid "Jan" msgstr "Jan" -#: views/staff.py:785 +#: views/staff.py:847 msgid "Feb" msgstr "Feb" -#: views/staff.py:786 +#: views/staff.py:848 msgid "Mar" msgstr "Mär" -#: views/staff.py:787 +#: views/staff.py:849 msgid "Apr" msgstr "Apr" -#: views/staff.py:788 +#: views/staff.py:850 msgid "May" msgstr "Mai" -#: views/staff.py:789 +#: views/staff.py:851 msgid "Jun" msgstr "Jun" -#: views/staff.py:790 +#: views/staff.py:852 msgid "Jul" msgstr "Jul" -#: views/staff.py:791 +#: views/staff.py:853 msgid "Aug" msgstr "Aug" -#: views/staff.py:792 +#: views/staff.py:854 msgid "Sep" msgstr "Sep" -#: views/staff.py:793 +#: views/staff.py:855 msgid "Oct" msgstr "Okt" -#: views/staff.py:794 +#: views/staff.py:856 msgid "Nov" msgstr "Nov" -#: views/staff.py:795 +#: views/staff.py:857 msgid "Dec" msgstr "Dez" -#: views/staff.py:821 +#: views/staff.py:883 msgid "User by Priority" msgstr "Benutzer je Priorität" -#: views/staff.py:827 +#: views/staff.py:889 msgid "User by Queue" msgstr "Benutzer je Sammlung" -#: views/staff.py:833 +#: views/staff.py:895 msgid "User by Status" msgstr "Benutzer je Status" -#: views/staff.py:839 +#: views/staff.py:901 msgid "User by Month" msgstr "Benutzer je Monat" -#: views/staff.py:845 +#: views/staff.py:907 msgid "Queue by Priority" msgstr "Sammlung je Priorität" -#: views/staff.py:851 +#: views/staff.py:913 msgid "Queue by Status" msgstr "Sammlung je Status" -#: views/staff.py:857 +#: views/staff.py:919 msgid "Queue by Month" msgstr "Sammlung je Monat" +#~ msgid "Your Tickets" +#~ msgstr "Ihre Tickets" +#~ msgid "" +#~ "Powered by django-" +#~ "helpdesk." +#~ msgstr "" +#~ "Powered by django-" +#~ "helpdesk." diff --git a/helpdesk/locale/en/LC_MESSAGES/django.mo b/helpdesk/locale/en/LC_MESSAGES/django.mo index c0af75e3..25efc87f 100644 Binary files a/helpdesk/locale/en/LC_MESSAGES/django.mo and b/helpdesk/locale/en/LC_MESSAGES/django.mo differ diff --git a/helpdesk/locale/en/LC_MESSAGES/django.po b/helpdesk/locale/en/LC_MESSAGES/django.po index 4f8606ed..3299ef1c 100644 --- a/helpdesk/locale/en/LC_MESSAGES/django.po +++ b/helpdesk/locale/en/LC_MESSAGES/django.po @@ -8,175 +8,167 @@ msgid "" msgstr "" "Project-Id-Version: 0.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-05-11 15:05+1000\n" +"POT-Creation-Date: 2012-01-20 11:41-0800\n" "PO-Revision-Date: 2011-07-02 07:12+10Last-Translator: Ross Poulton " "\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: forms.py:108 forms.py:339 models.py:262 -#: templates/helpdesk/dashboard.html:10 templates/helpdesk/dashboard.html:26 -#: templates/helpdesk/dashboard.html:44 templates/helpdesk/rss_list.html:23 -#: templates/helpdesk/ticket_list.html:54 -#: templates/helpdesk/ticket_list.html:75 -#: templates/helpdesk/ticket_list.html:186 views/staff.py:846 -#: views/staff.py:852 views/staff.py:858 +#: forms.py:113 forms.py:346 models.py:262 views/staff.py:930 +#: views/staff.py:936 views/staff.py:942 msgid "Queue" msgstr "" -#: forms.py:117 +#: forms.py:122 msgid "Summary of the problem" msgstr "" -#: forms.py:122 +#: forms.py:127 msgid "Submitter E-Mail Address" msgstr "" -#: forms.py:123 +#: forms.py:129 msgid "" "This e-mail address will receive copies of all public updates to this ticket." msgstr "" -#: forms.py:129 +#: forms.py:135 msgid "Description of Issue" msgstr "" -#: forms.py:136 +#: forms.py:142 msgid "Case owner" msgstr "" -#: forms.py:137 +#: forms.py:143 msgid "" "If you select an owner other than yourself, they'll be e-mailed details of " "this ticket immediately." msgstr "" -#: forms.py:145 models.py:322 management/commands/escalate_tickets.py:152 -#: templates/helpdesk/public_view_ticket.html:21 -#: templates/helpdesk/ticket.html:129 -#: templates/helpdesk/ticket_desc_table.html:22 -#: templates/helpdesk/ticket_list.html:81 views/staff.py:265 +#: forms.py:151 models.py:322 management/commands/escalate_tickets.py:149 +#: views/staff.py:334 msgid "Priority" msgstr "" -#: forms.py:146 +#: forms.py:152 msgid "Please select a priority carefully. If unsure, leave it as '3'." msgstr "" -#: forms.py:152 forms.py:375 +#: forms.py:158 forms.py:387 msgid "Attach File" msgstr "" -#: forms.py:153 forms.py:376 +#: forms.py:159 forms.py:388 msgid "You can attach a file such as a document or screenshot to this ticket." msgstr "" -#: forms.py:161 templates/helpdesk/public_view_ticket.html:33 -#: templates/helpdesk/ticket.html:132 -#: templates/helpdesk/ticket_desc_table.html:33 -#: templates/helpdesk/ticket_list.html:58 -#: templates/helpdesk/ticket_list.html:186 views/staff.py:276 +#: forms.py:167 views/staff.py:345 msgid "Tags" msgstr "" -#: forms.py:162 +#: forms.py:168 msgid "" "Words, separated by spaces, or phrases separated by commas. These should " "communicate significant characteristics of this ticket" msgstr "" -#: forms.py:251 +#: forms.py:261 msgid "Ticket Opened" msgstr "" -#: forms.py:258 +#: forms.py:268 #, python-format msgid "Ticket Opened & Assigned to %(name)s" msgstr "" -#: forms.py:348 +#: forms.py:355 msgid "Summary of your query" msgstr "" -#: forms.py:353 +#: forms.py:360 msgid "Your E-Mail Address" msgstr "" -#: forms.py:354 +#: forms.py:361 msgid "We will e-mail you when your ticket is updated." msgstr "" -#: forms.py:359 +#: forms.py:366 msgid "Description of your issue" msgstr "" -#: forms.py:361 +#: forms.py:368 msgid "" "Please be as descriptive as possible, including any details we may need to " "address your query." msgstr "" -#: forms.py:369 +#: forms.py:376 msgid "Urgency" msgstr "" -#: forms.py:370 +#: forms.py:377 msgid "Please select a priority carefully." msgstr "" -#: forms.py:458 +#: forms.py:382 +msgid "Due on" +msgstr "" + +#: forms.py:470 msgid "Ticket Opened Via Web" msgstr "" -#: forms.py:528 +#: forms.py:537 msgid "Show Ticket List on Login?" msgstr "" -#: forms.py:529 +#: forms.py:538 msgid "Display the ticket list upon login? Otherwise, the dashboard is shown." msgstr "" -#: forms.py:534 +#: forms.py:543 msgid "E-mail me on ticket change?" msgstr "" -#: forms.py:535 +#: forms.py:544 msgid "" "If you're the ticket owner and the ticket is changed via the web by somebody " "else, do you want to receive an e-mail?" msgstr "" -#: forms.py:540 +#: forms.py:549 msgid "E-mail me when assigned a ticket?" msgstr "" -#: forms.py:541 +#: forms.py:550 msgid "" "If you are assigned a ticket via the web, do you want to receive an e-mail?" msgstr "" -#: forms.py:546 +#: forms.py:555 msgid "E-mail me when a ticket is changed via the API?" msgstr "" -#: forms.py:547 +#: forms.py:556 msgid "If a ticket is altered by the API, do you want to receive an e-mail?" msgstr "" -#: forms.py:552 +#: forms.py:561 msgid "Number of tickets to show per page" msgstr "" -#: forms.py:553 +#: forms.py:562 msgid "How many tickets do you want to see on the Ticket List page?" msgstr "" -#: forms.py:560 +#: forms.py:569 msgid "Use my e-mail address when submitting tickets?" msgstr "" -#: forms.py:561 +#: forms.py:570 msgid "" "When you submit a ticket, do you want to automatically use your e-mail " "address as the submitter address? You can type a different e-mail address " @@ -184,13 +176,11 @@ msgid "" msgstr "" #: models.py:32 models.py:256 models.py:484 models.py:781 models.py:815 -#: templates/helpdesk/dashboard.html:26 templates/helpdesk/dashboard.html:44 -#: templates/helpdesk/ticket.html:123 templates/helpdesk/ticket_list.html:72 -#: templates/helpdesk/ticket_list.html:186 views/staff.py:255 +#: views/staff.py:324 msgid "Title" msgstr "" -#: models.py:37 models.py:786 models.py:1152 +#: models.py:37 models.py:786 models.py:1156 msgid "Slug" msgstr "" @@ -200,9 +190,7 @@ msgid "" "or e-mailing may get messy." msgstr "" -#: models.py:43 models.py:1009 models.py:1079 models.py:1149 -#: templates/helpdesk/email_ignore_list.html:13 -#: templates/helpdesk/ticket_cc_list.html:15 +#: models.py:43 models.py:1009 models.py:1079 models.py:1153 msgid "E-Mail Address" msgstr "" @@ -354,31 +342,23 @@ msgstr "" msgid "How often do you wish to check this mailbox? (in Minutes)" msgstr "" -#: models.py:240 templates/helpdesk/dashboard.html:10 -#: templates/helpdesk/ticket.html:87 +#: models.py:240 msgid "Open" msgstr "" -#: models.py:241 templates/helpdesk/ticket.html:93 -#: templates/helpdesk/ticket.html.py:99 templates/helpdesk/ticket.html:104 -#: templates/helpdesk/ticket.html.py:108 +#: models.py:241 msgid "Reopened" msgstr "" -#: models.py:242 templates/helpdesk/dashboard.html:10 -#: templates/helpdesk/ticket.html:88 templates/helpdesk/ticket.html.py:94 -#: templates/helpdesk/ticket.html:100 +#: models.py:242 msgid "Resolved" msgstr "" -#: models.py:243 templates/helpdesk/ticket.html:89 -#: templates/helpdesk/ticket.html.py:95 templates/helpdesk/ticket.html:101 -#: templates/helpdesk/ticket.html.py:105 +#: models.py:243 msgid "Closed" msgstr "" -#: models.py:244 templates/helpdesk/ticket.html:90 -#: templates/helpdesk/ticket.html.py:96 templates/helpdesk/ticket.html:109 +#: models.py:244 msgid "Duplicate" msgstr "" @@ -402,9 +382,7 @@ msgstr "" msgid "5. Very Low" msgstr "" -#: models.py:266 templates/helpdesk/dashboard.html:44 -#: templates/helpdesk/ticket_list.html:69 -#: templates/helpdesk/ticket_list.html:186 +#: models.py:266 msgid "Created" msgstr "" @@ -420,8 +398,7 @@ msgstr "" msgid "Date this ticket was most recently changed." msgstr "" -#: models.py:278 templates/helpdesk/public_view_ticket.html:16 -#: templates/helpdesk/ticket_desc_table.html:17 +#: models.py:278 msgid "Submitter E-Mail" msgstr "" @@ -435,10 +412,7 @@ msgstr "" msgid "Assigned to" msgstr "" -#: models.py:294 templates/helpdesk/dashboard.html:26 -#: templates/helpdesk/ticket_list.html:55 -#: templates/helpdesk/ticket_list.html:78 -#: templates/helpdesk/ticket_list.html:186 +#: models.py:294 msgid "Status" msgstr "" @@ -450,8 +424,7 @@ msgstr "" msgid "If a ticket is on hold, it will not automatically be escalated." msgstr "" -#: models.py:308 models.py:790 templates/helpdesk/public_view_ticket.html:39 -#: templates/helpdesk/ticket_desc_table.html:58 +#: models.py:308 models.py:790 msgid "Description" msgstr "" @@ -459,8 +432,7 @@ msgstr "" msgid "The content of the customers query." msgstr "" -#: models.py:315 templates/helpdesk/public_view_ticket.html:46 -#: templates/helpdesk/ticket_desc_table.html:65 +#: models.py:315 msgid "Resolution" msgstr "" @@ -478,8 +450,8 @@ msgid "" "management/commands/escalate_tickets.py." msgstr "" -#: models.py:342 templates/helpdesk/ticket_desc_table.html:13 -#: views/feeds.py:91 views/feeds.py:117 views/feeds.py:171 views/staff.py:212 +#: models.py:342 views/feeds.py:91 views/feeds.py:117 views/feeds.py:171 +#: views/staff.py:281 msgid "Unassigned" msgstr "" @@ -487,17 +459,15 @@ msgstr "" msgid " - On Hold" msgstr "" -#: models.py:475 models.py:1067 models.py:1207 models.py:1232 -#: templates/helpdesk/public_homepage.html:9 -#: templates/helpdesk/public_view_form.html:12 +#: models.py:475 models.py:1067 models.py:1225 models.py:1250 msgid "Ticket" msgstr "" -#: models.py:479 models.py:708 models.py:1002 models.py:1146 +#: models.py:479 models.py:708 models.py:1002 models.py:1150 msgid "Date" msgstr "" -#: models.py:491 views/staff.py:226 +#: models.py:491 views/staff.py:295 msgid "Comment" msgstr "" @@ -511,12 +481,12 @@ msgid "" "tickets can only be seen by staff." msgstr "" -#: models.py:508 models.py:882 models.py:1075 views/staff.py:822 -#: views/staff.py:828 views/staff.py:834 views/staff.py:840 +#: models.py:508 models.py:882 models.py:1075 views/staff.py:906 +#: views/staff.py:912 views/staff.py:918 views/staff.py:924 msgid "User" msgstr "" -#: models.py:512 templates/helpdesk/ticket.html:84 +#: models.py:512 msgid "New Status" msgstr "" @@ -528,7 +498,7 @@ msgstr "" msgid "Follow-up" msgstr "" -#: models.py:549 models.py:1212 +#: models.py:549 models.py:1230 msgid "Field" msgstr "" @@ -581,7 +551,6 @@ msgid "" msgstr "" #: models.py:662 models.py:703 models.py:997 -#: templates/helpdesk/email_ignore_list.html:13 msgid "Name" msgstr "" @@ -657,7 +626,7 @@ msgstr "" msgid "Locale of this template." msgstr "" -#: models.py:811 templates/helpdesk/kb_index.html:10 +#: models.py:811 msgid "Category" msgstr "" @@ -697,7 +666,7 @@ msgstr "" msgid "Unrated" msgstr "" -#: models.py:886 templates/helpdesk/ticket_list.html:145 +#: models.py:886 msgid "Query Name" msgstr "" @@ -781,118 +750,136 @@ msgstr "" msgid "Can this CC login and update the ticket?" msgstr "" -#: models.py:1121 +#: models.py:1125 msgid "Field Name" msgstr "" -#: models.py:1122 +#: models.py:1126 msgid "" "As used in the database and behind the scenes. Must be unique and consist of " "only lowercase letters with no punctuation." msgstr "" -#: models.py:1127 +#: models.py:1131 msgid "Label" msgstr "" -#: models.py:1129 +#: models.py:1133 msgid "The display label for this field" msgstr "" -#: models.py:1133 +#: models.py:1137 msgid "Help Text" msgstr "" -#: models.py:1134 +#: models.py:1138 msgid "Shown to the user when editing the ticket" msgstr "" -#: models.py:1140 +#: models.py:1144 msgid "Character (single line)" msgstr "" -#: models.py:1141 +#: models.py:1145 msgid "Text (multi-line)" msgstr "" -#: models.py:1142 +#: models.py:1146 msgid "Integer" msgstr "" -#: models.py:1143 +#: models.py:1147 msgid "Decimal" msgstr "" -#: models.py:1144 +#: models.py:1148 msgid "List" msgstr "" -#: models.py:1145 +#: models.py:1149 msgid "Boolean (checkbox yes/no)" msgstr "" -#: models.py:1147 +#: models.py:1151 msgid "Time" msgstr "" -#: models.py:1148 +#: models.py:1152 msgid "Date & Time" msgstr "" -#: models.py:1150 +#: models.py:1154 msgid "URL" msgstr "" -#: models.py:1151 +#: models.py:1155 msgid "IP Address" msgstr "" -#: models.py:1156 +#: models.py:1160 msgid "Data Type" msgstr "" -#: models.py:1158 +#: models.py:1162 msgid "Allows you to restrict the data entered into this field" msgstr "" -#: models.py:1163 +#: models.py:1167 msgid "Maximum Length (characters)" msgstr "" -#: models.py:1169 +#: models.py:1173 msgid "Decimal Places" msgstr "" -#: models.py:1170 +#: models.py:1174 msgid "Only used for decimal fields" msgstr "" -#: models.py:1176 +#: models.py:1180 +msgid "Add empty first choice to List?" +msgstr "" + +#: models.py:1181 +msgid "" +"Only for List: adds an empty first entry to the choices list, which enforces " +"that the user makes an active choice." +msgstr "" + +#: models.py:1185 msgid "List Values" msgstr "" -#: models.py:1177 +#: models.py:1186 msgid "For list fields only. Enter one option per line." msgstr "" -#: models.py:1191 +#: models.py:1192 +msgid "Ordering" +msgstr "" + +#: models.py:1193 +msgid "Lower numbers are displayed first; higher numbers are listed later" +msgstr "" + +#: models.py:1207 msgid "Required?" msgstr "" -#: models.py:1192 +#: models.py:1208 msgid "Does the user have to enter a value for this field?" msgstr "" -#: models.py:1196 +#: models.py:1212 msgid "Staff Only?" msgstr "" -#: models.py:1197 +#: models.py:1213 msgid "" "If this is ticked, then the public submission form will NOT show this field" msgstr "" -#: models.py:1238 +#: models.py:1256 msgid "Depends On Ticket" msgstr "" @@ -903,1063 +890,47 @@ msgid "" "suit your situation." msgstr "" -#: management/commands/escalate_tickets.py:146 +#: management/commands/escalate_tickets.py:143 #, python-format msgid "Ticket escalated after %s days" msgstr "" -#: management/commands/get_email.py:146 +#: management/commands/get_email.py:151 msgid "Created from e-mail" msgstr "" -#: management/commands/get_email.py:150 +#: management/commands/get_email.py:155 msgid "Unknown Sender" msgstr "" -#: management/commands/get_email.py:204 +#: management/commands/get_email.py:209 msgid "" "No plain-text email body available. Please see attachment email_html_body." "html." msgstr "" -#: management/commands/get_email.py:208 +#: management/commands/get_email.py:213 msgid "email_html_body.html" msgstr "" -#: management/commands/get_email.py:285 +#: management/commands/get_email.py:287 msgid " (Reopened)" msgstr "" -#: management/commands/get_email.py:287 +#: management/commands/get_email.py:289 msgid " (Updated)" msgstr "" -#: management/commands/get_email.py:309 +#: management/commands/get_email.py:311 #, python-format msgid "E-Mail Received from %(sender_email)s" msgstr "" -#: management/commands/get_email.py:317 +#: management/commands/get_email.py:319 #, python-format msgid "Ticket Re-Opened by E-Mail Received from %(sender_email)s" msgstr "" -#: templates/helpdesk/base.html:7 -msgid "Powered by django-helpdesk" -msgstr "" - -#: templates/helpdesk/base.html:12 templates/helpdesk/rss_list.html:9 -#: templates/helpdesk/rss_list.html:23 templates/helpdesk/rss_list.html:28 -msgid "My Open Tickets" -msgstr "" - -#: templates/helpdesk/base.html:13 -msgid "All Recent Activity" -msgstr "" - -#: templates/helpdesk/base.html:14 templates/helpdesk/dashboard.html:43 -#: templates/helpdesk/rss_list.html:15 -msgid "Unassigned Tickets" -msgstr "" - -#: templates/helpdesk/base.html:45 templates/helpdesk/public_base.html:3 -#: templates/helpdesk/public_base.html:11 -msgid "Helpdesk" -msgstr "" - -#: templates/helpdesk/base.html:54 -msgid "" -"Powered by django-" -"helpdesk." -msgstr "" - -#: templates/helpdesk/base.html:54 templates/helpdesk/rss_list.html:9 -#: templates/helpdesk/rss_list.html:12 templates/helpdesk/rss_list.html:15 -#: templates/helpdesk/rss_list.html:27 templates/helpdesk/rss_list.html:28 -msgid "RSS Icon" -msgstr "" - -#: templates/helpdesk/base.html:54 templates/helpdesk/rss_list.html:2 -#: templates/helpdesk/rss_list.html.py:4 -msgid "RSS Feeds" -msgstr "" - -#: templates/helpdesk/base.html:54 -msgid "API" -msgstr "" - -#: templates/helpdesk/base.html:54 -msgid "User Settings" -msgstr "" - -#: templates/helpdesk/base.html:54 -msgid "System Settings" -msgstr "" - -#: templates/helpdesk/confirm_delete_saved_query.html:3 -#: templates/helpdesk/ticket_list.html:134 -msgid "Delete Saved Query" -msgstr "" - -#: templates/helpdesk/confirm_delete_saved_query.html:5 -#, python-format -msgid "" -"\n" -"

Delete Query

\n" -"\n" -"

Are you sure you want to delete this saved filter (%(query_title)s)? To re-create it, you will need to manually re-filter your ticket " -"listing.

\n" -msgstr "" - -#: templates/helpdesk/confirm_delete_saved_query.html:11 -msgid "" -"\n" -"

You have shared this query, so other users may be using it. If you delete " -"it, they will have to manually create their own query.

\n" -msgstr "" - -#: templates/helpdesk/confirm_delete_saved_query.html:15 -#: templates/helpdesk/delete_ticket.html:11 -msgid "No, Don't Delete It" -msgstr "" - -#: templates/helpdesk/confirm_delete_saved_query.html:17 -#: templates/helpdesk/delete_ticket.html:13 -msgid "Yes - Delete It" -msgstr "" - -#: templates/helpdesk/create_ticket.html:3 -msgid "Create Ticket" -msgstr "" - -#: templates/helpdesk/create_ticket.html:6 -msgid "" -"

Submit a Ticket

\n" -"\n" -"

Unless otherwise stated, all fields are required. Please provide as " -"descriptive a title and description as possible.

" -msgstr "" - -#: templates/helpdesk/create_ticket.html:17 -#: templates/helpdesk/edit_ticket.html:19 -#: templates/helpdesk/public_homepage.html:31 -msgid "(Optional)" -msgstr "" - -#: templates/helpdesk/create_ticket.html:26 -#: templates/helpdesk/public_homepage.html:40 -msgid "Submit Ticket" -msgstr "" - -#: templates/helpdesk/dashboard.html:2 -msgid "Helpdesk Dashboard" -msgstr "" - -#: templates/helpdesk/dashboard.html:9 -msgid "Helpdesk Summary" -msgstr "" - -#: templates/helpdesk/dashboard.html:20 -msgid "" -"Welcome to your Helpdesk Dashboard! From here you can quickly see your own " -"tickets, and those tickets that have no owner. Why not pick up an orphan " -"ticket and sort it out for a customer?" -msgstr "" - -#: templates/helpdesk/dashboard.html:25 -msgid "Your Tickets" -msgstr "" - -#: templates/helpdesk/dashboard.html:26 templates/helpdesk/dashboard.html:44 -#: templates/helpdesk/ticket_list.html:186 -msgid "Pr" -msgstr "" - -#: templates/helpdesk/dashboard.html:26 -msgid "Last Update" -msgstr "" - -#: templates/helpdesk/dashboard.html:38 -msgid "You have no tickets assigned to you." -msgstr "" - -#: templates/helpdesk/dashboard.html:52 -#: templates/helpdesk/ticket_desc_table.html:13 -msgid "Take" -msgstr "" - -#: templates/helpdesk/dashboard.html:52 -#: templates/helpdesk/email_ignore_list.html:13 -#: templates/helpdesk/email_ignore_list.html:23 -#: templates/helpdesk/ticket_cc_list.html:15 -#: templates/helpdesk/ticket_cc_list.html:23 -msgid "Delete" -msgstr "" - -#: templates/helpdesk/dashboard.html:56 -msgid "There are no unassigned tickets." -msgstr "" - -#: templates/helpdesk/delete_ticket.html:3 -msgid "Delete Ticket" -msgstr "" - -#: templates/helpdesk/delete_ticket.html:5 -#, python-format -msgid "" -"\n" -"

Delete Ticket

\n" -"\n" -"

Are you sure you want to delete this ticket (%(ticket_title)s)? " -"All traces of the ticket, including followups, attachments, and updates will " -"be irreversably removed.

\n" -msgstr "" - -#: templates/helpdesk/edit_ticket.html:3 -msgid "Edit Ticket" -msgstr "" - -#: templates/helpdesk/edit_ticket.html:6 -msgid "" -"

Edit a Ticket

\n" -"\n" -"

Unless otherwise stated, all fields are required. Please provide as " -"descriptive a title and description as possible.

\n" -"\n" -"

Note: Editing a ticket does not send an e-mail " -"to the ticket owner or submitter. No new details should be entered, this " -"form should only be used to fix incorrect details or clean up the submission." -"

" -msgstr "" - -#: templates/helpdesk/edit_ticket.html:28 -msgid "Save Changes" -msgstr "" - -#: templates/helpdesk/email_ignore_add.html:3 -#: templates/helpdesk/email_ignore_add.html:23 -msgid "Ignore E-Mail Address" -msgstr "" - -#: templates/helpdesk/email_ignore_add.html:5 -msgid "" -"\n" -"

Ignore E-Mail Address

\n" -"\n" -"

To ignore an e-mail address and prevent any emails from that address " -"creating tickets automatically, enter the e-mail address below.

\n" -"\n" -"

You can either enter a whole e-mail address such as email@domain.com or a portion of an e-mail address with a wildcard, such as *@domain." -"com or user@*.

" -msgstr "" - -#: templates/helpdesk/email_ignore_del.html:3 -msgid "Delete Ignored E-Mail Address" -msgstr "" - -#: templates/helpdesk/email_ignore_del.html:5 -#, python-format -msgid "" -"\n" -"

Un-Ignore E-Mail Address

\n" -"\n" -"

Are you sure you wish to stop removing this email address (%" -"(email_address)s) and allow their e-mails to automatically create " -"tickets in your system? You can re-add this e-mail address at any time.

\n" -msgstr "" - -#: templates/helpdesk/email_ignore_del.html:11 -msgid "Keep Ignoring It" -msgstr "" - -#: templates/helpdesk/email_ignore_del.html:13 -msgid "Stop Ignoring It" -msgstr "" - -#: templates/helpdesk/email_ignore_list.html:3 -#: templates/helpdesk/email_ignore_list.html:12 -msgid "Ignored E-Mail Addresses" -msgstr "" - -#: templates/helpdesk/email_ignore_list.html:5 -msgid "" -"\n" -"

Ignored E-Mail Addresses

\n" -"\n" -"

The following e-mail addresses are currently being ignored by the " -"incoming e-mail processor. You can add a new e-mail address " -"to the list or delete any of the items below as required.

" -msgstr "" - -#: templates/helpdesk/email_ignore_list.html:13 -msgid "Date Added" -msgstr "" - -#: templates/helpdesk/email_ignore_list.html:13 -msgid "Queues" -msgstr "" - -#: templates/helpdesk/email_ignore_list.html:13 -msgid "Keep in mailbox?" -msgstr "" - -#: templates/helpdesk/email_ignore_list.html:21 -msgid "All" -msgstr "" - -#: templates/helpdesk/email_ignore_list.html:22 -msgid "Keep" -msgstr "" - -#: templates/helpdesk/email_ignore_list.html:29 -msgid "" -"Note: If the 'Keep' option is not selected, emails sent " -"from that address will be deleted permanently." -msgstr "" - -#: templates/helpdesk/followup_edit.html:2 -msgid "Edit followup" -msgstr "" - -#: templates/helpdesk/followup_edit.html:9 -msgid "Edit FollowUp" -msgstr "" - -#: templates/helpdesk/followup_edit.html:14 -msgid "Reassign ticket:" -msgstr "" - -#: templates/helpdesk/followup_edit.html:16 -msgid "Title:" -msgstr "" - -#: templates/helpdesk/followup_edit.html:19 -msgid "Comment:" -msgstr "" - -#: templates/helpdesk/kb_category.html:4 -#: templates/helpdesk/kb_category.html:11 -#, python-format -msgid "Knowledgebase Category: %(kbcat)s" -msgstr "" - -#: templates/helpdesk/kb_category.html:6 -#, python-format -msgid "You are viewing all items in the %(kbcat)s category." -msgstr "" - -#: templates/helpdesk/kb_category.html:12 -msgid "Article" -msgstr "" - -#: templates/helpdesk/kb_index.html:4 templates/helpdesk/navigation.html:26 -msgid "Knowledgebase" -msgstr "" - -#: templates/helpdesk/kb_index.html:6 -msgid "" -"We have listed a number of knowledgebase articles for your perusal in the " -"following categories. Please check to see if any of these articles address " -"your problem prior to opening a support ticket." -msgstr "" - -#: templates/helpdesk/kb_index.html:9 -msgid "Knowledgebase Categories" -msgstr "" - -#: templates/helpdesk/kb_item.html:4 -#, python-format -msgid "Knowledgebase: %(item)s" -msgstr "" - -#: templates/helpdesk/kb_item.html:13 -#, python-format -msgid "" -"View other %(category_title)s articles, or continue viewing other knowledgebase articles." -msgstr "" - -#: templates/helpdesk/kb_item.html:15 -msgid "Feedback" -msgstr "" - -#: templates/helpdesk/kb_item.html:17 -msgid "" -"We give our users an opportunity to vote for items that they believe have " -"helped them out, in order for us to better serve future customers. We would " -"appreciate your feedback on this article. Did you find it useful?" -msgstr "" - -#: templates/helpdesk/kb_item.html:20 -msgid "This article was useful to me" -msgstr "" - -#: templates/helpdesk/kb_item.html:21 -msgid "This article was not useful to me" -msgstr "" - -#: templates/helpdesk/kb_item.html:24 -msgid "The results of voting by other readers of this article are below:" -msgstr "" - -#: templates/helpdesk/kb_item.html:27 -#, python-format -msgid "Recommendations: %(recommendations)s" -msgstr "" - -#: templates/helpdesk/kb_item.html:28 -#, python-format -msgid "Votes: %(votes)s" -msgstr "" - -#: templates/helpdesk/kb_item.html:29 -#, python-format -msgid "Overall Rating: %(score)s" -msgstr "" - -#: templates/helpdesk/navigation.html:4 -msgid "Dashboard" -msgstr "" - -#: templates/helpdesk/navigation.html:5 -#: templates/helpdesk/ticket_list.html:185 -msgid "Tickets" -msgstr "" - -#: templates/helpdesk/navigation.html:6 -msgid "New Ticket" -msgstr "" - -#: templates/helpdesk/navigation.html:7 -msgid "Stats" -msgstr "" - -#: templates/helpdesk/navigation.html:20 -msgid "Logout" -msgstr "" - -#: templates/helpdesk/navigation.html:21 -msgid "Search..." -msgstr "" - -#: templates/helpdesk/navigation.html:21 -msgid "Enter a keyword, or a ticket number to jump straight to that ticket." -msgstr "" - -#: templates/helpdesk/navigation.html:25 -msgid "Submit A Ticket" -msgstr "" - -#: templates/helpdesk/navigation.html:27 -msgid "Log In" -msgstr "" - -#: templates/helpdesk/public_base.html:18 -msgid "" -"Powered by django-" -"helpdesk." -msgstr "" - -#: templates/helpdesk/public_homepage.html:4 -#: templates/helpdesk/public_view_form.html:4 -#: templates/helpdesk/public_view_ticket.html:2 -msgid "View a Ticket" -msgstr "" - -#: templates/helpdesk/public_homepage.html:12 -#: templates/helpdesk/public_view_form.html:15 -msgid "Your E-mail Address" -msgstr "" - -#: templates/helpdesk/public_homepage.html:16 -#: templates/helpdesk/public_view_form.html:19 -msgid "View Ticket" -msgstr "" - -#: templates/helpdesk/public_homepage.html:20 -msgid "Submit a Ticket" -msgstr "" - -#: templates/helpdesk/public_homepage.html:22 -msgid "" -"All fields are required. Please provide as descriptive a title and " -"description as possible." -msgstr "" - -#: templates/helpdesk/public_spam.html:4 -msgid "Unable To Open Ticket" -msgstr "" - -#: templates/helpdesk/public_spam.html:6 -msgid "" -"

Sorry, but there has been an error trying to submit your ticket.

\n" -"\n" -"

Our system has marked your submission as spam, so we are " -"unable to save it. If this is not spam, please press back and re-type your " -"message. Be careful to avoid sounding 'spammy', and if you have heaps of " -"links please try removing them if possible.

\n" -"\n" -"

We are sorry for any inconvenience, however this check is required to " -"avoid our helpdesk resources being overloaded by spammers.

\n" -msgstr "" - -#: templates/helpdesk/public_view_form.html:8 -msgid "Error:" -msgstr "" - -#: templates/helpdesk/public_view_ticket.html:8 -#, python-format -msgid "Queue: %(queue_name)s" -msgstr "" - -#: templates/helpdesk/public_view_ticket.html:11 -#: templates/helpdesk/ticket_desc_table.html:7 -msgid "Submitted On" -msgstr "" - -#: templates/helpdesk/public_view_ticket.html:46 -#: templates/helpdesk/ticket_desc_table.html:65 -msgid "Accept" -msgstr "" - -#: templates/helpdesk/public_view_ticket.html:46 -#: templates/helpdesk/ticket_desc_table.html:65 -msgid "Accept and Close" -msgstr "" - -#: templates/helpdesk/public_view_ticket.html:55 -#: templates/helpdesk/ticket.html:48 -msgid "Follow-Ups" -msgstr "" - -#: templates/helpdesk/public_view_ticket.html:63 -#: templates/helpdesk/ticket.html:59 -#, python-format -msgid "Changed %(field)s from %(old_value)s to %(new_value)s." -msgstr "" - -#: templates/helpdesk/report_index.html:3 -#: templates/helpdesk/report_index.html:6 -#: templates/helpdesk/report_output.html:3 -#: templates/helpdesk/report_output.html:16 -msgid "Reports & Statistics" -msgstr "" - -#: templates/helpdesk/report_index.html:9 -msgid "You haven't created any tickets yet, so you cannot run any reports." -msgstr "" - -#: templates/helpdesk/report_index.html:13 -msgid "Reports By User" -msgstr "" - -#: templates/helpdesk/report_index.html:15 -#: templates/helpdesk/report_index.html:24 -msgid "by Priority" -msgstr "" - -#: templates/helpdesk/report_index.html:16 -msgid "by Queue" -msgstr "" - -#: templates/helpdesk/report_index.html:17 -#: templates/helpdesk/report_index.html:25 -msgid "by Status" -msgstr "" - -#: templates/helpdesk/report_index.html:18 -#: templates/helpdesk/report_index.html:26 -msgid "by Month" -msgstr "" - -#: templates/helpdesk/report_index.html:22 -msgid "Reports By Queue" -msgstr "" - -#: templates/helpdesk/rss_list.html:6 -msgid "" -"The following RSS feeds are available for you to monitor using your " -"preferred RSS software. With the exception of the 'Latest Activity' feed, " -"all feeds provide information only on Open and Reopened cases. This ensures " -"your RSS reader isn't full of information about closed or historical tasks." -msgstr "" - -#: templates/helpdesk/rss_list.html:10 -msgid "" -"A summary of your open tickets - useful for getting alerted to new tickets " -"opened for you" -msgstr "" - -#: templates/helpdesk/rss_list.html:12 -msgid "Latest Activity" -msgstr "" - -#: templates/helpdesk/rss_list.html:13 -msgid "" -"A summary of all helpdesk activity - including comments, emails, " -"attachments, and more" -msgstr "" - -#: templates/helpdesk/rss_list.html:16 -msgid "" -"All unassigned tickets - useful for being alerted to new tickets opened by " -"the public via the web or via e-mail" -msgstr "" - -#: templates/helpdesk/rss_list.html:19 -msgid "" -"These RSS feeds allow you to view a summary of either your own tickets, or " -"all tickets, for each of the queues in your helpdesk. For example, if you " -"manage the staff who utilise a particular queue, this may be used to view " -"new tickets coming into that queue." -msgstr "" - -#: templates/helpdesk/rss_list.html:22 -msgid "Per-Queue Feeds" -msgstr "" - -#: templates/helpdesk/rss_list.html:23 -msgid "All Open Tickets" -msgstr "" - -#: templates/helpdesk/rss_list.html:27 -msgid "Open Tickets" -msgstr "" - -#: templates/helpdesk/system_settings.html:3 -msgid "Change System Settings" -msgstr "" - -#: templates/helpdesk/system_settings.html:5 -msgid "" -"\n" -"

System Settings

\n" -"\n" -"

The following items can be maintained by you or other superusers:

" -msgstr "" - -#: templates/helpdesk/system_settings.html:11 -msgid "E-Mail Ignore list" -msgstr "" - -#: templates/helpdesk/system_settings.html:12 -msgid "Maintain Queues" -msgstr "" - -#: templates/helpdesk/system_settings.html:13 -msgid "Maintain Pre-Set Replies" -msgstr "" - -#: templates/helpdesk/system_settings.html:14 -msgid "Maintain Knowledgebase Categories" -msgstr "" - -#: templates/helpdesk/system_settings.html:15 -msgid "Maintain Knowledgebase Items" -msgstr "" - -#: templates/helpdesk/system_settings.html:16 -msgid "Maintain E-Mail Templates" -msgstr "" - -#: templates/helpdesk/system_settings.html:17 -msgid "Maintain Users" -msgstr "" - -#: templates/helpdesk/ticket.html:2 -msgid "View Ticket Details" -msgstr "" - -#: templates/helpdesk/ticket.html:34 -msgid "Attach another File" -msgstr "" - -#: templates/helpdesk/ticket.html:34 templates/helpdesk/ticket.html.py:147 -msgid "Add Another File" -msgstr "" - -#: templates/helpdesk/ticket.html:53 -msgid "Private" -msgstr "" - -#: templates/helpdesk/ticket.html:70 -msgid "Respond to this ticket" -msgstr "" - -#: templates/helpdesk/ticket.html:76 -msgid "Use a Pre-set Reply" -msgstr "" - -#: templates/helpdesk/ticket.html:78 -msgid "" -"Selecting a pre-set reply will over-write your comment below. You can then " -"modify the pre-set reply to your liking before saving this update." -msgstr "" - -#: templates/helpdesk/ticket.html:80 -msgid "Comment / Resolution" -msgstr "" - -#: templates/helpdesk/ticket.html:82 -msgid "" -"You can insert ticket and queue details in your message. For more " -"information, see the context help page." -msgstr "" - -#: templates/helpdesk/ticket.html:85 -msgid "" -"This ticket cannot be resolved or closed until the tickets it depends on are " -"resolved." -msgstr "" - -#: templates/helpdesk/ticket.html:112 -msgid "Is this update public?" -msgstr "" - -#: templates/helpdesk/ticket.html:114 -msgid "" -"If this is public, the submitter will be e-mailed your comment or resolution." -msgstr "" - -#: templates/helpdesk/ticket.html:117 -msgid "Change Further Details »" -msgstr "" - -#: templates/helpdesk/ticket.html:126 templates/helpdesk/ticket_list.html:53 -#: templates/helpdesk/ticket_list.html:84 -#: templates/helpdesk/ticket_list.html:186 -msgid "Owner" -msgstr "" - -#: templates/helpdesk/ticket.html:127 -msgid "Unassign" -msgstr "" - -#: templates/helpdesk/ticket.html:140 -msgid "Attach File(s) »" -msgstr "" - -#: templates/helpdesk/ticket.html:146 -msgid "Attach a File" -msgstr "" - -#: templates/helpdesk/ticket.html:154 -msgid "Update This Ticket" -msgstr "" - -#: templates/helpdesk/ticket_cc_add.html:3 -msgid "Add Ticket CC" -msgstr "" - -#: templates/helpdesk/ticket_cc_add.html:5 -msgid "" -"\n" -"

Add Ticket CC

\n" -"\n" -"

To automatically send an email to a user or e-mail address when this " -"ticket is updated, select the user or enter an e-mail address below.

" -msgstr "" - -#: templates/helpdesk/ticket_cc_add.html:21 -msgid "Save Ticket CC" -msgstr "" - -#: templates/helpdesk/ticket_cc_del.html:3 -msgid "Delete Ticket CC" -msgstr "" - -#: templates/helpdesk/ticket_cc_del.html:5 -#, python-format -msgid "" -"\n" -"

Delete Ticket CC

\n" -"\n" -"

Are you sure you wish to delete this email address (%(email_address)" -"s) from the CC list for this ticket? They will stop receiving updates.\n" -msgstr "" - -#: templates/helpdesk/ticket_cc_del.html:11 -#: templates/helpdesk/ticket_dependency_del.html:11 -msgid "Don't Delete" -msgstr "" - -#: templates/helpdesk/ticket_cc_del.html:13 -#: templates/helpdesk/ticket_dependency_del.html:13 -msgid "Yes, Delete" -msgstr "" - -#: templates/helpdesk/ticket_cc_list.html:3 -msgid "Ticket CC Settings" -msgstr "" - -#: templates/helpdesk/ticket_cc_list.html:5 -#, python-format -msgid "" -"\n" -"

Ticket CC Settings

\n" -"\n" -"

The following people will receive an e-mail whenever %" -"(ticket_title)s is updated. Some people can also view or edit the " -"ticket via the public ticket views.

\n" -"\n" -"

You can add a new e-mail address to the list or delete " -"any of the items below as required.

" -msgstr "" - -#: templates/helpdesk/ticket_cc_list.html:14 -msgid "Ticket CC List" -msgstr "" - -#: templates/helpdesk/ticket_cc_list.html:15 -msgid "View?" -msgstr "" - -#: templates/helpdesk/ticket_cc_list.html:15 -msgid "Update?" -msgstr "" - -#: templates/helpdesk/ticket_cc_list.html:29 -#, python-format -msgid "Return to %(ticket_title)s" -msgstr "" - -#: templates/helpdesk/ticket_dependency_add.html:3 -msgid "Add Ticket Dependency" -msgstr "" - -#: templates/helpdesk/ticket_dependency_add.html:5 -msgid "" -"\n" -"

Add Ticket Dependency

\n" -"\n" -"

Adding a dependency will stop you resolving this ticket until the " -"dependent ticket has been resolved or closed.

" -msgstr "" - -#: templates/helpdesk/ticket_dependency_add.html:21 -msgid "Save Ticket Dependency" -msgstr "" - -#: templates/helpdesk/ticket_dependency_del.html:3 -msgid "Delete Ticket Dependency" -msgstr "" - -#: templates/helpdesk/ticket_dependency_del.html:5 -msgid "" -"\n" -"

Delete Ticket Dependency

\n" -"\n" -"

Are you sure you wish to remove the dependency on this ticket?

\n" -msgstr "" - -#: templates/helpdesk/ticket_desc_table.html:3 -msgid "Unhold" -msgstr "" - -#: templates/helpdesk/ticket_desc_table.html:3 -msgid "Hold" -msgstr "" - -#: templates/helpdesk/ticket_desc_table.html:4 -#, python-format -msgid "Queue: %(queue)s" -msgstr "" - -#: templates/helpdesk/ticket_desc_table.html:12 -msgid "Assigned To" -msgstr "" - -#: templates/helpdesk/ticket_desc_table.html:18 -msgid "Ignore" -msgstr "" - -#: templates/helpdesk/ticket_desc_table.html:27 -msgid "Copies To" -msgstr "" - -#: templates/helpdesk/ticket_desc_table.html:28 -msgid "Manage" -msgstr "" - -#: templates/helpdesk/ticket_desc_table.html:39 -msgid "Dependencies" -msgstr "" - -#: templates/helpdesk/ticket_desc_table.html:41 -msgid "" -"This ticket cannot be resolved until the following ticket(s) are resolved" -msgstr "" - -#: templates/helpdesk/ticket_desc_table.html:42 -msgid "Remove Dependency" -msgstr "" - -#: templates/helpdesk/ticket_desc_table.html:45 -msgid "This ticket has no dependencies." -msgstr "" - -#: templates/helpdesk/ticket_desc_table.html:47 -msgid "Add Dependency" -msgstr "" - -#: templates/helpdesk/ticket_list.html:2 -msgid "Ticket Listing" -msgstr "" - -#: templates/helpdesk/ticket_list.html:49 -msgid "Change Query" -msgstr "" - -#: templates/helpdesk/ticket_list.html:52 -msgid "Sorting" -msgstr "" - -#: templates/helpdesk/ticket_list.html:56 -#: templates/helpdesk/ticket_list.html:127 -msgid "Keywords" -msgstr "" - -#: templates/helpdesk/ticket_list.html:94 -msgid "Owner(s)" -msgstr "" - -#: templates/helpdesk/ticket_list.html:107 -msgid "Queue(s)" -msgstr "" - -#: templates/helpdesk/ticket_list.html:113 -msgid "Status(es)" -msgstr "" - -#: templates/helpdesk/ticket_list.html:120 -msgid "Tag(s)" -msgstr "" - -#: templates/helpdesk/ticket_list.html:132 -msgid "Apply Filter" -msgstr "" - -#: templates/helpdesk/ticket_list.html:134 -#, python-format -msgid "You are currently viewing saved query %(query_name)s." -msgstr "" - -#: templates/helpdesk/ticket_list.html:141 -#: templates/helpdesk/ticket_list.html:156 -msgid "Save Query" -msgstr "" - -#: templates/helpdesk/ticket_list.html:147 -msgid "" -"This name appears in the drop-down list of saved queries. If you share your " -"query, other users will see this name, so choose something clear and " -"descriptive!" -msgstr "" - -#: templates/helpdesk/ticket_list.html:149 -msgid "Shared?" -msgstr "" - -#: templates/helpdesk/ticket_list.html:150 -msgid "Yes, share this query with other users." -msgstr "" - -#: templates/helpdesk/ticket_list.html:151 -msgid "" -"If you share this query, it will be visible by all other logged-in " -"users." -msgstr "" - -#: templates/helpdesk/ticket_list.html:163 -msgid "Use Saved Query" -msgstr "" - -#: templates/helpdesk/ticket_list.html:165 -msgid "Query" -msgstr "" - -#: templates/helpdesk/ticket_list.html:170 -msgid "Run Query" -msgstr "" - -#: templates/helpdesk/ticket_list.html:200 -msgid "No Tickets Match Your Selection" -msgstr "" - -#: templates/helpdesk/ticket_list.html:206 -msgid "Previous" -msgstr "" - -#: templates/helpdesk/ticket_list.html:210 -#, python-format -msgid "Page %(ticket_num)s of %(num_pages)s." -msgstr "" - -#: templates/helpdesk/ticket_list.html:214 -msgid "Next" -msgstr "" - -#: templates/helpdesk/user_settings.html:3 -msgid "Change User Settings" -msgstr "" - -#: templates/helpdesk/user_settings.html:5 -msgid "" -"\n" -"

User Settings

\n" -"\n" -"

Use the following options to change the way your helpdesk system works " -"for you. These settings do not impact any other user.

" -msgstr "" - -#: templates/helpdesk/user_settings.html:19 -msgid "Save Options" -msgstr "" - -#: templates/helpdesk/registration/logged_out.html:2 -msgid "Logged Out" -msgstr "" - -#: templates/helpdesk/registration/logged_out.html:4 -msgid "" -"\n" -"

Logged Out

\n" -"\n" -"

Thanks for being here. Hopefully you've helped resolve a few tickets and " -"make the world a better place.

\n" -"\n" -msgstr "" - -#: templates/helpdesk/registration/login.html:2 -msgid "Helpdesk Login" -msgstr "" - -#: templates/helpdesk/registration/login.html:5 -#: templates/helpdesk/registration/login.html:17 -msgid "Login" -msgstr "" - -#: templates/helpdesk/registration/login.html:7 -msgid "" -"To log in and begin responding to cases, simply enter your username and " -"password below." -msgstr "" - -#: templates/helpdesk/registration/login.html:10 -msgid "Your username and password didn't match. Please try again." -msgstr "" - -#: templates/helpdesk/registration/login.html:12 -msgid "Username" -msgstr "" - -#: templates/helpdesk/registration/login.html:14 -msgid "Password" -msgstr "" - #: views/feeds.py:35 #, python-format msgid "Helpdesk: Open Tickets in queue %(queue)s for %(username)s" @@ -2008,45 +979,45 @@ msgstr "" msgid "Open and Reopened Tickets in queue %(queue)s" msgstr "" -#: views/public.py:83 +#: views/public.py:88 msgid "Invalid ticket ID or e-mail address. Please try again." msgstr "" -#: views/public.py:101 +#: views/public.py:106 msgid "Submitter accepted resolution and closed ticket" msgstr "" -#: views/staff.py:155 +#: views/staff.py:214 msgid "Accepted resolution and closed ticket" msgstr "" -#: views/staff.py:173 +#: views/staff.py:237 msgid "Sorry, you need to login to do that." msgstr "" -#: views/staff.py:206 +#: views/staff.py:274 #, python-format msgid "Assigned to %(username)s" msgstr "" -#: views/staff.py:228 +#: views/staff.py:297 msgid "Updated" msgstr "" -#: views/staff.py:395 +#: views/staff.py:464 #, python-format msgid "Assigned to %(username)s in bulk update" msgstr "" -#: views/staff.py:400 +#: views/staff.py:469 msgid "Unassigned in bulk update" msgstr "" -#: views/staff.py:405 views/staff.py:410 +#: views/staff.py:474 views/staff.py:479 msgid "Closed in bulk update" msgstr "" -#: views/staff.py:606 +#: views/staff.py:684 msgid "" "

Note: Your keyword search is case sensitive because of " "your database. This means the search will not be accurate. " @@ -2056,86 +1027,86 @@ msgid "" "matching in SQLite." msgstr "" -#: views/staff.py:713 +#: views/staff.py:797 msgid "Ticket taken off hold" msgstr "" -#: views/staff.py:716 +#: views/staff.py:800 msgid "Ticket placed on hold" msgstr "" -#: views/staff.py:784 +#: views/staff.py:868 msgid "Jan" msgstr "" -#: views/staff.py:785 +#: views/staff.py:869 msgid "Feb" msgstr "" -#: views/staff.py:786 +#: views/staff.py:870 msgid "Mar" msgstr "" -#: views/staff.py:787 +#: views/staff.py:871 msgid "Apr" msgstr "" -#: views/staff.py:788 +#: views/staff.py:872 msgid "May" msgstr "" -#: views/staff.py:789 +#: views/staff.py:873 msgid "Jun" msgstr "" -#: views/staff.py:790 +#: views/staff.py:874 msgid "Jul" msgstr "" -#: views/staff.py:791 +#: views/staff.py:875 msgid "Aug" msgstr "" -#: views/staff.py:792 +#: views/staff.py:876 msgid "Sep" msgstr "" -#: views/staff.py:793 +#: views/staff.py:877 msgid "Oct" msgstr "" -#: views/staff.py:794 +#: views/staff.py:878 msgid "Nov" msgstr "" -#: views/staff.py:795 +#: views/staff.py:879 msgid "Dec" msgstr "" -#: views/staff.py:821 +#: views/staff.py:905 msgid "User by Priority" msgstr "" -#: views/staff.py:827 +#: views/staff.py:911 msgid "User by Queue" msgstr "" -#: views/staff.py:833 +#: views/staff.py:917 msgid "User by Status" msgstr "" -#: views/staff.py:839 +#: views/staff.py:923 msgid "User by Month" msgstr "" -#: views/staff.py:845 +#: views/staff.py:929 msgid "Queue by Priority" msgstr "" -#: views/staff.py:851 +#: views/staff.py:935 msgid "Queue by Status" msgstr "" -#: views/staff.py:857 +#: views/staff.py:941 msgid "Queue by Month" msgstr "" diff --git a/helpdesk/management/commands/escalate_tickets.py b/helpdesk/management/commands/escalate_tickets.py index 13f6b712..b6050061 100644 --- a/helpdesk/management/commands/escalate_tickets.py +++ b/helpdesk/management/commands/escalate_tickets.py @@ -13,12 +13,12 @@ import getopt from optparse import make_option import sys -from django.core.management.base import BaseCommand +from django.core.management.base import BaseCommand, CommandError from django.db.models import Q from django.utils.translation import ugettext as _ from helpdesk.models import Queue, Ticket, FollowUp, EscalationExclusion, TicketChange -from helpdesk.lib import send_templated_mail +from helpdesk.lib import send_templated_mail, safe_template_context class Command(BaseCommand): @@ -99,10 +99,7 @@ def escalate_tickets(queues, verbose): t.priority -= 1 t.save() - context = { - 'ticket': t, - 'queue': q, - } + context = safe_template_context(t) if t.submitter_email: send_templated_mail( diff --git a/helpdesk/management/commands/get_email.py b/helpdesk/management/commands/get_email.py index 1b22c0b0..f9d69a09 100644 --- a/helpdesk/management/commands/get_email.py +++ b/helpdesk/management/commands/get_email.py @@ -25,8 +25,9 @@ from django.core.files.base import ContentFile from django.core.management.base import BaseCommand from django.db.models import Q from django.utils.translation import ugettext as _ +from django.conf import settings -from helpdesk.lib import send_templated_mail +from helpdesk.lib import send_templated_mail, safe_template_context from helpdesk.models import Queue, Ticket, FollowUp, Attachment, IgnoreEmail @@ -75,18 +76,22 @@ def process_email(quiet=False): def process_queue(q, quiet=False): if not quiet: print "Processing: %s" % q - if q.email_box_type == 'pop3': - if q.email_box_ssl: + email_box_type = settings.QUEUE_EMAIL_BOX_TYPE if settings.QUEUE_EMAIL_BOX_TYPE else q.email_box_type + + if email_box_type == 'pop3': + + if q.email_box_ssl or settings.QUEUE_EMAIL_BOX_SSL: if not q.email_box_port: q.email_box_port = 995 - server = poplib.POP3_SSL(q.email_box_host, int(q.email_box_port)) + server = poplib.POP3_SSL(q.email_box_host or settings.QUEUE_EMAIL_BOX_HOST, int(q.email_box_port)) else: if not q.email_box_port: q.email_box_port = 110 - server = poplib.POP3(q.email_box_host, int(q.email_box_port)) + server = poplib.POP3(q.email_box_host or settings.QUEUE_EMAIL_BOX_HOST, int(q.email_box_port)) server.getwelcome() - server.user(q.email_box_user) - server.pass_(q.email_box_pass) + server.user(q.email_box_user or settings.QUEUE_EMAIL_BOX_USER) + server.pass_(q.email_box_pass or settings.QUEUE_EMAIL_BOX_PASSWORD) + messagesInfo = server.list()[1] @@ -102,15 +107,15 @@ def process_queue(q, quiet=False): server.quit() - elif q.email_box_type == 'imap': - if q.email_box_ssl: + elif email_box_type == 'imap': + if q.email_box_ssl or settings.QUEUE_EMAIL_BOX_SSL: if not q.email_box_port: q.email_box_port = 993 - server = imaplib.IMAP4_SSL(q.email_box_host, int(q.email_box_port)) + server = imaplib.IMAP4_SSL(q.email_box_host or settings.QUEUE_EMAIL_BOX_HOST, int(q.email_box_port)) else: if not q.email_box_port: q.email_box_port = 143 - server = imaplib.IMAP4(q.email_box_host, int(q.email_box_port)) + server = imaplib.IMAP4(q.email_box_host or settings.QUEUE_EMAIL_BOX_HOST, int(q.email_box_port)) - server.login(q.email_box_user, q.email_box_pass) + server.login(q.email_box_user or settings.QUEUE_EMAIL_BOX_USER, q.email_box_pass or settings.QUEUE_EMAIL_BOX_PASSWORD) server.select(q.email_box_imap_folder) status, data = server.search(None, 'NOT', 'DELETED') @@ -246,6 +251,61 @@ def ticket_from_message(message, queue, quiet): t.status = Ticket.REOPENED_STATUS t.save() + context = safe_template_context(t) + + if new: + + if sender_email: + send_templated_mail( + 'newticket_submitter', + context, + recipients=sender_email, + sender=queue.from_address, + fail_silently=True, + ) + + if queue.new_ticket_cc: + send_templated_mail( + 'newticket_cc', + context, + recipients=queue.new_ticket_cc, + sender=queue.from_address, + fail_silently=True, + ) + + if queue.updated_ticket_cc and queue.updated_ticket_cc != queue.new_ticket_cc: + send_templated_mail( + 'newticket_cc', + context, + recipients=queue.updated_ticket_cc, + sender=queue.from_address, + fail_silently=True, + ) + + else: + if t.status == Ticket.REOPENED_STATUS: + update = _(' (Reopened)') + else: + update = _(' (Updated)') + + if t.assigned_to: + send_templated_mail( + 'updated_owner', + context, + recipients=t.assigned_to.email, + sender=queue.from_address, + fail_silently=True, + ) + + if queue.updated_ticket_cc: + send_templated_mail( + 'updated_cc', + context, + recipients=queue.updated_ticket_cc, + sender=queue.from_address, + fail_silently=True, + ) + f = FollowUp( ticket = t, title = _('E-Mail Received from %(sender_email)s' % {'sender_email': sender_email}), @@ -278,68 +338,6 @@ def ticket_from_message(message, queue, quiet): if not quiet: print " - %s" % filename - - context = { - 'ticket': t, - 'queue': queue, - } - - if new: - - if sender_email: - send_templated_mail( - 'newticket_submitter', - context, - recipients=sender_email, - sender=queue.from_address, - fail_silently=True, - ) - - if queue.new_ticket_cc: - send_templated_mail( - 'newticket_cc', - context, - recipients=queue.new_ticket_cc, - sender=queue.from_address, - fail_silently=True, - ) - - if queue.updated_ticket_cc and queue.updated_ticket_cc != queue.new_ticket_cc: - send_templated_mail( - 'newticket_cc', - context, - recipients=queue.updated_ticket_cc, - sender=queue.from_address, - fail_silently=True, - ) - - else: - - context.update(comment=f.comment) - - if t.status == Ticket.REOPENED_STATUS: - update = _(' (Reopened)') - else: - update = _(' (Updated)') - - if t.assigned_to: - send_templated_mail( - 'updated_owner', - context, - recipients=t.assigned_to.email, - sender=queue.from_address, - fail_silently=True, - ) - - if queue.updated_ticket_cc: - send_templated_mail( - 'updated_cc', - context, - recipients=queue.updated_ticket_cc, - sender=queue.from_address, - fail_silently=True, - ) - return t diff --git a/helpdesk/migrations/0004_auto__add_field_ticket_due_date.py b/helpdesk/migrations/0004_auto__add_field_ticket_due_date.py new file mode 100644 index 00000000..0b38e6ee --- /dev/null +++ b/helpdesk/migrations/0004_auto__add_field_ticket_due_date.py @@ -0,0 +1,228 @@ +# encoding: utf-8 +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + +class Migration(SchemaMigration): + + def forwards(self, orm): + + # Adding field 'Ticket.due_date' + db.add_column('helpdesk_ticket', 'due_date', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True), keep_default=False) + + + def backwards(self, orm): + + # Deleting field 'Ticket.due_date' + db.delete_column('helpdesk_ticket', 'due_date') + + models = { + 'auth.group': { + 'Meta': {'object_name': 'Group'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + 'helpdesk.attachment': { + 'Meta': {'ordering': "['filename']", 'object_name': 'Attachment'}, + 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}), + 'filename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'followup': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['helpdesk.FollowUp']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '30'}), + 'size': ('django.db.models.fields.IntegerField', [], {}) + }, + 'helpdesk.customfield': { + 'Meta': {'object_name': 'CustomField'}, + 'data_type': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'decimal_places': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'empty_selection_list': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'help_text': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'label': ('django.db.models.fields.CharField', [], {'max_length': "'30'"}), + 'list_values': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'max_length': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50', 'db_index': 'True'}), + 'ordering': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'required': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'staff_only': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) + }, + 'helpdesk.emailtemplate': { + 'Meta': {'ordering': "['template_name', 'locale']", 'object_name': 'EmailTemplate'}, + 'heading': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'html': ('django.db.models.fields.TextField', [], {}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'locale': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), + 'plain_text': ('django.db.models.fields.TextField', [], {}), + 'subject': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'template_name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + 'helpdesk.escalationexclusion': { + 'Meta': {'object_name': 'EscalationExclusion'}, + 'date': ('django.db.models.fields.DateField', [], {}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'queues': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['helpdesk.Queue']", 'null': 'True', 'blank': 'True'}) + }, + 'helpdesk.followup': { + 'Meta': {'ordering': "['date']", 'object_name': 'FollowUp'}, + 'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2012, 1, 20, 12, 19, 46, 778593)'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'new_status': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'public': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'ticket': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['helpdesk.Ticket']"}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}) + }, + 'helpdesk.ignoreemail': { + 'Meta': {'object_name': 'IgnoreEmail'}, + 'date': ('django.db.models.fields.DateField', [], {'blank': 'True'}), + 'email_address': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'keep_in_mailbox': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'queues': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['helpdesk.Queue']", 'null': 'True', 'blank': 'True'}) + }, + 'helpdesk.kbcategory': { + 'Meta': {'ordering': "['title']", 'object_name': 'KBCategory'}, + 'description': ('django.db.models.fields.TextField', [], {}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + 'helpdesk.kbitem': { + 'Meta': {'ordering': "['title']", 'object_name': 'KBItem'}, + 'answer': ('django.db.models.fields.TextField', [], {}), + 'category': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['helpdesk.KBCategory']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_updated': ('django.db.models.fields.DateTimeField', [], {'blank': 'True'}), + 'question': ('django.db.models.fields.TextField', [], {}), + 'recommendations': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'votes': ('django.db.models.fields.IntegerField', [], {'default': '0'}) + }, + 'helpdesk.presetreply': { + 'Meta': {'ordering': "['name']", 'object_name': 'PreSetReply'}, + 'body': ('django.db.models.fields.TextField', [], {}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'queues': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['helpdesk.Queue']", 'null': 'True', 'blank': 'True'}) + }, + 'helpdesk.queue': { + 'Meta': {'ordering': "('title',)", 'object_name': 'Queue'}, + 'allow_email_submission': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'allow_public_submission': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'email_address': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}), + 'email_box_host': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'email_box_imap_folder': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'email_box_interval': ('django.db.models.fields.IntegerField', [], {'default': "'5'", 'null': 'True', 'blank': 'True'}), + 'email_box_last_check': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'email_box_pass': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'email_box_port': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'email_box_ssl': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'email_box_type': ('django.db.models.fields.CharField', [], {'max_length': '5', 'null': 'True', 'blank': 'True'}), + 'email_box_user': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'escalate_days': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'locale': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), + 'new_ticket_cc': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'updated_ticket_cc': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}) + }, + 'helpdesk.savedsearch': { + 'Meta': {'object_name': 'SavedSearch'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'query': ('django.db.models.fields.TextField', [], {}), + 'shared': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) + }, + 'helpdesk.ticket': { + 'Meta': {'object_name': 'Ticket'}, + 'assigned_to': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'assigned_to'", 'null': 'True', 'to': "orm['auth.User']"}), + 'created': ('django.db.models.fields.DateTimeField', [], {'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'due_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_escalation': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'modified': ('django.db.models.fields.DateTimeField', [], {'blank': 'True'}), + 'on_hold': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'priority': ('django.db.models.fields.IntegerField', [], {'default': '3', 'blank': '3'}), + 'queue': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['helpdesk.Queue']"}), + 'resolution': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'status': ('django.db.models.fields.IntegerField', [], {'default': '1'}), + 'submitter_email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '200'}) + }, + 'helpdesk.ticketcc': { + 'Meta': {'object_name': 'TicketCC'}, + 'can_update': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'can_view': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'ticket': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['helpdesk.Ticket']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}) + }, + 'helpdesk.ticketchange': { + 'Meta': {'object_name': 'TicketChange'}, + 'field': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'followup': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['helpdesk.FollowUp']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'new_value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'old_value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}) + }, + 'helpdesk.ticketcustomfieldvalue': { + 'Meta': {'unique_together': "(('ticket', 'field'),)", 'object_name': 'TicketCustomFieldValue'}, + 'field': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['helpdesk.CustomField']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'ticket': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['helpdesk.Ticket']"}), + 'value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}) + }, + 'helpdesk.ticketdependency': { + 'Meta': {'unique_together': "(('ticket', 'depends_on'),)", 'object_name': 'TicketDependency'}, + 'depends_on': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'depends_on'", 'to': "orm['helpdesk.Ticket']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'ticket': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'ticketdependency'", 'to': "orm['helpdesk.Ticket']"}) + }, + 'helpdesk.usersettings': { + 'Meta': {'object_name': 'UserSettings'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'settings_pickled': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True'}) + } + } + + complete_apps = ['helpdesk'] diff --git a/helpdesk/models.py b/helpdesk/models.py index d10afc8b..6ad543f7 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): @@ -326,6 +326,12 @@ class Ticket(models.Model): help_text=_('1 = Highest Priority, 5 = Low Priority'), ) + due_date = models.DateTimeField( + _('Due on'), + blank=True, + null=True, + ) + last_escalation = models.DateTimeField( blank=True, null=True, @@ -436,7 +442,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 +452,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 +533,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 +849,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 +1030,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): """ @@ -1175,6 +1181,11 @@ class CustomField(models.Model): blank=True, null=True, ) + + empty_selection_list = models.BooleanField( + _('Add empty first choice to List?'), + help_text=_('Only for List: adds an empty first entry to the choices list, which enforces that the user makes an active choice.'), + ) list_values = models.TextField( _('List Values'), diff --git a/helpdesk/settings.py b/helpdesk/settings.py index 92e255ef..e712ad37 100644 --- a/helpdesk/settings.py +++ b/helpdesk/settings.py @@ -28,5 +28,112 @@ if type(DEFAULT_USER_SETTINGS) != type(dict()): 'tickets_per_page': 25 } + + +''' generic options - visible on all pages ''' +# redirect to login page instead of the default homepage when users visits "/"? +HELPDESK_REDIRECT_TO_LOGIN_BY_DEFAULT = getattr(settings, 'HELPDESK_REDIRECT_TO_LOGIN_BY_DEFAULT', False) + +# customize helpdesk name on a few pages, i.e., your organization. +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) + +# show 'stats' link in navigation bar? +HELPDESK_NAVIGATION_STATS_ENABLED = getattr(settings, 'HELPDESK_NAVIGATION_STATS_ENABLED', True) + +# set this to an email address inside your organization and a footer below +# the 'Powered by django-helpdesk' will be shown, telling the user whom to contact +# in case they have technical problems. +HELPDESK_SUPPORT_PERSON = getattr(settings, 'HELPDESK_SUPPORT_PERSON', False) + +# show dropdown list of languages that ticket comments can be translated into? +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", "it", "ru"]) + +# show link to 'change password' on 'User Settings' page? +HELPDESK_SHOW_CHANGE_PASSWORD = getattr(settings, 'HELPDESK_SHOW_CHANGE_PASSWORD', False) + +# allow user to override default layout for 'followups' - work in progress. +HELPDESK_FOLLOWUP_MOD = getattr(settings, 'HELPDESK_FOLLOWUP_MOD', False) + +# show custom welcome message in dashboard? +HELPDESK_CUSTOM_WELCOME = getattr(settings, 'HELPDESK_CUSTOM_WELCOME', False) + + + +''' options for public pages ''' +# show 'view a ticket' section on public page? +HELPDESK_VIEW_A_TICKET_PUBLIC = getattr(settings, 'HELPDESK_VIEW_A_TICKET_PUBLIC', True) + +# show 'submit a ticket' section on public page? +HELPDESK_SUBMIT_A_TICKET_PUBLIC = getattr(settings, 'HELPDESK_SUBMIT_A_TICKET_PUBLIC', True) + + + +''' options for update_ticket views ''' +# allow non-staff users to interact with tickets? this will also change how 'staff_member_required' +# in staff.py will be defined. +HELPDESK_ALLOW_NON_STAFF_TICKET_UPDATE = getattr(settings, 'HELPDESK_ALLOW_NON_STAFF_TICKET_UPDATE', False) + +# show edit buttons in ticket follow ups. +HELPDESK_SHOW_EDIT_BUTTON_FOLLOW_UP = getattr(settings, 'HELPDESK_HIDE_EDIT_BUTTON_FOLLOW_UP', True) + +# show ticket edit button on top of ticket description. +HELPDESK_SHOW_EDIT_BUTTON_TICKET_TOP = getattr(settings, 'HELPDESK_SHOW_EDIT_BUTTON_TICKET_TOP', True) + +# show ticket delete button on top of ticket description. +HELPDESK_SHOW_DELETE_BUTTON_TICKET_TOP = getattr(settings, 'HELPDESK_SHOW_DELETE_BUTTON_TICKET_TOP', True) + +# show hold / unhold button on top of ticket description. +HELPDESK_SHOW_HOLD_BUTTON_TICKET_TOP = getattr(settings, 'HELPDESK_SHOW_HOLD_BUTTON_TICKET_TOP', True) + +# make all updates public by default? this will hide the 'is this update public' checkbox +HELPDESK_UPDATE_PUBLIC_DEFAULT = getattr(settings, 'HELPDESK_UPDATE_PUBLIC_DEFAULT', True) + +# only show staff users in ticket owner drop-downs +HELPDESK_STAFF_ONLY_TICKET_OWNERS = getattr(settings, 'HELPDESK_STAFF_ONLY_TICKET_OWNERS', False) + +# only show staff users in ticket cc drop-down +HELPDESK_STAFF_ONLY_TICKET_CC = getattr(settings, 'HELPDESK_STAFF_ONLY_TICKET_CC', False) + + + +''' options for staff.create_ticket view ''' +# hide the 'assigned to' / 'Case owner' field from the 'create_ticket' view? +HELPDESK_CREATE_TICKET_HIDE_ASSIGNED_TO = getattr(settings, 'HELPDESK_CREATE_TICKET_HIDE_ASSIGNED_TO', False) + + + +''' options for dashboard ''' +# show delete button next to unassigned tickets +HELPDESK_DASHBOARD_SHOW_DELETE_UNASSIGNED = getattr(settings, 'HELPDESK_DASHBOARD_SHOW_DELETE_UNASSIGNED', True) + +# hide empty queues in dashboard overview? +HELPDESK_DASHBOARD_HIDE_EMPTY_QUEUES = getattr(settings, 'HELPDESK_DASHBOARD_HIDE_EMPTY_QUEUES', True) + + + +''' options for footer ''' +# show 'API' link at bottom of page +HELPDESK_FOOTER_SHOW_API_LINK = getattr(settings, 'HELPDESK_FOOTER_SHOW_API_LINK', True) + +# show / hide 'change language' link at bottom of page +HELPDESK_FOOTER_SHOW_CHANGE_LANGUAGE_LINK = getattr(settings, 'HELPDESK_FOOTER_SHOW_CHANGE_LANGUAGE_LINK', False) + +''' email options ''' +# default Queue email submission settings +QUEUE_EMAIL_BOX_TYPE = getattr(settings, 'QUEUE_EMAIL_BOX_TYPE', None) +QUEUE_EMAIL_BOX_SSL = getattr(settings, 'QUEUE_EMAIL_BOX_SSL', None) +QUEUE_EMAIL_BOX_HOST = getattr(settings, 'QUEUE_EMAIL_BOX_HOST', None) +QUEUE_EMAIL_BOX_USER = getattr(settings, 'QUEUE_EMAIL_BOX_USER', None) +QUEUE_EMAIL_BOX_PASSWORD = getattr(settings, 'QUEUE_EMAIL_BOX_PASSWORD', None) diff --git a/helpdesk/static/helpdesk/helpdesk-print.css b/helpdesk/static/helpdesk/helpdesk-print.css new file mode 100644 index 00000000..e69de29b diff --git a/helpdesk/static/helpdesk/helpdesk.css b/helpdesk/static/helpdesk/helpdesk.css index 638ee98d..85034e9d 100644 --- a/helpdesk/static/helpdesk/helpdesk.css +++ b/helpdesk/static/helpdesk/helpdesk.css @@ -43,7 +43,7 @@ table { border: solid #444 1px; background-color: #fff; color: #ccc; - padding: 2px 3px; + padding: 0px 3px; margin: 0px 2px; font-size: 10pt; line-height: 12pt; @@ -159,16 +159,29 @@ div.followup { padding:0 0 2px; } -div.followup .title { +div.followup_mod { + width: auto; + border: solid #666 1px; + padding: 5px; + margin: 0px 0px 10px; +} + +div.followup .title, div.followup_mod .title { font-weight: bold; font-size: 10pt; } -div.followup .title span { +div.followup .title span, div.followup_mod .title span { color: #aaa; font-weight: normal; } +div.followup_mod small { + float: right; + font-weight: bold; + font-style: italic; +} + span.private { color: #aaa; font-style: italic; @@ -267,3 +280,34 @@ span.priority5 { a.followup-edit { float:right; } + +/* tooltips for link hover */ +a.tooltip, a.tooltip:link, a.tooltip:visited, a.tooltip:active { + position: relative; + text-decoration: none; + font-style: italic; +} + +a.tooltip:hover { + background: transparent; +} + +a.tooltip span { + display: none; + text-decoration: none; +} + +a.tooltip:hover span { + display: block; + position: absolute; + top: 25px; + left: 0; + width: 250px; + z-index: 10; + color: #000000; + border:1px solid #000000; + background: #FFFFCC; + font: 12px Verdana, sans-serif; + text-align: left; +} + diff --git a/helpdesk/static/helpdesk/jquery.translate-debug-all.js b/helpdesk/static/helpdesk/jquery.translate-debug-all.js new file mode 100644 index 00000000..db922995 --- /dev/null +++ b/helpdesk/static/helpdesk/jquery.translate-debug-all.js @@ -0,0 +1,1546 @@ +/*! + * jQuery nodesContainingText plugin + * + * Version: 1.1.2 + * + * http://code.google.com/p/jquery-translate/ + * + * Copyright (c) 2009 Balazs Endresz (balazs.endresz@gmail.com) + * Dual licensed under the MIT and GPL licenses. + * + */ + +;(function($){ + +function Nct(){} + +Nct.prototype = { + init: function(jq, o){ + this.textArray = []; + this.elements = []; + this.options = o; + this.jquery = jq; + this.n = -1; + if(o.async === true) + o.async = 2; + + if(o.not){ + jq = jq.not(o.not); + jq = jq.add( jq.find("*").not(o.not) ).not( $(o.not).find("*") ); + }else + jq = jq.add( jq.find("*") ); + + this.jq = jq; + this.jql = this.jq.length; + return this.process(); + + }, + + process: function(){ + this.n++; + var that = this, o = this.options, text = "", hasTextNode = false, + hasChildNode = false, el = this.jq[this.n], e, c, ret; + + if(this.n === this.jql){ + ret = this.jquery.pushStack(this.elements, "nodesContainingText"); + o.complete.call(ret, ret, this.textArray); + + if(o.returnAll === false && o.walk === false) + return this.jquery; + return ret; + } + + if(!el) + return this.process(); + e=$(el); + + var nodeName = el.nodeName.toUpperCase(), + type = nodeName === "INPUT" && $.attr(el, "type").toLowerCase(); + + if( ({SCRIPT:1, NOSCRIPT:1, STYLE:1, OBJECT:1, IFRAME:1})[ nodeName ] ) + return this.process(); + + if(typeof o.subject === "string"){ + text=e.attr(o.subject); + }else{ + if(o.altAndVal && (nodeName === "IMG" || type === "image" ) ) + text = e.attr("alt"); + else if( o.altAndVal && ({text:1, button:1, submit:1})[ type ] ) + text = e.val(); + else if(nodeName === "TEXTAREA") + text = e.val(); + else{ + //check childNodes: + c = el.firstChild; + if(o.walk !== true) + hasChildNode = true; + else{ + while(c){ + if(c.nodeType == 1){ + hasChildNode = true; + break; + } + c=c.nextSibling; + } + } + + if(!hasChildNode) + text = e.text(); + else{//check textNodes: + if(o.walk !== true) + hasTextNode = true; + + c=el.firstChild; + while(c){ + if(c.nodeType == 3 && c.nodeValue.match(/\S/) !== null){//textnodes with text + /*jslint skipLines*/ + if(c.nodeValue.match(//) !== null){ + if(c.nodeValue.match(/(\S+(?=.*<))|(>(?=.*\S+))/) !== null){ + hasTextNode = true; + break; + } + }else{ + hasTextNode = true; + break; + } + /*jslint skipLinesEnd*/ + } + c = c.nextSibling; + } + + if(hasTextNode){//remove child nodes from jq + //remove scripts: + text = e.html(); + /*jslint skipLines*/ + text = o.stripScripts ? text.replace(/]*>([\s\S]*?)<\/script>/gi, "") : text; + /*jslint skipLinesEnd*/ + this.jq = this.jq.not( e.find("*") ); + } + } + } + } + + if(!text) + return this.process(); + this.elements.push(el); + this.textArray.push(text); + + o.each.call(el, this.elements.length - 1, el, text); + + if(o.async){ + setTimeout(function(){that.process();}, o.async); + return this.jquery; + }else + return this.process(); + + } +}; + +var defaults = { + not: "", + async: false, + each: function(){}, + complete: function(){}, + comments: false, + returnAll: true, + walk: true, + altAndVal: false, + subject: true, + stripScripts: true +}; + +$.fn.nodesContainingText = function(o){ + o = $.extend({}, defaults, $.fn.nodesContainingText.defaults, o); + return new Nct().init(this, o); +}; + +$.fn.nodesContainingText.defaults = defaults; + +})(jQuery);/*! + * Textnode Translator + * Ariel Flesler - http://flesler.blogspot.com/2008/05/textnode-translator-for-javascript.html + */ +//This is now only a placeholder, the original script has been modified +//and the Translator class is no longer exposed +/*! + * jQuery Translate plugin + * + * Version: ${version} + * + * http://code.google.com/p/jquery-translate/ + * + * Copyright (c) 2009 Balazs Endresz (balazs.endresz@gmail.com) + * Dual licensed under the MIT and GPL licenses. + * + * This plugin uses the 'Google AJAX Language API' (http://code.google.com/apis/ajaxlanguage/) + * You can read the terms of use at http://code.google.com/apis/ajaxlanguage/terms.html + * + */ +;(function($){ + +function $function(){} + +var True = true, False = false, undefined, replace = "".replace, + Str = String, Fn = Function, Obj = Object, + GL, GLL, toLangCode, inverseLanguages = {}, + loading, readyList = [], key, + defaults = { + from: "", + to: "", + start: $function, + error: $function, + each: $function, + complete: $function, + onTimeout: $function, + timeout: 0, + + stripComments: True, + stripWhitespace: True, + stripScripts: True, + separators: /\.\?\!;:/, + limit: 1750, + + + walk: True, + returnAll: False, + replace: True, + rebind: True, + data: True, + setLangAttr: False, + subject: True, + not: "", + altAndVal:True, + async: False, + toggle: False, + fromOriginal: True, + + parallel: false, + trim: true, + alwaysReplace: false + //,response: $function + + }; + + + +function ms_loaded(languageCodes, languageNames){ + GLL = {}; + for(var i = 0; i < languageCodes.length; i++){ + GLL[languageNames[i].toUpperCase()] = languageCodes[i]; + } + + //$.translate.GL = GL = google.language; + $.translate.GLL = GLL; // = GL.Languages; + + loaded(); +} + +function loaded(){ + toLangCode = $.translate.toLanguageCode; + + $.each(GLL, function(l, lc){ + inverseLanguages[ lc.toUpperCase() ] = l; + }); + + $.translate.isReady = True; + var fn; + while((fn = readyList.shift())) fn(); +} + +function filter(obj, fn){ + var newObj = {}; + $.each(obj, function(lang, langCode){ + if( fn(langCode, lang) === True) newObj[ lang ] = langCode; + }); + return newObj; +} + +function bind(fn, thisObj, args){ + return function(){ + return fn.apply(thisObj === True ? arguments[0] : thisObj, args || arguments); + }; +} + +function isSet(e){ + return e !== undefined; +} + +function validate(_args, overload, error){ + var matched, obj = {}, args = $.grep(_args, isSet); + + $.each(overload, function(_, el){ + var matches = $.grep(el[0], function(e, i){ + return isSet(args[i]) && args[i].constructor === e; + }).length; + if(matches === args.length && matches === el[0].length && (matched = True)){ + $.each(el[1], function(i, prop){ + obj[prop] = args[i]; + }); + return False; + } + }); + //TODO + if(!matched) throw error; + return obj; +} + + +function getOpt(args0, _defaults){ + //args0=[].slice.call(args0, 0) + var args = validate(args0 , $.translate.overload, "jQuery.translate: Invalid arguments" ), + o = args.options || {}; + delete args.options; + o = $.extend({}, defaults, _defaults, $.extend(o, args)); + + if(o.fromOriginal) o.toggle = True; + if(o.toggle) o.data = True; + if(o.async === True) o.async = 2; + if(o.alwaysReplace === true){ //see issue #58 + o.toggle = false; + o.fromOriginal = false; + } + + return o; +} + + +function T(){ + //copy over static methods during each instantiation + //for backward compatibility and access inside callback functions + this.extend($.translate); + delete this.defaults; + delete this.fn; +} + +T.prototype = { + version: "${version}", + + _init: function(t, o){ + var separator = o.separators.source || o.separators, + isString = this.isString = typeof t === "string", + lastpos = 0, substr; + + $.each(["stripComments", "stripScripts", "stripWhitespace"], function(i, name){ + var fn = $.translate[name]; + if( o[name] ) + t = isString ? fn(t) : $.map(t, fn); + }); + + this.rawSource = "

" + (isString ? t : t.join("
")) + "
"; + this._m3 = new RegExp("[" + separator + "](?![^" + separator + "]*[" + separator + "])"); + this.options = o; + this.from = o.from = toLangCode(o.from) || ""; + this.to = o.to = toLangCode(o.to) || ""; + this.source = t; + this.rawTranslation = ""; + this.translation = []; + this.i = 0; + this.stopped = False; + this.elements = o.nodes; + + //this._nres = 0; + //this._progress = 0; + this._i = -1; //TODO: rename + this.rawSources = []; + + while(True){ + substr = this.truncate( this.rawSource.substr(lastpos), o.limit); + if(!substr) break; + this.rawSources.push(substr); + lastpos += substr.length; + } + this.queue = new Array(this.rawSources.length); + this.done = 0; + + o.start.call(this, t , o.from, o.to, o); + + if(o.timeout) + this.timeout = setTimeout(bind(o.onTimeout, this, [t, o.from, o.to, o]), o.timeout); + + (o.toggle && o.nodes) ? + (o.textNodes ? this._toggleTextNodes() : this._toggle()) : + this._process(); + }, + + _process: function(){ + if(this.stopped) + return; + var o = this.options, + i = this.rawTranslation.length, + lastpos, subst, divst, divcl; + var that = this; + + while( (lastpos = this.rawTranslation.lastIndexOf("", i)) > -1){ + + i = lastpos - 1; + subst = this.rawTranslation.substr(0, i + 1); + /*jslint skipLines*/ + divst = subst.match(/ ]/gi); + divcl = subst.match(/<\/div>/gi); + /*jslint skipLinesEnd*/ + + divst = divst ? divst.length : 0; + divcl = divcl ? divcl.length : 0; + + if(divst !== divcl + 1) continue; //if there are some unclosed divs + + var divscompl = $( this.rawTranslation.substr(0, i + 7) ), + divlen = divscompl.length, + l = this.i; + + if(l === divlen) break; //if no new elements have been completely translated + + divscompl.slice(l, divlen).each( bind(function(j, e){ + if(this.stopped) + return False; + var e_html = $(e).html(), tr = o.trim ? $.trim(e_html) : e_html, + i = l + j, src = this.source, + from = !this.from && this.detectedSourceLanguage || this.from; + this.translation[i] = tr;//create an array for complete callback + this.isString ? this.translation = tr : src = this.source[i]; + + o.each.call(this, i, tr, src, from, this.to, o); + + this.i++; + }, this)); + + break; + } + + if(this.rawSources.length - 1 == this._i) + this._complete(); + + var _translate = bind(this._translate, this); + + if(o.parallel){ + if(this._i < 0){ + if(!o.parallel){ + $.each(this.rawSources, _translate); + }else{ + var j = 0, n = this.rawSources.length; + function seq(){ + _translate(); + if(j++ < n) + setTimeout( seq, o.parallel ); + } + seq(); + } + } + }else + _translate(); + + }, + + _translate: function(){ + this._i++; + var _this = this, i = this._i, src = this.rawSourceSub = this.rawSources[i]; + if(!src) return; + + if(key.length < 40){ + $.ajax({ + url: "https://www.googleapis.com/language/translate/v2", + dataType: "jsonp", + jsonp: "callback", + crossDomain: true, + //context: this, //doesn't work with older versions of jQuery + data: $.extend({"key": key, target: this.to, q: src}, this.from ? {source: this.from} : {}), + success: function(response){ + if(response.error){ + return _this.options.error.call(_this, response.error, _this.rawSourceSub, _this.from, _this.to, _this.options); + } + var tr = response.data.translations[0].translatedText; + _this.queue[i] = tr || _this.rawSourceSub; + _this.detectedSourceLanguage = response.data.translations[0].detectedSourceLanguage; + _this._check(); + } + }); + + /* + GL.translate(src, this.from, this.to, bind(function(result){ + //this._progress = 100 * (++this._nres) / this.rawSources.length; + //this.options.response.call(this, this._progress, result); + if(result.error) + return this.options.error.call(this, result.error, this.rawSourceSub, this.from, this.to, this.options); + + this.queue[i] = result.translation || this.rawSourceSub; + this.detectedSourceLanguage = result.detectedSourceLanguage; + this._check(); + }, this)); + */ + }else{ + $.ajax({ + url: "http://api.microsofttranslator.com/V2/Ajax.svc/Translate", + dataType: "jsonp", + jsonp: "oncomplete", + crossDomain: true, + //context: this, + data: {appId: key, from: _this.from, to: _this.to, contentType: "text/plain", text: src}, + success: function(data, status){ + //console.log(data); + _this.queue[i] = data || _this.rawSourceSub; + //this.detectedSourceLanguage = result.detectedSourceLanguage; + _this._check(); + } + }); + } + }, + + _check: function(){ + if(!this.options.parallel){ + this.rawTranslation += this.queue[this._i]; + this._process(); + return; + } + + var done = 0; + jQuery.each(this.queue, function(i, n) { + if (n != undefined) done = i; + else return false; + }); + + if ((done > this.done) || (done === this.queue.length - 1)) { + for(var i = 0; i <= done; i++) + this.rawTranslation += this.queue[i]; + this._process(); + } + this.done = done; + + }, + + _complete: function(){ + clearTimeout(this.timeout); + + this.options.complete.call(this, this.translation, this.source, + !this.from && this.detectedSourceLanguage || this.from, this.to, this.options); + }, + + stop: function(){ + if(this.stopped) + return this; + this.stopped = True; + this.options.error.call(this, {message:"stopped"}); + return this; + } +}; + + + +$.translate = function(t, a){ + if(t == undefined) + return new T(); + if( $.isFunction(t) ) + return $.translate.ready(t, a); + var that = new T(); + + var args = [].slice.call(arguments, 0); + args.shift(); + return $.translate.ready( bind(that._init, that, [t, getOpt(args, $.translate.defaults)] ), False, that ); +}; + + +$.translate.fn = $.translate.prototype = T.prototype; + +$.translate.fn.extend = $.translate.extend = $.extend; + + +$.translate.extend({ + + _bind: bind, + + _filter: filter, + + _validate: validate, + + _getOpt: getOpt, + + _defaults: defaults, //base defaults used by other components as well //TODO + + defaults: $.extend({}, defaults), + + capitalize: function(t){ return t.charAt(0).toUpperCase() + t.substr(1).toLowerCase(); }, + + truncate: function(text, limit){ + var i, m1, m2, m3, m4, t, encoded = encodeURIComponent( text ); + + for(i = 0; i < 10; i++){ + try { + t = decodeURIComponent( encoded.substr(0, limit - i) ); + } catch(e){ continue; } + if(t) break; + } + + return ( !( m1 = /<(?![^<]*>)/.exec(t) ) ) ? ( //if no broken tag present + ( !( m2 = />\s*$/.exec(t) ) ) ? ( //if doesn't end with '>' + ( m3 = this._m3.exec(t) ) ? ( //if broken sentence present + ( m4 = />(?![^>]*<)/.exec(t) ) ? ( + m3.index > m4.index ? t.substring(0, m3.index+1) : t.substring(0, m4.index+1) + ) : t.substring(0, m3.index+1) ) : t ) : t ) : t.substring(0, m1.index); + }, + + getLanguages: function(a, b){ + if(a == undefined || (b == undefined && !a)) + return GLL; + + var newObj = {}, typeof_a = typeof a, + languages = b ? $.translate.getLanguages(a) : GLL, + filterArg = ( typeof_a === "object" || typeof_a === "function" ) ? a : b; + + if(filterArg) + if(filterArg.call) //if it's a filter function + newObj = filter(languages, filterArg); + else //if it's an array of languages + for(var i = 0, length = filterArg.length, lang; i < length; i++){ + lang = $.translate.toLanguage(filterArg[i]); + if(languages[lang] != undefined) + newObj[lang] = languages[lang]; + } + else //if the first argument is true -> only translatable languages + newObj = filter(GLL, $.translate.isTranslatable); + + return newObj; + }, + + + toLanguage: function(a, format){ + var u = a.toUpperCase(); + var l = inverseLanguages[u] || + (GLL[u] ? u : undefined) || + inverseLanguages[($.translate.languageCodeMap[a.toLowerCase()]||"").toUpperCase()]; + return l == undefined ? undefined : + format === "lowercase" ? l.toLowerCase() : format === "capitalize" ? $.translate.capitalize(l) : l; + }, + + toLanguageCode: function(a){ + return GLL[a] || + GLL[ $.translate.toLanguage(a) ] || + $.translate.languageCodeMap[a.toLowerCase()]; + }, + + same: function(a, b){ + return a === b || toLangCode(a) === toLangCode(b); + }, + + isTranslatable: function(l){ + return !!toLangCode(l); + }, + + //keys must be lower case, and values must equal to a + //language code specified in the Language API + languageCodeMap: { + "pt": "pt-PT", + "pt-br": "pt-PT", + "he": "iw", + "zlm": "ms", + "zh-hans": "zh-CN", + "zh-hant": "zh-TW" + //,"zh-sg":"zh-CN" + //,"zh-hk":"zh-TW" + //,"zh-mo":"zh-TW" + }, + + //use only language codes specified in the Language API + isRtl: { + "ar": True, + "iw": True, + "fa": True, + "ur": True, + "yi": True + }, + + getBranding: function(){ + if(typeof console != "undefined") + console.log("$.translate.getBranding() IS DEPRECATED! PLEASE REMOVE IT FROM YOUR CODE!"); + return $(); + }, + + load: function(_key, version){ + loading = True; + key = _key; + + if(key.length < 40){ //Google API + /* + function _load(){ + google.load("language", version || "1", {"callback" : google_loaded}); + } + + if(typeof google !== "undefined" && google.load) + _load(); + else + $.getScript(((document.location.protocol == "https:") ? "https://" : "http://") + + "www.google.com/jsapi" + (key ? "?key=" + key : ""), _load); + */ + + /* + $.ajax({ + url: "https://www.googleapis.com/language/translate/v2/languages", + dataType: "jsonp", + jsonp: "oncomplete", + crossDomain: true, + context: this, + data: {key: key, target: "en"}, + success: function(response, status){ + var languageCodes = [], languageNames = []; + $.each(response.data.languages, function(i, e){ + languageCodes.push(e.language); + languageNames.push(e.name); + }); + ms_loaded(languageCodes, languageNames); + } + }); + */ + + var response = {"data": { + "languages": [ + { + "language": "af", + "name": "Afrikaans" + }, + { + "language": "sq", + "name": "Albanian" + }, + { + "language": "ar", + "name": "Arabic" + }, + { + "language": "be", + "name": "Belarusian" + }, + { + "language": "bg", + "name": "Bulgarian" + }, + { + "language": "ca", + "name": "Catalan" + }, + { + "language": "zh", + "name": "Chinese (Simplified)" + }, + { + "language": "zh-TW", + "name": "Chinese (Traditional)" + }, + { + "language": "hr", + "name": "Croatian" + }, + { + "language": "cs", + "name": "Czech" + }, + { + "language": "da", + "name": "Danish" + }, + { + "language": "nl", + "name": "Dutch" + }, + { + "language": "en", + "name": "English" + }, + { + "language": "et", + "name": "Estonian" + }, + { + "language": "tl", + "name": "Filipino" + }, + { + "language": "fi", + "name": "Finnish" + }, + { + "language": "fr", + "name": "French" + }, + { + "language": "gl", + "name": "Galician" + }, + { + "language": "de", + "name": "German" + }, + { + "language": "el", + "name": "Greek" + }, + { + "language": "ht", + "name": "Haitian Creole" + }, + { + "language": "iw", + "name": "Hebrew" + }, + { + "language": "hi", + "name": "Hindi" + }, + { + "language": "hu", + "name": "Hungarian" + }, + { + "language": "is", + "name": "Icelandic" + }, + { + "language": "id", + "name": "Indonesian" + }, + { + "language": "ga", + "name": "Irish" + }, + { + "language": "it", + "name": "Italian" + }, + { + "language": "ja", + "name": "Japanese" + }, + { + "language": "ko", + "name": "Korean" + }, + { + "language": "lv", + "name": "Latvian" + }, + { + "language": "lt", + "name": "Lithuanian" + }, + { + "language": "mk", + "name": "Macedonian" + }, + { + "language": "ms", + "name": "Malay" + }, + { + "language": "mt", + "name": "Maltese" + }, + { + "language": "no", + "name": "Norwegian" + }, + { + "language": "fa", + "name": "Persian" + }, + { + "language": "pl", + "name": "Polish" + }, + { + "language": "pt", + "name": "Portuguese" + }, + { + "language": "ro", + "name": "Romanian" + }, + { + "language": "ru", + "name": "Russian" + }, + { + "language": "sr", + "name": "Serbian" + }, + { + "language": "sk", + "name": "Slovak" + }, + { + "language": "sl", + "name": "Slovenian" + }, + { + "language": "es", + "name": "Spanish" + }, + { + "language": "sw", + "name": "Swahili" + }, + { + "language": "sv", + "name": "Swedish" + }, + { + "language": "th", + "name": "Thai" + }, + { + "language": "tr", + "name": "Turkish" + }, + { + "language": "uk", + "name": "Ukrainian" + }, + { + "language": "vi", + "name": "Vietnamese" + }, + { + "language": "cy", + "name": "Welsh" + }, + { + "language": "yi", + "name": "Yiddish" + } + ] + } +}; + + var languageCodes = [], languageNames = []; + $.each(response.data.languages, function(i, e){ + languageCodes.push(e.language); + languageNames.push(e.name); + }); + ms_loaded(languageCodes, languageNames); + + }else{ //Microsoft API + $.ajax({ + url: "http://api.microsofttranslator.com/V2/Ajax.svc/GetLanguagesForTranslate", + dataType: "jsonp", + jsonp: "oncomplete", + crossDomain: true, + context: this, + data: {appId: key}, + success: function(languageCodes, status){ + $.ajax({ + url: "http://api.microsofttranslator.com/V2/Ajax.svc/GetLanguageNames", + dataType: "jsonp", + jsonp: "oncomplete", + crossDomain: true, + context: this, + data: {appId: key, locale: "en", languageCodes: '["'+languageCodes.join('", "')+'"]'}, + success: function(languageNames, status){ + ms_loaded(languageCodes, languageNames); + } + }); + } + }); + + } + + return $.translate; + }, + + ready: function(fn, preventAutoload, that){ + $.translate.isReady ? fn() : readyList.push(fn); + if(!loading && !preventAutoload) + $.translate.load(); + return that || $.translate; + }, + + isReady: False, + + overload: [ + [[],[]], + [[Str, Str, Obj], ["from", "to", "options"] ], + [[Str, Obj], ["to", "options"] ], + [[Obj], ["options"] ], + [[Str, Str], ["from", "to"] ], + [[Str], ["to"] ], + [[Str, Str, Fn], ["from", "to", "complete"] ], + [[Str, Fn], ["to", "complete"] ] + //TODO + //,[[Str, Str, Fn, Fn], ["from", "to", "each", "complete"]] + ] + /*jslint skipLines*/ + , + //jslint doesn't seem to be able to parse some regexes correctly if used on the server, + //however it works fine if it's run on the command line: java -jar rhino.jar jslint.js file.js + stripScripts: bind(replace, True, [/]*>([\s\S]*?)<\/script>/gi, ""]), + + stripWhitespace: bind(replace, True, [/\s\s+/g, " "]), + + stripComments: bind(replace, True, [//g, ""]) + /*jslint skipLinesEnd*/ +}); + + +})(jQuery);/*!- + * jQuery.fn.nodesContainingText adapter for the jQuery Translate plugin + * Version: ${version} + * http://code.google.com/p/jquery-translate/ + */ +;(function($){ + +var True = true, + isInput = {text:True, button:True, submit:True}, + dontCopyEvents = {SCRIPT:True, NOSCRIPT:True, STYLE:True, OBJECT:True, IFRAME:True}, + $fly = $([]); + +$fly.length = 1; + +function getDoc(node){ + while (node && node.nodeType != 9) + node = node.parentNode; + return node; +} + +function toggleDir(e, dir){ + var align = e.css("text-align"); + e.css("direction", dir); + if(align === "right") e.css("text-align", "left"); + if(align === "left") e.css("text-align", "right"); +} + +function getType(el, o){ + var nodeName = el.nodeName.toUpperCase(), + type = nodeName === 'INPUT' && $.attr(el, 'type').toLowerCase(); + o = o || {altAndVal:True, subject:True}; + return typeof o.subject === "string" ? o.subject : + o.altAndVal && (nodeName === 'IMG' || type === "image" ) ? "alt" : + o.altAndVal && isInput[ type ] ? "$val" : + nodeName === "TEXTAREA" ? "$val" : "$html"; +} + +$.translate.fn._toggle = function(){ + var o = this.options, to = o.to, stop; + + this.elements.each($.translate._bind(function(i, el){ + this.i = i; + var e = $(el), tr = $.translate.getData(e, to, o); + + if(!tr) return !(stop = True); + + this.translation.push(tr); + + o.each.call(this, i, el, tr, this.source[i], this.from, to, o); + //'from' will be undefined if it wasn't set + }, this)); + + !stop ? this._complete() : this._process(); + //o.complete.call(this, o.nodes, this.translation, this.source, this.from, this.to, o) +}; + + + +$.translate.extend({ + _getType: getType, + + each: function(i, el, t, s, from, to, o){ + $fly[0] = el; + $.translate.setData($fly, to, t, from, s, o); + $.translate.replace($fly, t, to, o); + $.translate.setLangAttr($fly, to, o); + }, + + getData: function(e, lang, o){ + var el = e[0] || e, data = $.data(el, "translation"); + return data && data[lang] && data[lang][ getType(el, o) ]; + }, + + setData: function(e, to, t, from, s, o){ + if(o && !o.data) return; + + var el = e[0] || e, + type = getType(el, o), + data = $.data(el, "translation"); + + data = data || $.data(el, "translation", {}); + (data[from] = data[from] || {})[type] = s; + (data[to] = data[to] || {})[type] = t; + }, + + + replace: function(e, t, to, o){ + + if(o && !o.replace) return; + + if(o && typeof o.subject === "string") + return e.attr(o.subject, t); + + var el = e[0] || e, + nodeName = el.nodeName.toUpperCase(), + type = nodeName === 'INPUT' && $.attr(el, 'type').toLowerCase(), + isRtl = $.translate.isRtl, + lang = $.data(el, "lang"); + + //http://code.google.com/p/jquery-translate/issues/detail?id=38 + if(!o.alwaysReplace) + if( lang === to ) + return; + + if( isRtl[ to ] !== isRtl[ lang || o && o.from ] ){ + if( isRtl[ to ] ) + toggleDir(e, "rtl"); + else if( e.css("direction") === "rtl" ) + toggleDir(e, "ltr"); + } + + if( (!o || o.altAndVal) && (nodeName === 'IMG' || type === "image" ) ) + e.attr("alt", t); + else if( nodeName === "TEXTAREA" || (!o || o.altAndVal) && isInput[ type ] ) + e.val(t); + else{ + if(!o || o.rebind){ + this.doc = this.doc || getDoc(el); + var origContents = e.find("*").not("script"), + newElem = $(this.doc.createElement("div")).html(t); + $.translate.copyEvents( origContents, newElem.find("*") ); + e.html( newElem.contents() ); + }else + e.html(t); + } + + //used for determining if the text-align property should be changed, + //it's much faster than setting the "lang" attribute, see bug #13 + $.data(el, "lang", to); + }, + + setLangAttr: function(e, to, o){ + if(!o || o.setLangAttr) + e.attr((!o || o.setLangAttr === True) ? "lang" : o.setLangAttr, to); + }, + + copyEvents: function(from, to){ + to.each(function(i, to_i){ + var from_i = from[i]; + if( !to_i || !from_i ) //in some rare cases the translated html structure can be slightly different + return false; + if( dontCopyEvents[ from_i.nodeName.toUpperCase() ]) + return True; + var events = $.data(from_i, "events"); + if(!events) + return True; + for(var type in events) + for(var handler in events[type]) + $.event.add(to_i, type, events[type][handler], events[type][handler].data); + }); + } + +}); + + +$.fn.translate = function(a, b, c){ + var o = $.translate._getOpt(arguments, $.fn.translate.defaults), + ncto = $.extend( {}, $.translate._defaults, $.fn.translate.defaults, o, + { complete:function(e,t){$.translate(function(){ + + var from = $.translate.toLanguageCode(o.from); + + if(o.fromOriginal) + e.each(function(i, el){ + $fly[0] = el; + var data = $.translate.getData($fly, from, o); + if( !data ) return true; + t[i] = data; + }); + + + var each = o.each; + + function unshiftArgs(method){ + return function(){ + [].unshift.call(arguments, this.elements); + method.apply(this, arguments); + }; + } + + //TODO: set as instance property + o.nodes = e; + o.start = unshiftArgs(o.start); + o.onTimeout = unshiftArgs(o.onTimeout); + o.complete = unshiftArgs(o.complete); + + o.each = function(i){ + var args = arguments; + if(arguments.length !== 7) //if isn't called from _toggle + [].splice.call(args, 1, 0, this.elements[i]); + this.each.apply(this, args); + each.apply(this, args); + }; + + $.translate(t, o); + + });}, + + each: function(){} + }); + + if(this.nodesContainingText) + return this.nodesContainingText(ncto); + + //fallback if nodesContainingText method is not present: + o.nodes = this; + $.translate($.map(this, function(e){ return $(e).html() || $(e).val(); }), o); + return this; +}; + +$.fn.translate.defaults = $.extend({}, $.translate._defaults); + +})(jQuery);/*!- + * TextNode Translator for the jQuery Translate plugin + * Version: ${version} + * http://code.google.com/p/jquery-translate/ + */ + +;(function($){ + + +function getTextNodes( root, _filter ){ + + var nodes = [], + skip = {SCRIPT:1, NOSCRIPT:1, STYLE:1, IFRAME:1}, + notType = typeof _filter, + filter = notType === "string" ? function(node){ return !$(node).is(_filter); } : + notType === "function" ? _filter : //e.g. function(node){ return node.nodeName != 'A'; } + null; + + function recurse(_, root){ + var i = 0, children = root.childNodes, l = children.length, node; + for(; i < l; i++){ + node = children[i]; + + if(node.nodeType == 3 && /\S/.test(node.nodeValue)) + nodes.push(node); + else if( node.nodeType == 1 && + !skip[ node.nodeName.toUpperCase() ] && + (!filter || filter(node))) + recurse(null, node); + } + } + + $.each((root.length && !root.nodeName) ? root : [root], recurse); + + return nodes; +} + +function toggleDir(e, dir){ + var align = e.css("text-align"); + e.css("direction", dir); + if(align === "right") e.css("text-align", "left"); + if(align === "left") e.css("text-align", "right"); +} + +function setLangAttr(e, to, o){ + if(!o || o.setLangAttr) + $(e).attr((!o || o.setLangAttr === true) ? "lang" : o.setLangAttr, to); +} + +function replace(parent, node, text, to, o){ + if(!o.replace) return; + var isRtl = $.translate.isRtl, + lang = $.data(parent, "lang"); + + if( isRtl[ to ] !== isRtl[ lang || o && o.from ] ){ + var $parent = $(parent); + if( isRtl[ to ] ) + toggleDir($parent, "rtl"); + else if( $parent.css("direction") === "rtl" ) + toggleDir($parent, "ltr"); + } + + $.data(parent, "lang", to); + + if(text != node.nodeValue){ + var newTextNode = document.createTextNode(text); + parent.replaceChild(newTextNode, node); + return newTextNode; + } + + return node; +} + +function setData(parent, o, src, trnsl){ + if(o.data){ + var TR = "translation"; + if(!$.data(parent, TR)) + $.data(parent, TR, {}); + + if(!$.data(parent, TR)[o.from]) + $.data(parent, TR)[o.from] = []; + [].push.call($.data(parent, TR)[o.from], src); + + if(!$.data(parent, TR)[o.to]) + $.data(parent, TR)[o.to] = []; + [].push.call($.data(parent, TR)[o.to], trnsl); + } +} + +function getData(parent, lang, that){ + that._childIndex = that._prevParent === parent ? that._childIndex + 1 : 0; + var tr = $.data(parent, "translation"); + that._prevParent = parent; + return tr && tr[lang] && tr[lang][that._childIndex]; + +} + +function _each(i, textNode, t, s, from, to, o){ + t = t.replace(/</g, '<') + .replace(/>/g, '>') + .replace(/&/g, '&') + .replace(/"/g, '"') + .replace(/'|'/g, "'"); + + var parent = textNode.parentNode; + setData(parent, o, s, t); + var newTextNode = replace(parent, textNode, t, to, o); + setLangAttr(parent, o.to, o); + + return newTextNode; +} + +$.translateTextNodes = function(root){ + var args = [].slice.call(arguments,0); + args.shift(); + +$.translate(function(){ + var o = $.translate._getOpt(args, $.translateTextNodes.defaults), + each = o.each, + nodes = getTextNodes(root, o.not), + contents = $.map(nodes, function(n){ return n.nodeValue; }), + from = $.translate.toLanguageCode(o.from), + obj = {}; + + o.nodes = nodes; + o.textNodes = true; + o.trim = false; + + if(o.fromOriginal) + $.each(nodes, function(i, textNode){ + var data = getData(textNode.parentNode, from, obj); + if( !data ) return true; + contents[i] = data; + }); + + function unshiftArgs(method){ + return function(){ + [].unshift.call(arguments, this.elements); + method.apply(this, arguments); + }; + } + + o.start = unshiftArgs(o.start); + o.onTimeout = unshiftArgs(o.onTimeout); + o.complete = unshiftArgs(o.complete); + + o.each = function(i){ + var args = arguments; + if(arguments.length !== 7) //if isn't called from _toggle + [].splice.call(args, 1, 0, this.elements[i]); + this.elements[i] = args[1] = _each.apply(this, args); + + each.apply(this, args); + }; + + $.translate(contents, o); + +}); +}; + +$.translate.fn._toggleTextNodes = function(){ + var o = this.options, to = o.to, stop; + + $.each(this.elements, $.translate._bind(function(i, textNode){ + this.i = i; + var parent = textNode.parentNode, + tr = getData(parent, to, this); + + if(!tr) return !(stop = true); + + this.translation.push(tr); + + o.each.call(this, i, textNode, tr, this.source[i], this.from, to, o); + //'from' will be undefined if it wasn't set + }, this)); + + !stop ? this._complete() : this._process(); + //o.complete.call(this, this.elements, this.translation, this.source, this.from, this.to, o); +}; + +$.fn.translateTextNodes = function(a, b, c){ + [].unshift.call(arguments, this); + $.translateTextNodes.apply(null, arguments); + return this; +}; + +$.translateTextNodes.defaults = $.fn.translateTextNodes.defaults = $.extend({}, $.translate._defaults); + + +})(jQuery); +/*!- + * Simple user interface extension for the jQuery Translate plugin + * Version: ${version} + * http://code.google.com/p/jquery-translate/ + */ +;(function($){ + +var defaults = { + tags: ["select", "option"], + filter: $.translate.isTranslatable, + label: $.translate.toNativeLanguage || + function(langCode, lang){ + return $.translate.capitalize(lang); + }, + includeUnknown: false +}; + +$.translate.ui = function(){ + var o = {}, str='', cs='', cl=''; + + if(typeof arguments[0] === "string") + o.tags = $.makeArray(arguments); + else o = arguments[0]; + + o = $.extend({}, defaults, $.translate.ui.defaults, o); + + if(o.tags[2]){ + cs = '<' + o.tags[2] + '>'; + cl = ''; + } + + var languages = $.translate.getLanguages(o.filter); + if(!o.includeUnknown) delete languages.UNKNOWN; + + $.each( languages, function(l, lc){ + str += ('<' + o.tags[1] + " value=" + lc + '>' + cs + + //$.translate.capitalize(l) + " - " + + o.label(lc, l) + + cl + ''); + }); + + return $('<' + o.tags[0] + ' class="jq-translate-ui">' + str + ''); + +}; + +$.translate.ui.defaults = $.extend({}, defaults); + + +})(jQuery); +/*!- + * Progress indicator extension for the jQuery Translate plugin + * Version: ${version} + * http://code.google.com/p/jquery-translate/ + */ + +;jQuery.translate.fn.progress = function(selector, options){ + if(!this.i) this._pr = 0; + this._pr += this.source[this.i].length; + var progress = 100 * this._pr / ( this.rawSource.length - ( 11 * (this.i + 1) ) ); + + if(selector){ + var e = jQuery(selector); + if( !this.i && !e.hasClass("ui-progressbar") ) + e.progressbar(options); + e.progressbar( "option", "value", progress ); + } + + return progress; +};/*!- + * Native language names extension for the jQuery Translate plugin + * Version: ${version} + * http://code.google.com/p/jquery-translate/ + */ +;(function($){ +$.translate.extend({ + + toNativeLanguage: function(lang){ + return $.translate.nativeLanguages[ lang ] || + $.translate.nativeLanguages[ $.translate.toLanguageCode(lang) ]; + }, + + nativeLanguages: { + "af":"Afrikaans", + "be":"Беларуская", + "is":"Íslenska", + "ga":"Gaeilge", + "mk":"Македонски", + "ms":"Bahasa Melayu", + "sw":"Kiswahili", + "cy":"Cymraeg", + "yi":"ייִדיש", + + "sq":"Shqipe", + "ar":"العربية", + "bg":"Български", + "ca":"Català", + "zh":"中文", + "zh-CN":"简体中文", + "zh-TW":"繁體中文", + "hr":"Hrvatski", + "cs":"Čeština", + "da":"Dansk", + "nl":"Nederlands", + "en":"English", + "et":"Eesti", + "tl":"Tagalog", + "fi":"Suomi", + "fr":"Français", + "gl":"Galego", + "de":"Deutsch", + "el":"Ελληνικά", + "iw":"עברית", + "hi":"हिन्दी", + "hu":"Magyar", + "id":"Bahasa Indonesia", + "it":"Italiano", + "ja":"日本語", + "ko":"한국어", + "lv":"Latviešu", + "lt":"Lietuvių", + "mt":"Malti", + "no":"Norsk", + "fa":"فارسی", + "pl":"Polski", + "pt-PT":"Português", + "ro":"Român", + "ru":"Русский", + "sr":"Српски", + "sk":"Slovenský", + "sl":"Slovenski", + "es":"Español", + "sv":"Svenska", + "th":"ไทย", + "tr":"Türkçe", + "uk":"Українська", + "vi":"Tiếng Việt" + } + +}); + +})(jQuery);/*!- + * Paralell extension for the jQuery Translate plugin + * Version: ${version} + * http://code.google.com/p/jquery-translate/ + */ + +;(function($){ +$.translate.extend({ + defer: function(){ + return $.translate._bind($.translate, null, arguments); + }, + + run: function(array, finished){ + var count = array.length; + $.each(array, function(){ + var inst = this(), + complete = inst.options.complete; + inst.options.complete = function(){ + complete.apply(this, arguments); + if(!--count) finished(); + }; + }); + } +}); + +})(jQuery); diff --git a/helpdesk/templates/helpdesk/attribution.html b/helpdesk/templates/helpdesk/attribution.html index 90be0ced..461621e3 100644 --- a/helpdesk/templates/helpdesk/attribution.html +++ b/helpdesk/templates/helpdesk/attribution.html @@ -1,2 +1,5 @@ {% load i18n %} -{% trans "Powered by django-helpdesk." %} \ No newline at end of file +{% trans "Powered by django-helpdesk." %} +{% if helpdesk_settings.HELPDESK_SUPPORT_PERSON %} +

{% trans "For technical support please contact:" %} {{ helpdesk_settings.HELPDESK_SUPPORT_PERSON }}

+{% endif %} diff --git a/helpdesk/templates/helpdesk/base.html b/helpdesk/templates/helpdesk/base.html index aad66a93..7282087c 100644 --- a/helpdesk/templates/helpdesk/base.html +++ b/helpdesk/templates/helpdesk/base.html @@ -1,5 +1,7 @@ {% load i18n %} {% load saved_queries %} +{% load load_helpdesk_settings %} +{% with request|load_helpdesk_settings as helpdesk_settings %} {% with request|saved_queries as user_saved_queries_ %} @@ -7,20 +9,72 @@ {% block helpdesk_title %}Helpdesk{% endblock %} :: {% trans "Powered by django-helpdesk" %} - + {% comment %} + + {% endcomment %} + + + {% comment %} + {% endcomment %} + +