Add basic ability to download Ordering Batch as Excel spreadsheet

This commit is contained in:
Lance Edgar 2017-05-24 21:13:18 -05:00
parent b841ce664e
commit 522aad5880
3 changed files with 52 additions and 0 deletions

View file

@ -83,6 +83,7 @@ requires = [
'humanize', # 0.5.1 'humanize', # 0.5.1
'Mako', # 0.6.2 'Mako', # 0.6.2
'openpyxl', # 2.4.7
'pyramid_beaker>=0.6', # 0.6.1 'pyramid_beaker>=0.6', # 0.6.1
'pyramid_debugtoolbar', # 1.0 'pyramid_debugtoolbar', # 1.0
'pyramid_exclog', # 0.6 'pyramid_exclog', # 0.6

View file

@ -27,6 +27,13 @@
${h.stylesheet_link(request.static_url('tailbone:static/css/purchases.css'))} ${h.stylesheet_link(request.static_url('tailbone:static/css/purchases.css'))}
</%def> </%def>
<%def name="context_menu_items()">
${parent.context_menu_items()}
% if request.has_perm('{}.download_excel'.format(permission_prefix)):
<li>${h.link_to("Download {} as Excel".format(model_title), url('{}.download_excel'.format(route_prefix), uuid=batch.uuid))}</li>
% endif
</%def>
<%def name="leading_buttons()"> <%def name="leading_buttons()">
% if not batch.complete and not batch.executed and request.has_perm('ordering.order_form'): % if not batch.complete and not batch.executed and request.has_perm('ordering.order_form'):
<button type="button" id="order-form">Ordering Form</button> <button type="button" id="order-form">Ordering Form</button>

View file

@ -26,12 +26,18 @@ Views for 'ordering' (purchasing) batches
from __future__ import unicode_literals, absolute_import from __future__ import unicode_literals, absolute_import
import os
import six
import openpyxl
from sqlalchemy import orm from sqlalchemy import orm
from rattail.db import model, api from rattail.db import model, api
from rattail.core import Object from rattail.core import Object
from rattail.time import localtime from rattail.time import localtime
from pyramid.response import FileResponse
from tailbone import forms from tailbone import forms
from tailbone.views.purchasing import PurchasingBatchView from tailbone.views.purchasing import PurchasingBatchView
@ -218,6 +224,37 @@ class OrderingBatchView(PurchasingBatchView):
'batch_po_total': '${:0,.2f}'.format(batch.po_total or 0), 'batch_po_total': '${:0,.2f}'.format(batch.po_total or 0),
} }
def download_excel(self):
"""
Download ordering batch as Excel spreadsheet.
"""
batch = self.get_instance()
# populate Excel worksheet
workbook = openpyxl.Workbook()
worksheet = workbook.active
worksheet.title = "Purchase Order"
worksheet.append(["Store", "Vendor", "Date ordered"])
worksheet.append([batch.store.name, batch.vendor.name, batch.date_ordered.strftime('%m/%d/%Y')])
worksheet.append([])
worksheet.append(['vendor_code', 'upc', 'brand_name', 'description', 'case_quantity', 'cases_ordered', 'units_ordered'])
for row in batch.active_rows():
worksheet.append([row.vendor_code, six.text_type(row.upc), row.brand_name,
'{} {}'.format(row.description, row.size),
row.case_quantity, row.cases_ordered, row.units_ordered])
# write Excel file to batch data dir
filedir = batch.filedir(self.rattail_config)
if not os.path.exists(filedir):
os.makedirs(filedir)
filename = 'PO.{}.xlsx'.format(batch.id_str)
path = batch.filepath(self.rattail_config, filename)
workbook.save(path)
response = FileResponse(path, request=self.request)
response.content_length = os.path.getsize(path)
response.content_disposition = b'attachment; filename="{}"'.format(filename)
return response
@classmethod @classmethod
def defaults(cls, config): def defaults(cls, config):
@ -242,6 +279,13 @@ class OrderingBatchView(PurchasingBatchView):
config.add_view(cls, attr='order_form_update', route_name='{}.order_form_update'.format(route_prefix), config.add_view(cls, attr='order_form_update', route_name='{}.order_form_update'.format(route_prefix),
renderer='json', permission='{}.order_form'.format(permission_prefix)) renderer='json', permission='{}.order_form'.format(permission_prefix))
# download as Excel
config.add_route('{}.download_excel'.format(route_prefix), '{}/{{uuid}}/excel'.format(url_prefix))
config.add_view(cls, attr='download_excel', route_name='{}.download_excel'.format(route_prefix),
permission='{}.download_excel'.format(permission_prefix))
config.add_tailbone_permission(permission_prefix, '{}.download_excel'.format(permission_prefix),
"Download {} as Excel".format(model_title))
def includeme(config): def includeme(config):
OrderingBatchView.defaults(config) OrderingBatchView.defaults(config)