diff --git a/tailbone/helpers.py b/tailbone/helpers.py index 14282c43..a3d07f79 100644 --- a/tailbone/helpers.py +++ b/tailbone/helpers.py @@ -2,7 +2,7 @@ ################################################################################ # # Rattail -- Retail Software Framework -# Copyright © 2010-2020 Lance Edgar +# Copyright © 2010-2021 Lance Edgar # # This file is part of Rattail. # @@ -38,7 +38,9 @@ from rattail.db.util import maxlen from webhelpers2.html import * from webhelpers2.html.tags import * -from tailbone.util import csrf_token, get_csrf_token, pretty_datetime, raw_datetime +from tailbone.util import (csrf_token, get_csrf_token, + pretty_datetime, raw_datetime, + route_exists) def pretty_date(date): diff --git a/tailbone/templates/batch/vendorcatalog/index.mako b/tailbone/templates/batch/vendorcatalog/index.mako index 70412b39..fa6e4a5a 100644 --- a/tailbone/templates/batch/vendorcatalog/index.mako +++ b/tailbone/templates/batch/vendorcatalog/index.mako @@ -3,7 +3,7 @@ <%def name="context_menu_items()"> ${parent.context_menu_items()} - % if request.has_perm('vendors.list'): + % if h.route_exists(request, 'vendors') and request.has_perm('vendors.list'):
  • ${h.link_to("View Vendors", url('vendors'))}
  • % endif diff --git a/tailbone/util.py b/tailbone/util.py index 08ffd4cd..c0ab4e3e 100644 --- a/tailbone/util.py +++ b/tailbone/util.py @@ -2,7 +2,7 @@ ################################################################################ # # Rattail -- Retail Software Framework -# Copyright © 2010-2020 Lance Edgar +# Copyright © 2010-2021 Lance Edgar # # This file is part of Rattail. # @@ -37,6 +37,7 @@ from rattail.files import resource_path import colander from pyramid.renderers import get_renderer +from pyramid.interfaces import IRoutesMapper from webhelpers2.html import HTML, tags @@ -239,3 +240,14 @@ def email_address_is_valid(address): except colander.Invalid: return False return True + + +def route_exists(request, route_name): + """ + Checks for existence of the given route name, within the running app + config. Returns boolean indicating whether it exists. + """ + reg = request.registry + mapper = reg.getUtility(IRoutesMapper) + route = mapper.get_route(route_name) + return bool(route) diff --git a/tailbone/views/batch/vendorcatalog.py b/tailbone/views/batch/vendorcatalog.py index f7b5b15a..adcf5dff 100644 --- a/tailbone/views/batch/vendorcatalog.py +++ b/tailbone/views/batch/vendorcatalog.py @@ -58,6 +58,10 @@ class VendorCatalogView(FileBatchMasterView): editable = False rows_bulk_deletable = True + labels = { + 'vendor_id': "Vendor ID", + } + grid_columns = [ 'id', 'vendor', @@ -107,6 +111,7 @@ class VendorCatalogView(FileBatchMasterView): 'brand_name', 'description', 'size', + 'is_preferred_vendor', 'old_vendor_code', 'vendor_code', 'old_case_size', @@ -148,7 +153,7 @@ class VendorCatalogView(FileBatchMasterView): # vendor f.set_renderer('vendor', self.render_vendor) - if self.creating: + if self.creating and 'vendor' in f: f.replace('vendor', 'vendor_uuid') f.set_node('vendor_uuid', colander.String()) vendor_display = "" @@ -167,24 +172,19 @@ class VendorCatalogView(FileBatchMasterView): # filename f.set_label('filename', "Catalog File") + # parser_key if self.creating: - - f.set_fields([ - 'filename', - 'parser_key', - 'vendor_uuid', - 'future', - 'description', - 'notes', - ]) - - parser_values = [(p.key, p.display) for p in self.get_parsers()] - parser_values.insert(0, ('', "(please choose)")) - f.set_widget('parser_key', dfwidget.SelectWidget(values=parser_values)) + if 'parser_key' not in f: + f.insert_after('filename', 'parser_key') + values = [(p.key, p.display) for p in self.get_parsers()] + values.insert(0, ('', "(please choose)")) + f.set_widget('parser_key', dfwidget.SelectWidget(values=values)) f.set_label('parser_key', "File Type") # effective - if not self.creating: + if self.creating: + f.remove('effective') + else: f.set_readonly('effective') def get_batch_kwargs(self, batch): @@ -194,6 +194,10 @@ class VendorCatalogView(FileBatchMasterView): kwargs['vendor'] = batch.vendor elif batch.vendor_uuid: kwargs['vendor_uuid'] = batch.vendor_uuid + if batch.vendor_id: + kwargs['vendor_id'] = batch.vendor_id + if batch.vendor_name: + kwargs['vendor_name'] = batch.vendor_name kwargs['future'] = batch.future return kwargs @@ -227,7 +231,8 @@ class VendorCatalogView(FileBatchMasterView): row.STATUS_UPDATE_COST, # TODO: deprecate/remove this one row.STATUS_CHANGE_VENDOR_ITEM_CODE, row.STATUS_CHANGE_CASE_SIZE, - row.STATUS_CHANGE_COST): + row.STATUS_CHANGE_COST, + row.STATUS_CHANGE_PRODUCT): return 'notice' def configure_row_form(self, f):