Merge remote-tracking branch 'upstream/master'

Conflicts:
	helpdesk/views/staff.py
This commit is contained in:
Andreas Kotowicz 2012-03-12 15:00:53 +01:00
commit ffcd404b33
20 changed files with 827 additions and 1455 deletions

View File

@ -766,5 +766,197 @@
"subject": "(Mis \u00e0 jour)",
"template_name": "updated_submitter"
}
},
{
"pk": 65,
"model": "helpdesk.emailtemplate",
"fields": {
"locale": "it",
"template_name": "assigned_cc",
"plain_text": "Salve,\r\n\r\nTi \u00e8 stata inviata questa email per informarti che il ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") per {{ ticket.submitter_email }} {% if ticket.assigned_to %}\u00e8 stato assegnato a {{ ticket.assigned_to }}{% else %}non \u00e8 pi\u00f9 assegnato{% endif %}.\r\n\r\nID Ticket: {{ ticket.ticket }}\r\nCoda: {{ queue.title }}\r\nTitolo: {{ ticket.title }}\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}\r\nPriorit\u00e0: {{ ticket.get_priority_display }}\r\nStato: {{ ticket.get_status }}\r\nAssegnato a: {{ ticket.get_assigned_to }}\r\nVedi Online: {{ ticket.staff_url }} (richiesto login)\r\n\r\nLa descrizione del ticket era:\r\n\r\n{{ ticket.description }}",
"html": "<p style=\"font-family: sans-serif; font-size: 1em;\">Salve,</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">Ti \u00e8 stata inviata questa email per informarti che il ticket <a href=\"{{ ticket.staff_url }}\"><b>{{ ticket.ticket }}</b></a> (<em>{{ ticket.title }}</em>) per {{ ticket.submitter_email }} {% if ticket.assigned_to %}\u00e8 stato assegnato a {{ ticket.assigned_to }}{% else %}non \u00e8 pi\u00f9 assegnato{% endif %}.</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">\r\n<b>Ticket ID</b>: {{ ticket.ticket }}<br>\r\n<b>Coda</b>: {{ queue.title }}<br>\r\n<b>Titolo</b>: {{ ticket.title }}<br>\r\n<b>Aperto</b>: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}<br>\r\n<b>Inserito da</b>: {{ ticket.submitter_email|default:\"Sconosciuto\" }}<br>\r\n<b>Priorit\u00e0</b>: {{ ticket.get_priority_display }}<br>\r\n<b>Stato</b>: {{ ticket.get_status }}<br>\r\n<b>Assegnato a</b>: {{ ticket.get_assigned_to }}<br>\r\n<b><a href='{{ ticket.staff_url }}'>Vedi Online</a></b> per aggiornare questo ticket (richiesto login)</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">Per riferimento, la descrizione del ticket era:</p>\r\n\r\n<blockquote style=\"font-family: sans-serif; font-size: 1em;\">{{ ticket.description }}</blockquote>",
"heading": "Ticket Assegnato",
"subject": "(Assegnato)"
}
},
{
"pk": 66,
"model": "helpdesk.emailtemplate",
"fields": {
"locale": "it",
"template_name": "assigned_owner",
"plain_text": "Salve,\r\n\r\nTi \u00e8 stata inviata questa email per informarti che ti \u00e8 stato assegnato il ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") per {{ ticket.submitter_email }}.\r\n\r\nID Ticket: {{ ticket.ticket }}\r\nCoda: {{ queue.title }}\r\nTitolo: {{ ticket.title }}\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}\r\nPriorit\u00e0: {{ ticket.get_priority_display }}\r\nStato: {{ ticket.get_status }}\r\nAssegnato a: {{ ticket.get_assigned_to }}\r\nVedi Online: {{ ticket.staff_url }} (richiesto login)\r\n\r\nLa descrizione del ticket \u00e8:\r\n\r\n{{ ticket.description }}",
"html": "<p style=\"font-family: sans-serif; font-size: 1em;\">Salve,</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">Ti \u00e8 stata inviata questa email per informarti che ti \u00e8 stato assegnato il ticket <a href=\"{{ ticket.staff_url }}\"><b>{{ ticket.ticket }}</b></a> (<em>{{ ticket.title }}</em>) per {{ ticket.submitter_email }}.</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">\r\n<b>Ticket ID</b>: {{ ticket.ticket }}<br>\r\n<b>Coda</b>: {{ queue.title }}<br>\r\n<b>Titolo</b>: {{ ticket.title }}<br>\r\n<b>Aperto</b>: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}<br>\r\n<b>Inserito da</b>: {{ ticket.submitter_email|default:\"Sconosciuto\" }}<br>\r\n<b>Priorit\u00e0</b>: {{ ticket.get_priority_display }}<br>\r\n<b>Stato</b>: {{ ticket.get_status }}<br>\r\n<b>Assegnato a</b>: {{ ticket.get_assigned_to }}<br>\r\n<b><a href='{{ ticket.staff_url }}'>Vedi Online</a></b> per aggiornare questo ticket (richiesto login)</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">La descrizione del ticket \u00e8:</p>\r\n\r\n<blockquote style=\"font-family: sans-serif; font-size: 1em;\">{{ ticket.description }}</blockquote>",
"heading": "Ticket Assegnato A Te",
"subject": "(Assegnato a Te)"
}
},
{
"pk": 67,
"model": "helpdesk.emailtemplate",
"fields": {
"locale": "it",
"template_name": "closed_cc",
"plain_text": "Salve,\r\n\r\nIl ticket {{ ticket.title }} (\"{{ ticket.title }}\"){% if ticket.assigned_to %}, assegnato a {{ ticket.assigned_to }}{% endif %} \u00e8 stato chiuso.\r\n\r\nID Ticket: {{ ticket.ticket }}\r\nCoda: {{ queue.title }}\r\nTitolo: {{ ticket.title }}\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}\r\nPriorit\u00e0: {{ ticket.get_priority_display }}\r\nStato: {{ ticket.get_status }}\r\nAssegnato a: {{ ticket.get_assigned_to }}\r\nVedi Online: {{ ticket.staff_url }} (richiesto login)\r\n\r\nLa descrizione del ticket \u00e8:\r\n\r\n{{ ticket.description }}\r\n\r\nLa risoluzione fornita \u00e8:\r\n\r\n{{ resolution }}",
"html": "<p style=\"font-family: sans-serif; font-size: 1em;\">Salve,</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">Il ticket <i>{{ ticket.title }}</i> ('{{ ticket.title }}'){% if ticket.assigned_to %}, assegnato a {{ ticket.get_assigned_to }}{% endif %} \u00e8 stato chiuso.</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">\r\n<b>Ticket ID</b>: {{ ticket.ticket }}<br>\r\n<b>Coda</b>: {{ queue.title }}<br>\r\n<b>Titolo</b>: {{ ticket.title }}<br>\r\n<b>Aperto</b>: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}<br>\r\n<b>Inserito da</b>: {{ ticket.submitter_email|default:\"Sconosciuto\" }}<br>\r\n<b>Priorit\u00e0</b>: {{ ticket.get_priority_display }}<br>\r\n<b>Stato</b>: {{ ticket.get_status }}<br>\r\n<b>Assegnato a</b>: {{ ticket.get_assigned_to }}<br>\r\n<b><a href='{{ ticket.staff_url }}'>Vedi Online</a></b> per aggiornare questo ticket (richiesto login)</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">La descrizione del ticket \u00e8:</p>\r\n\r\n<blockquote style=\"font-family: sans-serif; font-size: 1em;\">{{ ticket.description }}</blockquote>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">La risoluzione fornita \u00e8:</p>\r\n\r\n<blockquote style=\"font-family: sans-serif; font-size: 1em;\">{{ resolution }}</blockquote>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">Se vuoi vedere questo ticket online, puoi visitare l'indirizzo <a href='{{ ticket.staff_url }}'>{{ ticket.staff_url }}</a>.</p>",
"heading": "Ticket Chiuso",
"subject": "(Closed)"
}
},
{
"pk": 68,
"model": "helpdesk.emailtemplate",
"fields": {
"locale": "it",
"template_name": "closed_owner",
"plain_text": "Salve,\r\n\r\nIl ticket seguente, correntemente a te assegnato, \u00e8 stato chiuso.\r\n\r\nID Ticket: {{ ticket.ticket }}\r\nCoda: {{ queue.title }}\r\nTitolo: {{ ticket.title }}\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}\r\nPriorit\u00e0: {{ ticket.get_priority_display }}\r\nStato: {{ ticket.get_status }}\r\nAssegnato a: {{ ticket.get_assigned_to }}\r\nVedi Online: {{ ticket.staff_url }} (richiesto login)\r\n\r\nSe vuoi vedere il ticket online, puoi visitare l'indirizzo {{ ticket.staff_url }}.",
"html": "<p style=\"font-family: sans-serif; font-size: 1em;\">Salve,</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">Il ticket seguente, correntemente a te assegnato, \u00e8 stato chiuso.</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">\r\n<b>Ticket ID</b>: {{ ticket.ticket }}<br>\r\n<b>Coda</b>: {{ queue.title }}<br>\r\n<b>Titolo</b>: {{ ticket.title }}<br>\r\n<b>Aperto</b>: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}<br>\r\n<b>Inserito da</b>: {{ ticket.submitter_email|default:\"Sconosciuto\" }}<br>\r\n<b>Priorit\u00e0</b>: {{ ticket.get_priority_display }}<br>\r\n<b>Stato</b>: {{ ticket.get_status }}<br>\r\n<b>Assegnato a</b>: {{ ticket.get_assigned_to }}<br>\r\n<b><a href='{{ ticket.staff_url }}'>Vedi Online</a></b> per aggiornare questo ticket (richiesto login)</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">La descrizione del ticket \u00e8:</p>\r\n\r\n<blockquote style=\"font-family: sans-serif; font-size: 1em;\">{{ ticket.description }}</blockquote>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">La risoluzione fornita \u00e8:</p>\r\n\r\n<blockquote style=\"font-family: sans-serif; font-size: 1em;\">{{ ticket.resolution }}</blockquote>",
"heading": "Ticket Chiuso",
"subject": "(Chiuso)"
}
},
{
"pk": 69,
"model": "helpdesk.emailtemplate",
"fields": {
"locale": "it",
"template_name": "closed_submitter",
"plain_text": "Salve,\r\n\r\nHai recentemente inserito un ticket dall'oggetto \"{{ ticket.title }}\". Questa email ti \u00e8 inviata come conferma della chiusura del ticket.\r\n\r\nSe credi che ci sia bisogno di ulteriore lavoro per questo ticket, per cortesia faccelo sapere rispondendo a questa email mantenendone invariato l'oggetto.\r\n\r\nSe vuoi vedere il ticket online, puoi visitare l'indirizzo {{ ticket.ticket_url }}.\r\n\r\nLa risoluzione fornita \u00e8:\r\n\r\n{{ ticket.resolution }}",
"html": "<p style=\"font-family: sans-serif; font-size: 1em;\">Salve,</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">Hai recentemente inserito un ticket dall'oggetto <i>{{ ticket.title }}</i>. Questa email ti \u00e8 inviata come conferma della chiusura del ticket..</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">La risoluzione fornita \u00e8:</p>\r\n\r\n<blockquote style=\"font-family: sans-serif; font-size: 1em;\">{{ ticket.resolution }}</blockquote>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">Se vuoi vedere il ticket online, puoi visitare l'indirizzo <a href=\"{{ ticket.ticket_url }}\">{{ ticket.ticket_url }}</a>. Se credi che ci sia bisogno di ulteriore lavoro per questo ticket, per cortesia faccelo sapere rispondendo a questa email mantenendone invariato l'oggetto.\r\n</p>",
"heading": "Ticket Chiuso",
"subject": "(Closed)"
}
},
{
"pk": 70,
"model": "helpdesk.emailtemplate",
"fields": {
"locale": "it",
"template_name": "escalated_cc",
"plain_text": "Salve,\r\n\r\nTi \u00e8 stata inviata questa email per informarti che la priorit\u00e0 del ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") \u00e8 stata aumentata automaticamente.\r\n\r\nID Ticket: {{ ticket.ticket }}\r\nCoda: {{ queue.title }}\r\nTitolo: {{ ticket.title }}\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}\r\nPriorit\u00e0: {{ ticket.get_priority_display }}\r\nStato: {{ ticket.get_status }}\r\nAssegnato a: {{ ticket.get_assigned_to }}\r\nVedi Online: {{ ticket.staff_url }} (richiesto login)\r\n\r\nLa descrizione originale del ticket era:\r\n\r\n{{ ticket.description }}",
"html": "<p style=\"font-family: sans-serif; font-size: 1em;\">Salve,</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">Ti \u00e8 stata inviata questa email per informarti che la priorit\u00e0 del ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") \u00e8 stata aumentata automaticamente.</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">\r\n<b>Ticket ID</b>: {{ ticket.ticket }}<br>\r\n<b>Coda</b>: {{ queue.title }}<br>\r\n<b>Titolo</b>: {{ ticket.title }}<br>\r\n<b>Aperto</b>: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}<br>\r\n<b>Inserito da</b>: {{ ticket.submitter_email|default:\"Sconosciuto\" }}<br>\r\n<b>Priorit\u00e0</b>: {{ ticket.get_priority_display }}<br>\r\n<b>Stato</b>: {{ ticket.get_status }}<br>\r\n<b>Assegnato a</b>: {{ ticket.get_assigned_to }}<br>\r\n<b><a href='{{ ticket.staff_url }}'>Vedi Online</a></b> per aggiornare questo ticket (richiesto login)</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">Per riferimento, la descrizione originale del ticket era:</p>\r\n\r\n<blockquote style=\"font-family: sans-serif; font-size: 1em;\">{{ ticket.description }}</blockquote>",
"heading": "Priorit\u00e0 Aumentata",
"subject": "(Priorit\u00e0)"
}
},
{
"pk": 71,
"model": "helpdesk.emailtemplate",
"fields": {
"locale": "it",
"template_name": "escalated_owner",
"plain_text": "Salve,\r\n\r\nLa priorit\u00e0 di un ticket a te assegnato \u00e8 stata automaticamente aumentata in quanto questo \u00e8 stato aperto pi\u00f9 del previsto.\r\n\r\nID Ticket: {{ ticket.ticket }}\r\nCoda: {{ queue.title }}\r\nTitolo: {{ ticket.title }}\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}\r\nPriorit\u00e0: {{ ticket.get_priority_display }}\r\nStato: {{ ticket.get_status }}\r\nAssegnato a: {{ ticket.get_assigned_to }}\r\nVedi Online: {{ ticket.staff_url }} (richiesto login)\r\n\r\nLa descrizione originale del ticket era:\r\n\r\n{{ ticket.description }}\r\n\r\nEsamina questo ticket e cerca di fornire una soluzione al pi\u00f9 presto.",
"html": "<p style=\"font-family: sans-serif; font-size: 1em;\">Salve,</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">La priorit\u00e0 di un ticket a te assegnato \u00e8 stata automaticamente aumentata in quanto questo \u00e8 stato aperto pi\u00f9 del previsto.</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">\r\n<b>Ticket ID</b>: {{ ticket.ticket }}<br>\r\n<b>Coda</b>: {{ queue.title }}<br>\r\n<b>Titolo</b>: {{ ticket.title }}<br>\r\n<b>Aperto</b>: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}<br>\r\n<b>Inserito da</b>: {{ ticket.submitter_email|default:\"Sconosciuto\" }}<br>\r\n<b>Priorit\u00e0</b>: {{ ticket.get_priority_display }}<br>\r\n<b>Stato</b>: {{ ticket.get_status }}<br>\r\n<b>Assegnato a</b>: {{ ticket.get_assigned_to }}<br>\r\n<b><a href='{{ ticket.staff_url }}'>Vedi Online</a></b> per aggiornare questo ticket (richiesto login)</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">Per riferimento, la descrizione originale del ticket era:</p>\r\n\r\n<blockquote style=\"font-family: sans-serif; font-size: 1em;\">{{ ticket.description }}</blockquote>",
"heading": "La Priorit\u00e0 Di Un Ticket A Te Assegnato \u00e8 Stata Aumentata",
"subject": "(Priorit\u00e0)"
}
},
{
"pk": 72,
"model": "helpdesk.emailtemplate",
"fields": {
"locale": "it",
"template_name": "escalated_submitter",
"plain_text": "Salve,\r\n\r\nHai recentemente inserito un ticket dall'oggetto \"{{ ticket.title }}\". Questa email ti \u00e8 inviata per informarti che la priorit\u00e0 del ticket \u00e8 stata automaticamente alzata in quanto questo \u00e8 stato aperto pi\u00f9 a lungo del previsto.\r\n\r\nEsamineremo a breve il ticket e cercheremo di fornire una risoluzione quanto prima.\r\n\r\nSe vuoi visitare il ticket online, puoi visitare l'indirizzo {{ ticket.ticket_url }}.",
"html": "<p style=\"font-family: sans-serif; font-size: 11pt;\">Salve,</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 11pt;\">Hai recentemente inserito un ticket dall'oggetto <i>{{ ticket.title }}</i>. Questa email ti \u00e8 inviata per informarti che la priorit\u00e0 del ticket \u00e8 stata automaticamente alzata in quanto questo \u00e8 stato aperto pi\u00f9 a lungo del previsto.</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 11pt;\">Esamineremo a breve il ticket e cercheremo di fornire una risoluzione quanto prima.</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 11pt;\">Se vuoi visitare il ticket online, puoi visitare l'indirizzo <a href=\"{{ ticket.ticket_url }}\">{{ ticket.ticket_url }}</a>.</p>",
"heading": "La Priorit\u00e0 Del Tuo Ticket \u00e8 Stata Aumentata",
"subject": "(Priorit\u00e0)"
}
},
{
"pk": 73,
"model": "helpdesk.emailtemplate",
"fields": {
"locale": "it",
"template_name": "newticket_cc",
"plain_text": "Salve,\r\n\r\nQuesta email ti \u00e8 stata inviata per informarti che un nuovo ticket \u00e8 stato aperto.\r\n\r\nID Ticket: {{ ticket.ticket }}\r\nCoda: {{ queue.title }}\r\nTitolo: {{ ticket.title }}\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}\r\nPriorit\u00e0: {{ ticket.get_priority_display }}\r\nStato: {{ ticket.get_status }}\r\nVedi Online: {{ ticket.staff_url }} (richiesto login)\r\n\r\nDescrizione:\r\n{{ ticket.description }}",
"html": "<p style=\"font-family: sans-serif; font-size: 1em;\">Salve,</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">Questa email ti \u00e8 stata inviata per informarti che un nuovo ticket \u00e8 stato aperto.</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">\r\n<b>Ticket ID</b>: {{ ticket.ticket }}<br>\r\n<b>Coda</b>: {{ queue.title }}<br>\r\n<b>Titolo</b>: {{ ticket.title }}<br>\r\n<b>Aperto</b>: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}<br>\r\n<b>Inserito da</b>: {{ ticket.submitter_email|default:\"Sconosciuto\" }}<br>\r\n<b>Priorit\u00e0</b>: {{ ticket.get_priority_display }}<br>\r\n<b>Stato</b>: {{ ticket.get_status }}<br>\r\n<b><a href='{{ ticket.staff_url }}'>Vedi Online</a></b> per aggiornare questo ticket (richiesto login)</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">Descrizione:</p>\r\n\r\n<blockquote style=\"font-family: sans-serif; font-size: 1em;\">{{ ticket.description }}</blockquote>",
"heading": "Nuovo Ticket Aperto",
"subject": "(Aperto)"
}
},
{
"pk": 74,
"model": "helpdesk.emailtemplate",
"fields": {
"locale": "it",
"template_name": "newticket_submitter",
"plain_text": "Salve,\r\n\r\nQuesta email ti \u00e8 stata inviata per informarti che abbiamo ricevuto la tua richiesta di helpdesk dall'oggetto \"{{ ticket.title }}\". \r\n\r\nNon \u00e8 necessario fare altro al momento. Al tuo ticket \u00e8 stato assegnato l'identificativo {{ ticket.ticket }} e verr\u00e0 presto esaminato.\r\n\r\nSe vuoi aggiungere ulteriori dettagli o hai domande sul ticket, rispondi a questa email includendo l'id \"{{ ticket.ticket }}\" del ticket nell'oggetto. Il modo pi\u00f9 semplice per farlo \u00e8 di premere il pulsante \"rispondi\" del tuo client di posta.\r\n\r\nSe vuoi vedere questo ticket online per aggiungere ulteriori informazioni, allegare file o vedere gli aggiornamenti, puoi visitare l'indirizzo {{ ticket.ticket_url }}.\r\n\r\nAnalizzeremo la tua richiesta e cercheremo di risolverla quanto prima. Riceverai successivi aggiornamenti e la notifica di risoluzione a questo indirizzo email.",
"html": "<p style=\"font-family: sans-serif; font-size: 1em;\">Salve,</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">Questa email ti \u00e8 stata inviata per informarti che abbiamo ricevuto la tua richiesta di helpdesk dall'oggetto <i>{{ ticket.title }}</i>.</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">Non \u00e8 necessario fare altro al momento. Al tuo ticket \u00e8 stato assegnato l'identificativo <b>{{ ticket.ticket }}</b> e verr\u00e0 presto esaminato.</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">Se vuoi aggiungere ulteriori dettagli o hai domande sul ticket, rispondi a questa email includendo l'id <b>{{ ticket.ticket}}</b> del ticket nell'oggetto. Il modo pi\u00f9 semplice per farlo \u00e8 di premere il pulsante \"rispondi\" del tuo client di posta.</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">Se vuoi vedere questo ticket online per aggiungere ulteriori informazioni, allegare file o vedere gli aggiornamenti, puoi visitare l'indirizzo <a href=\"{{ ticket.ticket_url }}\">{{ ticket.ticket_url }}</a>.</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">Analizzeremo la tua richiesta e cercheremo di risolverla quanto prima. Riceverai successivi aggiornamenti e la notifica di risoluzione a questo indirizzo email.</p>",
"heading": "Il Tuo Ticket \u00e8 Stato Aperto",
"subject": "(Aperto)"
}
},
{
"pk": 75,
"model": "helpdesk.emailtemplate",
"fields": {
"locale": "it",
"template_name": "resolved_cc",
"plain_text": "Salve,\r\n\r\nIl seguente ticket \u00e8 stato risolto:\r\n\r\nID Ticket: {{ ticket.ticket }}\r\nCoda: {{ queue.title }}\r\nTitolo: {{ ticket.title }}\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}\r\nPriorit\u00e0: {{ ticket.get_priority_display }}\r\nStato: {{ ticket.get_status }}\r\nAssegnato a: {{ ticket.get_assigned_to }}\r\nVedi Online: {{ ticket.staff_url }} (richiesto login)\r\n\r\nLa descrizione del ticket \u00e8:\r\n\r\n{{ ticket.description }}\r\n\r\nLa risoluzione fornita \u00e8:\r\n\r\n{{ ticket.resolution }}\r\n\r\nLa risoluzione \u00e8 stata inviata al proprietario del ticket, che dovr\u00e0 verificarla prima che il ticket possa essere chiuso.",
"html": "<p style=\"font-family: sans-serif; font-size: 1em;\">Salve,</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">Il seguente ticket \u00e8 stato risolto:</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">\r\n<b>Ticket ID</b>: {{ ticket.ticket }}<br>\r\n<b>Coda</b>: {{ queue.title }}<br>\r\n<b>Titolo</b>: {{ ticket.title }}<br>\r\n<b>Aperto</b>: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}<br>\r\n<b>Inserito da</b>: {{ ticket.submitter_email|default:\"Sconosciuto\" }}<br>\r\n<b>Priorit\u00e0</b>: {{ ticket.get_priority_display }}<br>\r\n<b>Stato</b>: {{ ticket.get_status }}<br>\r\n<b>Assegnato a</b>: {{ ticket.get_assigned_to }}<br>\r\n<b><a href='{{ ticket.staff_url }}'>Vedi Online</a></b> per aggiornare questo ticket (richiesto login)</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">Per riferimento, la descrizione originale del ticket era:</p>\r\n\r\n<blockquote style=\"font-family: sans-serif; font-size: 1em;\">{{ ticket.description }}</blockquote>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">La risoluzione aggiunta era:</p>\r\n\r\n<blockquote style=\"font-family: sans-serif; font-size: 1em;\">{{ ticket.resolution }}</blockquote>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">La risoluzione \u00e8 stata inviata al proprietario del ticket, che dovr\u00e0 verificarla prima che il ticket possa essere chiuso.</p>",
"heading": "Ticket Risolto",
"subject": "(Risolto)"
}
},
{
"pk": 76,
"model": "helpdesk.emailtemplate",
"fields": {
"locale": "it",
"template_name": "resolved_owner",
"plain_text": "Salve,\r\n\r\nun ticket a te assegnato \u00e8 stato risolto.\r\n\r\nID Ticket: {{ ticket.ticket }}\r\nCoda: {{ queue.title }}\r\nTitolo: {{ ticket.title }}\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}\r\nPriorit\u00e0: {{ ticket.get_priority_display }}\r\nStato: {{ ticket.get_status }}\r\nAssegnato a: {{ ticket.get_assigned_to }}\r\nVedi Online: {{ ticket.staff_url }} (richiesto login)\r\n\r\nLa descrizione del ticket \u00e8:\r\n\r\n{{ ticket.description }}\r\n\r\nLa risoluzione fornita \u00e8:\r\n\r\n{{ ticket.resolution }}\r\n\r\nLa risoluzione \u00e8 stata inviata al proprietario del ticket, che dovr\u00e0 verificarla prima che il ticket possa essere chiuso.",
"html": "<p style=\"font-family: sans-serif; font-size: 1em;\">Salve,</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">Un ticket a te assegnato \u00e8 stato risolto.</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">\r\n<b>Ticket ID</b>: {{ ticket.ticket }}<br>\r\n<b>Coda</b>: {{ queue.title }}<br>\r\n<b>Titolo</b>: {{ ticket.title }}<br>\r\n<b>Aperto</b>: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}<br>\r\n<b>Inserito da</b>: {{ ticket.submitter_email|default:\"Sconosciuto\" }}<br>\r\n<b>Priorit\u00e0</b>: {{ ticket.get_priority_display }}<br>\r\n<b>Stato</b>: {{ ticket.get_status }}<br>\r\n<b>Assegnato a</b>: {{ ticket.get_assigned_to }}<br>\r\n<b><a href='{{ ticket.staff_url }}'>Vedi Online</a></b> per aggiornare questo ticket (richiesto login)</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">La descrizione del ticket \u00e8:</p>\r\n\r\n<blockquote style=\"font-family: sans-serif; font-size: 1em;\">{{ ticket.description }}</blockquote>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">La risoluzione fornita \u00e8:</p>\r\n\r\n<blockquote style=\"font-family: sans-serif; font-size: 1em;\">{{ ticket.resolution }}</blockquote>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">La risoluzione \u00e8 stata inviata al proprietario del ticket, che dovr\u00e0 verificarla prima che il ticket possa essere chiuso.</p>",
"heading": "Ticket Risolto",
"subject": "(Risolto)"
}
},
{
"pk": 77,
"model": "helpdesk.emailtemplate",
"fields": {
"locale": "it",
"template_name": "resolved_submitter",
"plain_text": "Salve,\r\n\r\nHai recentemente inserito un ticket dall'oggetto \"{{ ticket.title }}\". Questa email vi \u00e8 stata inviata per informarvi della risoluzione del ticket.\r\n\r\nLa seguente risoluzione \u00e8 stata inserita al ticket {{ ticket.ticket }}:\r\n\r\n{{ resolution }}\r\n\r\nPu\u00f2 per cortesia confermare che questa risoluzione risolve i vostri problemi in modo tale da poter chiudere il ticket? Se ha ulteriori domande, o non crede che la risoluzione adottata \u00e8 adeguata, risponda a questa email mantenendo invariato l'oggetto.\r\n\r\nSe vuole vedere il ticket online, pu\u00f2 visitare l'indirizzo {{ ticket.ticket_url }}",
"html": "<p style=\"font-family: sans-serif; font-size: 1em;\">Hello,</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">Hai recentemente inserito un ticket dall'oggetto <i>{{ ticket.title }}</i>. Questa email vi \u00e8 stata inviata per informarvi della risoluzione del ticket.</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">La seguente risoluzione \u00e8 stata inserita al ticket <b>{{ ticket.ticket }}</b>:</p>\r\n\r\n<blockquote style=\"font-family: sans-serif; font-size: 1em;\">{{ resolution }}</blockquote>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">Pu\u00f2 per cortesia confermare che questa risoluzione risolve i vostri problemi in modo tale da poter chiudere il ticket? Se ha ulteriori domande, o non crede che la risoluzione adottata \u00e8 adeguata, risponda a questa email mantenendo invariato l'oggetto.</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">Se vuole vedere il ticket online, pu\u00f2 visitare l'indirizzo <a href=\"{{ ticket.ticket_url }}\">{{ ticket.ticket_url }}</a>.</p>",
"heading": "Il Tuo Ticket \u00e8 Stato Risolto",
"subject": "(Risolto)"
}
},
{
"pk": 78,
"model": "helpdesk.emailtemplate",
"fields": {
"locale": "it",
"template_name": "updated_cc",
"plain_text": "Salve,\r\n\r\nQuesta email ti \u00e8 stata inviata per informarti che il ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") per {{ ticket.submitter_email }} \u00e8 stato aggiornato.\r\n\r\nID Ticket: {{ ticket.ticket }}\r\nCoda: {{ queue.title }}\r\nTitolo: {{ ticket.title }}\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}\r\nPriorit\u00e0: {{ ticket.get_priority_display }}\r\nStato: {{ ticket.get_status }}\r\nAssegnato a: {{ ticket.get_assigned_to }}\r\nVedi Online: {{ ticket.staff_url }} (richiesto login)\r\n\r\nDescrizione originale:\r\n\r\n{{ ticket.description }}\r\n\r\nIl seguente commento \u00e8 stato aggiunto:\r\n\r\n{{ comment }}\r\n\r\nQuesta informazione{% if private %} non{% endif %} \u00e8 stata inviata al proprietario del ticket.\r\n\r\nSe vuoi vedere il ticket online, puoi visitare l'indirizzo {{ ticket.staff_url }}.",
"html": "<p style=\"font-family: sans-serif; font-size: 1em;\">Salve,</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">Questa email ti \u00e8 stata inviata per informarti che il ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") per {{ ticket.submitter_email }} \u00e8 stato aggiornato.</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">\r\n<b>Ticket ID</b>: {{ ticket.ticket }}<br>\r\n<b>Coda</b>: {{ queue.title }}<br>\r\n<b>Titolo</b>: {{ ticket.title }}<br>\r\n<b>Aperto</b>: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}<br>\r\n<b>Inserito da</b>: {{ ticket.submitter_email|default:\"Sconosciuto\" }}<br>\r\n<b>Priorit\u00e0</b>: {{ ticket.get_priority_display }}<br>\r\n<b>Stato</b>: {{ ticket.get_status }}<br>\r\n<b>Assegnato a</b>: {{ ticket.get_assigned_to }}<br>\r\n<b><a href='{{ ticket.staff_url }}'>Vedi Online</a></b> per aggiornare questo ticket (richiesto login)</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">Per riferimento, la descrizione originale era:</p>\r\n\r\n<blockquote style=\"font-family: sans-serif; font-size: 1em;\">{{ ticket.description }}</blockquote>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">Il seguente commento \u00e8 stato aggiunto:</p>\r\n\r\n<blockquote style=\"font-family: sans-serif; font-size: 1em;\">{{ comment }}</blockquote>\r\n\r\n<p style=\"font-family: Tahoma, Arial, sans-serif; font-size: 11pt;\">Questa informazione{% if private %} non{% endif %} \u00e8 stata inviata al proprietario del ticket.</p>",
"heading": "Ticket Aggiornato",
"subject": "(Aggiornato)"
}
},
{
"pk": 79,
"model": "helpdesk.emailtemplate",
"fields": {
"locale": "it",
"template_name": "updated_owner",
"plain_text": "Salve,\r\n\r\nTi \u00e8 stata inviata questa email per informavi che il ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") per {{ ticket.submitter_email }}, a te assegnato, \u00e8 stato aggiornato.\r\n\r\nID Ticket: {{ ticket.ticket }}\r\nCoda: {{ queue.title }}\r\nTitolo: {{ ticket.title }}\r\nAperto: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}\r\nInserito da: {{ ticket.submitter_email|default:\"Sconosciuto\" }}\r\nPriorit\u00e0: {{ ticket.get_priority_display }}\r\nStato: {{ ticket.get_status }}\r\nAssegnato a: {{ ticket.get_assigned_to }}\r\nVedi Online: {{ ticket.staff_url }} (richiesto login)\r\n\r\nDescrizione originale:\r\n\r\n{{ ticket.description }}\r\n\r\nIl seguente commento \u00e8 stato aggiunto:\r\n\r\n{{ comment }}\r\n\r\nQuesta informazione{% if private %} non{% endif %} \u00e8 stata inviata al proprietario del ticket.\r\n\r\nSe vuoi vedere il ticket online, puoi visitare l'indirizzo {{ ticket.staff_url }}.",
"html": "<p style=\"font-family: sans-serif; font-size: 1em;\">Salve,</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">Ti \u00e8 stata inviata questa email per informavi che il ticket {{ ticket.ticket }} (\"{{ ticket.title }}\") per {{ ticket.submitter_email }}, a te assegnato, \u00e8 stato aggiornato.</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">\r\n<b>Ticket ID</b>: {{ ticket.ticket }}<br>\r\n<b>Coda</b>: {{ queue.title }}<br>\r\n<b>Titolo</b>: {{ ticket.title }}<br>\r\n<b>Aperto</b>: {{ ticket.created|date:\"l N jS Y, \\a\\t P\" }}<br>\r\n<b>Inserito da</b>: {{ ticket.submitter_email|default:\"Sconosciuto\" }}<br>\r\n<b>Priorit\u00e0</b>: {{ ticket.get_priority_display }}<br>\r\n<b>Stato</b>: {{ ticket.get_status }}<br>\r\n<b>Assegnato a</b>: {{ ticket.get_assigned_to }}<br>\r\n<b><a href='{{ ticket.staff_url }}'>Vedi Online</a></b> per aggiornare questo ticket (richiesto login)</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">Per riferimento, la descrizione originale del ticket era:</p>\r\n\r\n<blockquote style=\"font-family: sans-serif; font-size: 1em;\">{{ ticket.description }}</blockquote>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">Il seguente commento \u00e8 stato aggiunto:</p>\r\n\r\n<blockquote style=\"font-family: sans-serif; font-size: 1em;\">{{ comment }}</blockquote>\r\n\r\n<p style=\"font-family: Tahoma, Arial, sans-serif; font-size: 11pt;\">Questa informazione{% if private %} non{% endif %} \u00e8 stata inviata al proprietario del ticket.</p>",
"heading": "Ticket Aggiornato",
"subject": "(Updated)"
}
},
{
"pk": 80,
"model": "helpdesk.emailtemplate",
"fields": {
"locale": "it",
"template_name": "updated_submitter",
"plain_text": "Salve,\r\n\r\nHai recentemente inserito un ticket dall'oggetto \"{{ ticket.title }}\". Questa email ti \u00e8 stata inviata per informarti di un aggiornamento riguardo il ticket suddetto.\r\n\r\nIl seguente commento \u00e8 stato aggiunto al ticket {{ ticket.ticket }}:\r\n\r\n{{ comment }}\r\n\r\nSe c'\u00e8 bisogno di fornire informazioni aggiuntive, risponda a questa email mantenendone l'oggetto invariato. In alternativa, \u00e8 possibile vedere ed aggiornare il ticket online visitando l'indirizzo {{ ticket.ticket_url }}\r\n",
"html": "<p style=\"font-family: sans-serif; font-size: 1em;\">Salve,</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">Hai recentemente inserito un ticket dall'oggetto <i>{{ ticket.title }}</i>. Questa email ti \u00e8 stata inviata per informarti di un aggiornamento riguardo il ticket suddetto.</p>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">Il seguente commento \u00e8 stato aggiunto al ticket <b>{{ ticket.ticket }}</b>:</p>\r\n\r\n<blockquote style=\"font-family: sans-serif; font-size: 1em;\">{{ comment }}</blockquote>\r\n\r\n<p style=\"font-family: sans-serif; font-size: 1em;\">Se c'\u00e8 bisogno di fornire informazioni aggiuntive, risponda a questa email mantenendone l'oggetto invariato. In alternativa, \u00e8 possibile vedere ed aggiornare il ticket online visitando l'indirizzo <a href=\"{{ ticket.ticket_url }}\">{{ ticket.ticket_url }}</a>.</p>",
"heading": "Il Tuo Ticket \u00e8 Stato Aggiornato",
"subject": "(Aggiornato)"
}
}
]

View File

@ -19,6 +19,7 @@ from django.utils.translation import ugettext as _
from helpdesk.lib import send_templated_mail, safe_template_context
from helpdesk.models import Ticket, Queue, FollowUp, Attachment, IgnoreEmail, TicketCC, CustomField, TicketCustomFieldValue, TicketDependency
from helpdesk.settings import HAS_TAG_SUPPORT
from helpdesk import settings as helpdesk_settings
class EditTicketForm(forms.ModelForm):
class Meta:
@ -58,8 +59,8 @@ class EditTicketForm(forms.ModelForm):
instanceargs['max_digits'] = field.max_length
elif field.data_type == 'list':
fieldclass = forms.ChoiceField
if field.empty_selection_list:
choices = field.choices_as_array
if field.empty_selection_list:
choices.insert(0, ('','---------' ) )
instanceargs['choices'] = choices
elif field.data_type == 'boolean':
@ -152,6 +153,19 @@ class TicketForm(forms.Form):
'as \'3\'.'),
)
due_date = forms.DateTimeField(
widget=extras.SelectDateWidget,
required=False,
label=_('Due on'),
)
def clean_due_date(self):
data = self.cleaned_data['due_date']
#TODO: add Google calendar update hook
#if not hasattr(self, 'instance') or self.instance.due_date != new_data:
# print "you changed!"
return data
attachment = forms.FileField(
required=False,
label=_('Attach File'),
@ -195,8 +209,8 @@ class TicketForm(forms.Form):
instanceargs['max_digits'] = field.max_length
elif field.data_type == 'list':
fieldclass = forms.ChoiceField
if field.empty_selection_list:
choices = field.choices_as_array
if field.empty_selection_list:
choices.insert(0, ('','---------' ) )
instanceargs['choices'] = choices
elif field.data_type == 'boolean':
@ -234,6 +248,7 @@ class TicketForm(forms.Form):
queue = q,
description = self.cleaned_data['body'],
priority = self.cleaned_data['priority'],
due_date = self.cleaned_data['due_date'],
)
if HAS_TAG_SUPPORT:
@ -376,6 +391,12 @@ class PublicTicketForm(forms.Form):
help_text=_('Please select a priority carefully.'),
)
due_date = forms.DateTimeField(
widget=extras.SelectDateWidget,
required=False,
label=_('Due on'),
)
attachment = forms.FileField(
required=False,
label=_('Attach File'),
@ -408,8 +429,8 @@ class PublicTicketForm(forms.Form):
instanceargs['max_digits'] = field.max_length
elif field.data_type == 'list':
fieldclass = forms.ChoiceField
if field.empty_selection_list:
choices = field.choices_as_array
if field.empty_selection_list:
choices.insert(0, ('','---------' ) )
instanceargs['choices'] = choices
elif field.data_type == 'boolean':
@ -446,6 +467,7 @@ class PublicTicketForm(forms.Form):
queue = q,
description = self.cleaned_data['body'],
priority = self.cleaned_data['priority'],
due_date = self.cleaned_data['due_date'],
)
t.save()
@ -572,7 +594,11 @@ class EmailIgnoreForm(forms.ModelForm):
class TicketCCForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(TicketCCForm, self).__init__(*args, **kwargs)
self.fields['user'].queryset = User.objects.filter(is_active=True).order_by('username')
if helpdesk_settings.HELPDESK_STAFF_ONLY_TICKET_CC:
users = User.objects.filter(is_active=True, is_staff=True).order_by('username')
else:
users = User.objects.filter(is_active=True).order_by('username')
self.fields['user'].queryset = users
class Meta:
model = TicketCC
exclude = ('ticket',)

View File

@ -173,10 +173,12 @@ def apply_query(queryset, params):
# eg a Q() set
queryset = queryset.filter(params['other_filter'])
if params.get('sorting', None):
if params.get('sortreverse', None):
params['sorting'] = "-%s" % params['sorting']
queryset = queryset.order_by(params['sorting'])
sorting = params.get('sorting', None)
if not sorting:
sortreverse = params.get('sortreverse', None)
if sortreverse:
sorting = "-%s" % sorting
queryset = queryset.order_by(sorting)
return queryset

File diff suppressed because it is too large Load Diff

View File

@ -25,6 +25,7 @@ from django.core.files.base import ContentFile
from django.core.management.base import BaseCommand
from django.db.models import Q
from django.utils.translation import ugettext as _
from django.conf import settings
from helpdesk.lib import send_templated_mail, safe_template_context
from helpdesk.models import Queue, Ticket, FollowUp, Attachment, IgnoreEmail
@ -75,18 +76,22 @@ def process_email(quiet=False):
def process_queue(q, quiet=False):
if not quiet:
print "Processing: %s" % q
if q.email_box_type == 'pop3':
if q.email_box_ssl:
email_box_type = settings.QUEUE_EMAIL_BOX_TYPE if settings.QUEUE_EMAIL_BOX_TYPE else q.email_box_type
if email_box_type == 'pop3':
if q.email_box_ssl or settings.QUEUE_EMAIL_BOX_SSL:
if not q.email_box_port: q.email_box_port = 995
server = poplib.POP3_SSL(q.email_box_host, int(q.email_box_port))
server = poplib.POP3_SSL(q.email_box_host or settings.QUEUE_EMAIL_BOX_HOST, int(q.email_box_port))
else:
if not q.email_box_port: q.email_box_port = 110
server = poplib.POP3(q.email_box_host, int(q.email_box_port))
server = poplib.POP3(q.email_box_host or settings.QUEUE_EMAIL_BOX_HOST, int(q.email_box_port))
server.getwelcome()
server.user(q.email_box_user)
server.pass_(q.email_box_pass)
server.user(q.email_box_user or settings.QUEUE_EMAIL_BOX_USER)
server.pass_(q.email_box_pass or settings.QUEUE_EMAIL_BOX_PASSWORD)
messagesInfo = server.list()[1]
@ -102,15 +107,15 @@ def process_queue(q, quiet=False):
server.quit()
elif q.email_box_type == 'imap':
if q.email_box_ssl:
elif email_box_type == 'imap':
if q.email_box_ssl or settings.QUEUE_EMAIL_BOX_SSL:
if not q.email_box_port: q.email_box_port = 993
server = imaplib.IMAP4_SSL(q.email_box_host, int(q.email_box_port))
server = imaplib.IMAP4_SSL(q.email_box_host or settings.QUEUE_EMAIL_BOX_HOST, int(q.email_box_port))
else:
if not q.email_box_port: q.email_box_port = 143
server = imaplib.IMAP4(q.email_box_host, int(q.email_box_port))
server = imaplib.IMAP4(q.email_box_host or settings.QUEUE_EMAIL_BOX_HOST, int(q.email_box_port))
server.login(q.email_box_user, q.email_box_pass)
server.login(q.email_box_user or settings.QUEUE_EMAIL_BOX_USER, q.email_box_pass or settings.QUEUE_EMAIL_BOX_PASSWORD)
server.select(q.email_box_imap_folder)
status, data = server.search(None, 'NOT', 'DELETED')
@ -246,61 +251,6 @@ def ticket_from_message(message, queue, quiet):
t.status = Ticket.REOPENED_STATUS
t.save()
context = safe_template_context(t)
if new:
if sender_email:
send_templated_mail(
'newticket_submitter',
context,
recipients=sender_email,
sender=queue.from_address,
fail_silently=True,
)
if queue.new_ticket_cc:
send_templated_mail(
'newticket_cc',
context,
recipients=queue.new_ticket_cc,
sender=queue.from_address,
fail_silently=True,
)
if queue.updated_ticket_cc and queue.updated_ticket_cc != queue.new_ticket_cc:
send_templated_mail(
'newticket_cc',
context,
recipients=queue.updated_ticket_cc,
sender=queue.from_address,
fail_silently=True,
)
else:
if t.status == Ticket.REOPENED_STATUS:
update = _(' (Reopened)')
else:
update = _(' (Updated)')
if t.assigned_to:
send_templated_mail(
'updated_owner',
context,
recipients=t.assigned_to.email,
sender=queue.from_address,
fail_silently=True,
)
if queue.updated_ticket_cc:
send_templated_mail(
'updated_cc',
context,
recipients=queue.updated_ticket_cc,
sender=queue.from_address,
fail_silently=True,
)
f = FollowUp(
ticket = t,
title = _('E-Mail Received from %(sender_email)s' % {'sender_email': sender_email}),
@ -333,6 +283,64 @@ def ticket_from_message(message, queue, quiet):
if not quiet:
print " - %s" % filename
context = safe_template_context(t)
if new:
if sender_email:
send_templated_mail(
'newticket_submitter',
context,
recipients=sender_email,
sender=queue.from_address,
fail_silently=True,
)
if queue.new_ticket_cc:
send_templated_mail(
'newticket_cc',
context,
recipients=queue.new_ticket_cc,
sender=queue.from_address,
fail_silently=True,
)
if queue.updated_ticket_cc and queue.updated_ticket_cc != queue.new_ticket_cc:
send_templated_mail(
'newticket_cc',
context,
recipients=queue.updated_ticket_cc,
sender=queue.from_address,
fail_silently=True,
)
else:
context.update(comment=f.comment)
if t.status == Ticket.REOPENED_STATUS:
update = _(' (Reopened)')
else:
update = _(' (Updated)')
if t.assigned_to:
send_templated_mail(
'updated_owner',
context,
recipients=t.assigned_to.email,
sender=queue.from_address,
fail_silently=True,
)
if queue.updated_ticket_cc:
send_templated_mail(
'updated_cc',
context,
recipients=queue.updated_ticket_cc,
sender=queue.from_address,
fail_silently=True,
)
return t

View File

@ -0,0 +1,228 @@
# encoding: utf-8
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Adding field 'Ticket.due_date'
db.add_column('helpdesk_ticket', 'due_date', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True), keep_default=False)
def backwards(self, orm):
# Deleting field 'Ticket.due_date'
db.delete_column('helpdesk_ticket', 'due_date')
models = {
'auth.group': {
'Meta': {'object_name': 'Group'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
},
'auth.permission': {
'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
},
'auth.user': {
'Meta': {'object_name': 'User'},
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
},
'contenttypes.contenttype': {
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
'helpdesk.attachment': {
'Meta': {'ordering': "['filename']", 'object_name': 'Attachment'},
'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
'filename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'followup': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['helpdesk.FollowUp']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '30'}),
'size': ('django.db.models.fields.IntegerField', [], {})
},
'helpdesk.customfield': {
'Meta': {'object_name': 'CustomField'},
'data_type': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'decimal_places': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'empty_selection_list': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'help_text': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'label': ('django.db.models.fields.CharField', [], {'max_length': "'30'"}),
'list_values': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'max_length': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'name': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50', 'db_index': 'True'}),
'ordering': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'required': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'staff_only': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
},
'helpdesk.emailtemplate': {
'Meta': {'ordering': "['template_name', 'locale']", 'object_name': 'EmailTemplate'},
'heading': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'html': ('django.db.models.fields.TextField', [], {}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'locale': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}),
'plain_text': ('django.db.models.fields.TextField', [], {}),
'subject': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'template_name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
'helpdesk.escalationexclusion': {
'Meta': {'object_name': 'EscalationExclusion'},
'date': ('django.db.models.fields.DateField', [], {}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'queues': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['helpdesk.Queue']", 'null': 'True', 'blank': 'True'})
},
'helpdesk.followup': {
'Meta': {'ordering': "['date']", 'object_name': 'FollowUp'},
'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2012, 1, 20, 12, 19, 46, 778593)'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'new_status': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'public': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'ticket': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['helpdesk.Ticket']"}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'})
},
'helpdesk.ignoreemail': {
'Meta': {'object_name': 'IgnoreEmail'},
'date': ('django.db.models.fields.DateField', [], {'blank': 'True'}),
'email_address': ('django.db.models.fields.CharField', [], {'max_length': '150'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'keep_in_mailbox': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'queues': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['helpdesk.Queue']", 'null': 'True', 'blank': 'True'})
},
'helpdesk.kbcategory': {
'Meta': {'ordering': "['title']", 'object_name': 'KBCategory'},
'description': ('django.db.models.fields.TextField', [], {}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
'helpdesk.kbitem': {
'Meta': {'ordering': "['title']", 'object_name': 'KBItem'},
'answer': ('django.db.models.fields.TextField', [], {}),
'category': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['helpdesk.KBCategory']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'last_updated': ('django.db.models.fields.DateTimeField', [], {'blank': 'True'}),
'question': ('django.db.models.fields.TextField', [], {}),
'recommendations': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'votes': ('django.db.models.fields.IntegerField', [], {'default': '0'})
},
'helpdesk.presetreply': {
'Meta': {'ordering': "['name']", 'object_name': 'PreSetReply'},
'body': ('django.db.models.fields.TextField', [], {}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'queues': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['helpdesk.Queue']", 'null': 'True', 'blank': 'True'})
},
'helpdesk.queue': {
'Meta': {'ordering': "('title',)", 'object_name': 'Queue'},
'allow_email_submission': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'allow_public_submission': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'email_address': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
'email_box_host': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
'email_box_imap_folder': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
'email_box_interval': ('django.db.models.fields.IntegerField', [], {'default': "'5'", 'null': 'True', 'blank': 'True'}),
'email_box_last_check': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
'email_box_pass': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
'email_box_port': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'email_box_ssl': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'email_box_type': ('django.db.models.fields.CharField', [], {'max_length': '5', 'null': 'True', 'blank': 'True'}),
'email_box_user': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
'escalate_days': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'locale': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}),
'new_ticket_cc': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'updated_ticket_cc': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'})
},
'helpdesk.savedsearch': {
'Meta': {'object_name': 'SavedSearch'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'query': ('django.db.models.fields.TextField', [], {}),
'shared': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
},
'helpdesk.ticket': {
'Meta': {'object_name': 'Ticket'},
'assigned_to': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'assigned_to'", 'null': 'True', 'to': "orm['auth.User']"}),
'created': ('django.db.models.fields.DateTimeField', [], {'blank': 'True'}),
'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'due_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'last_escalation': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
'modified': ('django.db.models.fields.DateTimeField', [], {'blank': 'True'}),
'on_hold': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'priority': ('django.db.models.fields.IntegerField', [], {'default': '3', 'blank': '3'}),
'queue': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['helpdesk.Queue']"}),
'resolution': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'status': ('django.db.models.fields.IntegerField', [], {'default': '1'}),
'submitter_email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '200'})
},
'helpdesk.ticketcc': {
'Meta': {'object_name': 'TicketCC'},
'can_update': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'can_view': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'ticket': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['helpdesk.Ticket']"}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'})
},
'helpdesk.ticketchange': {
'Meta': {'object_name': 'TicketChange'},
'field': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'followup': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['helpdesk.FollowUp']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'new_value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'old_value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'})
},
'helpdesk.ticketcustomfieldvalue': {
'Meta': {'unique_together': "(('ticket', 'field'),)", 'object_name': 'TicketCustomFieldValue'},
'field': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['helpdesk.CustomField']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'ticket': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['helpdesk.Ticket']"}),
'value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'})
},
'helpdesk.ticketdependency': {
'Meta': {'unique_together': "(('ticket', 'depends_on'),)", 'object_name': 'TicketDependency'},
'depends_on': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'depends_on'", 'to': "orm['helpdesk.Ticket']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'ticket': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'ticketdependency'", 'to': "orm['helpdesk.Ticket']"})
},
'helpdesk.usersettings': {
'Meta': {'object_name': 'UserSettings'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'settings_pickled': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'user': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True'})
}
}
complete_apps = ['helpdesk']

View File

@ -197,7 +197,7 @@ class Queue(models.Model):
return u'%s <%s>' % (self.title, self.email_address)
from_address = property(_from_address)
def save(self, force_insert=False, force_update=False):
def save(self, *args, **kwargs):
if self.email_box_type == 'imap' and not self.email_box_imap_folder:
self.email_box_imap_folder = 'INBOX'
@ -210,7 +210,7 @@ class Queue(models.Model):
self.email_box_port = 995
elif self.email_box_type == 'pop3' and not self.email_box_ssl:
self.email_box_port = 110
super(Queue, self).save(force_insert, force_update)
super(Queue, self).save(*args, **kwargs)
class Ticket(models.Model):
@ -326,6 +326,12 @@ class Ticket(models.Model):
help_text=_('1 = Highest Priority, 5 = Low Priority'),
)
due_date = models.DateTimeField(
_('Due on'),
blank=True,
null=True,
)
last_escalation = models.DateTimeField(
blank=True,
null=True,
@ -436,7 +442,7 @@ class Ticket(models.Model):
return ('helpdesk_view', (self.id,))
get_absolute_url = models.permalink(get_absolute_url)
def save(self, force_insert=False, force_update=False):
def save(self, *args, **kwargs):
if not self.id:
# This is a new ticket as no ID yet exists.
self.created = datetime.now()
@ -446,7 +452,7 @@ class Ticket(models.Model):
self.modified = datetime.now()
super(Ticket, self).save(force_insert, force_update)
super(Ticket, self).save(*args, **kwargs)
class FollowUpManager(models.Manager):
@ -527,11 +533,11 @@ class FollowUp(models.Model):
def get_absolute_url(self):
return u"%s#followup%s" % (self.ticket.get_absolute_url(), self.id)
def save(self, force_insert=False, force_update=False):
def save(self, *args, **kwargs):
t = self.ticket
t.modified = datetime.now()
t.save()
super(FollowUp, self).save(force_insert, force_update)
super(FollowUp, self).save(*args, **kwargs)
class TicketChange(models.Model):
@ -843,10 +849,10 @@ class KBItem(models.Model):
blank=True,
)
def save(self, force_insert=False, force_update=False):
def save(self, *args, **kwargs):
if not self.last_updated:
self.last_updated = datetime.now()
return super(KBItem, self).save(force_insert, force_update)
return super(KBItem, self).save(*args, **kwargs)
def _score(self):
if self.votes > 0:
@ -1024,10 +1030,10 @@ class IgnoreEmail(models.Model):
def __unicode__(self):
return u'%s' % self.name
def save(self):
def save(self, *args, **kwargs):
if not self.date:
self.date = datetime.now()
return super(IgnoreEmail, self).save()
return super(IgnoreEmail, self).save(*args, **kwargs)
def test(self, email):
"""

View File

@ -40,6 +40,9 @@ HELPDESK_PREPEND_ORG_NAME = getattr(settings, 'HELPDESK_PREPEND_ORG_NAME', False
# show knowledgebase links?
HELPDESK_KB_ENABLED = getattr(settings, 'HELPDESK_KB_ENABLED', True)
# show knowledgebase links on staff view?
HELPDESK_KB_ENABLED_STAFF = getattr(settings, 'HELPDESK_KB_ENABLED_STAFF', False)
# show extended navigation by default, to all users, irrespective of staff status?
HELPDESK_NAVIGATION_ENABLED = getattr(settings, 'HELPDESK_NAVIGATION_ENABLED', False)
@ -55,7 +58,7 @@ HELPDESK_SUPPORT_PERSON = getattr(settings, 'HELPDESK_SUPPORT_PERSON', False)
HELPDESK_TRANSLATE_TICKET_COMMENTS = getattr(settings, 'HELPDESK_TRANSLATE_TICKET_COMMENTS', False)
# list of languages to offer. if set to false, all default google translate languages will be shown.
HELPDESK_TRANSLATE_TICKET_COMMENTS_LANG = getattr(settings, 'HELPDESK_TRANSLATE_TICKET_COMMENTS_LANG', ["en", "de", "fr", "ru"])
HELPDESK_TRANSLATE_TICKET_COMMENTS_LANG = getattr(settings, 'HELPDESK_TRANSLATE_TICKET_COMMENTS_LANG', ["en", "de", "fr", "it", "ru"])
# show link to 'change password' on 'User Settings' page?
HELPDESK_SHOW_CHANGE_PASSWORD = getattr(settings, 'HELPDESK_SHOW_CHANGE_PASSWORD', False)
@ -78,6 +81,9 @@ HELPDESK_VIEW_A_TICKET_PUBLIC = getattr(settings, 'HELPDESK_VIEW_A_TICKET_PUBLIC
# show 'submit a ticket' section on public page?
HELPDESK_SUBMIT_A_TICKET_PUBLIC = getattr(settings, 'HELPDESK_SUBMIT_A_TICKET_PUBLIC', True)
# Should we should the KB categories on the homepage?
HELPDESK_SHOW_KB_ON_HOMEPAGE = getattr(settings, 'HELPDESK_SHOW_KB_ON_HOMEPAGE', False)
''' options for update_ticket views '''
@ -103,6 +109,12 @@ HELPDESK_SHOW_HOLD_BUTTON_TICKET_TOP = getattr(settings, 'HELPDESK_SHOW_HOLD_BUT
# make all updates public by default? this will hide the 'is this update public' checkbox
HELPDESK_UPDATE_PUBLIC_DEFAULT = getattr(settings, 'HELPDESK_UPDATE_PUBLIC_DEFAULT', True)
# only show staff users in ticket owner drop-downs
HELPDESK_STAFF_ONLY_TICKET_OWNERS = getattr(settings, 'HELPDESK_STAFF_ONLY_TICKET_OWNERS', False)
# only show staff users in ticket cc drop-down
HELPDESK_STAFF_ONLY_TICKET_CC = getattr(settings, 'HELPDESK_STAFF_ONLY_TICKET_CC', False)
''' options for staff.create_ticket view '''
@ -129,3 +141,10 @@ HELPDESK_FOOTER_SHOW_API_LINK = getattr(settings, 'HELPDESK_FOOTER_SHOW_API_LINK
# show / hide 'change language' link at bottom of page
HELPDESK_FOOTER_SHOW_CHANGE_LANGUAGE_LINK = getattr(settings, 'HELPDESK_FOOTER_SHOW_CHANGE_LANGUAGE_LINK', False)
''' email options '''
# default Queue email submission settings
QUEUE_EMAIL_BOX_TYPE = getattr(settings, 'QUEUE_EMAIL_BOX_TYPE', None)
QUEUE_EMAIL_BOX_SSL = getattr(settings, 'QUEUE_EMAIL_BOX_SSL', None)
QUEUE_EMAIL_BOX_HOST = getattr(settings, 'QUEUE_EMAIL_BOX_HOST', None)
QUEUE_EMAIL_BOX_USER = getattr(settings, 'QUEUE_EMAIL_BOX_USER', None)
QUEUE_EMAIL_BOX_PASSWORD = getattr(settings, 'QUEUE_EMAIL_BOX_PASSWORD', None)

View File

@ -12,7 +12,8 @@
{% comment %}
<script src='{{ STATIC_URL }}helpdesk/jquery.translate-debug-all.js' type='text/javascript' language='javascript'></script>
{% endcomment %}
<link rel='stylesheet' href='{{ STATIC_URL }}helpdesk/helpdesk.css' type='text/css' />
<link rel='stylesheet' href='{{ STATIC_URL }}helpdesk/helpdesk.css' type='text/css' media="screen" />
<link rel='stylesheet' href='{{ STATIC_URL }}helpdesk/helpdesk-print.css' type='text/css' media="print" />
<link rel='stylesheet' href='{{ STATIC_URL }}helpdesk/jquery-smoothness-theme/jquery-ui-1.8.9.custom.css' type='text/css' />
<link rel='alternate' href='{% url helpdesk_rss "user" %}{{ user.username }}/' type='application/rss+xml' title='{% trans "My Open Tickets" %}' />
<link rel='alternate' href='{% url helpdesk_rss "recent_activity" %}' type='application/rss+xml' title='{% trans "All Recent Activity" %}' />

View File

@ -0,0 +1,9 @@
<h1 style='font-family: "Trebuchet MS", Arial, sans-serif; font-size: 14pt; color: #6593C0'>{% block header %}Helpdesk{% endblock %}</h1>
{% block content %}{% endblock %}
<p style='font-family: "Trebuchet MS", Arial, sans-serif; font-size: 11pt;'>Cordiali saluti,</p>
<p style='font-family: "Trebuchet MS", Arial, sans-serif; font-size: 11pt;'><b>{{ queue.title }}</b>{% if queue.email_address %}<br><a href='mailto:{{ queue.email_address }}'>{{ queue.email_address }}</a>{% endif %}</p>
<p style='font-family: "Trebuchet MS", Arial, sans-serif; font-size: 9pt; color: #808080;' color='#808080'>Questa email vi è stata inviata in quanto utenti del nostro servizio di supporto clienti, in conformità con la nostra policy sulla privacy. Vi preghiamo di informarci se pensate di aver ricevuto questa email per errore.</p>

View File

@ -0,0 +1,6 @@
Cordiali saluti,
{{ queue.title }}{% if queue.email_address %}
{{ queue.email_address }}{% endif %}
Questa email vi è stata inviata in quanto utenti del nostro servizio di supporto clienti, in conformità con la nostra policy sulla privacy. Vi preghiamo di informarci se pensate di aver ricevuto questa email per errore.

View File

@ -7,6 +7,9 @@
{% if helpdesk_settings.HELPDESK_NAVIGATION_STATS_ENABLED %}
<li><a href='{% url helpdesk_report_index %}'>{% trans "Stats" %}</a></li>
{% endif %}
{% if helpdesk_settings.HELPDESK_KB_ENABLED_STAFF %}
<li><a href='{% url helpdesk_kb_index %}'>{% trans "Knowledgebase" %}</a></li>
{% endif %}
{% if user_saved_queries_ %}
<li class="headerlink"><a>{% trans "Load Saved Query" %}</a>
<ul>

View File

@ -1,6 +1,22 @@
{% extends "helpdesk/public_base.html" %}{% load i18n %}
{% block helpdesk_body %}
{% if helpdesk_settings.HELPDESK_SHOW_KB_ON_HOMEPAGE %}
<h2>{% trans "Knowledgebase Articles" %}</h2>
<table width='100%'>
<tr class='row_tablehead'><td>{% trans "Knowledgebase Categories" %}</td></tr>
<tr class='row_columnheads'><th>{% trans "Category" %}</th></tr>
{% for category in kb_categories %}
<tr class='row_even row_hover'><th><a href='{{ category.get_absolute_url }}'>{{ category.title }}</a></th></tr>
<tr class='row_odd'><td>{{ category.description }}</td></tr>
{% endfor %}
</table>
{% endif %}
{% if helpdesk_settings.HELPDESK_VIEW_A_TICKET_PUBLIC %}
<h2>{% trans "View a Ticket" %}</h2>

View File

@ -113,6 +113,7 @@ function googleTranslateElementInit() {
</div>
{% endif %}
<div id='add-followup'>
<h3>{% trans "Respond to this ticket" %}</h3>
<form method='post' action='update/' enctype='multipart/form-data'>
@ -180,6 +181,9 @@ function googleTranslateElementInit() {
<dt><label for='id_priority'>{% trans "Priority" %}</label></dt>
<dd><select id='id_priority' name='priority'>{% for p in priorities %}<option value='{{ p.0 }}'{% ifequal p.0 ticket.priority %} selected='selected'{% endifequal %}>{{ p.1 }}</option>{% endfor %}</select></dd>
<dt><label for='id_due_date'>{% trans "Due on" %}</label></dt>
<dd>{{ form.due_date }}</dd>
{% if tags_enabled %}
<dt><label for='id_tags'>{% trans "Tags" %}</label></dt>
<dd><input type='text' id='id_tags' name='tags' value='{{ ticket.tags }}'/></dd>
@ -207,5 +211,6 @@ function googleTranslateElementInit() {
{% csrf_token %}</form>
</div>
{% endblock %}

View File

@ -20,6 +20,7 @@ from django.http import HttpResponse
from django.shortcuts import render_to_response
from django.template import loader, Context
from django.utils import simplejson
from django.views.decorators.csrf import csrf_exempt
from helpdesk.forms import TicketForm
from helpdesk.lib import send_templated_mail, safe_template_context
@ -33,6 +34,7 @@ STATUS_ERROR_PERMISSIONS = 403
STATUS_ERROR_BADMETHOD = 405
@csrf_exempt
def api(request, method):
"""
Regardless of any other paramaters, we provide a help screen

View File

@ -18,7 +18,7 @@ from django.utils.translation import ugettext as _
from helpdesk import settings as helpdesk_settings
from helpdesk.forms import PublicTicketForm
from helpdesk.lib import send_templated_mail, text_is_spam
from helpdesk.models import Ticket, Queue, UserSettings
from helpdesk.models import Ticket, Queue, UserSettings, KBCategory
def homepage(request):
@ -63,10 +63,13 @@ def homepage(request):
form = PublicTicketForm(initial=initial_data)
form.fields['queue'].choices = [('', '--------')] + [[q.id, q.title] for q in Queue.objects.filter(allow_public_submission=True)]
knowledgebase_categories = KBCategory.objects.all()
return render_to_response('helpdesk/public_homepage.html',
RequestContext(request, {
'form': form,
'helpdesk_settings': helpdesk_settings,
'kb_categories': knowledgebase_categories
}))

View File

@ -16,6 +16,7 @@ from django.contrib.auth.models import User
from django.contrib.auth.decorators import login_required, user_passes_test
from django.core.files.base import ContentFile
from django.core.urlresolvers import reverse
from django.core.exceptions import ValidationError
from django.core import paginator
from django.db import connection
from django.db.models import Q
@ -245,12 +246,25 @@ def view_ticket(request, ticket_id):
return update_ticket(request, ticket_id)
<<<<<<< HEAD
ticketcc_string, SHOW_SUBSCRIBE = return_ticketccstring_and_show_subscribe(request.user, ticket)
=======
if helpdesk_settings.HELPDESK_STAFF_ONLY_TICKET_OWNERS:
users = User.objects.filter(is_active=True, is_staff=True).order_by('username')
else:
users = User.objects.filter(is_active=True).order_by('username')
# TODO: shouldn't this template get a form to begin with?
form = TicketForm(initial={'due_date':ticket.due_date})
>>>>>>> upstream/master
return render_to_response('helpdesk/ticket.html',
RequestContext(request, {
'ticket': ticket,
'active_users': User.objects.filter(is_active=True).order_by('username'),
'form': form,
'active_users': users,
'priorities': Ticket.PRIORITY_CHOICES,
'preset_replies': PreSetReply.objects.filter(Q(queues=ticket.queue) | Q(queues__isnull=True)),
'tags_enabled': HAS_TAG_SUPPORT,
@ -316,6 +330,10 @@ def update_ticket(request, ticket_id, public=False):
public = request.POST.get('public', False)
owner = int(request.POST.get('owner', None))
priority = int(request.POST.get('priority', ticket.priority))
due_date = datetime(
int(request.POST.get('due_date_year')),
int(request.POST.get('due_date_month')),
int(request.POST.get('due_date_day')))
tags = request.POST.get('tags', '')
# Check whether anything about the ticket has changed. If nothing has
@ -433,6 +451,16 @@ def update_ticket(request, ticket_id, public=False):
c.save()
ticket.priority = priority
if due_date != ticket.due_date:
c = TicketChange(
followup=f,
field=_('Due on'),
old_value=ticket.due_date,
new_value=due_date,
)
c.save()
ticket.due_date = due_date
if HAS_TAG_SUPPORT:
if tags != ticket.tags:
c = TicketChange(
@ -444,7 +472,11 @@ def update_ticket(request, ticket_id, public=False):
c.save()
ticket.tags = tags
<<<<<<< HEAD
if new_status in [Ticket.RESOLVED_STATUS, Ticket.CLOSED_STATUS]:
=======
if new_status in [ Ticket.RESOLVED_STATUS, Ticket.CLOSED_STATUS ]:
>>>>>>> upstream/master
ticket.resolution = comment
messages_sent_to = []
@ -720,18 +752,27 @@ def ticket_list(request):
else:
queues = request.GET.getlist('queue')
if queues:
try:
queues = [int(q) for q in queues]
query_params['filtering']['queue__id__in'] = queues
except ValueError:
pass
owners = request.GET.getlist('assigned_to')
if owners:
try:
owners = [int(u) for u in owners]
query_params['filtering']['assigned_to__id__in'] = owners
except ValueError:
pass
statuses = request.GET.getlist('status')
if statuses:
try:
statuses = [int(s) for s in statuses]
query_params['filtering']['status__in'] = statuses
except ValueError:
pass
date_from = request.GET.get('date_from')
if date_from:
@ -764,8 +805,15 @@ def ticket_list(request):
sortreverse = request.GET.get('sortreverse', None)
query_params['sortreverse'] = sortreverse
try:
ticket_qs = apply_query(Ticket.objects.select_related(), query_params)
except ValidationError:
# invalid parameters in query, return default query
query_params = {
'filtering': {'status__in': [1, 2, 3]},
'sorting': 'created',
}
ticket_qs = apply_query(Ticket.objects.select_related(), query_params)
print >> sys.stderr, str(ticket_qs.query)
## TAG MATCHING
if HAS_TAG_SUPPORT:
@ -860,7 +908,11 @@ def create_ticket(request):
form = TicketForm(initial=initial_data)
form.fields['queue'].choices = [('', '--------')] + [[q.id, q.title] for q in Queue.objects.all()]
form.fields['assigned_to'].choices = [('', '--------')] + [[u.id, u.username] for u in User.objects.filter(is_active=True).order_by('username')]
if helpdesk_settings.HELPDESK_STAFF_ONLY_TICKET_OWNERS:
users = User.objects.filter(is_active=True, is_staff=True).order_by('username')
else:
users = User.objects.filter(is_active=True).order_by('username')
form.fields['assigned_to'].choices = [('', '--------')] + [[u.id, u.username] for u in users]
if helpdesk_settings.HELPDESK_CREATE_TICKET_HIDE_ASSIGNED_TO:
form.fields['assigned_to'].widget = forms.HiddenInput()

View File

@ -4,7 +4,7 @@ from distutils.util import convert_path
from fnmatch import fnmatchcase
from setuptools import setup, find_packages
version = '0.1.5b'
version = '0.1.6b'
# Provided as an attribute, so you can append to these instead
# of replicating them: