Several disparate changes needed for vendor catalog improvements

- invoke vendor handler where appropriate, e.g. for parsers
- reverse "polarity" of dropdown chooser setting; rename it
- tweak autocomplete behavior yet again, for dynamic values
- auto-select vendor upon parser selection, when possible
This commit is contained in:
Lance Edgar 2022-01-07 19:27:10 -06:00
parent ab61778d35
commit 88b3279e63
12 changed files with 164 additions and 93 deletions

View file

@ -30,15 +30,13 @@ import logging
import six
from rattail.db import model, api
from rattail.vendors.catalogs import iter_catalog_parsers
from rattail.db import model
import colander
from deform import widget as dfwidget
from webhelpers2.html import tags
from tailbone import forms
from tailbone.db import Session
from tailbone.views.batch import FileBatchMasterView
from tailbone.diffs import Diff
@ -139,13 +137,9 @@ class VendorCatalogView(FileBatchMasterView):
def get_parsers(self):
if not hasattr(self, 'parsers'):
parsers = sorted(iter_catalog_parsers(), key=lambda p: p.display)
supported = self.rattail_config.getlist(
'tailbone', 'batch.vendorcatalog.supported_parsers')
if supported:
parsers = [parser for parser in parsers
if parser.key in supported]
self.parsers = parsers
app = self.get_rattail_app()
vendor_handler = app.get_vendor_handler()
self.parsers = vendor_handler.get_supported_catalog_parsers()
return self.parsers
def configure_grid(self, g):
@ -160,24 +154,8 @@ class VendorCatalogView(FileBatchMasterView):
def configure_form(self, f):
super(VendorCatalogView, self).configure_form(f)
# vendor
f.set_renderer('vendor', self.render_vendor)
if self.creating and 'vendor' in f:
f.replace('vendor', 'vendor_uuid')
f.set_node('vendor_uuid', colander.String())
vendor_display = ""
if self.request.method == 'POST':
if self.request.POST.get('vendor_uuid'):
vendor = self.Session.query(model.Vendor).get(self.request.POST['vendor_uuid'])
if vendor:
vendor_display = six.text_type(vendor)
vendors_url = self.request.route_url('vendors.autocomplete')
f.set_widget('vendor_uuid', forms.widgets.JQueryAutocompleteWidget(
field_display=vendor_display, service_url=vendors_url))
f.set_label('vendor_uuid', "Vendor")
else:
f.set_readonly('vendor')
app = self.get_rattail_app()
vendor_handler = app.get_vendor_handler()
# filename
f.set_label('filename', "Catalog File")
@ -196,12 +174,75 @@ class VendorCatalogView(FileBatchMasterView):
f.set_widget('parser_key', dfwidget.SelectWidget(values=values))
f.set_label('parser_key', "File Type")
# vendor
f.set_renderer('vendor', self.render_vendor)
if self.creating and 'vendor' in f:
f.replace('vendor', 'vendor_uuid')
f.set_label('vendor_uuid', "Vendor")
use_dropdown = vendor_handler.choice_uses_dropdown()
if use_dropdown:
vendors = self.Session.query(model.Vendor)\
.order_by(model.Vendor.id)
vendor_values = [(vendor.uuid, "({}) {}".format(vendor.id,
vendor.name))
for vendor in vendors]
f.set_widget('vendor_uuid',
dfwidget.SelectWidget(values=vendor_values))
else:
vendor_display = ""
if self.request.method == 'POST':
if self.request.POST.get('vendor_uuid'):
vendor = self.Session.query(model.Vendor).get(
self.request.POST['vendor_uuid'])
if vendor:
vendor_display = six.text_type(vendor)
vendors_url = self.request.route_url('vendors.autocomplete')
f.set_widget('vendor_uuid', forms.widgets.JQueryAutocompleteWidget(
field_display=vendor_display, service_url=vendors_url,
assigned_label='vendorName'))
else:
f.set_readonly('vendor')
# effective
if self.creating:
f.remove('effective')
else:
f.set_readonly('effective')
def template_kwargs_create(self, **kwargs):
use_buefy = self.get_use_buefy()
app = self.get_rattail_app()
vendor_handler = app.get_vendor_handler()
parsers = self.get_parsers()
parsers_data = {}
for parser in parsers:
if use_buefy:
pdata = {'key': parser.key,
'vendor_key': parser.vendor_key}
if parser.vendor_key:
vendor = vendor_handler.get_vendor(self.Session(),
parser.vendor_key)
if vendor:
pdata['vendor_uuid'] = vendor.uuid
pdata['vendor_name'] = vendor.name
parsers_data[parser.key] = pdata
else:
if parser.vendor_key:
vendor = vendor_handler.get_vendor(self.Session(),
parser.vendor_key)
if vendor:
parser.vendormap_value = "{{uuid: '{}', name: '{}'}}".format(
vendor.uuid, vendor.name.replace("'", "\\'"))
else:
log.warning("vendor '{}' not found for parser: {}".format(
parser.vendor_key, parser.key))
parser.vendormap_value = 'null'
else:
parser.vendormap_value = 'null'
kwargs['parsers'] = parsers
kwargs['parsers_data'] = parsers_data
return kwargs
def get_batch_kwargs(self, batch):
kwargs = super(VendorCatalogView, self).get_batch_kwargs(batch)
kwargs['parser_key'] = batch.parser_key
@ -275,23 +316,6 @@ class VendorCatalogView(FileBatchMasterView):
return kwargs
def template_kwargs_create(self, **kwargs):
parsers = self.get_parsers()
for parser in parsers:
if parser.vendor_key:
vendor = api.get_vendor(Session(), parser.vendor_key)
if vendor:
parser.vendormap_value = "{{uuid: '{}', name: '{}'}}".format(
vendor.uuid, vendor.name.replace("'", "\\'"))
else:
log.warning("vendor '{}' not found for parser: {}".format(
parser.vendor_key, parser.key))
parser.vendormap_value = 'null'
else:
parser.vendormap_value = 'null'
kwargs['parsers'] = parsers
return kwargs
# TODO: deprecate / remove this
VendorCatalogsView = VendorCatalogView