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 = {
|
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
|
||||||
|
|
Loading…
Reference in a new issue