Add new "v3" grids, refactor all views to use them
or at least that's the idea..hopefully we caught them all
This commit is contained in:
parent
f244c2934b
commit
5b1ae27a10
71 changed files with 2679 additions and 2030 deletions
|
@ -44,11 +44,11 @@ import wtforms
|
|||
import formalchemy as fa
|
||||
from pyramid import httpexceptions
|
||||
from pyramid.renderers import render_to_response
|
||||
from webhelpers2.html import tags
|
||||
from webhelpers2.html import tags, HTML
|
||||
|
||||
from tailbone import forms, newgrids as grids
|
||||
from tailbone import forms, grids3 as grids
|
||||
from tailbone.db import Session
|
||||
from tailbone.views import MasterView, AutocompleteView
|
||||
from tailbone.views import MasterView2 as MasterView, AutocompleteView
|
||||
from tailbone.progress import SessionProgress
|
||||
|
||||
|
||||
|
@ -71,21 +71,6 @@ from tailbone.progress import SessionProgress
|
|||
# return query
|
||||
|
||||
|
||||
class DescriptionFieldRenderer(fa.TextFieldRenderer):
|
||||
"""
|
||||
Renderer for product descriptions within the grid; adds hyperlink.
|
||||
"""
|
||||
|
||||
def render_readonly(self, **kwargs):
|
||||
description = self.raw_value
|
||||
if description is None:
|
||||
return ''
|
||||
if kwargs.get('link') and description:
|
||||
product = self.field.parent.model
|
||||
description = tags.link_to(description, kwargs['link'](product))
|
||||
return description
|
||||
|
||||
|
||||
class ProductsView(MasterView):
|
||||
"""
|
||||
Master view for the Product class.
|
||||
|
@ -93,6 +78,17 @@ class ProductsView(MasterView):
|
|||
model_class = model.Product
|
||||
supports_mobile = True
|
||||
|
||||
grid_columns = [
|
||||
'upc',
|
||||
'brand',
|
||||
'description',
|
||||
'size',
|
||||
'subdepartment',
|
||||
'vendor',
|
||||
'regular_price',
|
||||
'current_price',
|
||||
]
|
||||
|
||||
# child_version_classes = [
|
||||
# (model.ProductCode, 'product_uuid'),
|
||||
# (model.ProductCost, 'product_uuid'),
|
||||
|
@ -133,7 +129,9 @@ class ProductsView(MasterView):
|
|||
|
||||
return query
|
||||
|
||||
def _preconfigure_grid(self, g):
|
||||
def configure_grid(self, g):
|
||||
super(ProductsView, self).configure_grid(g)
|
||||
|
||||
def join_vendor(q):
|
||||
return q.outerjoin(model.ProductCost,
|
||||
sa.and_(
|
||||
|
@ -185,7 +183,6 @@ class ProductsView(MasterView):
|
|||
|
||||
g.filters['upc'].default_active = True
|
||||
g.filters['upc'].default_verb = 'equal'
|
||||
g.filters['upc'].label = "UPC"
|
||||
g.filters['description'].default_active = True
|
||||
g.filters['description'].default_verb = 'contains'
|
||||
g.filters['brand'] = g.make_filter('brand', model.Brand.name,
|
||||
|
@ -196,51 +193,64 @@ class ProductsView(MasterView):
|
|||
g.filters['subdepartment'] = g.make_filter('subdepartment', model.Subdepartment.name)
|
||||
g.filters['report_code'] = g.make_filter('report_code', model.ReportCode.name)
|
||||
g.filters['code'] = g.make_filter('code', model.ProductCode.code)
|
||||
g.filters['vendor'] = g.make_filter('vendor', model.Vendor.name, label="Vendor (preferred)")
|
||||
g.filters['vendor_any'] = g.make_filter('vendor_any', self.VendorAny.name, label="Vendor (any)")
|
||||
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.filters['vendor_code'] = g.make_filter('vendor_code', ProductCostCode.code)
|
||||
g.filters['vendor_code_any'] = g.make_filter('vendor_code_any', ProductCostCodeAny.code)
|
||||
|
||||
product_link = lambda p: self.get_action_url('view', p)
|
||||
|
||||
g.upc.set(label="UPC", renderer=forms.renderers.GPCFieldRenderer)
|
||||
g.upc.attrs(link=product_link)
|
||||
|
||||
g.description.set(renderer=DescriptionFieldRenderer)
|
||||
g.description.attrs(link=product_link)
|
||||
|
||||
g.regular_price.set(label="Reg. Price", renderer=forms.renderers.PriceFieldRenderer)
|
||||
g.current_price.set(label="Cur. Price", renderer=forms.renderers.PriceFieldRenderer)
|
||||
|
||||
g.vendor.set(label="Pref. Vendor")
|
||||
|
||||
g.joiners['cost'] = lambda q: q.outerjoin(model.ProductCost,
|
||||
sa.and_(
|
||||
model.ProductCost.product_uuid == model.Product.uuid,
|
||||
model.ProductCost.preference == 1))
|
||||
g.sorters['cost'] = g.make_sorter(model.ProductCost.unit_cost)
|
||||
g.filters['cost'] = g.make_filter('cost', model.ProductCost.unit_cost)
|
||||
g.cost.set(renderer=forms.renderers.CostFieldRenderer)
|
||||
|
||||
g.default_sortkey = 'upc'
|
||||
|
||||
if self.print_labels and self.request.has_perm('products.print_labels'):
|
||||
g.more_actions.append(grids.GridAction('print_label', icon='print'))
|
||||
|
||||
def configure_grid(self, g):
|
||||
g.configure(
|
||||
include=[
|
||||
g.upc,
|
||||
g.brand,
|
||||
g.description,
|
||||
g.size,
|
||||
g.subdepartment,
|
||||
g.vendor,
|
||||
g.regular_price,
|
||||
g.current_price,
|
||||
],
|
||||
readonly=True)
|
||||
g.set_type('upc', 'gpc')
|
||||
|
||||
g.set_renderer('regular_price', self.render_price)
|
||||
g.set_renderer('current_price', self.render_price)
|
||||
g.set_renderer('cost', self.render_cost)
|
||||
|
||||
g.set_link('upc')
|
||||
g.set_link('description')
|
||||
|
||||
g.set_label('upc', "UPC")
|
||||
g.set_label('vendor', "Vendor (preferred)")
|
||||
g.set_label('vendor_any', "Vendor (any)")
|
||||
g.set_label('regular_price', "Reg. Price")
|
||||
g.set_label('current_price', "Cur. Price")
|
||||
g.set_label('vendor', "Pref. Vendor")
|
||||
|
||||
def render_price(self, product, column):
|
||||
price = product[column]
|
||||
if price:
|
||||
if not product.not_for_sale:
|
||||
if price.price is not None and price.pack_price is not None:
|
||||
if price.multiple > 1:
|
||||
return HTML("$ {:0.2f} / {} ($ {:0.2f} / {})".format(
|
||||
price.price, price.multiple,
|
||||
price.pack_price, price.pack_multiple))
|
||||
return HTML("$ {:0.2f} ($ {:0.2f} / {})".format(
|
||||
price.price, price.pack_price, price.pack_multiple))
|
||||
if price.price is not None:
|
||||
if price.multiple > 1:
|
||||
return "$ {:0.2f} / {}".format(price.price, price.multiple)
|
||||
return "$ {:0.2f}".format(price.price)
|
||||
if price.pack_price is not None:
|
||||
return "$ {:0.2f} / {}".format(price.pack_price, price.pack_multiple)
|
||||
return ""
|
||||
|
||||
def render_cost(self, product, column):
|
||||
cost = product.cost
|
||||
if not cost:
|
||||
return ""
|
||||
return "'${:0.2f}".format(cost.unit_cost)
|
||||
|
||||
def template_kwargs_index(self, **kwargs):
|
||||
if self.print_labels:
|
||||
|
@ -250,19 +260,15 @@ class ProductsView(MasterView):
|
|||
.all()
|
||||
return kwargs
|
||||
|
||||
def row_attrs(self, row, i):
|
||||
|
||||
attrs = {'uuid': row.uuid}
|
||||
|
||||
def grid_extra_class(self, product, i):
|
||||
classes = []
|
||||
if row.not_for_sale:
|
||||
if product.not_for_sale:
|
||||
classes.append('not-for-sale')
|
||||
if row.deleted:
|
||||
if product.deleted:
|
||||
classes.append('deleted')
|
||||
if classes:
|
||||
attrs['class_'] = ' '.join(classes)
|
||||
|
||||
return attrs
|
||||
return ' '.join(classes)
|
||||
|
||||
def get_instance(self):
|
||||
key = self.request.matchdict['uuid']
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue