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:
Lance Edgar 2017-07-07 09:13:53 -05:00
parent f244c2934b
commit 5b1ae27a10
71 changed files with 2679 additions and 2030 deletions

View file

@ -36,7 +36,7 @@ import formalchemy as fa
from pyramid import httpexceptions
from tailbone import forms
from tailbone.views.batch import BatchMasterView
from tailbone.views.batch import BatchMasterView2 as BatchMasterView
class PurchasingBatchView(BatchMasterView):
@ -47,6 +47,34 @@ class PurchasingBatchView(BatchMasterView):
model_row_class = model.PurchaseBatchRow
default_handler_spec = 'rattail.batch.purchase:PurchaseBatchHandler'
grid_columns = [
'id',
'vendor',
'department',
'buyer',
'date_ordered',
'created',
'created_by',
'executed',
]
# row_grid_columns = [
# 'sequence',
# 'upc',
# # 'item_id',
# 'brand_name',
# 'description',
# 'size',
# 'cases_ordered',
# 'units_ordered',
# 'cases_received',
# 'units_received',
# 'po_total',
# 'invoice_total',
# 'credits',
# 'status_code',
# ]
@property
def batch_mode(self):
raise NotImplementedError("Please define `batch_mode` for your purchasing batch view")
@ -55,9 +83,8 @@ class PurchasingBatchView(BatchMasterView):
return session.query(model.PurchaseBatch)\
.filter(model.PurchaseBatch.mode == self.batch_mode)
def _preconfigure_grid(self, g):
super(PurchasingBatchView, self)._preconfigure_grid(g)
del g.filters['mode']
def configure_grid(self, g):
super(PurchasingBatchView, self).configure_grid(g)
g.joiners['vendor'] = lambda q: q.join(model.Vendor)
g.filters['vendor'] = g.make_filter('vendor', model.Vendor.name,
@ -77,22 +104,8 @@ class PurchasingBatchView(BatchMasterView):
g.filters['complete'].default_active = True
g.filters['complete'].default_verb = 'is_true'
g.date_ordered.set(label="Ordered")
g.date_received.set(label="Received")
def configure_grid(self, g):
g.configure(
include=[
g.id,
g.vendor,
g.department,
g.buyer,
g.date_ordered,
g.created,
g.created_by,
g.executed,
],
readonly=True)
g.set_label('date_ordered', "Ordered")
g.set_label('date_received', "Received")
# def make_form(self, batch, **kwargs):
# if self.creating:
@ -299,65 +312,36 @@ class PurchasingBatchView(BatchMasterView):
# query = super(PurchasingBatchView, self).get_row_data(batch)
# return query.options(orm.joinedload(model.PurchaseBatchRow.credits))
def _preconfigure_row_grid(self, g):
super(PurchasingBatchView, self)._preconfigure_row_grid(g)
g.filters['upc'].label = "UPC"
g.filters['brand_name'].label = "Brand"
g.upc.set(label="UPC")
g.brand_name.set(label="Brand")
g.cases_ordered.set(label="Cases Ord.", renderer=forms.renderers.QuantityFieldRenderer)
g.units_ordered.set(label="Units Ord.", renderer=forms.renderers.QuantityFieldRenderer)
g.cases_received.set(label="Cases Rec.", renderer=forms.renderers.QuantityFieldRenderer)
g.units_received.set(label="Units Rec.", renderer=forms.renderers.QuantityFieldRenderer)
g.po_total.set(label="Total", renderer=forms.renderers.CurrencyFieldRenderer)
g.invoice_total.set(label="Total", renderer=forms.renderers.CurrencyFieldRenderer)
g.append(fa.Field('has_credits', type=fa.types.Boolean, label="Credits?",
value=lambda row: bool(row.credits)))
def configure_row_grid(self, g):
batch = self.get_instance()
super(PurchasingBatchView, self).configure_row_grid(g)
g.configure(
include=[
g.sequence,
g.upc,
# g.item_id,
g.brand_name,
g.description,
g.size,
g.cases_ordered,
g.units_ordered,
g.cases_received,
g.units_received,
g.po_total,
g.invoice_total,
g.has_credits,
g.status_code,
],
readonly=True)
g.set_type('upc', 'gpc')
g.set_type('cases_ordered', 'quantity')
g.set_type('units_ordered', 'quantity')
g.set_type('cases_received', 'quantity')
g.set_type('units_received', 'quantity')
g.set_type('po_total', 'currency')
g.set_type('invoice_total', 'currency')
g.set_type('credits', 'boolean')
if batch.mode == self.enum.PURCHASE_BATCH_MODE_ORDERING:
del g.cases_received
del g.units_received
del g.has_credits
del g.invoice_total
elif batch.mode in (self.enum.PURCHASE_BATCH_MODE_RECEIVING,
self.enum.PURCHASE_BATCH_MODE_COSTING):
del g.po_total
g.set_label('upc', "UPC")
g.set_label('brand_name', "Brand")
g.set_label('cases_ordered', "Cases Ord.")
g.set_label('units_ordered', "Units Ord.")
g.set_label('cases_received', "Cases Rec.")
g.set_label('units_received', "Units Rec.")
g.set_label('po_total', "Total")
g.set_label('invoice_total', "Total")
g.set_label('credits', "Credits?")
def make_row_grid_tools(self, batch):
return self.make_default_row_grid_tools(batch)
def row_grid_row_attrs(self, row, i):
attrs = {}
def row_grid_extra_class(self, row, i):
if row.status_code == row.STATUS_PRODUCT_NOT_FOUND:
attrs['class_'] = 'warning'
elif row.status_code in (row.STATUS_INCOMPLETE,
row.STATUS_ORDERED_RECEIVED_DIFFER):
attrs['class_'] = 'notice'
return attrs
return 'warning'
if row.status_code in (row.STATUS_INCOMPLETE, row.STATUS_ORDERED_RECEIVED_DIFFER):
return 'notice'
def _preconfigure_row_fieldset(self, fs):
super(PurchasingBatchView, self)._preconfigure_row_fieldset(fs)

View file

@ -51,6 +51,23 @@ class OrderingBatchView(PurchasingBatchView):
model_title = "Ordering Batch"
model_title_plural = "Ordering Batches"
row_grid_columns = [
'sequence',
'upc',
# 'item_id',
'brand_name',
'description',
'size',
'cases_ordered',
'units_ordered',
# 'cases_received',
# 'units_received',
'po_total',
# 'invoice_total',
# 'credits',
'status_code',
]
order_form_header_columns = [
"UPC",
"Brand",

View file

@ -39,7 +39,7 @@ import formalchemy as fa
import formencode as fe
from webhelpers2.html import tags
from tailbone import forms, newgrids as grids
from tailbone import forms, grids3 as grids
from tailbone.views.purchasing import PurchasingBatchView
@ -93,10 +93,36 @@ class ReceivingBatchView(PurchasingBatchView):
mobile_creatable = True
mobile_rows_filterable = True
row_grid_columns = [
'sequence',
'upc',
# 'item_id',
'brand_name',
'description',
'size',
'cases_ordered',
'units_ordered',
'cases_received',
'units_received',
# 'po_total',
'invoice_total',
'credits',
'status_code',
]
@property
def batch_mode(self):
return self.enum.PURCHASE_BATCH_MODE_RECEIVING
def render_mobile_listitem(self, batch, i):
title = "({}) {} for ${:0,.2f} - {}, {}".format(
batch.id_str,
batch.vendor,
batch.po_total or 0,
batch.department,
batch.created_by)
return title
def make_mobile_row_filters(self):
"""
Returns a set of filters for the mobile row grid.
@ -158,10 +184,6 @@ class ReceivingBatchView(PurchasingBatchView):
kwargs['sms_transaction_number'] = batch.sms_transaction_number
return kwargs
def configure_mobile_grid(self, g):
super(ReceivingBatchView, self).configure_mobile_grid(g)
g.listitem.set(renderer=ReceivingBatchRenderer)
def configure_mobile_fieldset(self, fs):
fs.configure(include=[
fs.vendor.with_renderer(fa.TextFieldRenderer),
@ -178,13 +200,9 @@ class ReceivingBatchView(PurchasingBatchView):
else:
del fs.complete
def render_mobile_row_listitem(self, row, **kwargs):
if row is None:
return ''
def render_mobile_row_listitem(self, row, i):
description = row.product.full_description if row.product else row.description
title = "({}) {}".format(row.upc.pretty(), description)
url = self.request.route_url('mobile.receiving.rows.view', uuid=row.uuid)
return tags.link_to(title, url)
return "({}) {}".format(row.upc.pretty(), description)
# TODO: this view can create new rows, with only a GET query. that should
# probably be changed to require POST; for now we just require the "create
@ -344,20 +362,6 @@ class ReceivingBatchView(PurchasingBatchView):
cls._defaults(config)
class ReceivingBatchRenderer(fa.FieldRenderer):
def render_readonly(self, **kwargs):
batch = self.raw_value
title = "({}) {} for ${:0,.2f} - {}, {}".format(
batch.id_str,
batch.vendor,
batch.po_total or 0,
batch.department,
batch.created_by)
url = self.request.route_url('mobile.receiving.view', uuid=batch.uuid)
return tags.link_to(title, url)
class ValidBatchRow(forms.validators.ModelValidator):
model_class = model.PurchaseBatchRow