mirror of
https://gitea.mueller.network/extern/django-helpdesk.git
synced 2024-11-28 19:03:14 +01:00
Allow a file to be attached to the ticket when the ticket is opened. These files are attached to outgoing emails. Also, updated forms to loop over form.fields rather than explicitly naming each field. Fixes issue #15.
This commit is contained in:
parent
fa79cac822
commit
11293b0b66
60
forms.py
60
forms.py
@ -10,11 +10,12 @@ forms.py - Definitions of newforms-based forms for creating and maintaining
|
|||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
from django import forms
|
from django import forms
|
||||||
|
from django.conf import settings
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
from django.utils.translation import ugettext as _
|
from django.utils.translation import ugettext as _
|
||||||
|
|
||||||
from helpdesk.lib import send_templated_mail
|
from helpdesk.lib import send_templated_mail
|
||||||
from helpdesk.models import Ticket, Queue, FollowUp, IgnoreEmail
|
from helpdesk.models import Ticket, Queue, FollowUp, Attachment, IgnoreEmail
|
||||||
|
|
||||||
class TicketForm(forms.Form):
|
class TicketForm(forms.Form):
|
||||||
queue = forms.ChoiceField(
|
queue = forms.ChoiceField(
|
||||||
@ -60,6 +61,12 @@ class TicketForm(forms.Form):
|
|||||||
'as \'3\'.'),
|
'as \'3\'.'),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
attachment = forms.FileField(
|
||||||
|
required=False,
|
||||||
|
label=_('Attach File'),
|
||||||
|
help_text=_('You can attach a file such as a document or screenshot to this ticket.'),
|
||||||
|
)
|
||||||
|
|
||||||
def save(self, user):
|
def save(self, user):
|
||||||
"""
|
"""
|
||||||
Writes and returns a Ticket() object
|
Writes and returns a Ticket() object
|
||||||
@ -98,6 +105,25 @@ class TicketForm(forms.Form):
|
|||||||
|
|
||||||
f.save()
|
f.save()
|
||||||
|
|
||||||
|
files = []
|
||||||
|
if self.cleaned_data['attachment']:
|
||||||
|
import mimetypes
|
||||||
|
file = self.cleaned_data['attachment']
|
||||||
|
filename = file.name.replace(' ', '_')
|
||||||
|
a = Attachment(
|
||||||
|
followup=f,
|
||||||
|
filename=filename,
|
||||||
|
mime_type=mimetypes.guess_type(filename)[0] or 'application/octet-stream',
|
||||||
|
size=file.size,
|
||||||
|
)
|
||||||
|
a.file.save(file.name, file, save=False)
|
||||||
|
a.save()
|
||||||
|
|
||||||
|
if file.size < getattr(settings, 'MAX_EMAIL_ATTACHMENT_SIZE', 512000):
|
||||||
|
# Only files smaller than 512kb (or as defined in
|
||||||
|
# settings.MAX_EMAIL_ATTACHMENT_SIZE) are sent via email.
|
||||||
|
files.append(a.file.path)
|
||||||
|
|
||||||
context = {
|
context = {
|
||||||
'ticket': t,
|
'ticket': t,
|
||||||
'queue': q,
|
'queue': q,
|
||||||
@ -110,6 +136,7 @@ class TicketForm(forms.Form):
|
|||||||
recipients=t.submitter_email,
|
recipients=t.submitter_email,
|
||||||
sender=q.from_address,
|
sender=q.from_address,
|
||||||
fail_silently=True,
|
fail_silently=True,
|
||||||
|
files=files,
|
||||||
)
|
)
|
||||||
|
|
||||||
if t.assigned_to and t.assigned_to != user and getattr(t.assigned_to.usersettings.settings, 'email_on_ticket_assign', False):
|
if t.assigned_to and t.assigned_to != user and getattr(t.assigned_to.usersettings.settings, 'email_on_ticket_assign', False):
|
||||||
@ -119,6 +146,7 @@ class TicketForm(forms.Form):
|
|||||||
recipients=t.assigned_to.email,
|
recipients=t.assigned_to.email,
|
||||||
sender=q.from_address,
|
sender=q.from_address,
|
||||||
fail_silently=True,
|
fail_silently=True,
|
||||||
|
files=files,
|
||||||
)
|
)
|
||||||
|
|
||||||
if q.new_ticket_cc:
|
if q.new_ticket_cc:
|
||||||
@ -128,6 +156,7 @@ class TicketForm(forms.Form):
|
|||||||
recipients=q.new_ticket_cc,
|
recipients=q.new_ticket_cc,
|
||||||
sender=q.from_address,
|
sender=q.from_address,
|
||||||
fail_silently=True,
|
fail_silently=True,
|
||||||
|
files=files,
|
||||||
)
|
)
|
||||||
|
|
||||||
if q.updated_ticket_cc and q.updated_ticket_cc != q.new_ticket_cc:
|
if q.updated_ticket_cc and q.updated_ticket_cc != q.new_ticket_cc:
|
||||||
@ -137,6 +166,7 @@ class TicketForm(forms.Form):
|
|||||||
recipients=q.updated_ticket_cc,
|
recipients=q.updated_ticket_cc,
|
||||||
sender=q.from_address,
|
sender=q.from_address,
|
||||||
fail_silently=True,
|
fail_silently=True,
|
||||||
|
files=files,
|
||||||
)
|
)
|
||||||
|
|
||||||
return t
|
return t
|
||||||
@ -178,6 +208,12 @@ class PublicTicketForm(forms.Form):
|
|||||||
help_text=_('Please select a priority carefully.'),
|
help_text=_('Please select a priority carefully.'),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
attachment = forms.FileField(
|
||||||
|
required=False,
|
||||||
|
label=_('Attach File'),
|
||||||
|
help_text=_('You can attach a file such as a document or screenshot to this ticket.'),
|
||||||
|
)
|
||||||
|
|
||||||
def save(self):
|
def save(self):
|
||||||
"""
|
"""
|
||||||
Writes and returns a Ticket() object
|
Writes and returns a Ticket() object
|
||||||
@ -207,6 +243,25 @@ class PublicTicketForm(forms.Form):
|
|||||||
|
|
||||||
f.save()
|
f.save()
|
||||||
|
|
||||||
|
files = []
|
||||||
|
if self.cleaned_data['attachment']:
|
||||||
|
import mimetypes
|
||||||
|
file = self.cleaned_data['attachment']
|
||||||
|
filename = file.name.replace(' ', '_')
|
||||||
|
a = Attachment(
|
||||||
|
followup=f,
|
||||||
|
filename=filename,
|
||||||
|
mime_type=mimetypes.guess_type(filename)[0] or 'application/octet-stream',
|
||||||
|
size=file.size,
|
||||||
|
)
|
||||||
|
a.file.save(file.name, file, save=False)
|
||||||
|
a.save()
|
||||||
|
|
||||||
|
if file.size < getattr(settings, 'MAX_EMAIL_ATTACHMENT_SIZE', 512000):
|
||||||
|
# Only files smaller than 512kb (or as defined in
|
||||||
|
# settings.MAX_EMAIL_ATTACHMENT_SIZE) are sent via email.
|
||||||
|
files.append(a.file.path)
|
||||||
|
|
||||||
context = {
|
context = {
|
||||||
'ticket': t,
|
'ticket': t,
|
||||||
'queue': q,
|
'queue': q,
|
||||||
@ -218,6 +273,7 @@ class PublicTicketForm(forms.Form):
|
|||||||
recipients=t.submitter_email,
|
recipients=t.submitter_email,
|
||||||
sender=q.from_address,
|
sender=q.from_address,
|
||||||
fail_silently=True,
|
fail_silently=True,
|
||||||
|
files=files,
|
||||||
)
|
)
|
||||||
|
|
||||||
if q.new_ticket_cc:
|
if q.new_ticket_cc:
|
||||||
@ -227,6 +283,7 @@ class PublicTicketForm(forms.Form):
|
|||||||
recipients=q.new_ticket_cc,
|
recipients=q.new_ticket_cc,
|
||||||
sender=q.from_address,
|
sender=q.from_address,
|
||||||
fail_silently=True,
|
fail_silently=True,
|
||||||
|
files=files,
|
||||||
)
|
)
|
||||||
|
|
||||||
if q.updated_ticket_cc and q.updated_ticket_cc != q.new_ticket_cc:
|
if q.updated_ticket_cc and q.updated_ticket_cc != q.new_ticket_cc:
|
||||||
@ -236,6 +293,7 @@ class PublicTicketForm(forms.Form):
|
|||||||
recipients=q.updated_ticket_cc,
|
recipients=q.updated_ticket_cc,
|
||||||
sender=q.from_address,
|
sender=q.from_address,
|
||||||
fail_silently=True,
|
fail_silently=True,
|
||||||
|
files=files,
|
||||||
)
|
)
|
||||||
|
|
||||||
return t
|
return t
|
||||||
|
@ -7,35 +7,19 @@
|
|||||||
|
|
||||||
<p>Unless otherwise stated, all fields are required. Please provide as descriptive a title and description as possible.</p>{% endblocktrans %}
|
<p>Unless otherwise stated, all fields are required. Please provide as descriptive a title and description as possible.</p>{% endblocktrans %}
|
||||||
|
|
||||||
<form method='post' action='./'>
|
<form method='post' action='./' encrypt='multipart/form-data'>
|
||||||
<fieldset>
|
<fieldset>
|
||||||
<dl>
|
<dl>
|
||||||
<dt><label for='id_queue'>{{ form.queue.label }}</label></dt>
|
{% for field in form %}
|
||||||
<dd>{{ form.queue }}</dd>
|
{% if field.is_hidden %}
|
||||||
{% if form.queue.errors %}<dd class='error'>{{ form.queue.errors }}</dd>{% endif %}
|
{{ field }}
|
||||||
|
{% else %}
|
||||||
<dt><label for='id_title'>{{ form.title.label }}</label></dt>
|
<dt><label for='id_{{ field.name }}'>{{ field.label }}</label>{% if not field.field.required %} <span class='form_optional'>{% trans "(Optional)" %}</span>{% endif %}</dt>
|
||||||
<dd>{{ form.title }}</dd>
|
<dd>{{ field }}</dd>
|
||||||
{% if form.title.errors %}<dd class='error'>{{ form.title.errors }}</dd>{% endif %}
|
{% if field.errors %}<dd class='error'>{{ field.errors }}</dd>{% endif %}
|
||||||
|
{% if field.help_text %}<dd class='form_help_text'>{{ field.help_text }}</dd>{% endif %}</label>
|
||||||
<dt><label for='id_submitter_email'>{{ form.submitter_email.label }}</label> <span class='form_optional'>{% trans "(Optional)" %}</span></dt>
|
{% endif %}
|
||||||
<dd>{{ form.submitter_email }}</dd>
|
{% endfor %}
|
||||||
{% if form.submitter_email.errors %}<dd class='error'>{{ form.submitter_email.errors }}</dd>{% endif %}
|
|
||||||
<dd class='form_help_text'>{{ form.submitter_email.help_text }}</dd>
|
|
||||||
|
|
||||||
<dt><label for='id_body'>{{ form.body.label }}</label></dt>
|
|
||||||
<dd>{{ form.body }}</dd>
|
|
||||||
{% if form.body.errors %}<dd class='error'>{{ form.body.errors }}</dd>{% endif %}
|
|
||||||
|
|
||||||
<dt><label for='id_assigned_to'>{{ form.assigned_to.label }}</label> <span class='form_optional'>{% trans "(Optional)" %}</span></dt>
|
|
||||||
<dd>{{ form.assigned_to }}</dd>
|
|
||||||
{% if form.assigned_to.errors %}<dd class='error'>{{ form.assigned_to.errors }}</dd>{% endif %}
|
|
||||||
<dd class='form_help_text'>{{ form.assigned_to.help_text }}</dd>
|
|
||||||
|
|
||||||
<dt><label for='id_priority'>{{ form.priority.label }}</label></dt>
|
|
||||||
<dd>{{ form.priority }}</dd>
|
|
||||||
{% if form.priority.errors %}<dd class='error'>{{ form.priority.errors }}</dd>{% endif %}
|
|
||||||
<dd class='form_help_text'>{{ form.priority.help_text }}</dd>
|
|
||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
<div class='buttons'>
|
<div class='buttons'>
|
||||||
|
@ -21,35 +21,19 @@
|
|||||||
|
|
||||||
<p>{% trans "All fields are required. Please provide as descriptive a title and description as possible." %}</p>
|
<p>{% trans "All fields are required. Please provide as descriptive a title and description as possible." %}</p>
|
||||||
|
|
||||||
<form method='post' action='./#submit'>
|
<form method='post' action='./#submit' enctype='multipart/form-data'>
|
||||||
<fieldset>
|
<fieldset>
|
||||||
<dl>
|
<dl>
|
||||||
<dt><label for='id_queue'>{{ form.queue.label }}</label></dt>
|
{% for field in form %}
|
||||||
<dd>{{ form.queue }}</dd>
|
{% if field.is_hidden %}
|
||||||
{% if form.queue.errors %}
|
{{ field }}
|
||||||
<dd class='error'>{{ form.queue.errors }}</dd>{% endif %}
|
{% else %}
|
||||||
|
<dt><label for='id_{{ field.name }}'>{{ field.label }}</label>{% if not field.field.required %} <span class='form_optional'>{% trans "(Optional)" %}</span>{% endif %}</dt>
|
||||||
<dt><label for='id_title'>{{ form.title.label }}</label></dt>
|
<dd>{{ field }}</dd>
|
||||||
<dd>{{ form.title }}</dd>
|
{% if field.errors %}<dd class='error'>{{ field.errors }}</dd>{% endif %}
|
||||||
{% if form.title.errors %}
|
{% if field.help_text %}<dd class='form_help_text'>{{ field.help_text }}</dd>{% endif %}</label>
|
||||||
<dd class='error'>{{ form.title.errors }}</dd>{% endif %}
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
<dt><label for='id_submitter_email'>{{ form.submitter_email.label }}</label></dt>
|
|
||||||
<dd>{{ form.submitter_email }}</dd>
|
|
||||||
{% if form.submitter_email.errors %}
|
|
||||||
<dd class='error'>{{ form.submitter_email.errors }}</dd>{% endif %}
|
|
||||||
<dd class='form_help_text'>{{ form.submitter_email.help_text }}</dd>
|
|
||||||
|
|
||||||
<dt><label for='id_body'>{{ form.body.label }}</label></dt>
|
|
||||||
<dd>{{ form.body }}</dd>
|
|
||||||
{% if form.body.errors %}
|
|
||||||
<dd class='error'>{{ form.body.errors }}</dd>{% endif %}
|
|
||||||
|
|
||||||
<dt><label for='id_priority'>{{ form.priority.label }}</label></dt>
|
|
||||||
<dd>{{ form.priority }}</dd>
|
|
||||||
{% if form.priority.errors %}
|
|
||||||
<dd class='error'>{{ form.priority.errors }}</dd>{% endif %}
|
|
||||||
<dd class='form_help_text'>{{ form.priority.help_text }}</dd>
|
|
||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
<div class='buttons'>
|
<div class='buttons'>
|
||||||
|
@ -28,7 +28,7 @@ def homepage(request):
|
|||||||
return HttpResponseRedirect(reverse('helpdesk_dashboard'))
|
return HttpResponseRedirect(reverse('helpdesk_dashboard'))
|
||||||
|
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
form = PublicTicketForm(request.POST)
|
form = PublicTicketForm(request.POST, request.FILES)
|
||||||
form.fields['queue'].choices = [('', '--------')] + [[q.id, q.title] for q in Queue.objects.filter(allow_public_submission=True)]
|
form.fields['queue'].choices = [('', '--------')] + [[q.id, q.title] for q in Queue.objects.filter(allow_public_submission=True)]
|
||||||
if form.is_valid():
|
if form.is_valid():
|
||||||
ticket = form.save()
|
ticket = form.save()
|
||||||
|
@ -402,7 +402,7 @@ ticket_list = staff_member_required(ticket_list)
|
|||||||
|
|
||||||
def create_ticket(request):
|
def create_ticket(request):
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
form = TicketForm(request.POST)
|
form = TicketForm(request.POST, request.FILES)
|
||||||
form.fields['queue'].choices = [('', '--------')] + [[q.id, q.title] for q in Queue.objects.all()]
|
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)]
|
form.fields['assigned_to'].choices = [('', '--------')] + [[u.id, u.username] for u in User.objects.filter(is_active=True)]
|
||||||
if form.is_valid():
|
if form.is_valid():
|
||||||
|
Loading…
Reference in New Issue
Block a user