Tidy up logic for vendor filtering in products grid

was hoping to "fix" count issue but alas..

refs #23
This commit is contained in:
Lance Edgar 2023-09-28 10:56:15 -05:00
parent f572757f00
commit 0ee6725188

View file

@ -86,6 +86,8 @@ class ProductView(MasterView):
labels = { labels = {
'item_id': "Item ID", 'item_id': "Item ID",
'upc': "UPC", 'upc': "UPC",
'vendor': "Vendor (preferred)",
'vendor_any': "Vendor (any)",
'status_code': "Status", 'status_code': "Status",
'tax1': "Tax 1", 'tax1': "Tax 1",
'tax2': "Tax 2", 'tax2': "Tax 2",
@ -158,13 +160,6 @@ class ProductView(MasterView):
'inventory_on_order', 'inventory_on_order',
] ]
# These aliases enable the grid queries to filter products which may be
# purchased from *any* vendor, and yet sort by only the "preferred" vendor
# (since that's what shows up in the grid column).
ProductVendorCost = orm.aliased(model.ProductCost)
ProductVendorCostAny = orm.aliased(model.ProductCost)
VendorAny = orm.aliased(model.Vendor)
# same, but for prices # same, but for prices
RegularPrice = orm.aliased(model.ProductPrice) RegularPrice = orm.aliased(model.ProductPrice)
CurrentPrice = orm.aliased(model.ProductPrice) CurrentPrice = orm.aliased(model.ProductPrice)
@ -184,14 +179,11 @@ class ProductView(MasterView):
self.handler = self.products_handler self.handler = self.products_handler
def query(self, session): def query(self, session):
query = super(ProductView, self).query(session) query = super().query(session)
if not self.has_perm('view_deleted'): if not self.has_perm('view_deleted'):
query = query.filter(model.Product.deleted == False) query = query.filter(model.Product.deleted == False)
# TODO: surely this is not always needed
query = query.outerjoin(model.ProductInventory)
return query return query
def get_departments(self): def get_departments(self):
@ -207,23 +199,10 @@ class ProductView(MasterView):
.all() .all()
def configure_grid(self, g): def configure_grid(self, g):
super(ProductView, self).configure_grid(g) super().configure_grid(g)
app = self.get_rattail_app() app = self.get_rattail_app()
model = self.model model = self.model
def join_vendor(q):
return q.outerjoin(self.ProductVendorCost,
sa.and_(
self.ProductVendorCost.product_uuid == model.Product.uuid,
self.ProductVendorCost.preference == 1))\
.outerjoin(model.Vendor)
def join_vendor_any(q):
return q.outerjoin(self.ProductVendorCostAny,
self.ProductVendorCostAny.product_uuid == model.Product.uuid)\
.outerjoin(self.VendorAny,
self.VendorAny.uuid == self.ProductVendorCostAny.vendor_uuid)
ProductCostCode = orm.aliased(model.ProductCost) ProductCostCode = orm.aliased(model.ProductCost)
ProductCostCodeAny = orm.aliased(model.ProductCost) ProductCostCodeAny = orm.aliased(model.ProductCost)
@ -261,12 +240,33 @@ class ProductView(MasterView):
g.joiners['subdepartment'] = lambda q: q.outerjoin(model.Subdepartment, g.joiners['subdepartment'] = lambda q: q.outerjoin(model.Subdepartment,
model.Subdepartment.uuid == model.Product.subdepartment_uuid) model.Subdepartment.uuid == model.Product.subdepartment_uuid)
g.joiners['code'] = lambda q: q.outerjoin(model.ProductCode) g.joiners['code'] = lambda q: q.outerjoin(model.ProductCode)
g.joiners['vendor'] = join_vendor
g.joiners['vendor_any'] = join_vendor_any
g.sorters['brand'] = g.make_sorter(model.Brand.name) g.sorters['brand'] = g.make_sorter(model.Brand.name)
g.sorters['subdepartment'] = g.make_sorter(model.Subdepartment.name) g.sorters['subdepartment'] = g.make_sorter(model.Subdepartment.name)
g.sorters['vendor'] = g.make_sorter(model.Vendor.name)
# vendor
ProductVendorCost = orm.aliased(model.ProductCost)
def join_vendor(q):
return q.outerjoin(ProductVendorCost,
sa.and_(
ProductVendorCost.product_uuid == model.Product.uuid,
ProductVendorCost.preference == 1))\
.outerjoin(model.Vendor)
g.set_joiner('vendor', join_vendor)
g.set_sorter('vendor', model.Vendor.name)
g.set_filter('vendor', model.Vendor.name)
# vendor_any
ProductVendorCostAny = orm.aliased(model.ProductCost)
VendorAny = orm.aliased(model.Vendor)
def join_vendor_any(q):
return q.outerjoin(ProductVendorCostAny,
ProductVendorCostAny.product_uuid == model.Product.uuid)\
.outerjoin(VendorAny,
VendorAny.uuid == ProductVendorCostAny.vendor_uuid)
g.set_joiner('vendor_any', join_vendor_any)
g.set_filter('vendor_any', VendorAny.name)
# factory=VendorAnyFilter, joiner=join_vendor_any)
ProductTrueCost = orm.aliased(model.ProductVolatile) ProductTrueCost = orm.aliased(model.ProductVolatile)
ProductTrueMargin = orm.aliased(model.ProductVolatile) ProductTrueMargin = orm.aliased(model.ProductVolatile)
@ -284,12 +284,15 @@ class ProductView(MasterView):
g.set_renderer('true_margin', self.render_true_margin) g.set_renderer('true_margin', self.render_true_margin)
# on_hand # on_hand
g.set_sorter('on_hand', model.ProductInventory.on_hand) InventoryOnHand = orm.aliased(model.ProductInventory)
g.set_filter('on_hand', model.ProductInventory.on_hand) g.set_joiner('on_hand', lambda q: q.outerjoin(InventoryOnHand))
g.set_sorter('on_hand', InventoryOnHand.on_hand)
g.set_filter('on_hand', InventoryOnHand.on_hand)
# on_order # on_order
g.set_sorter('on_order', model.ProductInventory.on_order) InventoryOnOrder = orm.aliased(model.ProductInventory)
g.set_filter('on_order', model.ProductInventory.on_order) g.set_sorter('on_order', InventoryOnOrder.on_order)
g.set_filter('on_order', InventoryOnOrder.on_order)
g.filters['description'].default_active = True g.filters['description'].default_active = True
g.filters['description'].default_verb = 'contains' g.filters['description'].default_verb = 'contains'
@ -297,9 +300,6 @@ class ProductView(MasterView):
default_active=True, default_verb='contains') default_active=True, default_verb='contains')
g.filters['subdepartment'] = g.make_filter('subdepartment', model.Subdepartment.name) g.filters['subdepartment'] = g.make_filter('subdepartment', model.Subdepartment.name)
g.filters['code'] = g.make_filter('code', model.ProductCode.code) g.filters['code'] = g.make_filter('code', model.ProductCode.code)
g.filters['vendor'] = g.make_filter('vendor', model.Vendor.name)
g.filters['vendor_any'] = g.make_filter('vendor_any', self.VendorAny.name)
# factory=VendorAnyFilter, joiner=join_vendor_any)
# g.joiners['vendor_code_any'] = join_vendor_code_any # g.joiners['vendor_code_any'] = join_vendor_code_any
# g.filters['vendor_code_any'] = g.make_filter('vendor_code_any', ProductCostCodeAny.code) # g.filters['vendor_code_any'] = g.make_filter('vendor_code_any', ProductCostCodeAny.code)
@ -382,10 +382,6 @@ class ProductView(MasterView):
g.set_link('item_id') g.set_link('item_id')
g.set_link('description') g.set_link('description')
g.set_label('vendor', "Vendor (preferred)")
g.set_label('vendor_any', "Vendor (any)")
g.set_label('vendor', "Vendor (preferred)")
def configure_common_form(self, f): def configure_common_form(self, f):
super(ProductView, self).configure_common_form(f) super(ProductView, self).configure_common_form(f)
product = f.model_instance product = f.model_instance