forked from extern/django-helpdesk
* Removed e-mail templates to the database
* Added statistics views, making use of Google Charts * Added initial data fixture, to automatically create e-mail templates at install-time
This commit is contained in:
121
lib.py
121
lib.py
@ -5,6 +5,39 @@ Jutda Helpdesk - A Django powered ticket tracker for small enterprise.
|
||||
|
||||
lib.py - Common functions (eg multipart e-mail)
|
||||
"""
|
||||
def send_templated_mail(template_name, email_context, recipients, sender=None, bcc=None, fail_silently=False, files=None):
|
||||
from helpdesk.models import EmailTemplate
|
||||
from django.core.mail import EmailMultiAlternatives
|
||||
from django.template import loader, Context
|
||||
from django.conf import settings
|
||||
|
||||
t = EmailTemplate.objects.get(template_name__iexact=template_name)
|
||||
|
||||
if not sender:
|
||||
sender = settings.DEFAULT_FROM_EMAIL
|
||||
|
||||
context = Context(email_context)
|
||||
|
||||
text_part = loader.get_template_from_string("%s{%% include 'helpdesk/email_text_footer.txt' %%}" % t.plain_text).render(context)
|
||||
html_part = loader.get_template_from_string("{%% extends 'helpdesk/email_html_base.html' %%}{%% block title %%}%s{%% endblock %%}{%% block content %%}%s{%% endblock %%}" % (t.heading, t.html)).render(context)
|
||||
subject_part = loader.get_template_from_string("{{ ticket.ticket }} {{ ticket.title }} %s" % t.subject).render(context)
|
||||
|
||||
if type(recipients) != list:
|
||||
recipients = [recipients,]
|
||||
|
||||
msg = EmailMultiAlternatives(subject_part, text_part, sender, recipients, bcc=bcc)
|
||||
msg.attach_alternative(html_part, "text/html")
|
||||
|
||||
if files:
|
||||
if type(files) != list:
|
||||
files = [files,]
|
||||
|
||||
for file in files:
|
||||
msg.attach_file(file)
|
||||
|
||||
return msg.send(fail_silently)
|
||||
|
||||
|
||||
|
||||
def send_multipart_mail(template_name, email_context, subject, recipients, sender=None, bcc=None, fail_silently=False, files=None):
|
||||
"""
|
||||
@ -58,14 +91,96 @@ def send_multipart_mail(template_name, email_context, subject, recipients, sende
|
||||
return msg.send(fail_silently)
|
||||
|
||||
|
||||
def normalise_to_100(data):
|
||||
def normalise_data(data, to=100):
|
||||
"""
|
||||
Used for normalising data prior to graphing with Google charting API
|
||||
"""
|
||||
max_value = max(data)
|
||||
if max_value > 100:
|
||||
if max_value > to:
|
||||
new_data = []
|
||||
for d in data:
|
||||
new_data.append(int(d/float(max_value)*100))
|
||||
new_data.append(int(d/float(max_value)*to))
|
||||
data = new_data
|
||||
return data
|
||||
|
||||
chart_colours = ('80C65A', '990066', 'FF9900', '3399CC', 'BBCCED', '3399CC', 'FFCC33')
|
||||
|
||||
def line_chart(data):
|
||||
"""
|
||||
'data' is a list of lists making a table.
|
||||
Row 1, columns 2-n are data headings (the time periods)
|
||||
Rows 2-n are data, with column 1 being the line labels
|
||||
"""
|
||||
|
||||
column_headings = data[0][1:]
|
||||
max = 0
|
||||
for row in data[1:]:
|
||||
for field in row[1:]:
|
||||
if field > max:
|
||||
max = field
|
||||
|
||||
|
||||
# Set width to '65px * number of months'.
|
||||
chart_url = 'http://chart.apis.google.com/chart?cht=lc&chs=%sx90&chd=t:' % (len(column_headings)*65)
|
||||
first_row = True
|
||||
row_headings = []
|
||||
for row in data[1:]:
|
||||
# Add data to URL, normalised to the maximum for all lines on this chart
|
||||
norm = normalise_data(row[1:], max)
|
||||
if not first_row:
|
||||
chart_url += '|'
|
||||
chart_url += ','.join([str(num) for num in norm])
|
||||
row_headings.append(row[0])
|
||||
first_row = False
|
||||
|
||||
chart_url += '&chds='
|
||||
rows = len(data)-1
|
||||
first = True
|
||||
for row in range(rows):
|
||||
# Set maximum data ranges to '0:x' where 'x' is the maximum number in use.
|
||||
if not first:
|
||||
chart_url += ','
|
||||
chart_url += '0,%s' % max
|
||||
first = False
|
||||
chart_url += '&chdl=%s' % '|'.join(row_headings) # Display legend/labels
|
||||
chart_url += '&chco=%s' % ','.join(chart_colours) # Default colour set
|
||||
chart_url += '&chxt=x,y' # Turn on axis labels
|
||||
chart_url += '&chxl=0:|%s|1:|0|%s' % ('|'.join(column_headings), max) # Axis Label Text
|
||||
|
||||
return chart_url
|
||||
|
||||
def bar_chart(data):
|
||||
"""
|
||||
'data' is a list of lists making a table.
|
||||
Row 1, columns 2-n are data headings
|
||||
Rows 2-n are data, with column 1 being the line labels
|
||||
"""
|
||||
|
||||
column_headings = data[0][1:]
|
||||
max = 0
|
||||
for row in data[1:]:
|
||||
for field in row[1:]:
|
||||
if field > max:
|
||||
max = field
|
||||
|
||||
|
||||
# Set width to '150px * number of months'.
|
||||
chart_url = 'http://chart.apis.google.com/chart?cht=bvg&chs=%sx90&chd=t:' % (len(column_headings) * 150)
|
||||
first_row = True
|
||||
row_headings = []
|
||||
for row in data[1:]:
|
||||
# Add data to URL, normalised to the maximum for all lines on this chart
|
||||
norm = normalise_data(row[1:], max)
|
||||
if not first_row:
|
||||
chart_url += '|'
|
||||
chart_url += ','.join([str(num) for num in norm])
|
||||
row_headings.append(row[0])
|
||||
first_row = False
|
||||
|
||||
chart_url += '&chds=0,%s' % max
|
||||
chart_url += '&chdl=%s' % '|'.join(row_headings) # Display legend/labels
|
||||
chart_url += '&chco=%s' % ','.join(chart_colours) # Default colour set
|
||||
chart_url += '&chxt=x,y' # Turn on axis labels
|
||||
chart_url += '&chxl=0:|%s|1:|0|%s' % ('|'.join(column_headings), max) # Axis Label Text
|
||||
|
||||
return chart_url
|
||||
|
Reference in New Issue
Block a user