Tidy up logic for vendor filtering in products grid
was hoping to "fix" count issue but alas.. refs #23
This commit is contained in:
parent
f572757f00
commit
0ee6725188
|
@ -86,6 +86,8 @@ class ProductView(MasterView):
|
|||
labels = {
|
||||
'item_id': "Item ID",
|
||||
'upc': "UPC",
|
||||
'vendor': "Vendor (preferred)",
|
||||
'vendor_any': "Vendor (any)",
|
||||
'status_code': "Status",
|
||||
'tax1': "Tax 1",
|
||||
'tax2': "Tax 2",
|
||||
|
@ -158,13 +160,6 @@ class ProductView(MasterView):
|
|||
'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
|
||||
RegularPrice = orm.aliased(model.ProductPrice)
|
||||
CurrentPrice = orm.aliased(model.ProductPrice)
|
||||
|
@ -184,14 +179,11 @@ class ProductView(MasterView):
|
|||
self.handler = self.products_handler
|
||||
|
||||
def query(self, session):
|
||||
query = super(ProductView, self).query(session)
|
||||
query = super().query(session)
|
||||
|
||||
if not self.has_perm('view_deleted'):
|
||||
query = query.filter(model.Product.deleted == False)
|
||||
|
||||
# TODO: surely this is not always needed
|
||||
query = query.outerjoin(model.ProductInventory)
|
||||
|
||||
return query
|
||||
|
||||
def get_departments(self):
|
||||
|
@ -207,23 +199,10 @@ class ProductView(MasterView):
|
|||
.all()
|
||||
|
||||
def configure_grid(self, g):
|
||||
super(ProductView, self).configure_grid(g)
|
||||
super().configure_grid(g)
|
||||
app = self.get_rattail_app()
|
||||
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)
|
||||
ProductCostCodeAny = orm.aliased(model.ProductCost)
|
||||
|
||||
|
@ -261,12 +240,33 @@ class ProductView(MasterView):
|
|||
g.joiners['subdepartment'] = lambda q: q.outerjoin(model.Subdepartment,
|
||||
model.Subdepartment.uuid == model.Product.subdepartment_uuid)
|
||||
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['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)
|
||||
ProductTrueMargin = orm.aliased(model.ProductVolatile)
|
||||
|
@ -284,12 +284,15 @@ class ProductView(MasterView):
|
|||
g.set_renderer('true_margin', self.render_true_margin)
|
||||
|
||||
# on_hand
|
||||
g.set_sorter('on_hand', model.ProductInventory.on_hand)
|
||||
g.set_filter('on_hand', model.ProductInventory.on_hand)
|
||||
InventoryOnHand = orm.aliased(model.ProductInventory)
|
||||
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
|
||||
g.set_sorter('on_order', model.ProductInventory.on_order)
|
||||
g.set_filter('on_order', model.ProductInventory.on_order)
|
||||
InventoryOnOrder = orm.aliased(model.ProductInventory)
|
||||
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_verb = 'contains'
|
||||
|
@ -297,9 +300,6 @@ class ProductView(MasterView):
|
|||
default_active=True, default_verb='contains')
|
||||
g.filters['subdepartment'] = g.make_filter('subdepartment', model.Subdepartment.name)
|
||||
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.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('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):
|
||||
super(ProductView, self).configure_common_form(f)
|
||||
product = f.model_instance
|
||||
|
|
Loading…
Reference in a new issue