* Fix inline models in Admin

* Use signals correctly
(Thanks, David Clymer)
This commit is contained in:
Ross Poulton 2008-08-13 21:42:57 +00:00
parent c762313e08
commit 4d6859ba42
4 changed files with 30 additions and 19 deletions

View File

@ -1,6 +1,7 @@
from django.contrib import admin from django.contrib import admin
from helpdesk.models import Queue, Ticket, FollowUp, PreSetReply, KBCategory from helpdesk.models import Queue, Ticket, FollowUp, PreSetReply, KBCategory
from helpdesk.models import EscalationExclusion, EmailTemplate, KBItem from helpdesk.models import EscalationExclusion, EmailTemplate, KBItem
from helpdesk.models import TicketChange, Attachment
class QueueAdmin(admin.ModelAdmin): class QueueAdmin(admin.ModelAdmin):
list_display = ('title', 'slug', 'email_address') list_display = ('title', 'slug', 'email_address')
@ -10,17 +11,23 @@ class TicketAdmin(admin.ModelAdmin):
date_hierarchy = 'created' date_hierarchy = 'created'
list_filter = ('assigned_to', 'status', ) list_filter = ('assigned_to', 'status', )
class GenericAdmin(admin.ModelAdmin): class TicketChangeInline(admin.StackedInline):
pass model = TicketChange
class AttachmentInline(admin.StackedInline):
model = Attachment
class FollowUpAdmin(admin.ModelAdmin):
inlines = [TicketChangeInline, AttachmentInline]
class PreSetReplyAdmin(admin.ModelAdmin): class PreSetReplyAdmin(admin.ModelAdmin):
list_display = ('name',) list_display = ('name',)
admin.site.register(Ticket, TicketAdmin) admin.site.register(Ticket, TicketAdmin)
admin.site.register(Queue, QueueAdmin) admin.site.register(Queue, QueueAdmin)
admin.site.register(FollowUp, GenericAdmin) admin.site.register(FollowUp, FollowUpAdmin)
admin.site.register(PreSetReply, GenericAdmin) admin.site.register(PreSetReply)
admin.site.register(EscalationExclusion, GenericAdmin) admin.site.register(EscalationExclusion)
admin.site.register(EmailTemplate, GenericAdmin) admin.site.register(EmailTemplate)
admin.site.register(KBCategory, GenericAdmin) admin.site.register(KBCategory)
admin.site.register(KBItem, GenericAdmin) admin.site.register(KBItem)

View File

@ -12,7 +12,6 @@ from datetime import datetime
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.db import models from django.db import models
from django.conf import settings from django.conf import settings
from django.dispatch import dispatcher
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
class Queue(models.Model): class Queue(models.Model):
@ -243,10 +242,10 @@ class TicketChange(models.Model):
""" For each FollowUp, any changes to the parent ticket (eg Title, Priority, """ For each FollowUp, any changes to the parent ticket (eg Title, Priority,
etc) are tracked here for display purposes. etc) are tracked here for display purposes.
""" """
followup = models.ForeignKey(FollowUp, edit_inline=models.TABULAR) followup = models.ForeignKey(FollowUp)
field = models.CharField(_('Field'), max_length=100, core=True) field = models.CharField(_('Field'), max_length=100)
old_value = models.TextField(_('Old Value'), blank=True, null=True, core=True) old_value = models.TextField(_('Old Value'), blank=True, null=True)
new_value = models.TextField(_('New Value'), blank=True, null=True, core=True) new_value = models.TextField(_('New Value'), blank=True, null=True)
def __unicode__(self): def __unicode__(self):
str = u'%s ' % field str = u'%s ' % field
@ -274,9 +273,9 @@ class DynamicFileField(models.FileField):
def contribute_to_class(self, cls, name): def contribute_to_class(self, cls, name):
"""Hook up events so we can access the instance.""" """Hook up events so we can access the instance."""
super(DynamicFileField, self).contribute_to_class(cls, name) super(DynamicFileField, self).contribute_to_class(cls, name)
dispatcher.connect(self._post_init, models.signals.post_init, sender=cls) models.signals.post_init.connect(self._post_init, sender=cls)
def _post_init(self, instance=None): def _post_init(self, instance=None, **kwargs):
"""Get dynamic upload_to value from the model instance.""" """Get dynamic upload_to value from the model instance."""
if hasattr(instance, 'get_upload_to'): if hasattr(instance, 'get_upload_to'):
self.upload_to = instance.get_upload_to(self.attname) self.upload_to = instance.get_upload_to(self.attname)
@ -286,8 +285,8 @@ class DynamicFileField(models.FileField):
return 'varchar(100)' return 'varchar(100)'
class Attachment(models.Model): class Attachment(models.Model):
followup = models.ForeignKey(FollowUp, edit_inline=models.TABULAR) followup = models.ForeignKey(FollowUp)
file = DynamicFileField(_('File'), upload_to='helpdesk/attachments', core=True) file = DynamicFileField(_('File'), upload_to='helpdesk/attachments')
filename = models.CharField(_('Filename'), max_length=100) filename = models.CharField(_('Filename'), max_length=100)
mime_type = models.CharField(_('MIME Type'), max_length=30) mime_type = models.CharField(_('MIME Type'), max_length=30)
size = models.IntegerField(_('Size'), help_text=_('Size of this file in bytes')) size = models.IntegerField(_('Size'), help_text=_('Size of this file in bytes'))

View File

@ -17,6 +17,8 @@ from email.Utils import parseaddr
from helpdesk.models import Queue, Ticket, FollowUp, Attachment from helpdesk.models import Queue, Ticket, FollowUp, Attachment
from helpdesk.lib import send_templated_mail from helpdesk.lib import send_templated_mail
from django.core.files.base import ContentFile
def process_email(): def process_email():
for q in Queue.objects.filter(email_box_type__isnull=False, allow_email_submission=True): for q in Queue.objects.filter(email_box_type__isnull=False, allow_email_submission=True):
if not q.email_box_last_check: q.email_box_last_check = datetime.now()-timedelta(minutes=30) if not q.email_box_last_check: q.email_box_last_check = datetime.now()-timedelta(minutes=30)
@ -173,7 +175,8 @@ def ticket_from_message(message, queue):
for file in files: for file in files:
filename = file['filename'].replace(' ', '_') filename = file['filename'].replace(' ', '_')
a = Attachment(followup=f, filename=filename, mime_type=file['type'], size=len(file['content'])) a = Attachment(followup=f, filename=filename, mime_type=file['type'], size=len(file['content']))
a.save_file_file(file['filename'], file['content']) #a.save_file_file(file['filename'], file['content'])
a.file.save(file['filename'], ContentFile(file['content']))
a.save() a.save()
print " - %s" % file['filename'] print " - %s" % file['filename']

View File

@ -10,6 +10,7 @@ from datetime import datetime
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.core.files.base import ContentFile
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.db.models import Q from django.db.models import Q
from django.http import HttpResponseRedirect, Http404, HttpResponse from django.http import HttpResponseRedirect, Http404, HttpResponse
@ -194,7 +195,8 @@ def update_ticket(request, ticket_id):
for file in request.FILES.getlist('attachment'): for file in request.FILES.getlist('attachment'):
filename = file['filename'].replace(' ', '_') filename = file['filename'].replace(' ', '_')
a = Attachment(followup=f, filename=filename, mime_type=file['content-type'], size=len(file['content'])) a = Attachment(followup=f, filename=filename, mime_type=file['content-type'], size=len(file['content']))
a.save_file_file(file['filename'], file['content']) #a.save_file_file(file['filename'], file['content'])
a.file.save(file['filename'], ContentFile(file['content']))
a.save() a.save()
ticket.save() ticket.save()