forked from extern/django-helpdesk
* General clean-up, especially for Django admin - added help_text to more fields and defined other admin options to make life easier.
This commit is contained in:
parent
dce7731957
commit
038ea15877
50
models.py
50
models.py
@ -26,10 +26,11 @@
|
|||||||
$Id$
|
$Id$
|
||||||
|
|
||||||
"""
|
"""
|
||||||
from django.db import models
|
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
from django.db.models import permalink
|
from django.db import models
|
||||||
|
from django.conf import settings
|
||||||
|
|
||||||
class Queue(models.Model):
|
class Queue(models.Model):
|
||||||
"""
|
"""
|
||||||
@ -43,11 +44,14 @@ class Queue(models.Model):
|
|||||||
can automatically get tickets via e-mail.
|
can automatically get tickets via e-mail.
|
||||||
"""
|
"""
|
||||||
title = models.CharField(maxlength=100)
|
title = models.CharField(maxlength=100)
|
||||||
slug = models.SlugField()
|
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)
|
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.')
|
||||||
|
|
||||||
def _from_address(self):
|
def _from_address(self):
|
||||||
return '%s <%s>' % (self.title, self.email_address)
|
if not self.email_address:
|
||||||
|
return 'NO QUEUE EMAIL ADDRESS DEFINED <%s>' % settings.DEFAULT_FROM_EMAIL
|
||||||
|
else:
|
||||||
|
return '%s <%s>' % (self.title, self.email_address)
|
||||||
from_address = property(_from_address)
|
from_address = property(_from_address)
|
||||||
|
|
||||||
email_box_type = models.CharField(maxlength=5, choices=(('pop3', 'POP 3'),('imap', 'IMAP')), blank=True, null=True, help_text='E-Mail Server Type - Both POP3 and IMAP are supported. Select your email server type here.')
|
email_box_type = models.CharField(maxlength=5, choices=(('pop3', 'POP 3'),('imap', 'IMAP')), blank=True, null=True, help_text='E-Mail Server Type - Both POP3 and IMAP are supported. Select your email server type here.')
|
||||||
@ -63,13 +67,17 @@ class Queue(models.Model):
|
|||||||
return u"%s" % self.title
|
return u"%s" % self.title
|
||||||
|
|
||||||
class Admin:
|
class Admin:
|
||||||
pass
|
list_display = ('title', 'slug', 'email_address')
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
ordering = ('title',)
|
||||||
|
|
||||||
def save(self):
|
def save(self):
|
||||||
if self.email_box_type == 'imap' and not self.email_box_imap_folder:
|
if self.email_box_type == 'imap' and not self.email_box_imap_folder:
|
||||||
self.email_box_imap_folder = 'INBOX'
|
self.email_box_imap_folder = 'INBOX'
|
||||||
super(Queue, self).save()
|
super(Queue, self).save()
|
||||||
|
|
||||||
|
|
||||||
class Ticket(models.Model):
|
class Ticket(models.Model):
|
||||||
"""
|
"""
|
||||||
To allow a ticket to be entered as quickly as possible, only the
|
To allow a ticket to be entered as quickly as possible, only the
|
||||||
@ -146,19 +154,19 @@ class Ticket(models.Model):
|
|||||||
get_priority_img = property(_get_priority_img)
|
get_priority_img = property(_get_priority_img)
|
||||||
|
|
||||||
class Admin:
|
class Admin:
|
||||||
list_display = ('title', 'status', 'assigned_to',)
|
list_display = ('title', 'status', 'assigned_to', 'submitter_email',)
|
||||||
date_hierarchy = 'created'
|
date_hierarchy = 'created'
|
||||||
list_filter = ('assigned_to',)
|
list_filter = ('assigned_to', 'status', )
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
get_latest_by = "created"
|
get_latest_by = "created"
|
||||||
|
|
||||||
def __unicode__(self):
|
def __unicode__(self):
|
||||||
return '%s' % self.title
|
return u'%s' % self.title
|
||||||
|
|
||||||
def get_absolute_url(self):
|
def get_absolute_url(self):
|
||||||
return ('helpdesk.views.view_ticket', [str(self.id)])
|
return ('helpdesk.views.view_ticket', [str(self.id)])
|
||||||
get_absolute_url = permalink(get_absolute_url)
|
get_absolute_url = models.permalink(get_absolute_url)
|
||||||
|
|
||||||
def save(self):
|
def save(self):
|
||||||
if not self.id:
|
if not self.id:
|
||||||
@ -200,7 +208,7 @@ class FollowUp(models.Model):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
def __unicode__(self):
|
def __unicode__(self):
|
||||||
return '%s' % self.title
|
return u'%s' % self.title
|
||||||
|
|
||||||
|
|
||||||
def save(self):
|
def save(self):
|
||||||
@ -219,7 +227,7 @@ class TicketChange(models.Model):
|
|||||||
new_value = models.TextField(blank=True, null=True, core=True)
|
new_value = models.TextField(blank=True, null=True, core=True)
|
||||||
|
|
||||||
def __unicode__(self):
|
def __unicode__(self):
|
||||||
str = '%s ' % field
|
str = u'%s ' % field
|
||||||
if not new_value:
|
if not new_value:
|
||||||
str += 'removed'
|
str += 'removed'
|
||||||
elif not old_value:
|
elif not old_value:
|
||||||
@ -233,12 +241,24 @@ class TicketChange(models.Model):
|
|||||||
#file = models.FileField()
|
#file = models.FileField()
|
||||||
|
|
||||||
class PreSetReply(models.Model):
|
class PreSetReply(models.Model):
|
||||||
queues = models.ManyToManyField(Queue, blank=True, null=True)
|
""" We can allow the admin to define a number of pre-set replies, used to
|
||||||
name = models.CharField(max_length=100)
|
simplify the sending of updates and resolutions. These are basically Django
|
||||||
|
templates with a limited context - however if yo uwanted to get crafy it would
|
||||||
|
be easy to write a reply that displays ALL updates in hierarchical order etc
|
||||||
|
with use of for loops over {{ ticket.followup_set.all }} and friends.
|
||||||
|
|
||||||
|
When replying to a ticket, the user can select any reply set for the current
|
||||||
|
queue, and the body text is fetched via AJAX."""
|
||||||
|
|
||||||
|
queues = models.ManyToManyField(Queue, blank=True, null=True, help_text='Leave blank to allow this reply to be used for all queues, or select those queues you wish to limit this reply to.')
|
||||||
|
name = models.CharField(max_length=100, help_text='Only used to assist users with selecting a reply - not shown to the user.')
|
||||||
body = models.TextField(help_text='Context available: {{ ticket }} - ticket object (eg {{ ticket.title }}); {{ queue }} - The queue; and {{ user }} - the current user.')
|
body = models.TextField(help_text='Context available: {{ ticket }} - ticket object (eg {{ ticket.title }}); {{ queue }} - The queue; and {{ user }} - the current user.')
|
||||||
|
|
||||||
class Admin:
|
class Admin:
|
||||||
pass
|
list_display = ('name',)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
ordering = ['name',]
|
ordering = ['name',]
|
||||||
|
|
||||||
|
def __unicode__(self):
|
||||||
|
return u'%s' % self.name
|
||||||
|
15
views.py
15
views.py
@ -32,15 +32,16 @@ from datetime import datetime
|
|||||||
# Django imports
|
# Django imports
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
from django.contrib.auth.decorators import login_required
|
from django.contrib.auth.decorators import login_required
|
||||||
from django.template import loader, Context, RequestContext
|
from django.core.urlresolvers import reverse
|
||||||
from django.shortcuts import render_to_response, get_object_or_404
|
|
||||||
from django.http import HttpResponseRedirect, Http404, HttpResponse
|
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
|
from django.http import HttpResponseRedirect, Http404, HttpResponse
|
||||||
|
from django.shortcuts import render_to_response, get_object_or_404
|
||||||
|
from django.template import loader, Context, RequestContext
|
||||||
|
|
||||||
# Helpdesk imports
|
# Helpdesk imports
|
||||||
from helpdesk.forms import TicketForm
|
from helpdesk.forms import TicketForm
|
||||||
from helpdesk.models import Ticket, Queue, FollowUp, TicketChange, PreSetReply
|
|
||||||
from helpdesk.lib import send_multipart_mail
|
from helpdesk.lib import send_multipart_mail
|
||||||
|
from helpdesk.models import Ticket, Queue, FollowUp, TicketChange, PreSetReply
|
||||||
|
|
||||||
def dashboard(request):
|
def dashboard(request):
|
||||||
tickets = Ticket.objects.filter(assigned_to=request.user).exclude(status=Ticket.CLOSED_STATUS)
|
tickets = Ticket.objects.filter(assigned_to=request.user).exclude(status=Ticket.CLOSED_STATUS)
|
||||||
@ -67,6 +68,12 @@ def view_ticket(request, ticket_id):
|
|||||||
if request.GET.has_key('take'):
|
if request.GET.has_key('take'):
|
||||||
ticket.assigned_to = request.user
|
ticket.assigned_to = request.user
|
||||||
ticket.save()
|
ticket.save()
|
||||||
|
|
||||||
|
if request.GET.has_key('delete'):
|
||||||
|
if request.method == 'GET':
|
||||||
|
else:
|
||||||
|
ticket.delete()
|
||||||
|
return HttpResponseRedirect(reverse('helpdesk_dashboard'))
|
||||||
|
|
||||||
if request.GET.has_key('close') and ticket.status == Ticket.RESOLVED_STATUS:
|
if request.GET.has_key('close') and ticket.status == Ticket.RESOLVED_STATUS:
|
||||||
if not ticket.assigned_to:
|
if not ticket.assigned_to:
|
||||||
|
Loading…
Reference in New Issue
Block a user