diff --git a/helpdesk/email.py b/helpdesk/email.py index 3a520c3c..5fd68a86 100644 --- a/helpdesk/email.py +++ b/helpdesk/email.py @@ -337,9 +337,15 @@ def create_object_from_email_message(message, ticket_id, payload, files, logger) if previous_followup is None and ticket_id is not None: try: ticket = Ticket.objects.get(id=ticket_id) - new = False except Ticket.DoesNotExist: ticket = None + else: + new = False + # Check if the ticket has been merged to another ticket + if ticket.merged_to: + logger.info("Ticket has been merged to %s" % ticket.merged_to.ticket) + # Use the ticket in which it was merged to for next operations + ticket = ticket.merged_to # New issue, create a new instance if ticket is None: diff --git a/helpdesk/forms.py b/helpdesk/forms.py index 39cf8bcd..d6779c69 100644 --- a/helpdesk/forms.py +++ b/helpdesk/forms.py @@ -8,7 +8,7 @@ forms.py - Definitions of newforms-based forms for creating and maintaining """ import logging -from django.core.exceptions import ObjectDoesNotExist +from django.core.exceptions import ObjectDoesNotExist, ValidationError from django import forms from django.conf import settings from django.utils.translation import ugettext_lazy as _ @@ -510,3 +510,22 @@ class TicketDependencyForm(forms.ModelForm): class Meta: model = TicketDependency exclude = ('ticket',) + + +class MultipleTicketSelectForm(forms.Form): + tickets = forms.ModelMultipleChoiceField( + label=_('Tickets to merge'), + queryset=Ticket.objects.filter(merged_to=None), + widget=forms.SelectMultiple(attrs={'class': 'form-control'}) + ) + + def clean_tickets(self): + tickets = self.cleaned_data.get('tickets') + if len(tickets) < 2: + raise ValidationError(_('Please choose at least 2 tickets.')) + if len(tickets) > 4: + raise ValidationError(_('Impossible to merge more than 4 tickets...')) + queues = tickets.order_by('queue').distinct().values_list('queue', flat=True) + if len(queues) != 1: + raise ValidationError(_('All selected tickets must share the same queue in order to be merged.')) + return tickets diff --git a/helpdesk/lib.py b/helpdesk/lib.py index 7cdfb967..ecc83b21 100644 --- a/helpdesk/lib.py +++ b/helpdesk/lib.py @@ -26,7 +26,7 @@ def ticket_template_context(ticket): for field in ('title', 'created', 'modified', 'submitter_email', 'status', 'get_status_display', 'on_hold', 'description', 'resolution', 'priority', 'get_priority_display', - 'last_escalation', 'ticket', 'ticket_for_url', + 'last_escalation', 'ticket', 'ticket_for_url', 'merged_to', 'get_status', 'ticket_url', 'staff_url', '_get_assigned_to' ): attr = getattr(ticket, field, None) diff --git a/helpdesk/locale/fr/LC_MESSAGES/django.mo b/helpdesk/locale/fr/LC_MESSAGES/django.mo index 2aec870d..b2642e5c 100644 Binary files a/helpdesk/locale/fr/LC_MESSAGES/django.mo and b/helpdesk/locale/fr/LC_MESSAGES/django.mo differ diff --git a/helpdesk/locale/fr/LC_MESSAGES/django.po b/helpdesk/locale/fr/LC_MESSAGES/django.po index 1ff42417..d0009a8a 100644 --- a/helpdesk/locale/fr/LC_MESSAGES/django.po +++ b/helpdesk/locale/fr/LC_MESSAGES/django.po @@ -16,7 +16,7 @@ msgid "" msgstr "" "Project-Id-Version: django-helpdesk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-06-10 11:34+0200\n" +"POT-Creation-Date: 2020-10-31 00:13+0100\n" "PO-Revision-Date: 2016-06-07 12:22+0000\n" "Last-Translator: Antoine Nguyen \n" "Language-Team: French (http://www.transifex.com/rossp/django-helpdesk/" @@ -27,74 +27,105 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: .\admin.py:29 .\models.py:415 -#: .\templates\helpdesk\public_view_ticket.html:19 -#: .\templates\helpdesk\ticket_desc_table.html:57 +#: .\admin.py:38 .\models.py:493 +#: .\templates\helpdesk\public_view_ticket.html:26 +#: .\templates\helpdesk\ticket_desc_table.html:39 msgid "Submitter E-Mail" msgstr "E-mail de l’Émetteur" -#: .\admin.py:48 .\models.py:40 .\models.py:965 .\models.py:1374 +#: .\admin.py:68 .\models.py:86 .\models.py:1272 .\models.py:1757 msgid "Slug" msgstr "Slug" -#: .\forms.py:139 .\models.py:272 .\models.py:399 -#: .\templates\helpdesk\include\tickets.html:18 -#: .\templates\helpdesk\include\unassigned.html:18 -#: .\templates\helpdesk\report_index.html:39 -#: .\templates\helpdesk\rss_list.html:34 +#: .\email.py:374 +#, python-format +msgid "E-Mail Received from %(sender_email)s" +msgstr "E-mail reçu de %(sender_email)s " + +#: .\email.py:383 +#, python-format +msgid "Ticket Re-Opened by E-Mail Received from %(sender_email)s" +msgstr "Ticket ré-ouvert par E-mail reçu de %(sender_email)s " + +#: .\email.py:440 +msgid "Comment from e-mail" +msgstr "Commentaire depuis l'e-mail" + +#: .\email.py:446 +msgid "Unknown Sender" +msgstr "Expéditeur inconnu" + +#: .\email.py:526 +msgid "email_html_body.html" +msgstr "email_html_body.html" + +#: .\forms.py:147 .\models.py:332 .\models.py:477 +#: .\templates\helpdesk\filters\sorting.html:16 +#: .\templates\helpdesk\include\tickets.html:16 +#: .\templates\helpdesk\include\unassigned.html:15 +#: .\templates\helpdesk\include\unassigned.html:55 +#: .\templates\helpdesk\report_index.html:44 +#: .\templates\helpdesk\rss_list.html:45 #: .\templates\helpdesk\ticket_list.html:63 -#: .\templates\helpdesk\ticket_list.html:82 -#: .\templates\helpdesk\ticket_list.html:223 .\views\staff.py:1239 -#: .\views\staff.py:1245 .\views\staff.py:1251 .\views\staff.py:1257 +#: .\templates\helpdesk\ticket_list.html:176 .\views\staff.py:1436 +#: .\views\staff.py:1442 .\views\staff.py:1448 .\views\staff.py:1454 msgid "Queue" msgstr "File" -#: .\forms.py:148 +#: .\forms.py:156 msgid "Summary of the problem" msgstr "Résumé du problème" -#: .\forms.py:153 +#: .\forms.py:161 msgid "Description of your issue" msgstr "Description de votre problème" -#: .\forms.py:155 +#: .\forms.py:163 msgid "Please be as descriptive as possible and include all details" msgstr "Soyez aussi précis que possible et renseignez chaque détails." -#: .\forms.py:163 .\management\commands\escalate_tickets.py:156 .\models.py:459 -#: .\templates\helpdesk\public_view_ticket.html:24 -#: .\templates\helpdesk\ticket.html:215 -#: .\templates\helpdesk\ticket_desc_table.html:62 -#: .\templates\helpdesk\ticket_list.html:88 .\views\staff.py:551 +#: .\forms.py:171 .\management\commands\escalate_tickets.py:131 .\models.py:537 +#: .\templates\helpdesk\filters\sorting.html:22 +#: .\templates\helpdesk\include\tickets.html:15 +#: .\templates\helpdesk\include\unassigned.html:14 +#: .\templates\helpdesk\include\unassigned.html:54 +#: .\templates\helpdesk\public_view_ticket.html:31 +#: .\templates\helpdesk\ticket.html:179 +#: .\templates\helpdesk\ticket_desc_table.html:49 +#: .\templates\helpdesk\ticket_list.html:62 .\views\staff.py:644 msgid "Priority" msgstr "Priorité" -#: .\forms.py:164 +#: .\forms.py:172 msgid "Please select a priority carefully. If unsure, leave it as '3'." msgstr "" "Veuillez choisir une priorité avec attention. En cas de doute, laisser sur " "'3'." -#: .\forms.py:170 .\models.py:467 .\templates\helpdesk\ticket.html:218 -#: .\views\staff.py:561 +#: .\forms.py:179 .\models.py:545 .\templates\helpdesk\ticket.html:182 +#: .\views\staff.py:654 .\views\staff.py:866 msgid "Due on" msgstr "Résolution souhaitée le " -#: .\forms.py:175 +#: .\forms.py:185 msgid "Attach File" msgstr "Joindre un fichier" -#: .\forms.py:176 +#: .\forms.py:186 msgid "You can attach a file such as a document or screenshot to this ticket." msgstr "" "Vous pouvez joindre un fichier tel qu'un document ou une capture d'écran " "pour ce ticket." -#: .\forms.py:299 +#: .\forms.py:198 +msgid "Knowledge Base Item" +msgstr "Élément de la base de connaissance" + +#: .\forms.py:297 msgid "Submitter E-Mail Address" msgstr "Adresse e-mail de l'émetteur" -#: .\forms.py:301 +#: .\forms.py:299 msgid "" "This e-mail address will receive copies of all public updates to this ticket." msgstr "" @@ -113,89 +144,51 @@ msgstr "" "Si vous sélectionnez un autre propriétaire que vous-même, il lui sera " "immédiatement envoyé par courriel les détails de ce billet." -#: .\forms.py:338 +#: .\forms.py:349 #, python-format msgid "Ticket Opened & Assigned to %(name)s" msgstr "Billet ouvert et assigné à %(name)s" -#: .\forms.py:339 +#: .\forms.py:350 msgid "" msgstr "" -#: .\forms.py:342 +#: .\forms.py:353 msgid "Ticket Opened" msgstr "Billet ouvert" -#: .\forms.py:362 +#: .\forms.py:373 msgid "Your E-Mail Address" msgstr "Votre adresse e-mail" -#: .\forms.py:363 +#: .\forms.py:374 msgid "We will e-mail you when your ticket is updated." msgstr "Nous vous enverrons un e-mail dès que votre billet sera mis à jour." -#: .\forms.py:393 +#: .\forms.py:439 msgid "Ticket Opened Via Web" msgstr "Billet ouvert via le Web" -#: .\forms.py:406 -msgid "Show Ticket List on Login?" -msgstr "Afficher la liste des billets lors de la connexion ?" +#: .\forms.py:517 +msgid "Tickets to merge" +msgstr "Billet à fusionner" -#: .\forms.py:407 -msgid "Display the ticket list upon login? Otherwise, the dashboard is shown." +#: .\forms.py:525 +msgid "Please choose at least 2 tickets." +msgstr "Veuillez choisir au moins 2 tickets" + +#: .\forms.py:527 +msgid "Impossible to merge more than 4 tickets..." +msgstr "Impossible de fusionner plus de 4 tickets..." + +#: .\forms.py:530 +msgid "All selected tickets must share the same queue in order to be merged." msgstr "" -"Afficher la liste des billets lors de la connexion ? Dans le cas contraire, " -"le tableau de bord sera affiché." - -#: .\forms.py:412 -msgid "E-mail me on ticket change?" -msgstr "M'envoyer un e-mail lors de changement pour le ticket ?" - -#: .\forms.py:413 -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 "" -"Si vous êtes le propriétaire d'un ticket et que le ticket est modifié via le " -"web par quelqu'un d'autre, voulez-vous recevoir un courriel ?" - -#: .\forms.py:418 -msgid "E-mail me when assigned a ticket?" -msgstr "M'envoyer un courriel lorsqu'on m'assigne un ticket ?" - -#: .\forms.py:419 -msgid "" -"If you are assigned a ticket via the web, do you want to receive an e-mail?" -msgstr "" -"Si vous êtes affecté à un ticket via le web, voulez-vous recevoir un " -"courriel ?" - -#: .\forms.py:424 -msgid "Number of tickets to show per page" -msgstr "Nombre de tickets à afficher par page" - -#: .\forms.py:425 -msgid "How many tickets do you want to see on the Ticket List page?" -msgstr "Combien de tickets voulez-vous voir sur la page Liste des Tickets ?" - -#: .\forms.py:431 -msgid "Use my e-mail address when submitting tickets?" -msgstr "Utiliser mon adresse e-mail lors de la soumission des tickets ?" - -#: .\forms.py:432 -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 "" -"Quand vous soumettez un ticket, voulez-vous d'utiliser automatiquement votre " -"adresse e-mail comme adresse d'émetteur? Vous pouvez taper une autre adresse " -"e-mail lors de la saisie du ticket en cas de besoin, cette option ne modifie " -"que la valeur par défaut." +"Tous les tickets sélectionnés doivent partager la même file afin d'être " +"fusionnés" #: .\management\commands\create_queue_permissions.py:69 -#: .\migrations\0009_migrate_queuemembership.py:30 .\models.py:331 +#: .\migrations\0009_migrate_queuemembership.py:28 .\models.py:406 msgid "Permission for queue: " msgstr "Permission pour la file : " @@ -209,43 +202,18 @@ msgstr "" "leur configuration si nécessaire. Utilise settings.DEFAULT_USER_SETTINGS que " "vous pouvez personnaliser pour s'adapter à vos besoins." -#: .\management\commands\escalate_tickets.py:150 +#: .\management\commands\escalate_tickets.py:125 #, python-format msgid "Ticket escalated after %s days" msgstr "Ticket augmenté après %s days" -#: .\management\commands\get_email.py:309 -msgid "Comment from e-mail" -msgstr "Commentaire depuis l'e-mail" - -#: .\management\commands\get_email.py:315 -msgid "Unknown Sender" -msgstr "Expéditeur inconnu" - -#: .\management\commands\get_email.py:372 -msgid "email_html_body.html" -msgstr "email_html_body.html" - -#: .\management\commands\get_email.py:484 -#, python-format -msgid "E-Mail Received from %(sender_email)s" -msgstr "E-mail reçu de %(sender_email)s " - -#: .\management\commands\get_email.py:492 -#, python-format -msgid "Ticket Re-Opened by E-Mail Received from %(sender_email)s" -msgstr "Ticket ré-ouvert par E-mail reçu de %(sender_email)s " - -#: .\models.py:35 .\models.py:392 .\models.py:651 .\models.py:960 -#: .\models.py:998 .\templates\helpdesk\include\tickets.html:17 -#: .\templates\helpdesk\include\unassigned.html:17 -#: .\templates\helpdesk\ticket.html:209 -#: .\templates\helpdesk\ticket_list.html:79 -#: .\templates\helpdesk\ticket_list.html:222 .\views\staff.py:523 +#: .\models.py:81 .\models.py:470 .\models.py:876 .\models.py:1325 +#: .\templates\helpdesk\filters\sorting.html:13 +#: .\templates\helpdesk\ticket.html:173 .\views\staff.py:616 msgid "Title" msgstr "Titre" -#: .\models.py:43 +#: .\models.py:89 msgid "" "This slug is used when building ticket ID's. Once set, try not to change it " "or e-mailing may get messy." @@ -254,12 +222,12 @@ msgstr "" "définie, éssayez de ne pas le changer ou les email risquent de ne plus " "fonctionner" -#: .\models.py:48 .\models.py:1208 .\models.py:1291 .\models.py:1371 +#: .\models.py:94 .\models.py:1593 .\models.py:1675 .\models.py:1754 #: .\templates\helpdesk\email_ignore_list.html:25 msgid "E-Mail Address" msgstr "Adresse E-Mail" -#: .\models.py:51 +#: .\models.py:97 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." @@ -268,11 +236,11 @@ msgstr "" "Si vous utilisez IMAP ou POP3, ce doit être l'adresse e-mail pour cette " "boîte aux lettres." -#: .\models.py:57 .\models.py:936 +#: .\models.py:103 .\models.py:1239 msgid "Locale" msgstr "Localisation" -#: .\models.py:61 +#: .\models.py:107 msgid "" "Locale of this queue. All correspondence in this queue will be in this " "language." @@ -280,30 +248,30 @@ msgstr "" "Localisation de cette file. Toute la correspondance dans cette file sera " "dans cette langue." -#: .\models.py:66 +#: .\models.py:112 msgid "Allow Public Submission?" msgstr "Autoriser la publication publique ?" -#: .\models.py:69 +#: .\models.py:115 msgid "Should this queue be listed on the public submission form?" msgstr "" "Cette file doit-elle être listée dans le formulaire public de soumission ?" -#: .\models.py:73 +#: .\models.py:119 msgid "Allow E-Mail Submission?" msgstr "Autoriser la publication E-Mail ?" -#: .\models.py:76 +#: .\models.py:122 msgid "Do you want to poll the e-mail box below for new tickets?" msgstr "" "Voulez-vous du relever la boîte e-mail ci-dessous pour la création de " "nouveaux tickets ?" -#: .\models.py:81 +#: .\models.py:127 msgid "Escalation Days" msgstr "Jours d'augmentation des priorités." -#: .\models.py:84 +#: .\models.py:130 msgid "" "For tickets which are not held, how often do you wish to increase their " "priority? Set to 0 for no escalation." @@ -311,11 +279,11 @@ msgstr "" "Pour les tickets qui ne sont pas affectés, à quelle fréquence souhaitez-vous " "augmenter leur priorité ? Mettre à 0 pour pas d'augmentation." -#: .\models.py:89 +#: .\models.py:135 msgid "New Ticket CC Address" msgstr "Nouvelle adresse \"copie à\" pour ce ticket" -#: .\models.py:93 +#: .\models.py:139 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-" @@ -325,11 +293,11 @@ msgstr "" "nouvellement créé dans cette file. Entrez une liste d'adresses mails " "séparées par des virgules." -#: .\models.py:99 +#: .\models.py:145 msgid "Updated Ticket CC Address" msgstr "Adresse \"copie à\" du ticket mise à jour" -#: .\models.py:103 +#: .\models.py:149 msgid "" "If an e-mail address is entered here, then it will receive notification of " "all activity (new tickets, closed tickets, updates, reassignments, etc) for " @@ -340,23 +308,34 @@ msgstr "" "changement de propriétaire, etc.). Entrez une liste d'adresses mails " "séparées par des virgules." -#: .\models.py:110 +#: .\models.py:156 +msgid "Notify contacts when email updates arrive" +msgstr "" + +#: .\models.py:159 +msgid "" +"When an email arrives to either create a ticket or to interact with an " +"existing discussion. Should email notifications be sent ? Note: the " +"new_ticket_cc and updated_ticket_cc work independently of this feature" +msgstr "" + +#: .\models.py:165 msgid "E-Mail Box Type" msgstr "Type de boites mail" -#: .\models.py:112 +#: .\models.py:167 msgid "POP 3" msgstr "POP 3" -#: .\models.py:112 +#: .\models.py:167 msgid "IMAP" msgstr "IMAP" -#: .\models.py:112 +#: .\models.py:167 msgid "Local Directory" msgstr "Dossier local" -#: .\models.py:115 +#: .\models.py:170 msgid "" "E-Mail server type for creating tickets automatically from a mailbox - both " "POP3 and IMAP are supported, as well as reading from a local directory." @@ -365,11 +344,11 @@ msgstr "" "boîte aux lettres - POP3 et IMAP sont supportés, ainsi que la lecture sur un " "dossier local." -#: .\models.py:121 +#: .\models.py:176 msgid "E-Mail Hostname" msgstr "E-Mail Hostname" -#: .\models.py:125 +#: .\models.py:180 msgid "" "Your e-mail server address - either the domain name or IP address. May be " "\"localhost\"." @@ -377,11 +356,11 @@ msgstr "" "Votre adresse de serveur e-mail - soit le nom de domaine ou adresse IP. Peut " "être \"localhost\"." -#: .\models.py:130 +#: .\models.py:185 msgid "E-Mail Port" msgstr "E-Mail Port" -#: .\models.py:133 +#: .\models.py:188 msgid "" "Port number to use for accessing e-mail. Default for POP3 is \"110\", and " "for IMAP is \"143\". This may differ on some servers. Leave it blank to use " @@ -391,11 +370,11 @@ msgstr "" "le \"110\", et IMAP le \"143\". Cela peut différer sur certains serveurs. " "Laissez le champ vide pour utiliser les paramètres par défaut." -#: .\models.py:139 +#: .\models.py:194 msgid "Use SSL for E-Mail?" msgstr "Utiliser SSL pour les E-Mail ?" -#: .\models.py:142 +#: .\models.py:197 msgid "" "Whether to use SSL for IMAP or POP3 - the default ports when using SSL are " "993 for IMAP and 995 for POP3." @@ -403,27 +382,27 @@ msgstr "" "Que ce soit pour utiliser SSL pour IMAP ou POP3 - les ports par défaut " "lorsque vous utilisez SSL sont 993 pour IMAP et 995 pour POP3." -#: .\models.py:147 +#: .\models.py:202 msgid "E-Mail Username" msgstr "Nom d'utilisateur E-Mail" -#: .\models.py:151 +#: .\models.py:206 msgid "Username for accessing this mailbox." msgstr "Nom d'utilisateur pour accéder à cette boîte aux lettres." -#: .\models.py:155 +#: .\models.py:210 msgid "E-Mail Password" msgstr "Mot de passe E-Mail" -#: .\models.py:159 +#: .\models.py:214 msgid "Password for the above username" msgstr "Mot de passe pour le nom d'utilisateur ci-dessus" -#: .\models.py:163 +#: .\models.py:218 msgid "IMAP Folder" msgstr "Dossier IMAP" -#: .\models.py:167 +#: .\models.py:222 msgid "" "If using IMAP, what folder do you wish to fetch messages from? This allows " "you to use one IMAP account for multiple queues, by filtering messages on " @@ -434,11 +413,11 @@ msgstr "" "en filtrant les messages sur votre serveur IMAP dans des dossiers distincts. " "Par défaut: INBOX." -#: .\models.py:174 +#: .\models.py:229 msgid "E-Mail Local Directory" msgstr "Dossier local d'e-mail" -#: .\models.py:178 +#: .\models.py:233 msgid "" "If using a local directory, what directory path do you wish to poll for new " "email? Example: /var/lib/mail/helpdesk/" @@ -446,86 +425,87 @@ msgstr "" "Si vous utilisez un dossier local, quel chemin souhaitez-vous pour récupérer " "les nouveaux e-mails dans votre dossier ? Exemple: /var/lib/mail/helpdesk/" -#: .\models.py:184 +#: .\models.py:239 msgid "Django auth permission name" msgstr "Nom de permission auth de Django" -#: .\models.py:189 +#: .\models.py:244 msgid "Name used in the django.contrib.auth permission system" msgstr "Nom utilisé dans système de permission django.contrib.auth" -#: .\models.py:193 +#: .\models.py:248 msgid "E-Mail Check Interval" msgstr "Périodicité de la vérification des e-mail." -#: .\models.py:194 +#: .\models.py:249 msgid "How often do you wish to check this mailbox? (in Minutes)" msgstr "" -"A quelle fréquence voulez vous vérifier cette boîte aux lettres? (En minutes)" +"A quelle fréquence voulez vous vérifier cette boîte aux lettres ? (En " +"minutes)" -#: .\models.py:208 +#: .\models.py:263 msgid "Socks Proxy Type" msgstr "Type de Proxy Socks" -#: .\models.py:210 +#: .\models.py:265 msgid "SOCKS4" msgstr "SOCKS4" -#: .\models.py:210 +#: .\models.py:265 msgid "SOCKS5" msgstr "SOCKS5" -#: .\models.py:213 +#: .\models.py:268 msgid "" "SOCKS4 or SOCKS5 allows you to proxy your connections through a SOCKS server." msgstr "" "SOCKS4 ou SOCKS5 vous permrmettent de vous connecter via un server SOCKS" -#: .\models.py:217 +#: .\models.py:272 msgid "Socks Proxy Host" msgstr "Hôte du Proxy Socks" -#: .\models.py:220 +#: .\models.py:275 msgid "Socks proxy IP address. Default: 127.0.0.1" msgstr "Adresse du Proxy Socks. Par défaut : 127.0.0.1" -#: .\models.py:224 +#: .\models.py:279 msgid "Socks Proxy Port" msgstr "Port du Proxy Socks" -#: .\models.py:227 +#: .\models.py:282 msgid "Socks proxy port number. Default: 9150 (default TOR port)" msgstr "Numéro de port du Proxy Socks. Par défaut : 9150 (port TOR par défaut)" -#: .\models.py:231 +#: .\models.py:286 msgid "Logging Type" msgstr "Type de Logging" -#: .\models.py:234 .\templates\helpdesk\ticket_list.html:250 +#: .\models.py:289 .\templates\helpdesk\ticket_list.html:81 msgid "None" msgstr "Aucune" -#: .\models.py:235 +#: .\models.py:290 msgid "Debug" msgstr "Debug" -#: .\models.py:236 +#: .\models.py:291 msgid "Information" msgstr "Information" -#: .\models.py:237 +#: .\models.py:292 msgid "Warning" msgstr "Alerte" -#: .\models.py:238 +#: .\models.py:293 msgid "Error" msgstr "Erreur" -#: .\models.py:239 +#: .\models.py:294 msgid "Critical" msgstr "Critique" -#: .\models.py:243 +#: .\models.py:298 msgid "" "Set the default logging level. All messages at that level or above will be " "logged to the directory set below. If no level is set, logging will be " @@ -535,11 +515,11 @@ msgstr "" "au-dessus seront loggé sur le répertoire défini plus haut. Si aucun niveau " "n'est défini, les logs seront désactivés." -#: .\models.py:249 +#: .\models.py:304 msgid "Logging Directory" msgstr "Dossier de logs" -#: .\models.py:253 +#: .\models.py:308 msgid "" "If logging is enabled, what directory should we use to store log files for " "this queue? If no directory is set, default to /var/log/helpdesk/" @@ -548,131 +528,147 @@ msgstr "" "fichiers de logs pour cette file ? Si aucun dossier n'est défini, cela sera /" "var/log/helpdesk/ par défaut" -#: .\models.py:264 +#: .\models.py:319 msgid "Default owner" msgstr "Propriétaire par défaut" -#: .\models.py:273 .\templates\helpdesk\email_ignore_list.html:27 +#: .\models.py:323 +msgid "Time to be spent on this Queue in total" +msgstr "Temps dédié total à passer sur cette file" + +#: .\models.py:333 .\templates\helpdesk\email_ignore_list.html:27 msgid "Queues" msgstr "Files" -#: .\models.py:376 .\templates\helpdesk\report_index.html:40 -#: .\templates\helpdesk\ticket.html:160 +#: .\models.py:454 .\templates\helpdesk\report_index.html:45 +#: .\templates\helpdesk\ticket.html:117 msgid "Open" msgstr "Ouvert" -#: .\models.py:377 .\templates\helpdesk\ticket.html:168 -#: .\templates\helpdesk\ticket.html:176 .\templates\helpdesk\ticket.html:182 -#: .\templates\helpdesk\ticket.html:187 +#: .\models.py:455 .\templates\helpdesk\public_view_ticket.html:107 +#: .\templates\helpdesk\public_view_ticket.html:115 +#: .\templates\helpdesk\public_view_ticket.html:121 +#: .\templates\helpdesk\public_view_ticket.html:126 +#: .\templates\helpdesk\ticket.html:125 .\templates\helpdesk\ticket.html:133 +#: .\templates\helpdesk\ticket.html:139 .\templates\helpdesk\ticket.html:144 msgid "Reopened" msgstr "Réouvert" -#: .\models.py:378 .\templates\helpdesk\report_index.html:41 -#: .\templates\helpdesk\ticket.html:161 .\templates\helpdesk\ticket.html:169 -#: .\templates\helpdesk\ticket.html:177 +#: .\models.py:456 .\templates\helpdesk\public_view_ticket.html:108 +#: .\templates\helpdesk\public_view_ticket.html:116 +#: .\templates\helpdesk\report_index.html:46 +#: .\templates\helpdesk\ticket.html:118 .\templates\helpdesk\ticket.html:126 +#: .\templates\helpdesk\ticket.html:134 msgid "Resolved" msgstr "Résolu" -#: .\models.py:379 .\templates\helpdesk\report_index.html:42 -#: .\templates\helpdesk\ticket.html:162 .\templates\helpdesk\ticket.html:170 -#: .\templates\helpdesk\ticket.html:178 .\templates\helpdesk\ticket.html:183 +#: .\models.py:457 .\templates\helpdesk\public_view_ticket.html:109 +#: .\templates\helpdesk\public_view_ticket.html:117 +#: .\templates\helpdesk\public_view_ticket.html:122 +#: .\templates\helpdesk\report_index.html:47 +#: .\templates\helpdesk\ticket.html:119 .\templates\helpdesk\ticket.html:127 +#: .\templates\helpdesk\ticket.html:135 .\templates\helpdesk\ticket.html:140 msgid "Closed" msgstr "Fermé" -#: .\models.py:380 .\templates\helpdesk\ticket.html:163 -#: .\templates\helpdesk\ticket.html:171 .\templates\helpdesk\ticket.html:188 +#: .\models.py:458 .\templates\helpdesk\public_view_ticket.html:110 +#: .\templates\helpdesk\public_view_ticket.html:127 +#: .\templates\helpdesk\ticket.html:120 .\templates\helpdesk\ticket.html:128 +#: .\templates\helpdesk\ticket.html:145 msgid "Duplicate" msgstr "Doublon" -#: .\models.py:384 +#: .\models.py:462 msgid "1. Critical" msgstr "1. Critique" -#: .\models.py:385 +#: .\models.py:463 msgid "2. High" msgstr "2. Haut" -#: .\models.py:386 +#: .\models.py:464 msgid "3. Normal" msgstr "3. Normal" -#: .\models.py:387 +#: .\models.py:465 msgid "4. Low" msgstr "4. Faible" -#: .\models.py:388 +#: .\models.py:466 msgid "5. Very Low" msgstr "5. Très faible" -#: .\models.py:403 .\templates\helpdesk\include\unassigned.html:19 -#: .\templates\helpdesk\ticket_list.html:76 -#: .\templates\helpdesk\ticket_list.html:225 +#: .\models.py:481 .\templates\helpdesk\filters\sorting.html:10 +#: .\templates\helpdesk\include\unassigned.html:16 +#: .\templates\helpdesk\include\unassigned.html:56 +#: .\templates\helpdesk\ticket_list.html:65 msgid "Created" msgstr "Créé le" -#: .\models.py:405 +#: .\models.py:483 msgid "Date this ticket was first created" msgstr "Date de création du ticket" -#: .\models.py:409 +#: .\models.py:487 msgid "Modified" msgstr "Mis à jour" -#: .\models.py:411 +#: .\models.py:489 msgid "Date this ticket was most recently changed." msgstr "Dernière date de modification de ce ticket." -#: .\models.py:418 +#: .\models.py:496 msgid "" "The submitter will receive an email for all public follow-ups left for this " "task." msgstr "L'émetteur recevra un e-mail pour tous les suivis de cette tâche." -#: .\models.py:428 +#: .\models.py:506 msgid "Assigned to" msgstr "Assigné à" -#: .\models.py:432 .\templates\helpdesk\include\tickets.html:19 +#: .\models.py:510 .\templates\helpdesk\filters\sorting.html:19 +#: .\templates\helpdesk\include\tickets.html:17 #: .\templates\helpdesk\ticket_list.html:64 -#: .\templates\helpdesk\ticket_list.html:85 -#: .\templates\helpdesk\ticket_list.html:224 .\views\staff.py:533 +#: .\templates\helpdesk\ticket_list.html:177 .\views\staff.py:626 +#: .\views\staff.py:867 msgid "Status" msgstr "État" -#: .\models.py:438 +#: .\models.py:516 msgid "On Hold" msgstr "En attente" -#: .\models.py:441 +#: .\models.py:519 msgid "If a ticket is on hold, it will not automatically be escalated." msgstr "" "Si un ticket est en attente, sa priorité ne sera pas automatiquement " "augmentée." -#: .\models.py:445 .\models.py:969 -#: .\templates\helpdesk\public_view_ticket.html:42 -#: .\templates\helpdesk\ticket_desc_table.html:29 +#: .\models.py:523 .\models.py:1276 +#: .\templates\helpdesk\public_view_ticket.html:50 +#: .\templates\helpdesk\ticket_desc_table.html:95 .\views\staff.py:870 msgid "Description" msgstr "Description" -#: .\models.py:448 +#: .\models.py:526 msgid "The content of the customers query." msgstr "Contenu de la requête des clients." -#: .\models.py:452 .\templates\helpdesk\public_view_ticket.html:49 -#: .\templates\helpdesk\ticket_desc_table.html:36 +#: .\models.py:530 .\templates\helpdesk\public_view_ticket.html:57 +#: .\templates\helpdesk\ticket_desc_table.html:100 .\views\staff.py:871 msgid "Resolution" msgstr "Solution" -#: .\models.py:455 +#: .\models.py:533 msgid "The resolution provided to the customer by our staff." msgstr "La solution fournie au client par notre personnel." -#: .\models.py:463 +#: .\models.py:541 msgid "1 = Highest Priority, 5 = Low Priority" msgstr "1 = Priorité la plus élevée, 5 = faible priorité" -#: .\models.py:476 +#: .\models.py:554 msgid "" "The date this ticket was last escalated - updated automatically by " "management/commands/escalate_tickets.py." @@ -680,44 +676,76 @@ msgstr "" "La date à laquelle la priorité de ce ticket à été dernièrement augmentée - " "mise à jour automatiquement par management/commands/escalate_tickets.py." -#: .\models.py:485 .\templates\helpdesk\ticket_desc_table.html:53 -#: .\views\feeds.py:93 .\views\feeds.py:118 .\views\feeds.py:170 -#: .\views\staff.py:495 +#: .\models.py:559 +msgid "Secret key needed for viewing/editing ticket by non-logged in users" +msgstr "" +"Clé secrète nécessaire pour voir/éditer un ticket d'un utilisateur non " +"connecté" + +#: .\models.py:569 +msgid "Knowledge base item the user was viewing when they created this ticket." +msgstr "" +"Objet de la base de connaissance que l'utilisateur consultait lorsqu'il a " +"créé ce ticket." + +#: .\models.py:574 +msgid "merged to" +msgstr "fusionné à" + +#: .\models.py:652 .\templates\helpdesk\filters\owner.html:12 +#: .\templates\helpdesk\ticket_desc_table.html:35 .\views\feeds.py:93 +#: .\views\feeds.py:118 .\views\feeds.py:170 .\views\staff.py:586 msgid "Unassigned" msgstr "Non assigné" -#: .\models.py:525 +#: .\models.py:692 msgid " - On Hold" msgstr " - En attente" -#: .\models.py:528 +#: .\models.py:695 msgid " - Open dependencies" msgstr " - Dépendances ouvertes" -#: .\models.py:585 .\models.py:642 .\models.py:1278 .\models.py:1454 -#: .\models.py:1489 .\templates\helpdesk\public_homepage.html:79 +#: .\models.py:770 .\models.py:867 .\models.py:1662 .\models.py:1835 +#: .\models.py:1869 .\templates\helpdesk\include\tickets.html:14 +#: .\templates\helpdesk\include\unassigned.html:13 +#: .\templates\helpdesk\include\unassigned.html:53 +#: .\templates\helpdesk\public_homepage.html:58 #: .\templates\helpdesk\public_view_form.html:12 +#: .\templates\helpdesk\ticket_list.html:61 msgid "Ticket" msgstr "Ticket" -#: .\models.py:586 .\templates\helpdesk\navigation.html:23 -#: .\templates\helpdesk\ticket_list.html:4 +#: .\models.py:771 .\templates\helpdesk\create_ticket.html:7 +#: .\templates\helpdesk\delete_ticket.html:7 +#: .\templates\helpdesk\edit_ticket.html:7 +#: .\templates\helpdesk\email_ignore_add.html:7 +#: .\templates\helpdesk\followup_edit.html:14 +#: .\templates\helpdesk\rss_list.html:8 .\templates\helpdesk\ticket.html:16 +#: .\templates\helpdesk\ticket_cc_add.html:7 +#: .\templates\helpdesk\ticket_cc_del.html:7 +#: .\templates\helpdesk\ticket_cc_list.html:7 +#: .\templates\helpdesk\ticket_dependency_add.html:7 +#: .\templates\helpdesk\ticket_dependency_del.html:7 +#: .\templates\helpdesk\ticket_list.html:5 +#: .\templates\helpdesk\ticket_list.html:18 +#: .\templates\helpdesk\ticket_merge.html:14 msgid "Tickets" msgstr "Tickets" -#: .\models.py:646 .\models.py:880 .\models.py:1201 .\models.py:1368 +#: .\models.py:871 .\models.py:1184 .\models.py:1586 .\models.py:1751 msgid "Date" msgstr "Date" -#: .\models.py:658 .\views\staff.py:512 +#: .\models.py:883 .\views\staff.py:603 msgid "Comment" msgstr "Commentaire" -#: .\models.py:664 +#: .\models.py:889 msgid "Public" msgstr "Public" -#: .\models.py:667 +#: .\models.py:893 msgid "" "Public tickets are viewable by the submitter and all staff, but non-public " "tickets can only be seen by staff." @@ -725,99 +753,116 @@ msgstr "" "Les tickets publics sont visibles par l'émetteur et l'ensemble du personnel, " "mais les billets non-public ne peuvent être vus que par le personnel." -#: .\models.py:676 .\models.py:1068 .\models.py:1287 -#: .\templates\helpdesk\ticket_cc_add.html:20 .\views\staff.py:1214 -#: .\views\staff.py:1220 .\views\staff.py:1227 .\views\staff.py:1233 +#: .\models.py:903 .\models.py:1427 .\models.py:1671 +#: .\templates\helpdesk\ticket_cc_add.html:31 .\views\staff.py:1411 +#: .\views\staff.py:1417 .\views\staff.py:1424 .\views\staff.py:1430 msgid "User" msgstr "Utilisateur" -#: .\models.py:680 .\templates\helpdesk\ticket.html:156 +#: .\models.py:907 .\templates\helpdesk\ticket.html:113 msgid "New Status" msgstr "Nouvel état" -#: .\models.py:684 +#: .\models.py:911 msgid "If the status was changed, what was it changed to?" msgstr "Si l'état a été modifié, en quoi l'a-t-il été?" -#: .\models.py:691 .\models.py:717 .\models.py:780 +#: .\models.py:915 +msgid "E-Mail ID" +msgstr "E-Mail ID" + +#: .\models.py:919 +msgid "The Message ID of the submitter's email." +msgstr "Le Message ID de l'email de l'émetteur" + +#: .\models.py:926 +msgid "Time spent on this follow up" +msgstr "Temps passé sur ce suivi" + +#: .\models.py:932 .\models.py:964 .\models.py:1081 msgid "Follow-up" msgstr "Suivi" -#: .\models.py:692 +#: .\models.py:933 msgid "Follow-ups" msgstr "Suivis" -#: .\models.py:721 .\models.py:1460 +#: .\models.py:968 .\models.py:1841 msgid "Field" msgstr "Champ" -#: .\models.py:726 +#: .\models.py:973 msgid "Old Value" msgstr "Ancienne valeur" -#: .\models.py:732 +#: .\models.py:979 msgid "New Value" msgstr "Nouvelle valeur" -#: .\models.py:740 +#: .\models.py:987 msgid "removed" msgstr "retiré" -#: .\models.py:742 +#: .\models.py:989 #, python-format msgid "set to %s" msgstr "défini à %s" -#: .\models.py:744 +#: .\models.py:991 #, python-format msgid "changed from \"%(old_value)s\" to \"%(new_value)s\"" msgstr "changé de \"%(old_value)s\" à \"%(new_value)s\"" -#: .\models.py:751 +#: .\models.py:998 msgid "Ticket change" msgstr "Modification d'un ticket" -#: .\models.py:752 +#: .\models.py:999 msgid "Ticket changes" msgstr "Modifications d'un ticket" -#: .\models.py:784 +#: .\models.py:1014 msgid "File" msgstr "Fichier" -#: .\models.py:790 +#: .\models.py:1020 msgid "Filename" msgstr "Nom de fichier" -#: .\models.py:795 +#: .\models.py:1026 msgid "MIME Type" msgstr "Type MIME" -#: .\models.py:800 +#: .\models.py:1032 msgid "Size" msgstr "Taille" -#: .\models.py:801 +#: .\models.py:1034 msgid "Size of this file in bytes" msgstr "Poids de ce fichier en octets" -#: .\models.py:809 +#: .\models.py:1071 msgid "Attachment" msgstr "Pièce jointe" -#: .\models.py:810 +#: .\models.py:1072 .\templates\helpdesk\ticket.html:60 +#: .\templates\helpdesk\ticket_desc_table.html:78 msgid "Attachments" msgstr "Pièces jointes" -#: .\models.py:827 +#: .\models.py:1103 .\models.py:1392 +msgid "Knowledge base item" +msgstr "Élément de la base de connaissance" + +#: .\models.py:1132 msgid "Pre-set reply" msgstr "Réponse préétablie" -#: .\models.py:828 +#: .\models.py:1133 msgid "Pre-set replies" msgstr "Réponses préétablies" -#: .\models.py:833 +#: .\models.py:1138 msgid "" "Leave blank to allow this reply to be used for all queues, or select those " "queues you wish to limit this reply to." @@ -826,23 +871,23 @@ msgstr "" "files, ou sélectionnez les files auxquelles vous souhaitez limiter cette " "réponse." -#: .\models.py:838 .\models.py:875 .\models.py:1196 +#: .\models.py:1143 .\models.py:1179 .\models.py:1581 #: .\templates\helpdesk\email_ignore_list.html:24 msgid "Name" msgstr "Nom" -#: .\models.py:840 +#: .\models.py:1145 msgid "" "Only used to assist users with selecting a reply - not shown to the user." msgstr "" "Seulement utilisé pour aider les utilisateurs à choisir une réponse - n'est " "pas afficher pour l'utilisateur." -#: .\models.py:845 +#: .\models.py:1150 msgid "Body" msgstr "Body" -#: .\models.py:846 +#: .\models.py:1151 msgid "" "Context available: {{ ticket }} - ticket object (eg {{ ticket.title }}); " "{{ queue }} - The queue; and {{ user }} - the current user." @@ -850,7 +895,7 @@ msgstr "" "Context disponible: {{ ticket }} - objet du ticket (eg {{ ticket.title }}); " "{{ queue }} - La file; et {{ user }} - l'utilisateur courant." -#: .\models.py:870 +#: .\models.py:1174 msgid "" "Leave blank for this exclusion to be applied to all queues, or select those " "queues you wish to exclude with this entry." @@ -858,27 +903,27 @@ msgstr "" "Laissez vide pour appliquer cette exclusion à toutes les files, ou " "sélectionnez celles que vous souhaitez exclure pour cette éntrée" -#: .\models.py:881 +#: .\models.py:1185 msgid "Date on which escalation should not happen" msgstr "Jours exclus du processus d'augmentation des priorités" -#: .\models.py:888 +#: .\models.py:1192 msgid "Escalation exclusion" msgstr "Exclusion d'escalade" -#: .\models.py:889 +#: .\models.py:1193 msgid "Escalation exclusions" msgstr "Exclusions d'escalade" -#: .\models.py:903 +#: .\models.py:1206 msgid "Template Name" msgstr "Nom du template" -#: .\models.py:908 +#: .\models.py:1211 msgid "Subject" msgstr "Sujet" -#: .\models.py:910 +#: .\models.py:1213 msgid "" "This will be prefixed with \"[ticket.ticket] ticket.title\". We recommend " "something simple such as \"(Updated\") or \"(Closed)\" - the same context is " @@ -888,11 +933,11 @@ msgstr "" "recommandons quelque chose de simple comme \"(Mis à jour\") ou \"(Fermé)\" - " "le même contexte est disponible en plain_text, ci-dessous." -#: .\models.py:916 +#: .\models.py:1219 msgid "Heading" msgstr "Titre" -#: .\models.py:918 +#: .\models.py:1221 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." @@ -900,11 +945,11 @@ msgstr "" "Dans les e-mails HTML, ce sera le titre en haut de l'email - le même " "contexte est disponible dans le mode plain_text, ci-dessous." -#: .\models.py:924 +#: .\models.py:1227 msgid "Plain Text" msgstr "Plain Text" -#: .\models.py:925 +#: .\models.py:1228 msgid "" "The context available to you includes {{ ticket }}, {{ queue }}, and " "depending on the time of the call: {{ resolution }} or {{ comment }}." @@ -912,144 +957,224 @@ msgstr "" "Le contexte disponible inclue {{ ticket }}, {{ queue }}, et suivant le temps " "passé: {{ resolution }} ou {{ comment }}." -#: .\models.py:931 +#: .\models.py:1234 msgid "HTML" msgstr "HTML" -#: .\models.py:932 +#: .\models.py:1235 msgid "The same context is available here as in plain_text, above." msgstr "Le même contexte est disponible ici comme dans plain_text, ci-dessus." -#: .\models.py:940 +#: .\models.py:1243 msgid "Locale of this template." msgstr "Langue de ce modèle." -#: .\models.py:948 +#: .\models.py:1251 msgid "e-mail template" msgstr "Modèle d'e-mail" -#: .\models.py:949 +#: .\models.py:1252 msgid "e-mail templates" msgstr "Modèles d'e-mail" -#: .\models.py:977 +#: .\models.py:1262 +msgid "Name of the category" +msgstr "Nom de la catégorie" + +#: .\models.py:1267 +msgid "Title on knowledgebase page" +msgstr "Titre sur la page de la Base de Connaissance" + +#: .\models.py:1284 +msgid "Default queue when creating a ticket after viewing this category." +msgstr "File par défaut quand un ticket est créé depuis cette catégorie." + +#: .\models.py:1289 +msgid "Is KBCategory publicly visible?" +msgstr "Est-ce que cette catégorie est visible publiquement ?" + +#: .\models.py:1297 msgid "Knowledge base category" msgstr "Catégorie de la base de connaissance" -#: .\models.py:978 +#: .\models.py:1298 msgid "Knowledge base categories" msgstr "Catégories de la base de connaissance" -#: .\models.py:994 .\templates\helpdesk\public_homepage.html:12 +#: .\models.py:1321 msgid "Category" msgstr "Catégorie" -#: .\models.py:1003 +#: .\models.py:1330 msgid "Question" msgstr "Question" -#: .\models.py:1007 +#: .\models.py:1334 msgid "Answer" msgstr "Réponse" -#: .\models.py:1011 +#: .\models.py:1338 msgid "Votes" msgstr "Votes" -#: .\models.py:1012 +#: .\models.py:1339 msgid "Total number of votes cast for this item" msgstr "Nombre total de votes exprimés pour cet article" -#: .\models.py:1017 +#: .\models.py:1344 msgid "Positive Votes" msgstr "Votes positifs" -#: .\models.py:1018 +#: .\models.py:1345 msgid "Number of votes for this item which were POSITIVE." msgstr "Nombre de votes pour cet article qui ont été positifs." -#: .\models.py:1023 +#: .\models.py:1350 msgid "Last Updated" msgstr "Dernière mise à jour" -#: .\models.py:1024 +#: .\models.py:1351 msgid "The date on which this question was most recently changed." msgstr "La date à laquelle cette question a été la plus récemment modifiées." -#: .\models.py:1037 +#: .\models.py:1358 +msgid "Team" +msgstr "Équipe" + +#: .\models.py:1364 +msgid "Order" +msgstr "Ordre" + +#: .\models.py:1370 +msgid "Enabled to display to users" +msgstr "Activé pour être afficher aux utilisateurs" + +#: .\models.py:1384 msgid "Unrated" msgstr "Non évalué" -#: .\models.py:1045 -msgid "Knowledge base item" -msgstr "Élément de la base de connaissance" - -#: .\models.py:1046 +#: .\models.py:1393 .\templates\helpdesk\ticket_list.html:180 msgid "Knowledge base items" msgstr "Éléments de la base de connaissance" -#: .\models.py:1072 .\templates\helpdesk\ticket_list.html:160 +#: .\models.py:1431 .\templates\helpdesk\ticket_list.html:238 msgid "Query Name" msgstr "Nom de la requête" -#: .\models.py:1074 +#: .\models.py:1433 msgid "User-provided name for this query" msgstr "Nom de requête fournie par l'utilisateur" -#: .\models.py:1078 +#: .\models.py:1437 msgid "Shared With Other Users?" msgstr "Partager avec d'autres utilisateurs ?" -#: .\models.py:1081 +#: .\models.py:1440 msgid "Should other users see this query?" msgstr "Les autres utilisateurs peuvent-ils voir cette requête ?" -#: .\models.py:1085 +#: .\models.py:1444 msgid "Search Query" msgstr "Requête de recherche" -#: .\models.py:1086 +#: .\models.py:1445 msgid "Pickled query object. Be wary changing this." msgstr "Objets de requête. Changement non recommandé." -#: .\models.py:1096 +#: .\models.py:1455 msgid "Saved search" msgstr "Recherche sauvegardée" -#: .\models.py:1097 +#: .\models.py:1456 msgid "Saved searches" msgstr "Recherches sauvegardées" -#: .\models.py:1116 -msgid "Settings Dictionary" -msgstr "Préférences de dictionnaire" +#: .\models.py:1498 +msgid "DEPRECATED! Settings Dictionary DEPRECATED!" +msgstr "OBSOLETE ! Préférences de dictionnaire OBSOLETE !" -#: .\models.py:1117 +#: .\models.py:1499 msgid "" -"This is a base64-encoded representation of a pickled Python dictionary. Do " -"not change this field via the admin." +"DEPRECATED! This is a base64-encoded representation of a pickled Python " +"dictionary. Do not change this field via the admin." msgstr "" -"Il s'agit d'une représentation codée en base64 d'un dictionnaire Python. Ne " -"pas modifier ce champ par l'admin." +"OBSOLETE ! Il s'agit d'une représentation codée en base64 d'un dictionnaire " +"Python. Ne pas modifier ce champ par l'admin." -#: .\models.py:1156 +#: .\models.py:1506 +msgid "Show Ticket List on Login?" +msgstr "Afficher la liste des billets lors de la connexion ?" + +#: .\models.py:1507 +msgid "Display the ticket list upon login? Otherwise, the dashboard is shown." +msgstr "" +"Afficher la liste des billets lors de la connexion ? Dans le cas contraire, " +"le tableau de bord sera affiché." + +#: .\models.py:1512 +msgid "E-mail me on ticket change?" +msgstr "M'envoyer un e-mail lors de changement pour le ticket ?" + +#: .\models.py:1513 +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 "" +"Si vous êtes le propriétaire d'un ticket et que le ticket est modifié via le " +"web par quelqu'un d'autre, voulez-vous recevoir un courriel ?" + +#: .\models.py:1518 +msgid "E-mail me when assigned a ticket?" +msgstr "M'envoyer un courriel lorsqu'on m'assigne un ticket ?" + +#: .\models.py:1519 +msgid "" +"If you are assigned a ticket via the web, do you want to receive an e-mail?" +msgstr "" +"Si vous êtes affecté à un ticket via le web, voulez-vous recevoir un " +"courriel ?" + +#: .\models.py:1524 +msgid "Number of tickets to show per page" +msgstr "Nombre de tickets à afficher par page" + +#: .\models.py:1525 +msgid "How many tickets do you want to see on the Ticket List page?" +msgstr "Combien de tickets voulez-vous voir sur la page Liste des Tickets ?" + +#: .\models.py:1531 +msgid "Use my e-mail address when submitting tickets?" +msgstr "Utiliser mon adresse e-mail lors de la soumission des tickets ?" + +#: .\models.py:1532 +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 "" +"Quand vous soumettez un ticket, voulez-vous d'utiliser automatiquement votre " +"adresse e-mail comme adresse d'émetteur? Vous pouvez taper une autre adresse " +"e-mail lors de la saisie du ticket en cas de besoin, cette option ne modifie " +"que la valeur par défaut." + +#: .\models.py:1543 msgid "User Setting" msgstr "Paramètre utilisateur" -#: .\models.py:1157 .\templates\helpdesk\navigation.html:71 -#: .\templates\helpdesk\user_settings.html:6 +#: .\models.py:1544 .\templates\helpdesk\navigation-header.html:51 +#: .\templates\helpdesk\user_settings.html:15 msgid "User Settings" msgstr "Paramètres Utilisateurs" -#: .\models.py:1185 +#: .\models.py:1570 msgid "Ignored e-mail address" msgstr "Adresse e-mail ignorée" -#: .\models.py:1186 +#: .\models.py:1571 msgid "Ignored e-mail addresses" msgstr "Adresses e-mail ignorées" -#: .\models.py:1191 +#: .\models.py:1576 msgid "" "Leave blank for this e-mail to be ignored on all queues, or select those " "queues you wish to ignore this e-mail for." @@ -1057,11 +1182,11 @@ msgstr "" "Laissez vide cet e-mail pour qu'il soit ignoré par toutes les files, ou " "sélectionner les files qui doivent ignorer cet e-mail." -#: .\models.py:1202 +#: .\models.py:1587 msgid "Date on which this e-mail address was added" msgstr "Date à laquelle cette adresse e-mail a été ajouté" -#: .\models.py:1210 +#: .\models.py:1595 msgid "" "Enter a full e-mail address, or portions with wildcards, eg *@domain.com or " "postmaster@*." @@ -1069,11 +1194,11 @@ msgstr "" "Entrez une adresse e-mail complète, ou des parties avec des caractères " "génériques, par exemple *@domain.com ou postmaster@*." -#: .\models.py:1215 +#: .\models.py:1600 msgid "Save Emails in Mailbox?" msgstr "Sauvegarder les e-mails dans la boîte aux lettres ?" -#: .\models.py:1218 +#: .\models.py:1603 msgid "" "Do you want to save emails from this address in the mailbox? If this is " "unticked, emails from this address will be deleted." @@ -1082,39 +1207,39 @@ msgstr "" "boîte aux lettres ? Si ce n'est pas cochée, les e-mails de cette adresse " "seront supprimés." -#: .\models.py:1286 +#: .\models.py:1670 msgid "User who wishes to receive updates for this ticket." msgstr "Utilisateurs qui désirent recevoir les mises à jour pour ce ticket." -#: .\models.py:1294 +#: .\models.py:1678 msgid "For non-user followers, enter their e-mail address" msgstr "" "Pour des non-utilisateurs suivant les tickets, entrer leur adresse e-mail." -#: .\models.py:1298 +#: .\models.py:1682 msgid "Can View Ticket?" msgstr "Est-il possible de voir le ticket ?" -#: .\models.py:1301 +#: .\models.py:1685 msgid "Can this CC login to view the ticket details?" msgstr "" "Le destinataire en copie peut-il se connecter pour voir les détails du " "ticket ?" -#: .\models.py:1305 +#: .\models.py:1689 msgid "Can Update Ticket?" msgstr "Est-il possible de mettre à jour le ticket ?" -#: .\models.py:1308 +#: .\models.py:1692 msgid "Can this CC login and update the ticket?" msgstr "" "Le destinataire en copie peut-il se connecter et mettre à jour le ticket ?" -#: .\models.py:1342 +#: .\models.py:1725 msgid "Field Name" msgstr "Nom du champ" -#: .\models.py:1343 +#: .\models.py:1726 msgid "" "As used in the database and behind the scenes. Must be unique and consist of " "only lowercase letters with no punctuation." @@ -1122,87 +1247,87 @@ msgstr "" "Utilisé dans la base de données et dans les coulisses. Doit être unique et " "se composer de lettres minuscules sans ponctuation." -#: .\models.py:1349 +#: .\models.py:1732 msgid "Label" msgstr "Label" -#: .\models.py:1351 +#: .\models.py:1734 msgid "The display label for this field" msgstr "Le label affiché pour ce champ" -#: .\models.py:1355 +#: .\models.py:1738 msgid "Help Text" msgstr "Texte d'aide" -#: .\models.py:1356 +#: .\models.py:1739 msgid "Shown to the user when editing the ticket" msgstr "Montré à l'utilisateur lors de l'édition du ticket" -#: .\models.py:1362 +#: .\models.py:1745 msgid "Character (single line)" msgstr "Caractère (une seule ligne)" -#: .\models.py:1363 +#: .\models.py:1746 msgid "Text (multi-line)" msgstr "Texte (multi-ligne)" -#: .\models.py:1364 +#: .\models.py:1747 msgid "Integer" msgstr "Entier" -#: .\models.py:1365 +#: .\models.py:1748 msgid "Decimal" msgstr "Décimal" -#: .\models.py:1366 +#: .\models.py:1749 msgid "List" msgstr "Liste" -#: .\models.py:1367 +#: .\models.py:1750 msgid "Boolean (checkbox yes/no)" msgstr "Booléen (case à cocher oui / non)" -#: .\models.py:1369 +#: .\models.py:1752 msgid "Time" msgstr "Heure" -#: .\models.py:1370 +#: .\models.py:1753 msgid "Date & Time" msgstr "Date & Heure" -#: .\models.py:1372 +#: .\models.py:1755 msgid "URL" msgstr "URL" -#: .\models.py:1373 +#: .\models.py:1756 msgid "IP Address" msgstr "Adresse IP" -#: .\models.py:1378 +#: .\models.py:1761 msgid "Data Type" msgstr "Type de données" -#: .\models.py:1380 +#: .\models.py:1763 msgid "Allows you to restrict the data entered into this field" msgstr "Permet de restreindre les données saisies dans ce domaine" -#: .\models.py:1385 +#: .\models.py:1768 msgid "Maximum Length (characters)" msgstr "Longueur maximale (caractères)" -#: .\models.py:1391 +#: .\models.py:1774 msgid "Decimal Places" msgstr "Décimales" -#: .\models.py:1392 +#: .\models.py:1775 msgid "Only used for decimal fields" msgstr "Utilisé uniquement pour les champs décimaux" -#: .\models.py:1398 +#: .\models.py:1781 msgid "Add empty first choice to List?" msgstr "Ajouter un premier choix à la liste ?" -#: .\models.py:1400 +#: .\models.py:1783 msgid "" "Only for List: adds an empty first entry to the choices list, which enforces " "that the user makes an active choice." @@ -1210,72 +1335,84 @@ msgstr "" "Seulement pour la liste: ajoute une première entrée vide dans la liste des " "choix, ce qui impose à l'utilisateur de faire un choix actif." -#: .\models.py:1405 +#: .\models.py:1788 msgid "List Values" msgstr "Valeurs de la liste" -#: .\models.py:1406 +#: .\models.py:1789 msgid "For list fields only. Enter one option per line." msgstr "Pour les champs de la liste seulement. Entrez une option par ligne." -#: .\models.py:1412 +#: .\models.py:1795 msgid "Ordering" msgstr "Commande" -#: .\models.py:1413 +#: .\models.py:1796 msgid "Lower numbers are displayed first; higher numbers are listed later" msgstr "" "Les plus petits nombres sont affichés en premiers ; les plus élevés sont " "listés après." -#: .\models.py:1427 +#: .\models.py:1809 msgid "Required?" msgstr "Requis ?" -#: .\models.py:1428 +#: .\models.py:1810 msgid "Does the user have to enter a value for this field?" msgstr "L'utilisateur doit-il entrer une valeur pour ce champ ?" -#: .\models.py:1433 +#: .\models.py:1815 msgid "Staff Only?" msgstr "Equipe uniquement ?" -#: .\models.py:1434 +#: .\models.py:1816 msgid "" "If this is ticked, then the public submission form will NOT show this field" msgstr "" "Si cette option est cochée, le formulaire de soumission public ne pourra pas " "afficher ce champs" -#: .\models.py:1445 +#: .\models.py:1827 msgid "Custom field" msgstr "Champ personnalisé" -#: .\models.py:1446 +#: .\models.py:1828 msgid "Custom fields" msgstr "Champs personnalisés" -#: .\models.py:1470 +#: .\models.py:1851 msgid "Ticket custom field value" msgstr "Valeur champs personnalisé billet" -#: .\models.py:1471 +#: .\models.py:1852 msgid "Ticket custom field values" msgstr "Valeur champs personnalisé billet" -#: .\models.py:1483 +#: .\models.py:1863 msgid "Ticket dependency" msgstr "Dépendance du ticket" -#: .\models.py:1484 +#: .\models.py:1864 msgid "Ticket dependencies" msgstr "Dépendances du ticket" -#: .\models.py:1496 +#: .\models.py:1876 msgid "Depends On Ticket" msgstr "Dépend du ticket" -#: .\templates\helpdesk\attribution.html:2 +#: .\query.py:203 +msgid "No text" +msgstr "Pas de texte" + +#: .\query.py:204 +msgid "View ticket" +msgstr "Voir ticket" + +#: .\query.py:206 +msgid "Messages" +msgstr "Messages" + +#: .\templates\helpdesk\attribution.html:6 msgid "" "django-" "helpdesk." @@ -1283,41 +1420,36 @@ msgstr "" "django-" "helpdesk." -#: .\templates\helpdesk\base.html:18 +#: .\templates\helpdesk\base-head.html:14 msgid "Powered by django-helpdesk" msgstr "Propulsé par django-helpdesk" -#: .\templates\helpdesk\base.html:75 .\templates\helpdesk\rss_list.html:10 -#: .\templates\helpdesk\rss_list.html:36 +#: .\templates\helpdesk\base-head.html:47 .\templates\helpdesk\rss_list.html:21 +#: .\templates\helpdesk\rss_list.html:47 msgid "My Open Tickets" msgstr "Mes Tickets Ouverts" -#: .\templates\helpdesk\base.html:76 +#: .\templates\helpdesk\base-head.html:48 msgid "All Recent Activity" msgstr "Toute l'Activité Récente" -#: .\templates\helpdesk\base.html:77 -#: .\templates\helpdesk\include\unassigned.html:7 -#: .\templates\helpdesk\rss_list.html:16 +#: .\templates\helpdesk\base-head.html:49 +#: .\templates\helpdesk\include\unassigned.html:6 +#: .\templates\helpdesk\rss_list.html:27 msgid "Unassigned Tickets" msgstr "Tickets non-assignés" -#: .\templates\helpdesk\base.html:117 .\templates\helpdesk\navigation.html:12 -#: .\templates\helpdesk\public_base.html:16 -#: .\templates\helpdesk\public_base.html:50 -msgid "Helpdesk" -msgstr "Helpdesk" - -#: .\templates\helpdesk\confirm_delete_saved_query.html:3 -#: .\templates\helpdesk\ticket_list.html:140 +#: .\templates\helpdesk\confirm_delete_saved_query.html:7 +#: .\templates\helpdesk\confirm_delete_saved_query.html:10 +#: .\templates\helpdesk\ticket_list.html:213 msgid "Delete Saved Query" msgstr "Supprimer la requête enregistrée" -#: .\templates\helpdesk\confirm_delete_saved_query.html:6 +#: .\templates\helpdesk\confirm_delete_saved_query.html:13 msgid "Delete Query" msgstr "Supprimer la requête" -#: .\templates\helpdesk\confirm_delete_saved_query.html:8 +#: .\templates\helpdesk\confirm_delete_saved_query.html:15 #, python-format msgid "" "Are you sure you want to delete this saved filter (%(query_title)s)? Pour le recréer, vous devrez refiltrer la liste de " "ticket manuellement." -#: .\templates\helpdesk\confirm_delete_saved_query.html:11 +#: .\templates\helpdesk\confirm_delete_saved_query.html:18 msgid "" "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." @@ -1336,54 +1468,61 @@ msgstr "" "Vous avez partagé cette requête, il est donc possible que d'autres " "l'utilisent. Si vous la supprimez, il devront créer la leur manuellement." -#: .\templates\helpdesk\confirm_delete_saved_query.html:14 -#: .\templates\helpdesk\delete_ticket.html:10 +#: .\templates\helpdesk\confirm_delete_saved_query.html:21 +#: .\templates\helpdesk\delete_ticket.html:20 msgid "No, Don't Delete It" msgstr "Non, ne le supprimez pas." -#: .\templates\helpdesk\confirm_delete_saved_query.html:17 -#: .\templates\helpdesk\delete_ticket.html:13 +#: .\templates\helpdesk\confirm_delete_saved_query.html:24 +#: .\templates\helpdesk\delete_ticket.html:25 msgid "Yes I Understand - Delete It Anyway" msgstr "Oui, je comprends - Le supprimer quand même." #: .\templates\helpdesk\create_ticket.html:3 +#: .\templates\helpdesk\create_ticket.html:9 +#: .\templates\helpdesk\public_create_ticket.html:4 msgid "Create Ticket" msgstr "Créer un ticket" -#: .\templates\helpdesk\create_ticket.html:27 -#: .\templates\helpdesk\navigation.html:95 -#: .\templates\helpdesk\navigation.html:98 -#: .\templates\helpdesk\public_homepage.html:28 +#: .\templates\helpdesk\create_ticket.html:18 +#: .\templates\helpdesk\navigation-header.html:73 +#: .\templates\helpdesk\public_create_ticket.html:16 +#: .\templates\helpdesk\public_homepage.html:40 msgid "Submit a Ticket" msgstr "Soumettre un Ticket" -#: .\templates\helpdesk\create_ticket.html:32 -#: .\templates\helpdesk\edit_ticket.html:11 +#: .\templates\helpdesk\create_ticket.html:21 +#: .\templates\helpdesk\edit_ticket.html:21 +#: .\templates\helpdesk\public_create_ticket_base.html:7 msgid "Unless otherwise stated, all fields are required." msgstr "Sauf mention contraire, tous les champs sont requis." -#: .\templates\helpdesk\create_ticket.html:33 -#: .\templates\helpdesk\edit_ticket.html:11 -#: .\templates\helpdesk\public_homepage.html:29 +#: .\templates\helpdesk\create_ticket.html:22 +#: .\templates\helpdesk\edit_ticket.html:21 +#: .\templates\helpdesk\public_create_ticket_base.html:8 msgid "Please provide as descriptive a title and description as possible." msgstr "" "Veuillez fournir un titre et une description aussi détaillés que possible." -#: .\templates\helpdesk\create_ticket.html:46 -#: .\templates\helpdesk\ticket.html:147 .\templates\helpdesk\ticket.html:196 -msgid "(Optional)" -msgstr "(Optionnel)" +#: .\templates\helpdesk\create_ticket.html:39 +msgid "Optional" +msgstr "Optionnel" -#: .\templates\helpdesk\create_ticket.html:56 -#: .\templates\helpdesk\public_homepage.html:56 +#: .\templates\helpdesk\create_ticket.html:53 +#: .\templates\helpdesk\public_create_ticket_base.html:18 msgid "Submit Ticket" msgstr "Soumettre un ticket" -#: .\templates\helpdesk\dashboard.html:2 +#: .\templates\helpdesk\dashboard.html:3 msgid "Helpdesk Dashboard" msgstr "Tableau de bord Helpdesk" -#: .\templates\helpdesk\dashboard.html:12 +#: .\templates\helpdesk\dashboard.html:9 .\templates\helpdesk\kb_index.html:9 +#: .\templates\helpdesk\ticket_list.html:24 +msgid "Overview" +msgstr "Aperçu" + +#: .\templates\helpdesk\dashboard.html:20 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 " @@ -1393,40 +1532,41 @@ msgstr "" "tickets que vous avez soumis, ceux sur lesquels vous travaillez et ceux qui " "n'ont pas de propriétaire." -#: .\templates\helpdesk\dashboard.html:18 +#: .\templates\helpdesk\dashboard.html:26 msgid "All Tickets submitted by you" msgstr "Tous les tickets que vous avez soumis" -#: .\templates\helpdesk\dashboard.html:19 .\views\staff.py:102 +#: .\templates\helpdesk\dashboard.html:27 .\views\staff.py:111 msgid "atrbcu_page" msgstr "page_tickets_soumis" -#: .\templates\helpdesk\dashboard.html:23 +#: .\templates\helpdesk\dashboard.html:31 msgid "Open Tickets assigned to you (you are working on this ticket)" msgstr "Tickets ouverts qui vous sont assignés (vous travaillez sur ce ticket)" -#: .\templates\helpdesk\dashboard.html:24 +#: .\templates\helpdesk\dashboard.html:32 msgid "You have no tickets assigned to you." msgstr "Vous n'avez aucun ticket qui vous est assigné." -#: .\templates\helpdesk\dashboard.html:25 .\views\staff.py:100 +#: .\templates\helpdesk\dashboard.html:33 .\views\staff.py:109 msgid "ut_page" msgstr "page_tickets_utilisateur" -#: .\templates\helpdesk\dashboard.html:31 +#: .\templates\helpdesk\dashboard.html:39 msgid "Closed & resolved Tickets you used to work on" msgstr "Les tickets fermés et résolus sur lesquels vous avez travaillé." -#: .\templates\helpdesk\dashboard.html:32 .\views\staff.py:101 +#: .\templates\helpdesk\dashboard.html:40 .\views\staff.py:110 msgid "utcr_page" msgstr "page_tickets_utilisateur_ferme_resolu" #: .\templates\helpdesk\delete_ticket.html:3 -#: .\templates\helpdesk\delete_ticket.html:6 +#: .\templates\helpdesk\delete_ticket.html:12 +#: .\templates\helpdesk\delete_ticket.html:16 msgid "Delete Ticket" msgstr "Supprimer le ticket" -#: .\templates\helpdesk\delete_ticket.html:8 +#: .\templates\helpdesk\delete_ticket.html:18 #, python-format msgid "" "Are you sure you want to delete this ticket (%(ticket_title)s)? All " @@ -1438,39 +1578,45 @@ msgstr "" "jointes et les mises à jour seront irrémédiablement supprimés." #: .\templates\helpdesk\edit_ticket.html:3 +#: .\templates\helpdesk\edit_ticket.html:12 msgid "Edit Ticket" msgstr "Editer le ticket" -#: .\templates\helpdesk\edit_ticket.html:9 +#: .\templates\helpdesk\edit_ticket.html:19 msgid "Edit a Ticket" msgstr "Modification du ticket" -#: .\templates\helpdesk\edit_ticket.html:13 +#: .\templates\helpdesk\edit_ticket.html:23 msgid "Note" msgstr "Note" -#: .\templates\helpdesk\edit_ticket.html:13 +#: .\templates\helpdesk\edit_ticket.html:23 msgid "" "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 "" -"Modifier un ticket n'envoie pas d'e-mail au propriétaire ou au " -"rapporteur du ticket. Aucun détail ne doit être ajouté, ce formulaire doit " +"Modifier un ticket n'envoie pas d'e-mail au propriétaire ou à " +"l'émetteur du ticket. Aucun détail ne doit être ajouté, ce formulaire doit " "juste être utilisé pour corriger des informations incorrectes ou nettoyer la " "soumission." -#: .\templates\helpdesk\edit_ticket.html:33 +#: .\templates\helpdesk\edit_ticket.html:43 msgid "Save Changes" msgstr "Sauvegarder les changements" +#: .\templates\helpdesk\edit_ticket.html:44 +msgid "Cancel Changes" +msgstr "Annuler les changements" + #: .\templates\helpdesk\email_ignore_add.html:3 -#: .\templates\helpdesk\email_ignore_add.html:6 -#: .\templates\helpdesk\email_ignore_add.html:23 +#: .\templates\helpdesk\email_ignore_add.html:9 +#: .\templates\helpdesk\email_ignore_add.html:13 +#: .\templates\helpdesk\email_ignore_add.html:30 msgid "Ignore E-Mail Address" msgstr "Ignorer l'adresse e-mail" -#: .\templates\helpdesk\email_ignore_add.html:8 +#: .\templates\helpdesk\email_ignore_add.html:15 msgid "" "To ignore an e-mail address and prevent any emails from that address " "creating tickets automatically, enter the e-mail address below." @@ -1479,7 +1625,7 @@ msgstr "" "entrez le courriel de l’adresse ci-dessous pour la création automatique de " "billet" -#: .\templates\helpdesk\email_ignore_add.html:10 +#: .\templates\helpdesk\email_ignore_add.html:17 msgid "" "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." @@ -1551,17 +1697,17 @@ msgstr "Conserver dans la boîte aux lettres ?" #: .\templates\helpdesk\email_ignore_list.html:29 #: .\templates\helpdesk\email_ignore_list.html:40 -#: .\templates\helpdesk\include\unassigned.html:33 -#: .\templates\helpdesk\ticket.html:103 .\templates\helpdesk\ticket.html:119 -#: .\templates\helpdesk\ticket_cc_list.html:28 -#: .\templates\helpdesk\ticket_cc_list.html:37 -#: .\templates\helpdesk\ticket_desc_table.html:17 -#: .\templates\helpdesk\ticket_list.html:254 +#: .\templates\helpdesk\include\unassigned.html:29 +#: .\templates\helpdesk\include\unassigned.html:69 +#: .\templates\helpdesk\ticket_cc_list.html:38 +#: .\templates\helpdesk\ticket_cc_list.html:47 +#: .\templates\helpdesk\ticket_desc_table.html:16 +#: .\templates\helpdesk\ticket_list.html:90 msgid "Delete" msgstr "Supprimer" #: .\templates\helpdesk\email_ignore_list.html:38 -#: .\templates\helpdesk\ticket_list.html:249 +#: .\templates\helpdesk\ticket_list.html:78 msgid "All" msgstr "Tout" @@ -1577,35 +1723,119 @@ msgstr "" "Note: Si l'option «Garder» n'est pas sélectionnée, les " "courriels envoyés à partir de cette adresse seront définitivement supprimés." +#: .\templates\helpdesk\filters\date.html:4 +msgid "Date (From)" +msgstr "Date (du)" + +#: .\templates\helpdesk\filters\date.html:10 +msgid "Date (To)" +msgstr "Date (au)" + +#: .\templates\helpdesk\filters\date.html:19 +msgid "Use YYYY-MM-DD date format, eg 2018-01-30" +msgstr "Utilisez le format de date AAAA-MM-JJ, ex 2018-01-30" + +#: .\templates\helpdesk\filters\kbitems.html:6 +msgid "Knowledge base item(s)" +msgstr "Élément(s) de la base de connaissance" + +#: .\templates\helpdesk\filters\kbitems.html:12 +msgid "Uncategorized" +msgstr "Non catégorisés" + +#: .\templates\helpdesk\filters\kbitems.html:23 +#: .\templates\helpdesk\filters\queue.html:18 +#: .\templates\helpdesk\filters\status.html:14 +msgid "Ctrl-click to select multiple options" +msgstr "Ctrl-click pour sélectionner plusieurs options" + +#: .\templates\helpdesk\filters\keywords.html:4 +#: .\templates\helpdesk\ticket_list.html:178 +msgid "Keywords" +msgstr "Mots-clés" + +#: .\templates\helpdesk\filters\keywords.html:12 +msgid "" +"Keywords are case-insensitive, and will be looked for pretty much everywhere " +"possible. Prepend with 'queue:' or 'priority:' to search by queue or " +"priority. You can also use the keyword OR to combine multiple searches." +msgstr "" +"Les mots-clefs sont insensibles à la casse, et seront regardés pour à peu " +"près partout. Préfixé avec 'queue:' our 'priority:' pour rechercher par file " +"ou par priorité. Vous pouvez ausii utiliser le mot-clef OR pour combiner " +"plusieurs recherches." + +#: .\templates\helpdesk\filters\owner.html:6 +msgid "Owner(s)" +msgstr "Propriétaire(s)" + +#: .\templates\helpdesk\filters\owner.html:17 +msgid "(ME)" +msgstr "(MOI)" + +#: .\templates\helpdesk\filters\owner.html:25 +msgid "Ctrl-Click to select multiple options" +msgstr "Ctrl-Click pour sélectionner plusieurs options" + +#: .\templates\helpdesk\filters\queue.html:6 +msgid "Queue(s)" +msgstr "File(s)" + +#: .\templates\helpdesk\filters\sorting.html:5 +#: .\templates\helpdesk\ticket_list.html:174 +msgid "Sorting" +msgstr "Tri" + +#: .\templates\helpdesk\filters\sorting.html:25 +#: .\templates\helpdesk\ticket.html:176 +#: .\templates\helpdesk\ticket_list.html:67 +#: .\templates\helpdesk\ticket_list.html:175 .\views\staff.py:635 +#: .\views\staff.py:869 +msgid "Owner" +msgstr "Propriétaire" + +#: .\templates\helpdesk\filters\sorting.html:30 +msgid "Reverse" +msgstr "Renverser" + +#: .\templates\helpdesk\filters\sorting.html:38 +msgid "Ordering applied to tickets" +msgstr "Tri appliqué aux tickets" + +#: .\templates\helpdesk\filters\status.html:6 +msgid "Status(es)" +msgstr "État(s)" + #: .\templates\helpdesk\followup_edit.html:2 msgid "Edit followup" msgstr "Modifier le suivi" -#: .\templates\helpdesk\followup_edit.html:16 +#: .\templates\helpdesk\followup_edit.html:20 +#: .\templates\helpdesk\followup_edit.html:30 msgid "Edit FollowUp" msgstr "Modifier le suivi" -#: .\templates\helpdesk\followup_edit.html:21 +#: .\templates\helpdesk\followup_edit.html:37 msgid "Reassign ticket:" msgstr "Réattribuer le ticket:" -#: .\templates\helpdesk\followup_edit.html:23 +#: .\templates\helpdesk\followup_edit.html:39 msgid "Title:" msgstr "Titre :" -#: .\templates\helpdesk\followup_edit.html:25 +#: .\templates\helpdesk\followup_edit.html:41 msgid "Comment:" msgstr "Commentaire :" -#: .\templates\helpdesk\include\stats.html:7 -msgid "Helpdesk Summary" -msgstr "Résumé Helpdesk" +#: .\templates\helpdesk\include\alert_form_errors.html:4 +msgid "There are errors in the form" +msgstr "Il y a des erreurs dans le formulaire" -#: .\templates\helpdesk\include\stats.html:27 +#: .\templates\helpdesk\include\stats.html:15 msgid "View Tickets" msgstr "Voir les tickets" -#: .\templates\helpdesk\include\stats.html:27 +#: .\templates\helpdesk\include\stats.html:15 msgid "No tickets in this range" msgstr "Aucun tickets dans cette période" @@ -1613,65 +1843,73 @@ msgstr "Aucun tickets dans cette période" msgid "Your Tickets" msgstr "Vos tickets" -#: .\templates\helpdesk\include\tickets.html:16 -#: .\templates\helpdesk\include\unassigned.html:16 -#: .\templates\helpdesk\ticket_list.html:221 -msgid "Pr" -msgstr "Pr" - -#: .\templates\helpdesk\include\tickets.html:20 -#: .\templates\helpdesk\kb_category.html:30 +#: .\templates\helpdesk\include\tickets.html:18 msgid "Last Update" msgstr "Dernière mise à jour" -#: .\templates\helpdesk\include\tickets.html:34 +#: .\templates\helpdesk\include\tickets.html:31 msgid "You do not have any pending tickets." msgstr "Vous n'avez aucun tickets en attente." -#: .\templates\helpdesk\include\unassigned.html:7 +#: .\templates\helpdesk\include\unassigned.html:6 +#: .\templates\helpdesk\include\unassigned.html:46 msgid "(pick up a ticket if you start to work on it)" msgstr "(assignez vous un ticket si vous commencez à travailler dessus)" -#: .\templates\helpdesk\include\unassigned.html:32 -#: .\templates\helpdesk\ticket_desc_table.html:53 +#: .\templates\helpdesk\include\unassigned.html:17 +#: .\templates\helpdesk\include\unassigned.html:57 +msgid "Actions" +msgstr "Actions" + +#: .\templates\helpdesk\include\unassigned.html:28 +#: .\templates\helpdesk\include\unassigned.html:68 msgid "Take" msgstr "Prendre" -#: .\templates\helpdesk\include\unassigned.html:37 -#: .\templates\helpdesk\report_index.html:54 +#: .\templates\helpdesk\include\unassigned.html:33 +#: .\templates\helpdesk\include\unassigned.html:73 +#: .\templates\helpdesk\report_index.html:61 msgid "There are no unassigned tickets." msgstr "Il n'y a aucun ticket non assigné." -#: .\templates\helpdesk\kb_category.html:4 -msgid "Knowledgebase Category" -msgstr "Catégorie de la base de connaissance" +#: .\templates\helpdesk\include\unassigned.html:46 +msgid "KBItem:" +msgstr "Objet de la Base de Connaissance" + +#: .\templates\helpdesk\include\unassigned.html:46 +msgid "Team:" +msgstr "Équipe :" #: .\templates\helpdesk\kb_category.html:4 +#: .\templates\helpdesk\kb_category.html:10 +#: .\templates\helpdesk\kb_category_base.html:3 #, python-format msgid "%(kbcat)s" msgstr "%(kbcat)s" -#: .\templates\helpdesk\kb_category.html:8 -#, python-format -msgid "You are viewing all items in the %(kbcat)s category." -msgstr "Vous lisez tous les articles dans la catégorie %(kbcat)s." - -#: .\templates\helpdesk\kb_category.html:26 -#, python-format -msgid "View Answer " -msgstr "Voir Réponse " - -#: .\templates\helpdesk\kb_category.html:29 -msgid "Rating" -msgstr "Evaluations" - -#: .\templates\helpdesk\kb_index.html:4 .\templates\helpdesk\kb_item.html:4 -#: .\templates\helpdesk\navigation.html:33 -#: .\templates\helpdesk\navigation.html:101 +#: .\templates\helpdesk\kb_category.html:8 .\templates\helpdesk\kb_index.html:3 +#: .\templates\helpdesk\kb_index.html:7 .\templates\helpdesk\kb_index.html:13 +#: .\templates\helpdesk\navigation-sidebar.html:53 +#: .\templates\helpdesk\navigation-sidebar.html:75 msgid "Knowledgebase" msgstr "Base de connaissance" -#: .\templates\helpdesk\kb_index.html:6 +#: .\templates\helpdesk\kb_category_base.html:34 +msgid "open tickets" +msgstr "Tickets ouverts" + +#: .\templates\helpdesk\kb_category_base.html:39 +#: .\templates\helpdesk\kb_category_base.html:60 +msgid "Contact a human" +msgstr "Contacter un humain" + +#: .\templates\helpdesk\kb_category_base.html:44 +#, python-format +msgid "%(recommendations)s people found this answer useful of %(votes)s" +msgstr "" +"%(recommendations)s personnes ont trouvé cette réponse utiles sur %(votes)s" + +#: .\templates\helpdesk\kb_index.html:15 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 " @@ -1681,112 +1919,91 @@ msgstr "" "dans les catégories suivantes. Veuillez vérifier si l'un de ces articles " "traite de votre problème avant d'ouvrir un nouveau ticket." -#: .\templates\helpdesk\kb_index.html:20 +#: .\templates\helpdesk\kb_index.html:26 +#: .\templates\helpdesk\public_homepage.html:27 msgid "View articles" msgstr "Voir les articles" -#: .\templates\helpdesk\kb_item.html:4 -#, python-format -msgid "%(item)s" -msgstr "%(item)s" +#: .\templates\helpdesk\navigation-header.html:7 +msgid "Helpdesk" +msgstr "Helpdesk" -#: .\templates\helpdesk\kb_item.html:17 -msgid "Did you find this article useful?" -msgstr "Avez-vous trouvé cet article utile ?" - -#: .\templates\helpdesk\kb_item.html:28 -msgid "The results of voting by other readers of this article are below:" -msgstr "" -"Les résultats du vote par d'autres lecteurs du présent article sont ci-" -"dessous:" - -#: .\templates\helpdesk\kb_item.html:30 -#, python-format -msgid "Recommendations: %(recommendations)s" -msgstr "Recommendations : %(recommendations)s" - -#: .\templates\helpdesk\kb_item.html:31 -#, python-format -msgid "Votes: %(votes)s" -msgstr "Votes : %(votes)s" - -#: .\templates\helpdesk\kb_item.html:32 -#, python-format -msgid "Overall Rating: %(score)s" -msgstr "Note globale: %(score)s " - -#: .\templates\helpdesk\kb_item.html:40 -#, python-format -msgid "" -"View other %(category_title)s articles, or continue viewing other knowledgebase articles." -msgstr "" -"Voir les autres%(category_title)s " -"articles, ou continuer à lire les articles de la base de " -"connaissances ." - -#: .\templates\helpdesk\navigation.html:7 -msgid "Toggle navigation" -msgstr "Basculer la navigation" - -#: .\templates\helpdesk\navigation.html:20 -#: .\templates\helpdesk\navigation.html:94 -msgid "Dashboard" -msgstr "Tableau de bord" - -#: .\templates\helpdesk\navigation.html:26 -msgid "New Ticket" -msgstr "Nouveau Ticket" - -#: .\templates\helpdesk\navigation.html:29 -msgid "Stats" -msgstr "Statistiques" - -#: .\templates\helpdesk\navigation.html:38 -msgid "Saved Query" -msgstr "Requête sauvegardée" - -#: .\templates\helpdesk\navigation.html:53 +#: .\templates\helpdesk\navigation-header.html:17 msgid "Search..." msgstr "Rechercher ..." -#: .\templates\helpdesk\navigation.html:53 +#: .\templates\helpdesk\navigation-header.html:17 msgid "Enter a keyword, or a ticket number to jump straight to that ticket." msgstr "" "Entrez un mot clé ou un numéro de ticket pour aller directement à ce ticket." -#: .\templates\helpdesk\navigation.html:57 -#: .\templates\helpdesk\ticket_list.html:254 +#: .\templates\helpdesk\navigation-header.html:21 +#: .\templates\helpdesk\ticket_list.html:105 msgid "Go" msgstr "Go" -#: .\templates\helpdesk\navigation.html:73 .\templates\helpdesk\rss_list.html:3 -#: .\templates\helpdesk\rss_list.html:5 +#: .\templates\helpdesk\navigation-header.html:52 +#: .\templates\helpdesk\rss_list.html:4 .\templates\helpdesk\rss_list.html:16 msgid "RSS Feeds" msgstr "Flux RSS" -#: .\templates\helpdesk\navigation.html:75 +#: .\templates\helpdesk\navigation-header.html:54 #: .\templates\helpdesk\registration\change_password.html:2 #: .\templates\helpdesk\registration\change_password_done.html:2 msgid "Change password" msgstr "Changer le mot de passe" -#: .\templates\helpdesk\navigation.html:79 -#: .\templates\helpdesk\system_settings.html:6 +#: .\templates\helpdesk\navigation-header.html:58 +#: .\templates\helpdesk\system_settings.html:15 msgid "System Settings" msgstr "Paramètres Systèmes" -#: .\templates\helpdesk\navigation.html:82 -#: .\templates\helpdesk\navigation.html:103 +#: .\templates\helpdesk\navigation-header.html:61 +#: .\templates\helpdesk\navigation-header.html:80 msgid "Logout" msgstr "Déconnexion" -#: .\templates\helpdesk\navigation.html:103 +#: .\templates\helpdesk\navigation-header.html:68 +#: .\templates\helpdesk\navigation-sidebar.html:9 +msgid "Dashboard" +msgstr "Tableau de bord" + +#: .\templates\helpdesk\navigation-header.html:82 msgid "Log In" msgstr "Connexion" +#: .\templates\helpdesk\navigation-sidebar.html:15 +msgid "All Tickets" +msgstr "Tous les tickets" + +#: .\templates\helpdesk\navigation-sidebar.html:21 +#: .\templates\helpdesk\report_output.html:23 +msgid "Saved Queries" +msgstr "Requêtes sauvegardées" + +#: .\templates\helpdesk\navigation-sidebar.html:33 +msgid "" +"No saved queries currently available. You can create one in the All Tickets " +"page." +msgstr "" +"Pas de requêtes sauvegardées actuellement disponibles. Vous pouvez en créer " +"une dans la page Tous les tickets" + +#: .\templates\helpdesk\navigation-sidebar.html:40 +#: .\templates\helpdesk\navigation-sidebar.html:68 +msgid "New Ticket" +msgstr "Nouveau Ticket" + +#: .\templates\helpdesk\navigation-sidebar.html:46 +msgid "Reports" +msgstr "Rapports" + +#: .\templates\helpdesk\navigation-sidebar.html:62 +msgid "Homepage" +msgstr "Page d'accueil" + #: .\templates\helpdesk\public_change_language.html:2 -#: .\templates\helpdesk\public_homepage.html:74 +#: .\templates\helpdesk\public_homepage.html:54 #: .\templates\helpdesk\public_view_form.html:4 #: .\templates\helpdesk\public_view_ticket.html:3 msgid "View a Ticket" @@ -1796,28 +2013,32 @@ msgstr "Voir un ticket" msgid "Change the display language" msgstr "Changer la langue d'affichage" -#: .\templates\helpdesk\public_homepage.html:7 +#: .\templates\helpdesk\public_create_ticket_base.html:22 +msgid "" +"Public ticket submission is disabled. Please contact the administrator for " +"assistance." +msgstr "" +"La soumission de ticket public est désactivé. Merci de contacter un " +"administrateur pour de l'assistance." + +#: .\templates\helpdesk\public_homepage.html:4 +msgid "Welcome to Helpdesk" +msgstr "Bienvenue sur Helpdesk" + +#: .\templates\helpdesk\public_homepage.html:18 msgid "Knowledgebase Articles" msgstr "Base de connaissances des articles" -#: .\templates\helpdesk\public_homepage.html:10 -msgid "Knowledgebase Categories" -msgstr "Catégories de la base de connaissance" - -#: .\templates\helpdesk\public_homepage.html:29 -msgid "All fields are required." -msgstr "Tous les champs sont obligatoires." - -#: .\templates\helpdesk\public_homepage.html:67 +#: .\templates\helpdesk\public_homepage.html:47 msgid "Please use button at upper right to login first." msgstr "Veuillez utiliser le boutton en haut à droite pour vous connecter." -#: .\templates\helpdesk\public_homepage.html:83 +#: .\templates\helpdesk\public_homepage.html:64 #: .\templates\helpdesk\public_view_form.html:15 msgid "Your E-mail Address" msgstr "Votre adresse e-mail" -#: .\templates\helpdesk\public_homepage.html:87 +#: .\templates\helpdesk\public_homepage.html:70 #: .\templates\helpdesk\public_view_form.html:19 msgid "View Ticket" msgstr "Voir un Ticket" @@ -1847,7 +2068,7 @@ msgid "" "We are sorry for any inconvenience, however this check is required to avoid " "our helpdesk resources being overloaded by spammers." msgstr "" -"Nous somme désolé pour cet inconvénient, mais cette vérification est " +"Nous sommes désolé pour cet inconvénient, mais cette vérification est " "nécessaire pour éviter que notre ressource de support soit inondée par les " "spammeurs." @@ -1861,30 +2082,99 @@ msgid "Queue: %(queue_name)s" msgstr "File : %(queue_name)s " #: .\templates\helpdesk\public_view_ticket.html:14 -#: .\templates\helpdesk\ticket_desc_table.html:47 +#: .\templates\helpdesk\ticket_desc_table.html:30 msgid "Submitted On" msgstr "Soumis le" -#: .\templates\helpdesk\public_view_ticket.html:36 +#: .\templates\helpdesk\public_view_ticket.html:20 +msgid "Due On" +msgstr "Résolution souhaitée le " + +#: .\templates\helpdesk\public_view_ticket.html:44 msgid "Tags" msgstr "Tags" -#: .\templates\helpdesk\public_view_ticket.html:49 -#: .\templates\helpdesk\ticket_desc_table.html:36 +#: .\templates\helpdesk\public_view_ticket.html:57 +#: .\templates\helpdesk\ticket_desc_table.html:100 msgid "Accept and Close" msgstr "Accepter et Fermer" -#: .\templates\helpdesk\public_view_ticket.html:58 -#: .\templates\helpdesk\ticket.html:80 +#: .\templates\helpdesk\public_view_ticket.html:66 +#: .\templates\helpdesk\ticket.html:42 msgid "Follow-Ups" msgstr "Suivis" -#: .\templates\helpdesk\public_view_ticket.html:66 -#: .\templates\helpdesk\ticket.html:97 +#: .\templates\helpdesk\public_view_ticket.html:74 +#: .\templates\helpdesk\ticket.html:57 #, python-format msgid "Changed %(field)s from %(old_value)s to %(new_value)s." msgstr "Changé %(field)s de %(old_value)s à %(new_value)s." +#: .\templates\helpdesk\public_view_ticket.html:92 +#: .\templates\helpdesk\ticket.html:104 +msgid "Use a Pre-set Reply" +msgstr "Utiliser une réponse pré-enregistré" + +#: .\templates\helpdesk\public_view_ticket.html:92 +#: .\templates\helpdesk\ticket.html:104 .\templates\helpdesk\ticket.html:153 +#: .\templates\helpdesk\ticket.html:161 +msgid "(Optional)" +msgstr "(Optionnel)" + +#: .\templates\helpdesk\public_view_ticket.html:94 +#: .\templates\helpdesk\ticket.html:106 +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 "" +"Sélectionner une réponse prédéfinie effacera votre commentaire ci-dessous. " +"Vous pouvez ensuite modifier la réponse prédéfinie à votre guise avant " +"d'enregistrer cette mise à jour." + +#: .\templates\helpdesk\public_view_ticket.html:97 +#: .\templates\helpdesk\ticket.html:109 +msgid "Comment / Resolution" +msgstr "Commentaire / Solution" + +#: .\templates\helpdesk\public_view_ticket.html:99 +#: .\templates\helpdesk\ticket.html:111 +msgid "" +"You can insert ticket and queue details in your message. For more " +"information, see the context help page." +msgstr "" +"Vous pouvez insérer des tickets et des détails dans votre message. Pour plus " +"d'informations, consultez la page d'aide " +"contextuelle ." + +#: .\templates\helpdesk\public_view_ticket.html:101 +#: .\templates\helpdesk\ticket.html:114 +msgid "" +"This ticket cannot be resolved or closed until the tickets it depends on are " +"resolved." +msgstr "" +"Ce ticket ne peut être résolu ou fermé tant que les tickets desquels il " +"dépend n'ont pas été résolus." + +#: .\templates\helpdesk\public_view_ticket.html:136 +#: .\templates\helpdesk\ticket.html:189 +msgid "Attach File(s) »" +msgstr "Attacher des fichiers »" + +#: .\templates\helpdesk\public_view_ticket.html:141 +#: .\templates\helpdesk\ticket.html:194 +msgid "Attach a File" +msgstr "Joindre un fichier" + +#: .\templates\helpdesk\public_view_ticket.html:146 +#: .\templates\helpdesk\ticket.html:200 .\templates\helpdesk\ticket.html:263 +msgid "No files selected." +msgstr "Aucun fichier sélectionné" + +#: .\templates\helpdesk\public_view_ticket.html:155 +#: .\templates\helpdesk\ticket.html:209 +msgid "Update This Ticket" +msgstr "Mettre à jour ce Ticket" + #: .\templates\helpdesk\registration\change_password.html:6 msgid "Change Password" msgstr "Changer le mot de passe" @@ -1930,7 +2220,7 @@ msgid "" "
\n" "

Successfully Logged Out

\n" "

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

\n" +"tickets and made the world a better place.

\n" "
\n" " \n" "\n" @@ -1950,46 +2240,48 @@ msgstr "" msgid "Helpdesk Login" msgstr "Identifiant Helpdesk" -#: .\templates\helpdesk\registration\login.html:13 +#: .\templates\helpdesk\registration\login.html:12 msgid "Please Sign In" msgstr "Connectez-vous s'il vous plaît" -#: .\templates\helpdesk\registration\login.html:18 +#: .\templates\helpdesk\registration\login.html:16 msgid "Your username and password didn't match. Please try again." msgstr "" "Votre nom d'utilisateur et mot de passe ne correspondent pas. Veuillez " "essayer de nouveau." -#: .\templates\helpdesk\registration\login.html:29 -msgid "Remember Me" -msgstr "Se souvenir de moi" +#: .\templates\helpdesk\registration\login.html:34 +msgid "Remember Password" +msgstr "Se souvenir du mot de passe" -#: .\templates\helpdesk\registration\login.html:32 +#: .\templates\helpdesk\registration\login.html:38 msgid "Login" msgstr "Identifiant" #: .\templates\helpdesk\report_index.html:3 -#: .\templates\helpdesk\report_index.html:6 +#: .\templates\helpdesk\report_index.html:7 +#: .\templates\helpdesk\report_index.html:13 #: .\templates\helpdesk\report_output.html:4 -#: .\templates\helpdesk\report_output.html:29 +#: .\templates\helpdesk\report_output.html:12 +#: .\templates\helpdesk\report_output.html:18 msgid "Reports & Statistics" msgstr "Rapports & Statistiques" -#: .\templates\helpdesk\report_index.html:9 +#: .\templates\helpdesk\report_index.html:16 msgid "You haven't created any tickets yet, so you cannot run any reports." msgstr "" "Vous n'avez encore créé aucun ticket, vous ne pouvez donc exécuter aucun " "rapport." -#: .\templates\helpdesk\report_index.html:16 +#: .\templates\helpdesk\report_index.html:22 msgid "Current Ticket Stats" msgstr "Statistiques actuelles des tickets" -#: .\templates\helpdesk\report_index.html:24 +#: .\templates\helpdesk\report_index.html:29 msgid "Average number of days until ticket is closed (all tickets): " msgstr "Délai moyen de fermeture d'un ticket (tous tickets) :" -#: .\templates\helpdesk\report_index.html:28 +#: .\templates\helpdesk\report_index.html:33 msgid "" "Average number of days until ticket is closed (tickets opened in last 60 " "days): " @@ -1997,73 +2289,70 @@ msgstr "" "Délai moyen de fermeture d'un ticket (tickets ouverts dans les 60 derniers " "jours) :" -#: .\templates\helpdesk\report_index.html:29 +#: .\templates\helpdesk\report_index.html:34 msgid "Click" msgstr "Cliquer" -#: .\templates\helpdesk\report_index.html:29 -msgid "here" -msgstr "ici" - -#: .\templates\helpdesk\report_index.html:29 +#: .\templates\helpdesk\report_index.html:34 msgid "for detailed average by month." msgstr "pour la moyenne par mois détaillé" -#: .\templates\helpdesk\report_index.html:71 +#: .\templates\helpdesk\report_index.html:48 +#: .\templates\helpdesk\ticket.html:161 +msgid "Time spent" +msgstr "Temps passé" + +#: .\templates\helpdesk\report_index.html:75 msgid "Generate Report" msgstr "Générer le rapport" -#: .\templates\helpdesk\report_index.html:76 +#: .\templates\helpdesk\report_index.html:79 msgid "Reports By User" msgstr "Rapports par Utilisateur" -#: .\templates\helpdesk\report_index.html:78 -#: .\templates\helpdesk\report_index.html:86 +#: .\templates\helpdesk\report_index.html:81 +#: .\templates\helpdesk\report_index.html:89 msgid "by Priority" msgstr "par Priorité" -#: .\templates\helpdesk\report_index.html:79 +#: .\templates\helpdesk\report_index.html:82 msgid "by Queue" msgstr "par File" -#: .\templates\helpdesk\report_index.html:80 -#: .\templates\helpdesk\report_index.html:87 +#: .\templates\helpdesk\report_index.html:83 +#: .\templates\helpdesk\report_index.html:90 msgid "by Status" msgstr "par Status" -#: .\templates\helpdesk\report_index.html:81 -#: .\templates\helpdesk\report_index.html:88 +#: .\templates\helpdesk\report_index.html:84 +#: .\templates\helpdesk\report_index.html:91 msgid "by Month" msgstr "par Mois" -#: .\templates\helpdesk\report_index.html:84 +#: .\templates\helpdesk\report_index.html:87 msgid "Reports By Queue" msgstr "Rapports par File" -#: .\templates\helpdesk\report_index.html:89 .\views\staff.py:1256 +#: .\templates\helpdesk\report_index.html:92 .\views\staff.py:1453 msgid "Days until ticket closed by Month" msgstr "Jours avant fermeture d'un ticket par mois" -#: .\templates\helpdesk\report_output.html:35 -msgid "Saved Queries" -msgstr "Requêtes sauvegardées" - -#: .\templates\helpdesk\report_output.html:40 +#: .\templates\helpdesk\report_output.html:27 msgid "" "You can run this query on filtered data by using one of your saved queries." msgstr "" "Vous pouvez exécuter cette requête sur des données filtrées en utilisant " "l'une de vos requêtes enregistrées." -#: .\templates\helpdesk\report_output.html:42 +#: .\templates\helpdesk\report_output.html:29 msgid "Select Query:" msgstr "Selectionnez une requête :" -#: .\templates\helpdesk\report_output.html:47 +#: .\templates\helpdesk\report_output.html:34 msgid "Filter Report" msgstr "Filtrer le rapport" -#: .\templates\helpdesk\report_output.html:50 +#: .\templates\helpdesk\report_output.html:37 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." @@ -2072,7 +2361,7 @@ msgstr "" "données ? Aller à la liste des billets, filtrez votre requête, et " "enregistrez votre requête." -#: .\templates\helpdesk\rss_list.html:7 +#: .\templates\helpdesk\rss_list.html:18 msgid "" "The following RSS feeds are available for you to monitor using your " "preferred RSS software. With the exception of the 'Latest Activity' feed, " @@ -2085,7 +2374,7 @@ msgstr "" "ouvert. Ainsi, votre lecteur de flux RSS n'est pas plein d'informations sur " "les tâches fermées ou historiques." -#: .\templates\helpdesk\rss_list.html:11 +#: .\templates\helpdesk\rss_list.html:22 msgid "" "A summary of your open tickets - useful for getting alerted to new tickets " "opened for you" @@ -2093,11 +2382,11 @@ msgstr "" "Un résumé de vos tickets ouverts - utile pour être alerté lorsqu'un nouveau " "ticket arrive pour vous" -#: .\templates\helpdesk\rss_list.html:13 +#: .\templates\helpdesk\rss_list.html:24 msgid "Latest Activity" msgstr "Dernière activité" -#: .\templates\helpdesk\rss_list.html:14 +#: .\templates\helpdesk\rss_list.html:25 msgid "" "A summary of all helpdesk activity - including comments, emails, " "attachments, and more" @@ -2105,7 +2394,7 @@ msgstr "" "Un résumé de l'activité sur le helpdesk - y compris les commentaires, " "courriels, pièces jointes, et plus" -#: .\templates\helpdesk\rss_list.html:17 +#: .\templates\helpdesk\rss_list.html:28 msgid "" "All unassigned tickets - useful for being alerted to new tickets opened by " "the public via the web or via e-mail" @@ -2113,7 +2402,7 @@ msgstr "" "Tous les tickets non assignés - utile pour être alerté des nouveaux tickets " "ouverts par le public via le web ou par e-mail" -#: .\templates\helpdesk\rss_list.html:20 +#: .\templates\helpdesk\rss_list.html:31 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 " @@ -2125,152 +2414,112 @@ msgstr "" "êtes responsable d’une file particulière, ceci vous permet de visionner tous " "les nouveaux billet entrant." -#: .\templates\helpdesk\rss_list.html:26 +#: .\templates\helpdesk\rss_list.html:37 msgid "Per-Queue Feeds" msgstr "Flux par File" -#: .\templates\helpdesk\rss_list.html:35 +#: .\templates\helpdesk\rss_list.html:46 msgid "All Open Tickets" msgstr "Tous les tickets ouverts" +#: .\templates\helpdesk\success_iframe.html:3 +msgid "" +"Ticket submitted successfully! We will reply via email as soon as we get the " +"chance." +msgstr "" +"Ticket créé avec succès ! Nous vous répondrons par mail aussi vite que " +"possible." + #: .\templates\helpdesk\system_settings.html:3 msgid "Change System Settings" msgstr "Modifier les paramètres systèmes" -#: .\templates\helpdesk\system_settings.html:8 +#: .\templates\helpdesk\system_settings.html:7 +#: .\templates\helpdesk\user_settings.html:7 +msgid "Settings" +msgstr "Paramètres" + +#: .\templates\helpdesk\system_settings.html:17 msgid "The following items can be maintained by you or other superusers:" msgstr "" -"Les items suivant peuvent être maintenus par vous ou par des super usagers :" +"Les items suivant peuvent être maintenus par vous ou par des super " +"utilisateurs :" -#: .\templates\helpdesk\system_settings.html:11 +#: .\templates\helpdesk\system_settings.html:20 msgid "E-Mail Ignore list" -msgstr "Liste des adresses mails ignorés." +msgstr "Liste des adresses mails ignorées." -#: .\templates\helpdesk\system_settings.html:12 +#: .\templates\helpdesk\system_settings.html:21 msgid "Maintain Queues" msgstr "Gérer les files" -#: .\templates\helpdesk\system_settings.html:13 +#: .\templates\helpdesk\system_settings.html:22 msgid "Maintain Pre-Set Replies" msgstr "Gérer les réponses pré-définies" -#: .\templates\helpdesk\system_settings.html:14 +#: .\templates\helpdesk\system_settings.html:23 msgid "Maintain Knowledgebase Categories" msgstr "Gérer les catégories de la Base de Connaissance" -#: .\templates\helpdesk\system_settings.html:15 +#: .\templates\helpdesk\system_settings.html:24 msgid "Maintain Knowledgebase Items" msgstr "Gérer la Base de Connaissance" -#: .\templates\helpdesk\system_settings.html:16 +#: .\templates\helpdesk\system_settings.html:25 msgid "Maintain E-Mail Templates" msgstr "Gérer les templates e-mail" -#: .\templates\helpdesk\system_settings.html:17 +#: .\templates\helpdesk\system_settings.html:26 msgid "Maintain Users" msgstr "Gérer les utilisateurs" -#: .\templates\helpdesk\ticket.html:4 +#: .\templates\helpdesk\ticket.html:7 msgid "View Ticket Details" msgstr "Voir les détails du ticket" -#: .\templates\helpdesk\ticket.html:44 .\templates\helpdesk\ticket.html:236 -msgid "No files selected." -msgstr "Aucun fichier sélectionné" +#: .\templates\helpdesk\ticket.html:34 +msgid "This ticket has been merged into ticket" +msgstr "Ce ticket a été fusionné dans le ticket." -#: .\templates\helpdesk\ticket.html:91 +#: .\templates\helpdesk\ticket.html:49 +msgid "time spent" +msgstr "temps passé" + +#: .\templates\helpdesk\ticket.html:49 msgid "Private" msgstr "Privé" -#: .\templates\helpdesk\ticket.html:115 -#: .\templates\helpdesk\ticket_desc_table.html:16 -msgid "Edit" -msgstr "Editer" - -#: .\templates\helpdesk\ticket.html:140 +#: .\templates\helpdesk\ticket.html:96 msgid "Respond to this ticket" msgstr "Répondre à ce ticket" -#: .\templates\helpdesk\ticket.html:147 -msgid "Use a Pre-set Reply" -msgstr "Utiliser une réponse pré-enregistré" - -#: .\templates\helpdesk\ticket.html:149 -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 "" -"Sélectionner une réponse prédéfinie effacera votre commentaire ci-dessous. " -"Vous pouvez ensuite modifier la réponse prédéfinie à votre guise avant " -"d'enregistrer cette mise à jour." - -#: .\templates\helpdesk\ticket.html:152 -msgid "Comment / Resolution" -msgstr "Commentaire / Solution" - -#: .\templates\helpdesk\ticket.html:154 -msgid "" -"You can insert ticket and queue details in your message. For more " -"information, see the context help page." -msgstr "" -"Vous pouvez insérer des tickets et des détails dans votre message. Pour plus " -"d'informations, consultez la page d'aide " -"contextuelle ." - -#: .\templates\helpdesk\ticket.html:157 -msgid "" -"This ticket cannot be resolved or closed until the tickets it depends on are " -"resolved." -msgstr "" -"Ce ticket ne peut être résolu ou fermé tant que les tickets desquels il " -"dépend n'ont pas été résolus." - -#: .\templates\helpdesk\ticket.html:196 +#: .\templates\helpdesk\ticket.html:153 msgid "Is this update public?" msgstr "Cette mise à jour est-elle publique ?" -#: .\templates\helpdesk\ticket.html:198 +#: .\templates\helpdesk\ticket.html:155 msgid "Yes, make this update public." msgstr "Oui, rendre publique cette réponse" -#: .\templates\helpdesk\ticket.html:199 +#: .\templates\helpdesk\ticket.html:156 msgid "" "If this is public, the submitter will be e-mailed your comment or resolution." msgstr "" "Si elle est public, l'émetteur recevra vos commentaires ou la solution par " "courriel." -#: .\templates\helpdesk\ticket.html:203 +#: .\templates\helpdesk\ticket.html:167 msgid "Change Further Details »" msgstr "Faire d'autres changement »" -#: .\templates\helpdesk\ticket.html:212 -#: .\templates\helpdesk\ticket_list.html:62 -#: .\templates\helpdesk\ticket_list.html:91 -#: .\templates\helpdesk\ticket_list.html:227 .\views\staff.py:542 -msgid "Owner" -msgstr "Propriétaire" - -#: .\templates\helpdesk\ticket.html:213 +#: .\templates\helpdesk\ticket.html:177 msgid "Unassign" msgstr "Non assigné" -#: .\templates\helpdesk\ticket.html:225 -msgid "Attach File(s) »" -msgstr "Attacher des fichiers »" - -#: .\templates\helpdesk\ticket.html:230 -msgid "Attach a File" -msgstr "Joindre un fichier" - -#: .\templates\helpdesk\ticket.html:233 +#: .\templates\helpdesk\ticket.html:197 msgid "Add Another File" msgstr "Ajouter un autre fichier" -#: .\templates\helpdesk\ticket.html:245 -msgid "Update This Ticket" -msgstr "Mettre à jour ce Ticket" - #: .\templates\helpdesk\ticket_attachment_del.html:3 msgid "Delete Ticket Attachment" msgstr "Supprimer le fichier joint au ticket" @@ -2294,22 +2543,32 @@ msgstr "" "serveur.

\n" #: .\templates\helpdesk\ticket_attachment_del.html:11 -#: .\templates\helpdesk\ticket_cc_del.html:12 -#: .\templates\helpdesk\ticket_dependency_del.html:11 +#: .\templates\helpdesk\ticket_cc_del.html:25 +#: .\templates\helpdesk\ticket_dependency_del.html:21 msgid "Don't Delete" msgstr "Ne pas supprimer" #: .\templates\helpdesk\ticket_attachment_del.html:14 -#: .\templates\helpdesk\ticket_dependency_del.html:14 +#: .\templates\helpdesk\ticket_dependency_del.html:24 msgid "Yes, I Understand - Delete" msgstr "Oui, je comprends - Supprimer" #: .\templates\helpdesk\ticket_cc_add.html:3 -#: .\templates\helpdesk\ticket_cc_add.html:6 +#: .\templates\helpdesk\ticket_cc_add.html:19 msgid "Add Ticket CC" msgstr "Ajouter le destinataire en copie" -#: .\templates\helpdesk\ticket_cc_add.html:12 +#: .\templates\helpdesk\ticket_cc_add.html:13 +#: .\templates\helpdesk\ticket_cc_del.html:13 +#: .\templates\helpdesk\ticket_cc_list.html:12 +msgid "CC Settings" +msgstr "Paramètres \"copie à\"" + +#: .\templates\helpdesk\ticket_cc_add.html:15 +msgid "Add CC" +msgstr "Ajouter un CC" + +#: .\templates\helpdesk\ticket_cc_add.html:24 msgid "" "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." @@ -2318,20 +2577,20 @@ msgstr "" "lorsque ce ticket est mis à jour, sélectionnez l'utilisateur ou saisissez " "l'adresse mail ci-dessous." -#: .\templates\helpdesk\ticket_cc_add.html:18 +#: .\templates\helpdesk\ticket_cc_add.html:29 msgid "Email" msgstr "Email" -#: .\templates\helpdesk\ticket_cc_add.html:27 +#: .\templates\helpdesk\ticket_cc_add.html:38 msgid "Add Email" msgstr "Ajouter un email" -#: .\templates\helpdesk\ticket_cc_add.html:37 -#: .\templates\helpdesk\ticket_cc_add.html:51 +#: .\templates\helpdesk\ticket_cc_add.html:48 +#: .\templates\helpdesk\ticket_cc_add.html:62 msgid "Save Ticket CC" msgstr "CC sauvegarder billet" -#: .\templates\helpdesk\ticket_cc_add.html:41 +#: .\templates\helpdesk\ticket_cc_add.html:52 msgid "Add User" msgstr "Ajouter un utilisateur" @@ -2339,7 +2598,11 @@ msgstr "Ajouter un utilisateur" msgid "Delete Ticket CC" msgstr "Supprimer le \"copie à\" pour ce destinataire" -#: .\templates\helpdesk\ticket_cc_del.html:5 +#: .\templates\helpdesk\ticket_cc_del.html:15 +msgid "Delete CC" +msgstr "Supprimer CC" + +#: .\templates\helpdesk\ticket_cc_del.html:18 #, python-format msgid "" "\n" @@ -2356,7 +2619,7 @@ msgstr "" "( %(email_address)s ) de la liste CC pour ce ticket ? Ils ne " "recevront plus les mises à jour.

\n" -#: .\templates\helpdesk\ticket_cc_del.html:15 +#: .\templates\helpdesk\ticket_cc_del.html:28 msgid "Yes I Understand - Delete" msgstr "Oui, je comprends - Supprimer." @@ -2364,7 +2627,7 @@ msgstr "Oui, je comprends - Supprimer." msgid "Ticket CC Settings" msgstr "Paramètres \"copie à\" du ticket" -#: .\templates\helpdesk\ticket_cc_list.html:5 +#: .\templates\helpdesk\ticket_cc_list.html:15 #, python-format msgid "" "\n" @@ -2388,36 +2651,37 @@ msgstr "" "

Vous pouvez ajouter une nouvelle adresse mail à la liste ou supprimer " "l'un des éléments ci-dessous, au besoin.

" -#: .\templates\helpdesk\ticket_cc_list.html:16 +#: .\templates\helpdesk\ticket_cc_list.html:26 msgid "Ticket CC List" msgstr "Liste des destinataires en copie" -#: .\templates\helpdesk\ticket_cc_list.html:20 +#: .\templates\helpdesk\ticket_cc_list.html:30 msgid "Add an Email or Helpdesk User" msgstr "Ajouter un email ou un utilisateur Helpdesk" -#: .\templates\helpdesk\ticket_cc_list.html:25 +#: .\templates\helpdesk\ticket_cc_list.html:35 msgid "E-Mail Address or Helpdesk User" msgstr "Adresse E-Mail ou Utilisateur Helpdesk" -#: .\templates\helpdesk\ticket_cc_list.html:26 +#: .\templates\helpdesk\ticket_cc_list.html:36 msgid "View?" msgstr "Voir ?" -#: .\templates\helpdesk\ticket_cc_list.html:27 +#: .\templates\helpdesk\ticket_cc_list.html:37 msgid "Update?" msgstr "Mettre à jour ?" -#: .\templates\helpdesk\ticket_cc_list.html:53 +#: .\templates\helpdesk\ticket_cc_list.html:63 #, python-format msgid "Return to %(ticket_title)s" msgstr "Retourner à %(ticket_title)s" #: .\templates\helpdesk\ticket_dependency_add.html:3 +#: .\templates\helpdesk\ticket_dependency_add.html:12 msgid "Add Ticket Dependency" msgstr "Ajouter une dépendance à un ticket" -#: .\templates\helpdesk\ticket_dependency_add.html:5 +#: .\templates\helpdesk\ticket_dependency_add.html:15 msgid "" "\n" "

Add Ticket Dependency

\n" @@ -2431,15 +2695,16 @@ msgstr "" "

Ajouter une dépendance vous empêchera de résoudre ce billet jusqu'à ce " "que le billet en question ait été résolu ou fermé.

" -#: .\templates\helpdesk\ticket_dependency_add.html:21 +#: .\templates\helpdesk\ticket_dependency_add.html:31 msgid "Save Ticket Dependency" msgstr "Enregistrer la dépendance" #: .\templates\helpdesk\ticket_dependency_del.html:3 +#: .\templates\helpdesk\ticket_dependency_del.html:12 msgid "Delete Ticket Dependency" msgstr "Supprimer la dépendance" -#: .\templates\helpdesk\ticket_dependency_del.html:5 +#: .\templates\helpdesk\ticket_dependency_del.html:15 msgid "" "\n" "

Delete Ticket Dependency

\n" @@ -2451,41 +2716,37 @@ msgstr "" "\n" "

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

\n" -#: .\templates\helpdesk\ticket_desc_table.html:8 -msgid "Ticket Summary" -msgstr "Résumé du ticket" - -#: .\templates\helpdesk\ticket_desc_table.html:18 -msgid "Unhold" -msgstr "Reprendre" - -#: .\templates\helpdesk\ticket_desc_table.html:18 -msgid "Hold" -msgstr "Pause" - -#: .\templates\helpdesk\ticket_desc_table.html:20 +#: .\templates\helpdesk\ticket_desc_table.html:13 #, python-format msgid "Queue: %(queue)s" msgstr "File: %(queue)s" -#: .\templates\helpdesk\ticket_desc_table.html:43 -#: .\templates\helpdesk\ticket_list.html:226 +#: .\templates\helpdesk\ticket_desc_table.html:15 +msgid "Edit" +msgstr "Editer" + +#: .\templates\helpdesk\ticket_desc_table.html:17 +msgid "Unhold" +msgstr "Reprendre" + +#: .\templates\helpdesk\ticket_desc_table.html:17 +msgid "Hold" +msgstr "Pause" + +#: .\templates\helpdesk\ticket_desc_table.html:27 +#: .\templates\helpdesk\ticket_list.html:66 msgid "Due Date" msgstr "Date d'échéance" -#: .\templates\helpdesk\ticket_desc_table.html:52 +#: .\templates\helpdesk\ticket_desc_table.html:34 msgid "Assigned To" msgstr "Assigné à" -#: .\templates\helpdesk\ticket_desc_table.html:58 -msgid "Ignore" -msgstr "Ignorer" - -#: .\templates\helpdesk\ticket_desc_table.html:67 +#: .\templates\helpdesk\ticket_desc_table.html:52 msgid "Copies To" msgstr "Copies à" -#: .\templates\helpdesk\ticket_desc_table.html:68 +#: .\templates\helpdesk\ticket_desc_table.html:53 msgid "" "Click here to add / remove people who should receive an e-mail whenever this " "ticket is updated." @@ -2493,11 +2754,7 @@ msgstr "" "Cliquez ici pour ajouter / supprimer des personnes qui pourrait recevoir un " "e-mail lorsque ce ticket est mis à jour." -#: .\templates\helpdesk\ticket_desc_table.html:68 -msgid "Manage" -msgstr "Gérer" - -#: .\templates\helpdesk\ticket_desc_table.html:68 +#: .\templates\helpdesk\ticket_desc_table.html:53 msgid "" "Click here to subscribe yourself to this ticket, if you want to receive an e-" "mail whenever this ticket is updated." @@ -2505,30 +2762,11 @@ msgstr "" "Cliquez ici pour souscrire à ce ticket si vous souhaitez recevoir un e-mail " "dès que ce dernier est mis à jour." -#: .\templates\helpdesk\ticket_desc_table.html:68 -msgid "Subscribe" -msgstr "Souscrire" - -#: .\templates\helpdesk\ticket_desc_table.html:72 +#: .\templates\helpdesk\ticket_desc_table.html:57 msgid "Dependencies" msgstr "Dépendances" -#: .\templates\helpdesk\ticket_desc_table.html:74 -msgid "" -"This ticket cannot be resolved until the following ticket(s) are resolved" -msgstr "" -"Ce ticket ne peut être résolu tant que le(s) ticket(s) suivant(s) n'ont pas " -"été résolu(s)" - -#: .\templates\helpdesk\ticket_desc_table.html:75 -msgid "Remove Dependency" -msgstr "Supprimer la dépendance" - -#: .\templates\helpdesk\ticket_desc_table.html:78 -msgid "This ticket has no dependencies." -msgstr "Ce ticket ne dépend d'aucun autre." - -#: .\templates\helpdesk\ticket_desc_table.html:80 +#: .\templates\helpdesk\ticket_desc_table.html:59 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 " @@ -2538,100 +2776,133 @@ msgstr "" "d'un autre. Un ticket ne peut être fermé tant que les tickets dont il dépend " "ne sont pas fermés." -#: .\templates\helpdesk\ticket_desc_table.html:80 -msgid "Add Dependency" -msgstr "Ajouter une dépendance" +#: .\templates\helpdesk\ticket_desc_table.html:61 +msgid "" +"This ticket cannot be resolved until the following ticket(s) are resolved" +msgstr "" +"Ce ticket ne peut être résolu tant que le(s) ticket(s) suivant(s) n'ont pas " +"été résolu(s)" -#: .\templates\helpdesk\ticket_list.html:13 -msgid "No Tickets Match Your Selection" -msgstr "Aucun ticket correspondant à votre sélection" +#: .\templates\helpdesk\ticket_desc_table.html:65 +msgid "This ticket has no dependencies." +msgstr "Ce ticket ne dépend d'aucun autre." -#: .\templates\helpdesk\ticket_list.html:46 +#: .\templates\helpdesk\ticket_desc_table.html:68 +msgid "Total time spent" +msgstr "Temps passé total" + +#: .\templates\helpdesk\ticket_desc_table.html:73 +msgid "Knowlegebase item" +msgstr "Élément de la base de connaissance" + +#: .\templates\helpdesk\ticket_desc_table.html:107 +msgid "Edit details" +msgstr "Editer les détails" + +#: .\templates\helpdesk\ticket_list.html:21 +msgid "Saved Query" +msgstr "Requête sauvegardée" + +#: .\templates\helpdesk\ticket_list.html:36 +msgid "Query Results" +msgstr "Résultats de la requête" + +#: .\templates\helpdesk\ticket_list.html:41 +msgid "Table" +msgstr "Table" + +#: .\templates\helpdesk\ticket_list.html:47 +msgid "Timeline" +msgstr "Chronologie" + +#: .\templates\helpdesk\ticket_list.html:68 +msgid "Submitter" +msgstr "Émetteur" + +#: .\templates\helpdesk\ticket_list.html:69 +msgid "Time Spent" +msgstr "Temps Passé" + +#: .\templates\helpdesk\ticket_list.html:70 +msgid "KB item" +msgstr "Objet de la Base de Connaissance" + +#: .\templates\helpdesk\ticket_list.html:75 +msgid "Select:" +msgstr "Sélectionner :" + +#: .\templates\helpdesk\ticket_list.html:83 +msgid "Invert" +msgstr "Inverser" + +#: .\templates\helpdesk\ticket_list.html:87 +msgid "With Selected Tickets:" +msgstr "Avec les tickets sélectionnés :" + +#: .\templates\helpdesk\ticket_list.html:89 +msgid "Take (Assign to me)" +msgstr "Prendre (m'assigner ce ticket)" + +#: .\templates\helpdesk\ticket_list.html:91 +msgid "Merge" +msgstr "Fusionner" + +#: .\templates\helpdesk\ticket_list.html:92 +msgid "Close" +msgstr "Fermé" + +#: .\templates\helpdesk\ticket_list.html:93 +msgid "Close (Don't Send E-Mail)" +msgstr "Fermer (ne pas envoyer l'e-mail)" + +#: .\templates\helpdesk\ticket_list.html:94 +msgid "Close (Send E-Mail)" +msgstr "Fermer (envoyer l'e-mail)" + +#: .\templates\helpdesk\ticket_list.html:96 +msgid "Assign To" +msgstr "Assigné à" + +#: .\templates\helpdesk\ticket_list.html:97 +msgid "Nobody (Unassign)" +msgstr "Nul (non assigné)" + +#: .\templates\helpdesk\ticket_list.html:100 +msgid "Set KB Item" +msgstr "Définir objet de la base de connaissance" + +#: .\templates\helpdesk\ticket_list.html:101 +msgid "No KB Item" +msgstr "Pas d'objet de la base de connaissance" + +#: .\templates\helpdesk\ticket_list.html:151 msgid "Query Selection" msgstr "Sélection de requêtes" -#: .\templates\helpdesk\ticket_list.html:54 -msgid "Change Query" -msgstr "Changer la requête" +#: .\templates\helpdesk\ticket_list.html:161 +msgid "Filters" +msgstr "Filtres" -#: .\templates\helpdesk\ticket_list.html:61 -#: .\templates\helpdesk\ticket_list.html:73 -msgid "Sorting" -msgstr "Tri" +#: .\templates\helpdesk\ticket_list.html:170 +msgid "Add filter" +msgstr "Ajouter un filtre" -#: .\templates\helpdesk\ticket_list.html:65 -#: .\templates\helpdesk\ticket_list.html:133 -msgid "Keywords" -msgstr "Mots-clés" - -#: .\templates\helpdesk\ticket_list.html:66 +#: .\templates\helpdesk\ticket_list.html:179 msgid "Date Range" msgstr "Période temporelle" -#: .\templates\helpdesk\ticket_list.html:94 -msgid "Reverse" -msgstr "Renverser" +#: .\templates\helpdesk\ticket_list.html:211 +msgid "Apply Filters" +msgstr "Appliquer les filtres" -#: .\templates\helpdesk\ticket_list.html:96 -msgid "Ordering applied to tickets" -msgstr "Tri appliqué aux tickets" - -#: .\templates\helpdesk\ticket_list.html:101 -msgid "Owner(s)" -msgstr "Propriétaire(s)" - -#: .\templates\helpdesk\ticket_list.html:105 -msgid "(ME)" -msgstr "(MOI)" - -#: .\templates\helpdesk\ticket_list.html:109 -msgid "Ctrl-Click to select multiple options" -msgstr "Ctrl-Click pour sélectionner plusieurs options" - -#: .\templates\helpdesk\ticket_list.html:114 -msgid "Queue(s)" -msgstr "File(s)" - -#: .\templates\helpdesk\ticket_list.html:115 -#: .\templates\helpdesk\ticket_list.html:121 -msgid "Ctrl-click to select multiple options" -msgstr "Ctrl-click pour sélectionner plusieurs options" - -#: .\templates\helpdesk\ticket_list.html:120 -msgid "Status(es)" -msgstr "État(s)" - -#: .\templates\helpdesk\ticket_list.html:126 -msgid "Date (From)" -msgstr "Date (du)" - -#: .\templates\helpdesk\ticket_list.html:127 -msgid "Date (To)" -msgstr "Date (au)" - -#: .\templates\helpdesk\ticket_list.html:128 -msgid "Use YYYY-MM-DD date format, eg 2011-05-29" -msgstr "Utilisez le format de date AAAA-MM-JJ, ex 2011-05-29" - -#: .\templates\helpdesk\ticket_list.html:134 -msgid "" -"Keywords are case-insensitive, and will be looked for in the title, body and " -"submitter fields." -msgstr "" -"Les mots clés sont insensibles à la case et seront appliqués aux champs " -"titre, corps de texte et auteur." - -#: .\templates\helpdesk\ticket_list.html:138 -msgid "Apply Filter" -msgstr "Appliquer le filtre" - -#: .\templates\helpdesk\ticket_list.html:140 +#: .\templates\helpdesk\ticket_list.html:213 #, python-format msgid "" "You are currently viewing saved query \"%(query_name)s\"." -msgstr "Vous visionnez la requête \\\"%(query_name)s\\\"." +msgstr "" +"Vous visionnez actuellement la requête \"%(query_name)s\"." -#: .\templates\helpdesk\ticket_list.html:143 +#: .\templates\helpdesk\ticket_list.html:216 #, python-format msgid "" "Run a report on this " @@ -2641,12 +2912,12 @@ msgstr "" "cette requête pour voir les statistique et graphiques pour les données ci-" "dessous." -#: .\templates\helpdesk\ticket_list.html:152 -#: .\templates\helpdesk\ticket_list.html:170 +#: .\templates\helpdesk\ticket_list.html:229 +#: .\templates\helpdesk\ticket_list.html:248 msgid "Save Query" msgstr "Enregistrer la requête" -#: .\templates\helpdesk\ticket_list.html:162 +#: .\templates\helpdesk\ticket_list.html:240 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 " @@ -2656,15 +2927,15 @@ msgstr "" "partagez votre requête, les autres utilisateurs verront ce nom, choisissez " "alors quelque chose de clair et représentatif !" -#: .\templates\helpdesk\ticket_list.html:164 +#: .\templates\helpdesk\ticket_list.html:242 msgid "Shared?" msgstr "Partagée ?" -#: .\templates\helpdesk\ticket_list.html:165 +#: .\templates\helpdesk\ticket_list.html:243 msgid "Yes, share this query with other users." msgstr "Oui, partager cette requête avec les autres utilisateurs." -#: .\templates\helpdesk\ticket_list.html:166 +#: .\templates\helpdesk\ticket_list.html:244 msgid "" "If you share this query, it will be visible by all other logged-in " "users." @@ -2672,67 +2943,91 @@ msgstr "" "Si vous partagez cette requête, elle sera visible par tous les " "autres utilisateurs connectés." -#: .\templates\helpdesk\ticket_list.html:179 +#: .\templates\helpdesk\ticket_list.html:260 msgid "Use Saved Query" msgstr "Utiliser la requête enregistrée" -#: .\templates\helpdesk\ticket_list.html:185 +#: .\templates\helpdesk\ticket_list.html:267 msgid "Query" msgstr "Requête" -#: .\templates\helpdesk\ticket_list.html:187 -msgid "Shared" -msgstr "Partagée" - -#: .\templates\helpdesk\ticket_list.html:190 +#: .\templates\helpdesk\ticket_list.html:272 msgid "Run Query" msgstr "Exécuter la requête" -#: .\templates\helpdesk\ticket_list.html:210 -msgid "Query Results" -msgstr "Résultats de la requête" +#: .\templates\helpdesk\ticket_list.html:299 +msgid "No Tickets Match Your Selection" +msgstr "Aucun ticket correspondant à votre sélection" -#: .\templates\helpdesk\ticket_list.html:248 -msgid "Select:" -msgstr "Sélectionner :" +#: .\templates\helpdesk\ticket_merge.html:5 +#: .\templates\helpdesk\ticket_merge.html:16 +#: .\templates\helpdesk\ticket_merge.html:24 +msgid "Merge Tickets" +msgstr "Fusionner les tickets" -#: .\templates\helpdesk\ticket_list.html:251 -msgid "Invert" -msgstr "Inverser" +#: .\templates\helpdesk\ticket_merge.html:34 +msgid "OK" +msgstr "OK" -#: .\templates\helpdesk\ticket_list.html:254 -msgid "With Selected Tickets:" -msgstr "Avec les tickets sélectionnés :" +#: .\templates\helpdesk\ticket_merge.html:43 +msgid "" +"\n" +" Choose the ticket which will be conserved and then, " +"for each information, you can decide to use\n" +" a data from another ticket to merge. I you don't " +"select a data on a row, the information\n" +" from the main ticket will stay unchanged.\n" +" " +msgstr "" +"\n" +" Sélectionnez le ticket qui sera conservé puis, pour " +"chaque information, vous pouvez décider d'utiliser\n" +" la donnée d'un autre ticket à fusionner. Si vous ne " +"sélectionnez rien sur une ligne, l'information\n" +" du ticket principal restera inchangé.\n" +" " -#: .\templates\helpdesk\ticket_list.html:254 -msgid "Take (Assign to me)" -msgstr "Prendre (m'assigner ce ticket)" +#: .\templates\helpdesk\ticket_merge.html:50 +msgid "" +"\n" +" The follow-ups and attachments from " +"the merged tickets will be moved to\n" +" the main ticket.
\n" +" Involved users (the ticket submitter and " +"emails in CC) will also be added in the\n" +" main ticket CC list.
\n" +" However, ticket dependencies from the merged ticket " +"won't be applied to the main ticket.\n" +" " +msgstr "" +"\n" +" Les réponses et les pièce-jointes des " +"tickets fusionnées seront déplacés vers le\n" +" ticket conservé.
\n" +" Les personnes impliquées (l'émetteur du " +"ticket et autres personnes en copie) seront également ajoutés à\n" +" la liste des CC du ticket conservé.
\n" +" Cependant, les dépendances des tickets fusionnés ne " +"seront pas transférées.\n" +" " -#: .\templates\helpdesk\ticket_list.html:254 -msgid "Close" -msgstr "Fermé" +#: .\templates\helpdesk\ticket_merge.html:70 +msgid "Fields" +msgstr "Champs" -#: .\templates\helpdesk\ticket_list.html:254 -msgid "Close (Don't Send E-Mail)" -msgstr "Fermer (ne pas envoyer l'e-mail)" +#: .\templates\helpdesk\ticket_merge.html:78 +msgid "Open ticket" +msgstr "Ticket Ouvert" -#: .\templates\helpdesk\ticket_list.html:254 -msgid "Close (Send E-Mail)" -msgstr "Fermer (envoyer l'e-mail)" - -#: .\templates\helpdesk\ticket_list.html:254 -msgid "Assign To" -msgstr "Assigné à" - -#: .\templates\helpdesk\ticket_list.html:254 -msgid "Nobody (Unassign)" -msgstr "Nul (non assigné)" +#: .\templates\helpdesk\ticket_merge.html:98 +msgid "Validate" +msgstr "Valider" #: .\templates\helpdesk\user_settings.html:3 msgid "Change User Settings" msgstr "Modifier les paramètres de l'utilisateur" -#: .\templates\helpdesk\user_settings.html:8 +#: .\templates\helpdesk\user_settings.html:17 msgid "" "Use the following options to change the way your helpdesk system works for " "you. These settings do not impact any other user." @@ -2741,10 +3036,6 @@ msgstr "" "du centre d'assistance. Ces paramètres n'impactent pas les autres " "utilisateurs." -#: .\templates\helpdesk\user_settings.html:13 -msgid "Save Options" -msgstr "Enregistrer les options" - #: .\views\feeds.py:37 #, python-format msgid "Helpdesk: Open Tickets in queue %(queue)s for %(username)s" @@ -2796,45 +3087,79 @@ msgstr "Helpdesk: Tickets Ouverts dans la file %(queue)s" msgid "Open and Reopened Tickets in queue %(queue)s" msgstr "Tickets Ouverts et Ré-ouverts dans la file %(queue)s" -#: .\views\public.py:113 .\views\public.py:115 -msgid "Invalid ticket ID or e-mail address. Please try again." -msgstr "Ticket ID ou adresse e-mail invalide. Veuillez essayer de nouveau." - -#: .\views\public.py:131 -msgid "Submitter accepted resolution and closed ticket" -msgstr "L'émetteur a accepté la solution et fermé le ticket." - -#: .\views\public.py:152 +#: .\views\public.py:179 msgid "Missing ticket ID or e-mail address. Please try again." msgstr "Ticket ID ou adresse e-mail manquant. Veuillez essayer de nouveau." -#: .\views\staff.py:323 +#: .\views\public.py:188 +msgid "Invalid ticket ID or e-mail address. Please try again." +msgstr "Ticket ID ou adresse e-mail invalide. Veuillez essayer de nouveau." + +#: .\views\public.py:204 +msgid "Submitter accepted resolution and closed ticket" +msgstr "L'émetteur a accepté la solution et fermé le ticket." + +#: .\views\staff.py:357 msgid "Accepted resolution and closed ticket" msgstr "Solution acceptée et ticket fermé" -#: .\views\staff.py:488 +#: .\views\staff.py:445 +#, python-format +msgid "" +"When you add somebody on Cc, you must provide either a User or a valid " +"email. Email: %s" +msgstr "" +"Quand vous ajoutez quelqu'un en copie, vous devez soit renseigner un " +"utilisateur soit une adresse mail valide. Email: %s" + +#: .\views\staff.py:579 #, python-format msgid "Assigned to %(username)s" msgstr "Assigné à %(username)s " -#: .\views\staff.py:514 +#: .\views\staff.py:605 msgid "Updated" msgstr "Mis à jour" -#: .\views\staff.py:715 +#: .\views\staff.py:786 #, python-format msgid "Assigned to %(username)s in bulk update" msgstr "Assigné à %(username)s en mise à jour en masse" -#: .\views\staff.py:726 +#: .\views\staff.py:797 msgid "Unassigned in bulk update" msgstr "Non assigné en mise à jour en masse" -#: .\views\staff.py:735 .\views\staff.py:745 +#: .\views\staff.py:806 +msgid "KBItem set in bulk update" +msgstr "Objet de la base de connaissance défini pendant mise à jour en masse" + +#: .\views\staff.py:815 .\views\staff.py:825 msgid "Closed in bulk update" msgstr "Fermé pendant mise à jour en masse" -#: .\views\staff.py:965 +#: .\views\staff.py:865 +msgid "Created date" +msgstr "Date de création" + +#: .\views\staff.py:868 +msgid "Submitter email" +msgstr "Email de l’Émetteur" + +#: .\views\staff.py:889 +msgid "Not defined" +msgstr "Non définie" + +#: .\views\staff.py:921 +msgid "Please choose a ticket in which the others will be merged into." +msgstr "Veuillez choisir un ticket dans lequel les autres seront fusionnés" + +#: .\views\staff.py:989 +#, python-format +msgid "[Merged from #%(id)d] %(title)s" +msgstr "[Fusionné depuis #%(id)d] %(title)s" + +#: .\views\staff.py:1134 msgid "" "

Note: Your keyword search is case sensitive because of " "your database. This means the search will not be accurate. " @@ -2851,42 +3176,147 @@ msgstr "" "ref/databases/#sqlite-string-matching\">documentation de Django sur la " "recherche de chaîne avec SQLite ." -#: .\views\staff.py:1079 +#: .\views\staff.py:1285 msgid "Ticket taken off hold" msgstr "Ticket repris" -#: .\views\staff.py:1082 +#: .\views\staff.py:1288 msgid "Ticket placed on hold" msgstr "Ticket mis en pause" -#: .\views\staff.py:1213 +#: .\views\staff.py:1410 msgid "User by Priority" msgstr "Utilisateur par Priorité" -#: .\views\staff.py:1219 +#: .\views\staff.py:1416 msgid "User by Queue" msgstr "Utilisateur par File" -#: .\views\staff.py:1226 +#: .\views\staff.py:1423 msgid "User by Status" msgstr "Utilisateur par État" -#: .\views\staff.py:1232 +#: .\views\staff.py:1429 msgid "User by Month" msgstr "Utilisateurs par Mois" -#: .\views\staff.py:1238 +#: .\views\staff.py:1435 msgid "Queue by Priority" msgstr "File par Priorité" -#: .\views\staff.py:1244 +#: .\views\staff.py:1441 msgid "Queue by Status" msgstr "File par État" -#: .\views\staff.py:1250 +#: .\views\staff.py:1447 msgid "Queue by Month" msgstr "File par Mois" +#~ msgid "Helpdesk Summary" +#~ msgstr "Résumé Helpdesk" + +#~ msgid "Pr" +#~ msgstr "Pr" + +#~ msgid "Knowledgebase Category" +#~ msgstr "Catégorie de la base de connaissance" + +#, python-format +#~ msgid "You are viewing all items in the %(kbcat)s category." +#~ msgstr "Vous lisez tous les articles dans la catégorie %(kbcat)s." + +#, python-format +#~ msgid "" +#~ "View Answer " +#~ msgstr "" +#~ "Voir Réponse " + +#~ msgid "Rating" +#~ msgstr "Evaluations" + +#, python-format +#~ msgid "%(item)s" +#~ msgstr "%(item)s" + +#~ msgid "Did you find this article useful?" +#~ msgstr "Avez-vous trouvé cet article utile ?" + +#~ msgid "The results of voting by other readers of this article are below:" +#~ msgstr "" +#~ "Les résultats du vote par d'autres lecteurs du présent article sont ci-" +#~ "dessous:" + +#, python-format +#~ msgid "Recommendations: %(recommendations)s" +#~ msgstr "Recommendations : %(recommendations)s" + +#, python-format +#~ msgid "Votes: %(votes)s" +#~ msgstr "Votes : %(votes)s" + +#, python-format +#~ msgid "Overall Rating: %(score)s" +#~ msgstr "Note globale: %(score)s " + +#, python-format +#~ msgid "" +#~ "View other %(category_title)s " +#~ "articles, or continue viewing other knowledgebase " +#~ "articles." +#~ msgstr "" +#~ "Voir les autres%(category_title)s " +#~ "articles, ou continuer à lire les articles de la base " +#~ "de connaissances ." + +#~ msgid "Toggle navigation" +#~ msgstr "Basculer la navigation" + +#~ msgid "Stats" +#~ msgstr "Statistiques" + +#~ msgid "Knowledgebase Categories" +#~ msgstr "Catégories de la base de connaissance" + +#~ msgid "All fields are required." +#~ msgstr "Tous les champs sont obligatoires." + +#~ msgid "here" +#~ msgstr "ici" + +#~ msgid "Ticket Summary" +#~ msgstr "Résumé du ticket" + +#~ msgid "Ignore" +#~ msgstr "Ignorer" + +#~ msgid "Manage" +#~ msgstr "Gérer" + +#~ msgid "Subscribe" +#~ msgstr "Souscrire" + +#~ msgid "Remove Dependency" +#~ msgstr "Supprimer la dépendance" + +#~ msgid "Add Dependency" +#~ msgstr "Ajouter une dépendance" + +#~ msgid "Change Query" +#~ msgstr "Changer la requête" + +#~ msgid "" +#~ "Keywords are case-insensitive, and will be looked for in the title, body " +#~ "and submitter fields." +#~ msgstr "" +#~ "Les mots clés sont insensibles à la case et seront appliqués aux champs " +#~ "titre, corps de texte et auteur." + +#~ msgid "Shared" +#~ msgstr "Partagée" + +#~ msgid "Save Options" +#~ msgstr "Enregistrer les options" + #~ msgid "Description of Issue" #~ msgstr "Description du problème" @@ -2967,9 +3397,6 @@ msgstr "File par Mois" #~ msgid "Accept" #~ msgstr "Accepter" -#~ msgid "Open Tickets" -#~ msgstr "Tickets Ouverts" - #~ msgid "Attach another File" #~ msgstr "Attacher un autre fichier" diff --git a/helpdesk/migrations/0033_ticket_merged_to.py b/helpdesk/migrations/0033_ticket_merged_to.py new file mode 100644 index 00000000..98899213 --- /dev/null +++ b/helpdesk/migrations/0033_ticket_merged_to.py @@ -0,0 +1,19 @@ +# Generated by Django 2.2.13 on 2020-10-27 17:14 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('helpdesk', '0032_kbitem_enabled'), + ] + + operations = [ + migrations.AddField( + model_name='ticket', + name='merged_to', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='merged_tickets', to='helpdesk.Ticket', verbose_name='merged to'), + ), + ] diff --git a/helpdesk/migrations/0034_create_email_template_for_merged.py b/helpdesk/migrations/0034_create_email_template_for_merged.py new file mode 100644 index 00000000..24f6896e --- /dev/null +++ b/helpdesk/migrations/0034_create_email_template_for_merged.py @@ -0,0 +1,57 @@ +# Generated by Django 2.2.13 on 2020-10-29 22:34 + +from django.db import migrations + + +def forwards_func(apps, schema_editor): + EmailTemplate = apps.get_model("helpdesk", "EmailTemplate") + db_alias = schema_editor.connection.alias + EmailTemplate.objects.using(db_alias).create( + template_name='merged', + subject='(Merged)', + heading='Ticket merged', + plain_text="""Hello, + +This is a courtesy e-mail to let you know that ticket {{ ticket.ticket }} ("{{ ticket.title }}") by {{ ticket.submitter_email }} has been merged to ticket {{ ticket.merged_to.ticket }}. + +From now on, please answer on this ticket, or you can include the tag {{ ticket.merged_to.ticket }} in your e-mail subject.""", + html="""

Hello,

+ +

This is a courtesy e-mail to let you know that ticket {{ ticket.ticket }} ({{ ticket.title }}) by {{ ticket.submitter_email }} has been merged to ticket {{ ticket.merged_to.ticket }}.

+ +

From now on, please answer on this ticket, or you can include the tag {{ ticket.merged_to.ticket }} in your e-mail subject.

""", + locale='en' + ) + EmailTemplate.objects.using(db_alias).create( + template_name='merged', + subject='(Fusionné)', + heading='Ticket Fusionné', + plain_text="""Bonjour, + +Ce courriel indicatif permet de vous prévenir que le ticket {{ ticket.ticket }} ("{{ ticket.title }}") par {{ ticket.submitter_email }} a été fusionné au ticket {{ ticket.merged_to.ticket }}. + +Veillez à répondre sur ce ticket dorénavant, ou bien inclure la balise {{ ticket.merged_to.ticket }} dans le sujet de votre réponse par mail.""", + html="""

Bonjour,

+ +

Ce courriel indicatif permet de vous prévenir que le ticket {{ ticket.ticket }} ({{ ticket.title }}) par {{ ticket.submitter_email }} a été fusionné au ticket {{ ticket.merged_to.ticket }}.

+ +

Veillez à répondre sur ce ticket dorénavant, ou bien inclure la balise {{ ticket.merged_to.ticket }} dans le sujet de votre réponse par mail.

""", + locale='fr' + ) + + +def reverse_func(apps, schema_editor): + EmailTemplate = apps.get_model("helpdesk", "EmailTemplate") + db_alias = schema_editor.connection.alias + EmailTemplate.objects.using(db_alias).filter(template_name='merged').delete() + + +class Migration(migrations.Migration): + + dependencies = [ + ('helpdesk', '0033_ticket_merged_to'), + ] + + operations = [ + migrations.RunPython(forwards_func, reverse_func), + ] diff --git a/helpdesk/models.py b/helpdesk/models.py index d6355779..90945ddc 100644 --- a/helpdesk/models.py +++ b/helpdesk/models.py @@ -569,6 +569,15 @@ class Ticket(models.Model): verbose_name=_('Knowledge base item the user was viewing when they created this ticket.'), ) + merged_to = models.ForeignKey( + 'self', + verbose_name=_('merged to'), + related_name='merged_tickets', + on_delete=models.CASCADE, + null=True, + blank=True + ) + @property def time_spent(self): """Return back total time spent on the ticket. This is calculated value @@ -795,6 +804,46 @@ class Ticket(models.Model): def get_resolution_markdown(self): return get_markdown(self.resolution) + def add_email_to_ticketcc_if_not_in(self, email=None, user=None, ticketcc=None): + """ + Check that given email/user_email/ticketcc_email is not already present on the ticket + (submitter email, assigned to, or in ticket CCs) and add it to a new ticket CC, + or move the given one + + :param str email: + :param User user: + :param TicketCC ticketcc: + :rtype: TicketCC|None + """ + if ticketcc: + email = ticketcc.display + elif user: + if user.email: + email = user.email + else: + # Ignore if user has no email address + return + elif not email: + raise ValueError('You must provide at least one parameter to get the email from') + + # Prepare all emails already into the ticket + ticket_emails = [x.display for x in self.ticketcc_set.all()] + if self.submitter_email: + ticket_emails.append(self.submitter_email) + if self.assigned_to and self.assigned_to.email: + ticket_emails.append(self.assigned_to.email) + + # Check that email is not already part of the ticket + if email not in ticket_emails: + if ticketcc: + ticketcc.ticket = self + ticketcc.save(update_fields=['ticket']) + elif user: + ticketcc = self.ticketcc_set.create(user=user) + else: + ticketcc = self.ticketcc_set.create(email=email) + return ticketcc + class FollowUpManager(models.Manager): diff --git a/helpdesk/templated_email.py b/helpdesk/templated_email.py index 720e9445..08cb7628 100644 --- a/helpdesk/templated_email.py +++ b/helpdesk/templated_email.py @@ -3,6 +3,7 @@ import mimetypes import logging from smtplib import SMTPException +from django.conf import settings from django.utils.safestring import mark_safe logger = logging.getLogger('helpdesk') @@ -72,7 +73,7 @@ def send_templated_mail(template_name, footer_file = os.path.join('helpdesk', locale, 'email_text_footer.txt') text_part = from_string( - "%s{%% include '%s' %%}" % (t.plain_text, footer_file) + "%s\n\n{%% include '%s' %%}" % (t.plain_text, footer_file) ).render(context) email_html_base_file = os.path.join('helpdesk', locale, 'email_html_base.html') @@ -81,9 +82,9 @@ def send_templated_mail(template_name, context['comment'] = mark_safe(context['comment'].replace('\r\n', '
')) html_part = from_string( - "{%% extends '%s' %%}{%% block title %%}" - "%s" - "{%% endblock %%}{%% block content %%}%s{%% endblock %%}" % + "{%% extends '%s' %%}" + "{%% block title %%}%s{%% endblock %%}" + "{%% block content %%}%s{%% endblock %%}" % (email_html_base_file, t.heading, t.html) ).render(context) diff --git a/helpdesk/templates/helpdesk/include/ticket_merge_row.html b/helpdesk/templates/helpdesk/include/ticket_merge_row.html new file mode 100644 index 00000000..74f53a07 --- /dev/null +++ b/helpdesk/templates/helpdesk/include/ticket_merge_row.html @@ -0,0 +1,13 @@ +{% load helpdesk_util %} + + {{ display_attr }} + {% for ticket in tickets %} + + + + {% endfor %} + \ No newline at end of file diff --git a/helpdesk/templates/helpdesk/include/unassigned.html b/helpdesk/templates/helpdesk/include/unassigned.html index 2864e183..750f83f2 100644 --- a/helpdesk/templates/helpdesk/include/unassigned.html +++ b/helpdesk/templates/helpdesk/include/unassigned.html @@ -11,7 +11,7 @@ {% trans "Ticket" %} - {% trans "Prority" %} + {% trans "Priority" %} {% trans "Queue" %} {% trans "Created" %} {% trans "Actions" %} @@ -51,7 +51,7 @@ {% trans "Ticket" %} - {% trans "Prority" %} + {% trans "Priority" %} {% trans "Queue" %} {% trans "Created" %} {% trans "Actions" %} diff --git a/helpdesk/templates/helpdesk/ticket.html b/helpdesk/templates/helpdesk/ticket.html index 50cc3334..470f9dd9 100644 --- a/helpdesk/templates/helpdesk/ticket.html +++ b/helpdesk/templates/helpdesk/ticket.html @@ -21,196 +21,198 @@ {% endblock %} {% block helpdesk_body %} -{% if helpdesk_settings.HELPDESK_TRANSLATE_TICKET_COMMENTS %} -{% comment %} -
{% trans "Translate ticket comments into" %}
-
-{% endcomment %} -
- -{% endif %} + {% if helpdesk_settings.HELPDESK_TRANSLATE_TICKET_COMMENTS %} +
+ + {% endif %} -{% include "helpdesk/ticket_desc_table.html" %} + {% include "helpdesk/ticket_desc_table.html" %} -{% if ticket.followup_set.all %} -{% load ticket_to_link %} -
-
 {% trans "Follow-Ups" %}
-
-
- {% for followup in ticket.followup_set.all %} -
-
-
{{ followup.title }}
-   -
-

- {% if followup.comment %} -

{{ followup.get_markdown|urlizetrunc:50|num_to_link|linebreaksbr }}

- {% endif %} - {% for change in followup.ticketchange_set.all %} - {% if forloop.first %}
    {% endif %} -
  • {% blocktrans with change.field as field and change.old_value as old_value and change.new_value as new_value %}Changed {{ field }} from {{ old_value }} to {{ new_value }}.{% endblocktrans %}
  • - {% if forloop.last %}
{% endif %} - {% endfor %} - {% for attachment in followup.followupattachment_set.all %}{% if forloop.first %}{% trans "Attachments" %}:
    {% endif %} -
  • {{ attachment.filename }} ({{ attachment.mime_type }}, {{ attachment.size|filesizeformat }}) - {% if followup.user and request.user == followup.user %} - - {% endif %} -
  • - {% if forloop.last %}
{% endif %} - {% endfor %} -

- - {% with possible=helpdesk_settings.HELPDESK_SHOW_EDIT_BUTTON_FOLLOW_UP %} - {% if possible and followup.user and request.user == followup.user and not followup.ticketchange_set.all or possible and user.is_superuser and helpdesk_settings.HELPDESK_SHOW_DELETE_BUTTON_SUPERUSER_FOLLOW_UP %} - - {% if helpdesk_settings.HELPDESK_SHOW_EDIT_BUTTON_FOLLOW_UP %} - {% if followup.user and request.user == followup.user and not followup.ticketchange_set.all %} - - {% endif %} - {% endif %} - {% if user.is_superuser and helpdesk_settings.HELPDESK_SHOW_DELETE_BUTTON_SUPERUSER_FOLLOW_UP %} - - {% endif %} - - {% endif %}{% endwith %} -
- - {% endfor %} -
- + {% if ticket.merged_to %} +
+

+ {% trans "This ticket has been merged into ticket" %} + {{ ticket.merged_to }} +

- -
- - -{% endif %} -{% if helpdesk_settings.HELPDESK_TRANSLATE_TICKET_COMMENTS %} -
-{% endif %} - -
-
{% trans "Respond to this ticket" %}
-
- -
- -
-
- {% if preset_replies %} -
{% trans "(Optional)" %}
-
-
{% trans "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." %}
- {% endif %} - -
-
-
{% trans "You can insert ticket and queue details in your message. For more information, see the context help page." %}
- -
- {% if not ticket.can_be_resolved %}
{% trans "This ticket cannot be resolved or closed until the tickets it depends on are resolved." %}
{% endif %} - {% ifequal ticket.status 1 %} -
- - - - -
- {% endifequal %} - {% ifequal ticket.status 2 %} -
- - - - -
- {% endifequal %} - {% ifequal ticket.status 3 %} -
- - - -
- {% endifequal %} - {% ifequal ticket.status 4 %} -
-
- {% endifequal %} - {% ifequal ticket.status 5 %} -
- - -
- {% endifequal %} - - {% if helpdesk_settings.HELPDESK_UPDATE_PUBLIC_DEFAULT %} - - {% else %} -
- {% trans "(Optional)" %} -
-
  {% trans 'Yes, make this update public.' %}
-
{% trans "If this is public, the submitter will be e-mailed your comment or resolution." %}
- {% endif %} - - {% if user.is_staff %} -
- {% trans "(Optional)" %} -
-
- {% endif %} -
- -

- - - -

- - + {% endif %} -
+
+
{% trans "Respond to this ticket" %}
+
- + -{% csrf_token %} +
+
+ {% if preset_replies %} +
{% trans "(Optional)" %}
+
+
{% trans "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." %}
+ {% endif %} -
-
+
+
+
{% trans "You can insert ticket and queue details in your message. For more information, see the context help page." %}
+ +
+ {% if not ticket.can_be_resolved %}
{% trans "This ticket cannot be resolved or closed until the tickets it depends on are resolved." %}
{% endif %} + {% ifequal ticket.status 1 %} +
+ + + + +
+ {% endifequal %} + {% ifequal ticket.status 2 %} +
+ + + + +
+ {% endifequal %} + {% ifequal ticket.status 3 %} +
+ + + +
+ {% endifequal %} + {% ifequal ticket.status 4 %} +
+
+ {% endifequal %} + {% ifequal ticket.status 5 %} +
+ + +
+ {% endifequal %} + + {% if helpdesk_settings.HELPDESK_UPDATE_PUBLIC_DEFAULT %} + + {% else %} +
+ {% trans "(Optional)" %} +
+
  {% trans 'Yes, make this update public.' %}
+
{% trans "If this is public, the submitter will be e-mailed your comment or resolution." %}
+ {% endif %} + + {% if user.is_staff %} +
+ {% trans "(Optional)" %} +
+
+ {% endif %} + + +

+ + + +

+ + + + + + + + {% csrf_token %} + +
+
+ {% endif %} {% endblock %} diff --git a/helpdesk/templates/helpdesk/ticket_desc_table.html b/helpdesk/templates/helpdesk/ticket_desc_table.html index 038fc05e..47724048 100644 --- a/helpdesk/templates/helpdesk/ticket_desc_table.html +++ b/helpdesk/templates/helpdesk/ticket_desc_table.html @@ -21,7 +21,7 @@ {% for customfield in ticket.ticketcustomfieldvalue_set.all %} {{ customfield.field.label }} - {% ifequal customfield.field.data_type "url" %}{{ customfield.value }}{% else %}{{ customfield.value }}{% endifequal %} + {% ifequal customfield.field.data_type "url" %}{{ customfield.value }}{% else %}{{ customfield.value|default:"" }}{% endifequal %} {% endfor %} {% trans "Due Date" %} diff --git a/helpdesk/templates/helpdesk/ticket_list.html b/helpdesk/templates/helpdesk/ticket_list.html index f2c83e06..bd5b0333 100644 --- a/helpdesk/templates/helpdesk/ticket_list.html +++ b/helpdesk/templates/helpdesk/ticket_list.html @@ -59,7 +59,7 @@   {% trans "Ticket" %} - {% trans "Prority" %} + {% trans "Priority" %} {% trans "Queue" %} {% trans "Status" %} {% trans "Created" %} @@ -88,6 +88,7 @@ + {{ ticket }} + + {% trans "Open ticket" %} + + + + + {% endfor %} + + + + {% for attr, display_attr in ticket_attributes %} + {% include 'helpdesk/include/ticket_merge_row.html' %} + {% endfor %} + {% for custom_field in custom_fields %} + {% include 'helpdesk/include/ticket_merge_row.html' with display_attr=custom_field.label attr=custom_field.name %} + {% endfor %} + + +
+ +
+ +
+ + {% endif %} +{% endblock %} + +{% block helpdesk_js %} + {{ ticket_select_form.media.js }} +{% endblock %} \ No newline at end of file diff --git a/helpdesk/templatetags/helpdesk_util.py b/helpdesk/templatetags/helpdesk_util.py new file mode 100644 index 00000000..9522c17f --- /dev/null +++ b/helpdesk/templatetags/helpdesk_util.py @@ -0,0 +1,9 @@ +from django import template + +register = template.Library() + + +@register.filter +def get(value, arg, default=None): + """ Call the dictionary get function """ + return value.get(arg, default) diff --git a/helpdesk/tests/test_ticket_actions.py b/helpdesk/tests/test_ticket_actions.py index 407004a2..a729425b 100644 --- a/helpdesk/tests/test_ticket_actions.py +++ b/helpdesk/tests/test_ticket_actions.py @@ -4,6 +4,8 @@ from django.core import mail from django.urls import reverse from django.test import TestCase from django.test.client import Client +from django.utils import timezone + from helpdesk.models import CustomField, Queue, Ticket from helpdesk import settings as helpdesk_settings @@ -206,3 +208,100 @@ class TicketActionsTestCase(TestCase): self.assertEqual(response.status_code, 200) # TODO this needs to be checked further + + def test_merge_tickets(self): + self.loginUser() + + # Create two tickets + ticket_1 = Ticket.objects.create( + queue=self.queue_public, + title='Ticket 1', + description='Description from ticket 1', + submitter_email='user1@mail.com', + status=Ticket.RESOLVED_STATUS, + resolution='Awesome resolution for ticket 1' + ) + ticket_1_follow_up = ticket_1.followup_set.create(title='Ticket 1 creation') + ticket_1_cc = ticket_1.ticketcc_set.create(user=self.user) + ticket_1_created = ticket_1.created + due_date = timezone.now() + ticket_2 = Ticket.objects.create( + queue=self.queue_public, + title='Ticket 2', + description='Description from ticket 2', + submitter_email='user2@mail.com', + due_date=due_date, + assigned_to=self.user + ) + ticket_2_follow_up = ticket_1.followup_set.create(title='Ticket 2 creation') + ticket_2_cc = ticket_2.ticketcc_set.create(email='random@mail.com') + + # Create custom fields and set values for tickets + custom_field_1 = CustomField.objects.create( + name='test', + label='Test', + data_type='varchar', + ) + ticket_1_field_1 = 'This is for the test field' + ticket_1.ticketcustomfieldvalue_set.create(field=custom_field_1, value=ticket_1_field_1) + ticket_2_field_1 = 'Another test text' + ticket_2.ticketcustomfieldvalue_set.create(field=custom_field_1, value=ticket_2_field_1) + custom_field_2 = CustomField.objects.create( + name='number', + label='Number', + data_type='integer', + ) + ticket_2_field_2 = '444' + ticket_2.ticketcustomfieldvalue_set.create(field=custom_field_2, value=ticket_2_field_2) + + # Check that it correctly redirects to the intermediate page + response = self.client.post( + reverse('helpdesk:mass_update'), + data={ + 'ticket_id': [str(ticket_1.id), str(ticket_2.id)], + 'action': 'merge' + }, + follow=True + ) + redirect_url = '%s?tickets=%s&tickets=%s' % (reverse('helpdesk:merge_tickets'), ticket_1.id, ticket_2.id) + self.assertRedirects(response, redirect_url) + self.assertContains(response, ticket_1.description) + self.assertContains(response, ticket_1.resolution) + self.assertContains(response, ticket_1.submitter_email) + self.assertContains(response, ticket_1_field_1) + self.assertContains(response, ticket_2.description) + self.assertContains(response, ticket_2.submitter_email) + self.assertContains(response, ticket_2_field_1) + self.assertContains(response, ticket_2_field_2) + + # Check that the merge is correctly done + response = self.client.post( + redirect_url, + data={ + 'chosen_ticket': str(ticket_1.id), + 'due_date': str(ticket_2.id), + 'status': str(ticket_1.id), + 'submitter_email': str(ticket_2.id), + 'description': str(ticket_2.id), + 'assigned_to': str(ticket_2.id), + custom_field_1.name: str(ticket_1.id), + custom_field_2.name: str(ticket_2.id), + }, + follow=True + ) + self.assertRedirects(response, ticket_1.get_absolute_url()) + ticket_2.refresh_from_db() + self.assertEqual(ticket_2.merged_to, ticket_1) + self.assertEqual(ticket_2.followup_set.count(), 0) + self.assertEqual(ticket_2.ticketcc_set.count(), 0) + ticket_1.refresh_from_db() + self.assertEqual(ticket_1.created, ticket_1_created) + self.assertEqual(ticket_1.due_date, due_date) + self.assertEqual(ticket_1.status, Ticket.RESOLVED_STATUS) + self.assertEqual(ticket_1.submitter_email, ticket_2.submitter_email) + self.assertEqual(ticket_1.description, ticket_2.description) + self.assertEqual(ticket_1.assigned_to, ticket_2.assigned_to) + self.assertEqual(ticket_1.ticketcustomfieldvalue_set.get(field=custom_field_1).value, ticket_1_field_1) + self.assertEqual(ticket_1.ticketcustomfieldvalue_set.get(field=custom_field_2).value, ticket_2_field_2) + self.assertEqual(list(ticket_1.followup_set.all()), [ticket_1_follow_up, ticket_2_follow_up]) + self.assertEqual(list(ticket_1.ticketcc_set.all()), [ticket_1_cc, ticket_2_cc]) diff --git a/helpdesk/tests/test_ticket_lookup.py b/helpdesk/tests/test_ticket_lookup.py index 54faf1d1..94709425 100644 --- a/helpdesk/tests/test_ticket_lookup.py +++ b/helpdesk/tests/test_ticket_lookup.py @@ -1,10 +1,14 @@ # -*- coding: utf-8 -*- +from django.contrib.auth import get_user_model from django.urls import reverse from django.test import TestCase from helpdesk.models import Ticket, Queue from django.test.utils import override_settings +User = get_user_model() + + @override_settings( HELPDESK_VIEW_A_TICKET_PUBLIC=True ) @@ -50,3 +54,42 @@ class TestTicketLookupPublicEnabled(TestCase): # confirm that we can still get to a url which was emailed earlier response = self.client.get(url, params) self.assertNotContains(response, "Invalid ticket ID") + + def test_add_email_to_ticketcc_if_not_in(self): + staff_email = 'staff@mail.com' + staff_user = User.objects.create(username='staff', email=staff_email, is_staff=True) + self.ticket.assigned_to = staff_user + self.ticket.save() + email_1 = 'user1@mail.com' + ticketcc_1 = self.ticket.ticketcc_set.create(email=email_1) + + # Add new email to CC + email_2 = 'user2@mail.com' + ticketcc_2 = self.ticket.add_email_to_ticketcc_if_not_in(email=email_2) + self.assertEqual(list(self.ticket.ticketcc_set.all()), [ticketcc_1, ticketcc_2]) + + # Add existing email, doesn't change anything + self.ticket.add_email_to_ticketcc_if_not_in(email=email_1) + self.assertEqual(list(self.ticket.ticketcc_set.all()), [ticketcc_1, ticketcc_2]) + + # Add mail from assigned user, doesn't change anything + self.ticket.add_email_to_ticketcc_if_not_in(email=staff_email) + self.assertEqual(list(self.ticket.ticketcc_set.all()), [ticketcc_1, ticketcc_2]) + self.ticket.add_email_to_ticketcc_if_not_in(user=staff_user) + self.assertEqual(list(self.ticket.ticketcc_set.all()), [ticketcc_1, ticketcc_2]) + + # Move a ticketCC from ticket 1 to ticket 2 + ticket_2 = Ticket.objects.create(queue=self.ticket.queue, title='Ticket 2', submitter_email=email_2) + self.assertEqual(ticket_2.ticketcc_set.count(), 0) + ticket_2.add_email_to_ticketcc_if_not_in(ticketcc=ticketcc_1) + self.assertEqual(ticketcc_1.ticket, ticket_2) + self.assertEqual(ticket_2.ticketcc_set.count(), 1) + + # Adding email_2 doesn't change since it is already submitter email + ticket_2.add_email_to_ticketcc_if_not_in(email=email_2) + self.assertEqual(ticket_2.ticketcc_set.get(), ticketcc_1) + ticket_2.add_email_to_ticketcc_if_not_in(ticketcc=ticketcc_2) + self.assertEqual(ticket_2.ticketcc_set.get(), ticketcc_1) + + # Finally test function raises a Value error when no parameter is given + self.assertRaises(ValueError, ticket_2.add_email_to_ticketcc_if_not_in) diff --git a/helpdesk/urls.py b/helpdesk/urls.py index 3ad3216b..da22b09a 100644 --- a/helpdesk/urls.py +++ b/helpdesk/urls.py @@ -52,6 +52,10 @@ urlpatterns = [ staff.mass_update, name='mass_update'), + url(r'^tickets/merge$', + staff.merge_tickets, + name='merge_tickets'), + url(r'^tickets/(?P[0-9]+)/$', staff.view_ticket, name='view'), diff --git a/helpdesk/views/staff.py b/helpdesk/views/staff.py index d24c109e..95b5b031 100644 --- a/helpdesk/views/staff.py +++ b/helpdesk/views/staff.py @@ -18,7 +18,7 @@ from django.core.exceptions import ValidationError, PermissionDenied from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from django.db.models import Q from django.http import HttpResponseRedirect, Http404, HttpResponse, JsonResponse -from django.shortcuts import render, get_object_or_404 +from django.shortcuts import render, get_object_or_404, redirect from django.utils.translation import ugettext as _ from django.utils.html import escape from django.utils import timezone @@ -38,7 +38,7 @@ from helpdesk.decorators import ( ) from helpdesk.forms import ( TicketForm, UserSettingsForm, EmailIgnoreForm, EditTicketForm, TicketCCForm, - TicketCCEmailForm, TicketCCUserForm, EditFollowUpForm, TicketDependencyForm + TicketCCEmailForm, TicketCCUserForm, EditFollowUpForm, TicketDependencyForm, MultipleTicketSelectForm ) from helpdesk.decorators import superuser_required from helpdesk.lib import ( @@ -48,7 +48,7 @@ from helpdesk.lib import ( ) from helpdesk.models import ( Ticket, Queue, FollowUp, TicketChange, PreSetReply, FollowUpAttachment, SavedSearch, - IgnoreEmail, TicketCC, TicketDependency, UserSettings, KBItem, + IgnoreEmail, TicketCC, TicketDependency, UserSettings, KBItem, CustomField, TicketCustomFieldValue, ) from helpdesk import settings as helpdesk_settings import helpdesk.views.abstract_views as abstract_views @@ -61,6 +61,7 @@ from rest_framework.decorators import api_view from datetime import date, datetime, timedelta import re +from ..templated_email import send_templated_mail User = get_user_model() Query = get_query_class() @@ -766,6 +767,11 @@ def mass_update(request): elif action == 'take': user = request.user action = 'assign' + elif action == 'merge': + # Redirect to the Merge View with selected tickets id in the GET request + return redirect( + reverse('helpdesk:merge_tickets') + '?' + '&'.join(['tickets=%s' % ticket_id for ticket_id in tickets]) + ) huser = HelpdeskUser(request.user) for t in Ticket.objects.filter(id__in=tickets): @@ -854,6 +860,151 @@ def mass_update(request): mass_update = staff_member_required(mass_update) +# Prepare ticket attributes which will be displayed in the table to choose which value to keep when merging +ticket_attributes = ( + ('created', _('Created date')), + ('due_date', _('Due on')), + ('get_status_display', _('Status')), + ('submitter_email', _('Submitter email')), + ('assigned_to', _('Owner')), + ('description', _('Description')), + ('resolution', _('Resolution')), +) + + +@staff_member_required +def merge_tickets(request): + """ + An intermediate view to merge up to 3 tickets in one main ticket. + The user has to first select which ticket will receive the other tickets information and can also choose which + data to keep per attributes as well as custom fields. + Follow-ups and ticketCC will be moved to the main ticket and other tickets won't be able to receive new answers. + """ + ticket_select_form = MultipleTicketSelectForm(request.GET or None) + tickets = custom_fields = None + if ticket_select_form.is_valid(): + tickets = ticket_select_form.cleaned_data.get('tickets') + + custom_fields = CustomField.objects.all() + default = _('Not defined') + for ticket in tickets: + ticket.values = {} + # Prepare the value for each attributes of this ticket + for attribute, display_name in ticket_attributes: + value = getattr(ticket, attribute, default) + # Check if attr is a get_FIELD_display + if attribute.startswith('get_') and attribute.endswith('_display'): + # Hack to call methods like get_FIELD_display() + value = getattr(ticket, attribute, default)() + ticket.values[attribute] = { + 'value': value, + 'checked': str(ticket.id) == request.POST.get(attribute) + } + # Prepare the value for each custom fields of this ticket + for custom_field in custom_fields: + try: + value = ticket.ticketcustomfieldvalue_set.get(field=custom_field).value + except (TicketCustomFieldValue.DoesNotExist, ValueError): + value = default + ticket.values[custom_field.name] = { + 'value': value, + 'checked': str(ticket.id) == request.POST.get(custom_field.name) + } + + if request.method == 'POST': + # Find which ticket has been chosen to be the main one + try: + chosen_ticket = tickets.get(id=request.POST.get('chosen_ticket')) + except Ticket.DoesNotExist: + ticket_select_form.add_error( + field='tickets', + error=_('Please choose a ticket in which the others will be merged into.') + ) + else: + # Save ticket fields values + for attribute, display_name in ticket_attributes: + id_for_attribute = request.POST.get(attribute) + if id_for_attribute != chosen_ticket.id: + try: + selected_ticket = tickets.get(id=id_for_attribute) + except (Ticket.DoesNotExist, ValueError): + continue + + # Check if attr is a get_FIELD_display + if attribute.startswith('get_') and attribute.endswith('_display'): + # Keep only the FIELD part + attribute = attribute[4:-8] + # Get value from selected ticket and then save it on the chosen ticket + value = getattr(selected_ticket, attribute) + setattr(chosen_ticket, attribute, value) + # Save custom fields values + for custom_field in custom_fields: + id_for_custom_field = request.POST.get(custom_field.name) + if id_for_custom_field != chosen_ticket.id: + try: + selected_ticket = tickets.get(id=id_for_custom_field) + except (Ticket.DoesNotExist, ValueError): + continue + + # Check if the value for this ticket custom field exists + try: + value = selected_ticket.ticketcustomfieldvalue_set.get(field=custom_field).value + except TicketCustomFieldValue.DoesNotExist: + continue + + # Create the custom field value or update it with the value from the selected ticket + custom_field_value, created = chosen_ticket.ticketcustomfieldvalue_set.get_or_create( + field=custom_field, + defaults={'value': value} + ) + if not created: + custom_field_value.value = value + custom_field_value.save(update_fields=['value']) + # Save changes + chosen_ticket.save() + + # For other tickets, save the link to the ticket in which they have been merged to + # and set status to DUPLICATE + for ticket in tickets.exclude(id=chosen_ticket.id): + ticket.merged_to = chosen_ticket + ticket.status = Ticket.DUPLICATE_STATUS + ticket.save() + + # Send mail to submitter email and ticket CC to let them know ticket has been merged + context = safe_template_context(ticket) + if ticket.submitter_email: + send_templated_mail( + template_name='merged', + context=context, + recipients=[ticket.submitter_email], + bcc=[cc.email_address for cc in ticket.ticketcc_set.select_related('user')], + sender=ticket.queue.from_address, + fail_silently=True + ) + + # Move all followups and update their title to know they come from another ticket + ticket.followup_set.update( + ticket=chosen_ticket, + # Next might exceed maximum 200 characters limit + title=_('[Merged from #%(id)d] %(title)s') % {'id': ticket.id, 'title': ticket.title} + ) + + # Add submitter_email, assigned_to email and ticketcc to chosen ticket if necessary + chosen_ticket.add_email_to_ticketcc_if_not_in(email=ticket.submitter_email) + if ticket.assigned_to and ticket.assigned_to.email: + chosen_ticket.add_email_to_ticketcc_if_not_in(email=ticket.assigned_to.email) + for ticketcc in ticket.ticketcc_set.all(): + chosen_ticket.add_email_to_ticketcc_if_not_in(ticketcc=ticketcc) + return redirect(chosen_ticket) + + return render(request, 'helpdesk/ticket_merge.html', { + 'tickets': tickets, + 'ticket_attributes': ticket_attributes, + 'custom_fields': custom_fields, + 'ticket_select_form': ticket_select_form + }) + + @helpdesk_staff_member_required def ticket_list(request): context = {}