* Add queue-based automatic ticket escalation

This commit is contained in:
Ross Poulton 2008-01-16 04:38:24 +00:00
parent d3571d2397
commit 1524c37941
3 changed files with 83 additions and 2 deletions

14
README
View File

@ -99,11 +99,21 @@ See the file 'LICENSE' for licensing terms and conditions.
inbox, set up a cronjob to run scripts/get_email.py on a regular basis.
Don't forget to set the relevant Django environment variables in your
crnotab:
crontab:
5 * * * * DJANGO_SETTINGS_MODULE='myproject.settings' python /path/to/helpdesk/scripts/get_email.py
*/5 * * * * DJANGO_SETTINGS_MODULE='myproject.settings' python /path/to/helpdesk/scripts/get_email.py
This will run the e-mail import every 5 minutes
IMPORTANT NOTE: Any tickets created via POP3 or IMAP mailboxes will DELETE
the original e-mail from the mail server.
4. If you wish to automatically escalate tickets based on their age, set up
a cronjob to run scripts/escalate_tickets.py on a regular basis:
0 * * * * DJANGO_SETTINGS_MODULE='myproject.settings' python /path/to/helpdesk/scripts/escalate_tickets.py
This will run the escalation process hourly, using the 'Escalation Hours'
setting for each queue to determine which tickets to escalate.
You're now up and running!

View File

@ -46,6 +46,8 @@ class Queue(models.Model):
title = models.CharField(maxlength=100)
slug = models.SlugField(help_text='This slug is used when building ticket ID\'s. Once set, try not to change it or e-mailing may get messy.')
email_address = models.EmailField(blank=True, null=True, help_text='All outgoing e-mails for this queue will use this e-mail address. If you use IMAP or POP3, this shoul be the e-mail address for that mailbox.')
escalate_hours = models.IntegerField(blank=True, null=True, help_text='For tickets which are not held, how often do you wish to increase their priority? Set to 0 for no escalation.')
last_escalation = models.DateTimeField(blank=True, null=True, editable=False)
def _from_address(self):
if not self.email_address:

View File

@ -0,0 +1,69 @@
""" ..
.,::;::::::
..,::::::::,,,,::: Jutda Helpdesk - A Django
.,,::::::,,,,,,,,,,,,,:: powered ticket tracker for
.,::::::,,,,,,,,,,,,,,,,,,:;r. small enterprise
.::::,,,,,,,,,,,,,,,,,,,,,,:;;rr.
.:::,,,,,,,,,,,,,,,,,,,,,,,:;;;;;rr (c) Copyright 2008
.:::,,,,,,,,,,,,,,,,,,,,,,,:;;;:::;;rr
.:::,,,,,,,,,,,,,,,,,,,,. ,;;;::::::;;rr Jutda
.:::,,,,,,,,,,,,,,,,,,. .:;;:::::::::;;rr
.:::,,,,,,,,,,,,,,,. .;r;::::::::::::;r; All Rights Reserved
.:::,,,,,,,,,,,,,,, .;r;;:::::::::::;;:.
.:::,,,,,,,,,,,,,,,. .;r;;::::::::::::;:.
.;:,,,,,,,,,,,,,,, .,;rr;::::::::::::;:. This software is released
.,:,,,,,,,,,,,,,. .,:;rrr;;::::::::::::;;. under a limited-use license that
:,,,,,,,,,,,,,..:;rrrrr;;;::::::::::::;;. allows you to freely download this
:,,,,,,,:::;;;rr;;;;;;:::::::::::::;;, software from it's manufacturer and
::::;;;;;;;;;;;:::::::::::::::::;;, use it yourself, however you may not
.r;;;;:::::::::::::::::::::::;;;, distribute it. For further details, see
.r;::::::::::::::::::::;;;;;:, the enclosed LICENSE file.
.;;::::::::::::::;;;;;:,.
.;;:::::::;;;;;;:,. Please direct people who wish to download this
.r;;;;;;;;:,. software themselves to www.jutda.com.au.
,,,..
$Id$
"""
from datetime import datetime, timedelta
from django.db.models import Q
from helpdesk.models import Queue, Ticket, FollowUp
from helpdesk.lib import send_multipart_mail
def escalate_tickets():
for q in Queue.objects.filter(escalate_hours__isnull=False).exclude(escalate_hours=0):
if not q.last_escalation: q.last_escalation = datetime.now()-timedelta(hours=q.escalate_hours)
if (q.last_escalation + timedelta(hours=q.escalate_hours) - timedelta(minutes=2)) > datetime.now():
continue
print "Processing: %s" % q
q.last_escalation = datetime.now()
q.save()
for t in q.ticket_set.filter(Q(status=Ticket.OPEN_STATUS) | Q(status=Ticket.REOPENED_STATUS)).exclude(priority=1):
t.priority -= 1
t.save()
f = FollowUp(
ticket = t,
title = 'Ticket Escalated',
date=q.last_escalation,
public=True,
comment='Ticket escalated after %s hours' % q.escalate_hours,
)
f.save()
tc = TicketChange(
followup = f,
field = 'priority',
old_value = t.priority + 1,
new_value = t.priority,
)
tc.save()
if __name__ == '__main__':
escalate_tickets()