* 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:
Ross Poulton 2008-01-15 00:20:00 +00:00
parent dce7731957
commit 038ea15877
2 changed files with 46 additions and 19 deletions

View File

@ -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

View File

@ -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: