Don't save svg, return rendering at api endpoint.

One less layer of needless indirection is nice, but I did this so that I could
use this app on heroku, which does not allow saving files to the file-system.
This commit is contained in:
Tyler Hallada 2014-07-28 22:32:38 -04:00
parent 09cb0a311c
commit 0175764b17
3 changed files with 14 additions and 11 deletions

View File

@ -33,21 +33,26 @@ def get_num_machines_per_status(status, records):
len(filter(lambda r: r.machine.type == DRYER and len(filter(lambda r: r.machine.type == DRYER and
r.availability == status, records))] r.availability == status, records))]
def generate_current_chart(filepath, records, hall): def generate_current_chart(records, hall, filepath=None):
""" """
Generate stacked bar chart of current laundry usage for specified hall and Generate stacked bar chart of current laundry usage for specified hall and
save svg at filepath. save svg at filepath.
""" """
custom_style = Style(colors=('#B6E354', '#FF5995', '#FEED6C', '#E41B17')) custom_style = Style(colors=('#B6E354', '#FF5995', '#FEED6C', '#E41B17'))
chart = pygal.StackedBar(style=custom_style, width=800, height=512, explicit_size=True) chart = pygal.StackedBar(style=custom_style, width=800, height=512,
explicit_size=True)
chart.title = 'Current laundry machine usage in ' + hall.name chart.title = 'Current laundry machine usage in ' + hall.name
chart.x_labels = ['Washers', 'Dryers'] chart.x_labels = ['Washers', 'Dryers']
print records
chart.add('Available', get_num_machines_per_status(AVAILABLE, records)) chart.add('Available', get_num_machines_per_status(AVAILABLE, records))
chart.add('In Use', get_num_machines_per_status(IN_USE, records)) chart.add('In Use', get_num_machines_per_status(IN_USE, records))
chart.add('Cycle Complete', get_num_machines_per_status(CYCLE_COMPLETE, records)) chart.add('Cycle Complete', get_num_machines_per_status(CYCLE_COMPLETE, records))
chart.add('Unavailable', get_num_machines_per_status(UNAVAILABLE, records)) chart.add('Unavailable', get_num_machines_per_status(UNAVAILABLE, records))
chart.range = [0, 11] chart.range = [0, 11]
chart.render_to_file(filepath) if filepath:
chart.render_to_file(filepath)
else:
return chart.render()
# NOTE: Abandoning generating the weekly chart via mysql and Django for now. # NOTE: Abandoning generating the weekly chart via mysql and Django for now.
# (cron script and csv file is just easier) Sorry if there are a lot of # (cron script and csv file is just easier) Sorry if there are a lot of
@ -112,9 +117,8 @@ def update(hall, filepath=None):
machine = LaundryMachine.objects.get(number=number, hall=hall) machine = LaundryMachine.objects.get(number=number, hall=hall)
record = LaundryRecord(machine=machine, availability=availability, record = LaundryRecord(machine=machine, availability=availability,
time_remaining=time_remaining) time_remaining=time_remaining)
if filepath: records.append(record)
records.append(record)
else:
record.save()
if filepath: if filepath:
generate_current_chart(filepath, records, hall) generate_current_chart(records, hall, filepath=filepath)
else:
return generate_current_chart(records, hall)

View File

@ -27,7 +27,7 @@ function update_charts(selected) {
request = $.ajax({ request = $.ajax({
url: '/ajax/current/' + halls[selected] url: '/ajax/current/' + halls[selected]
}).done(function (result) { }).done(function (result) {
svg.attr('src', result); svg.attr('src', '/ajax/current/' + halls[selected]);
$('#loading').remove(); $('#loading').remove();
console.log(svg); console.log(svg);
$('.current-chart').append(svg); $('.current-chart').append(svg);

View File

@ -23,7 +23,6 @@ def ajax_get_current(request, hall):
hall_obj = get_object_or_404(Hall, pk=hall) hall_obj = get_object_or_404(Hall, pk=hall)
filename = str(hall_obj.id) + '_current.svg' filename = str(hall_obj.id) + '_current.svg'
try: try:
laundry.update(hall_obj, filepath=join(SVG_DIR, filename)) return HttpResponse(laundry.update(hall_obj), content_type='image/svg+xml')
except ObjectDoesNotExist: except ObjectDoesNotExist:
return HttpResponse(status=500); return HttpResponse(status=500);
return HttpResponse(join(SVG_URL, filename))