fix: add basic master view for Product Costs
This commit is contained in:
parent
9e55717041
commit
20b3f87dbe
|
@ -394,6 +394,11 @@ class TailboneMenuHandler(WuttaMenuHandler):
|
||||||
'route': 'products',
|
'route': 'products',
|
||||||
'perm': 'products.list',
|
'perm': 'products.list',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
'title': "Product Costs",
|
||||||
|
'route': 'product_costs',
|
||||||
|
'perm': 'product_costs.list',
|
||||||
|
},
|
||||||
{
|
{
|
||||||
'title': "Departments",
|
'title': "Departments",
|
||||||
'route': 'departments',
|
'route': 'departments',
|
||||||
|
@ -451,6 +456,11 @@ class TailboneMenuHandler(WuttaMenuHandler):
|
||||||
'route': 'vendors',
|
'route': 'vendors',
|
||||||
'perm': 'vendors.list',
|
'perm': 'vendors.list',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
'title': "Product Costs",
|
||||||
|
'route': 'product_costs',
|
||||||
|
'perm': 'product_costs.list',
|
||||||
|
},
|
||||||
{'type': 'sep'},
|
{'type': 'sep'},
|
||||||
{
|
{
|
||||||
'title': "Ordering",
|
'title': "Ordering",
|
||||||
|
|
|
@ -34,7 +34,7 @@ import sqlalchemy_continuum as continuum
|
||||||
|
|
||||||
from rattail import enum, pod, sil
|
from rattail import enum, pod, sil
|
||||||
from rattail.db import api, auth, Session as RattailSession
|
from rattail.db import api, auth, Session as RattailSession
|
||||||
from rattail.db.model import Product, PendingProduct, CustomerOrderItem
|
from rattail.db.model import Product, PendingProduct, ProductCost, CustomerOrderItem
|
||||||
from rattail.gpc import GPC
|
from rattail.gpc import GPC
|
||||||
from rattail.threads import Thread
|
from rattail.threads import Thread
|
||||||
from rattail.exceptions import LabelPrintingError
|
from rattail.exceptions import LabelPrintingError
|
||||||
|
@ -2668,6 +2668,78 @@ class PendingProductView(MasterView):
|
||||||
permission=f'{permission_prefix}.ignore_product')
|
permission=f'{permission_prefix}.ignore_product')
|
||||||
|
|
||||||
|
|
||||||
|
class ProductCostView(MasterView):
|
||||||
|
"""
|
||||||
|
Master view for Product Costs
|
||||||
|
"""
|
||||||
|
model_class = ProductCost
|
||||||
|
route_prefix = 'product_costs'
|
||||||
|
url_prefix = '/products/costs'
|
||||||
|
has_versions = True
|
||||||
|
|
||||||
|
grid_columns = [
|
||||||
|
'_product_key_',
|
||||||
|
'vendor',
|
||||||
|
'preference',
|
||||||
|
'code',
|
||||||
|
'case_size',
|
||||||
|
'case_cost',
|
||||||
|
'pack_size',
|
||||||
|
'pack_cost',
|
||||||
|
'unit_cost',
|
||||||
|
]
|
||||||
|
|
||||||
|
def query(self, session):
|
||||||
|
""" """
|
||||||
|
query = super().query(session)
|
||||||
|
model = self.app.model
|
||||||
|
|
||||||
|
# always join on Product
|
||||||
|
return query.join(model.Product)
|
||||||
|
|
||||||
|
def configure_grid(self, g):
|
||||||
|
""" """
|
||||||
|
super().configure_grid(g)
|
||||||
|
model = self.app.model
|
||||||
|
|
||||||
|
# product key
|
||||||
|
field = self.get_product_key_field()
|
||||||
|
g.set_renderer(field, self.render_product_key)
|
||||||
|
g.set_sorter(field, getattr(model.Product, field))
|
||||||
|
g.set_sort_defaults(field)
|
||||||
|
g.set_filter(field, getattr(model.Product, field))
|
||||||
|
|
||||||
|
# vendor
|
||||||
|
g.set_joiner('vendor', lambda q: q.join(model.Vendor))
|
||||||
|
g.set_sorter('vendor', model.Vendor.name)
|
||||||
|
g.set_filter('vendor', model.Vendor.name, label="Vendor Name")
|
||||||
|
|
||||||
|
def render_product_key(self, cost, field):
|
||||||
|
""" """
|
||||||
|
handler = self.app.get_products_handler()
|
||||||
|
return handler.render_product_key(cost.product)
|
||||||
|
|
||||||
|
def configure_form(self, f):
|
||||||
|
""" """
|
||||||
|
super().configure_form(f)
|
||||||
|
|
||||||
|
# product
|
||||||
|
f.set_renderer('product', self.render_product)
|
||||||
|
if 'product_uuid' in f and 'product' in f:
|
||||||
|
f.remove('product')
|
||||||
|
f.replace('product_uuid', 'product')
|
||||||
|
|
||||||
|
# vendor
|
||||||
|
f.set_renderer('vendor', self.render_vendor)
|
||||||
|
if 'vendor_uuid' in f and 'vendor' in f:
|
||||||
|
f.remove('vendor')
|
||||||
|
f.replace('vendor_uuid', 'vendor')
|
||||||
|
|
||||||
|
# futures
|
||||||
|
# TODO: should eventually show a subgrid here?
|
||||||
|
f.remove('futures')
|
||||||
|
|
||||||
|
|
||||||
def defaults(config, **kwargs):
|
def defaults(config, **kwargs):
|
||||||
base = globals()
|
base = globals()
|
||||||
|
|
||||||
|
@ -2677,6 +2749,9 @@ def defaults(config, **kwargs):
|
||||||
PendingProductView = kwargs.get('PendingProductView', base['PendingProductView'])
|
PendingProductView = kwargs.get('PendingProductView', base['PendingProductView'])
|
||||||
PendingProductView.defaults(config)
|
PendingProductView.defaults(config)
|
||||||
|
|
||||||
|
ProductCostView = kwargs.get('ProductCostView', base['ProductCostView'])
|
||||||
|
ProductCostView.defaults(config)
|
||||||
|
|
||||||
|
|
||||||
def includeme(config):
|
def includeme(config):
|
||||||
defaults(config)
|
defaults(config)
|
||||||
|
|
Loading…
Reference in a new issue