diff --git a/tailbone/templates/batch/view.mako b/tailbone/templates/batch/view.mako index c2cfd609..8739f126 100644 --- a/tailbone/templates/batch/view.mako +++ b/tailbone/templates/batch/view.mako @@ -63,7 +63,7 @@ <%def name="refresh_button()"> % if master.viewing and master.batch_refreshable(batch) and request.has_perm('{}.refresh'.format(permission_prefix)): - + % endif diff --git a/tailbone/views/batch/core.py b/tailbone/views/batch/core.py index e7a216ed..ab28c429 100644 --- a/tailbone/views/batch/core.py +++ b/tailbone/views/batch/core.py @@ -492,7 +492,7 @@ class BatchMasterView(MasterView): def get_execute_title(self, batch): if hasattr(self.handler, 'get_execute_title'): return self.handler.get_execute_title(batch) - return "Execute this batch" + return "Execute Batch" def prefill(self): """ diff --git a/tailbone/views/vendors/invoices.py b/tailbone/views/vendors/invoices.py index c3e01793..7ee6ed6e 100644 --- a/tailbone/views/vendors/invoices.py +++ b/tailbone/views/vendors/invoices.py @@ -2,7 +2,7 @@ ################################################################################ # # Rattail -- Retail Software Framework -# Copyright © 2010-2017 Lance Edgar +# Copyright © 2010-2018 Lance Edgar # # This file is part of Rattail. # @@ -29,10 +29,11 @@ from __future__ import unicode_literals, absolute_import from rattail.db import model, api from rattail.vendors.invoices import iter_invoice_parsers, require_invoice_parser -import formalchemy +# import formalchemy +import colander +from deform import widget as dfwidget -from tailbone.db import Session -from tailbone.views.batch import FileBatchMasterView2 as FileBatchMasterView +from tailbone.views.batch import FileBatchMasterView3 as FileBatchMasterView class VendorInvoicesView(FileBatchMasterView): @@ -45,11 +46,27 @@ class VendorInvoicesView(FileBatchMasterView): url_prefix = '/vendors/invoices' grid_columns = [ + 'id', + 'vendor', + 'invoice_date', + 'purchase_order_number', + 'filename', 'created', 'created_by', + 'executed', + ] + + form_fields = [ + 'id', 'vendor', 'filename', + 'parser_key', + 'purchase_order_number', + 'invoice_date', + 'created', + 'created_by', 'executed', + 'executed_by', ] row_grid_columns = [ @@ -70,56 +87,78 @@ class VendorInvoicesView(FileBatchMasterView): def configure_grid(self, g): super(VendorInvoicesView, self).configure_grid(g) - g.joiners['vendor'] = lambda q: q.join(model.Vendor) - g.filters['vendor'] = g.make_filter('vendor', model.Vendor.name, - default_active=True, default_verb='contains') - g.sorters['vendor'] = g.make_sorter(model.Vendor.name) - def configure_fieldset(self, fs): - fs.purchase_order_number.set(label=self.handler.po_number_title) - fs.purchase_order_number.set(validate=self.validate_po_number) - fs.filename.set(label="Invoice File") + # vendor + g.set_joiner('vendor', lambda q: q.join(model.Vendor)) + g.set_filter('vendor', model.Vendor.name, + default_active=True, + default_verb='contains') + g.set_sorter('vendor', model.Vendor.name) + g.set_link('vendor') - fs.configure( - include=[ - fs.vendor.readonly(), - fs.filename, - fs.parser_key, - fs.purchase_order_number, - fs.invoice_date.readonly(), - fs.created, - fs.created_by, - fs.executed, - fs.executed_by, - ]) + # invoice_date + g.set_link('invoice_date') + # purchase_order_number + g.set_link('purchase_order_number') + + # filename + g.set_link('filename') + + # created + g.set_link('created', False) + + # executed + g.set_link('executed', False) + + def configure_form(self, f): + super(VendorInvoicesView, self).configure_form(f) + + # vendor + if self.creating: + f.remove_field('vendor') + else: + f.set_readonly('vendor') + + # purchase_order_number + f.set_label('purchase_order_number', self.handler.po_number_title) + # f.set_validator('purchase_order_number', self.validate_po_number) + + # filename + f.set_label('filename', "Invoice File") + + # invoice_date + if self.creating: + f.remove_field('invoice_date') + else: + f.set_readonly('invoice_date') + + # parser_key if self.creating: parsers = sorted(iter_invoice_parsers(), key=lambda p: p.display) - parser_options = [(p.display, p.key) for p in parsers] - parser_options.insert(0, ("(please choose)", '')) - fs.parser_key.set(label="File Type", - renderer=formalchemy.fields.SelectFieldRenderer, - options=parser_options) - del fs.vendor - del fs.invoice_date - + parser_values = [(p.key, p.display) for p in parsers] + parser_values.insert(0, ('', "(please choose)")) + f.set_widget('parser_key', dfwidget.SelectWidget(values=parser_values)) + f.set_label('parser_key', "File Type") else: - del fs.parser_key + f.remove_field('parser_key') - def validate_po_number(self, value, field): - """ - Let the invoice handler in effect determine if the user-provided - purchase order number is valid. - """ - parser_key = field.parent.parser_key.value - if not parser_key: - raise formalchemy.ValidationError("Cannot validate PO number until File Type is chosen") - parser = require_invoice_parser(parser_key) - vendor = api.get_vendor(Session(), parser.vendor_key) - try: - self.handler.validate_po_number(value, vendor) - except ValueError as error: - raise formalchemy.ValidationError(unicode(error)) + # TODO: this is not needed for now, and this whole thing should be merged + # with the Purchasing Batch system anyway... + # def validate_po_number(self, value, field): + # """ + # Let the invoice handler in effect determine if the user-provided + # purchase order number is valid. + # """ + # parser_key = field.parent.parser_key.value + # if not parser_key: + # raise formalchemy.ValidationError("Cannot validate PO number until File Type is chosen") + # parser = require_invoice_parser(parser_key) + # vendor = api.get_vendor(self.Session(), parser.vendor_key) + # try: + # self.handler.validate_po_number(value, vendor) + # except ValueError as error: + # raise formalchemy.ValidationError(unicode(error)) def get_batch_kwargs(self, batch): kwargs = super(VendorInvoicesView, self).get_batch_kwargs(batch) @@ -128,7 +167,7 @@ class VendorInvoicesView(FileBatchMasterView): def init_batch(self, batch): parser = require_invoice_parser(batch.parser_key) - vendor = api.get_vendor(Session(), parser.vendor_key) + vendor = api.get_vendor(self.Session(), parser.vendor_key) if not vendor: self.request.session.flash("No vendor setting found in database for key: {}".format(parser.vendor_key)) return False