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
|
@ -27,3 +27,4 @@ Views for batches
|
|||
from __future__ import unicode_literals, absolute_import
|
||||
|
||||
from .core import BatchMasterView, FileBatchMasterView
|
||||
from .core2 import BatchMasterView2, FileBatchMasterView2
|
||||
|
|
126
tailbone/views/batch/core2.py
Normal file
126
tailbone/views/batch/core2.py
Normal file
|
@ -0,0 +1,126 @@
|
|||
# -*- coding: utf-8; -*-
|
||||
################################################################################
|
||||
#
|
||||
# Rattail -- Retail Software Framework
|
||||
# Copyright © 2010-2017 Lance Edgar
|
||||
#
|
||||
# This file is part of Rattail.
|
||||
#
|
||||
# Rattail is free software: you can redistribute it and/or modify it under the
|
||||
# terms of the GNU General Public License as published by the Free Software
|
||||
# Foundation, either version 3 of the License, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# Rattail is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
||||
# details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along with
|
||||
# Rattail. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
################################################################################
|
||||
"""
|
||||
Base views for maintaining batches
|
||||
"""
|
||||
|
||||
from __future__ import unicode_literals, absolute_import
|
||||
|
||||
import six
|
||||
|
||||
from rattail.db import model
|
||||
|
||||
from tailbone import grids3 as grids
|
||||
from tailbone.views import MasterView2
|
||||
from tailbone.views.batch import BatchMasterView, FileBatchMasterView
|
||||
from tailbone.views.batch.core import MobileBatchStatusFilter
|
||||
|
||||
|
||||
class BatchMasterView2(MasterView2, BatchMasterView):
|
||||
"""
|
||||
Base class for all "batch master" views
|
||||
"""
|
||||
|
||||
grid_columns = [
|
||||
'id',
|
||||
'created',
|
||||
'created_by',
|
||||
'rowcount',
|
||||
'status_code',
|
||||
'complete',
|
||||
'executed',
|
||||
'executed_by',
|
||||
]
|
||||
|
||||
def configure_grid(self, g):
|
||||
super(BatchMasterView2, self).configure_grid(g)
|
||||
|
||||
g.joiners['created_by'] = lambda q: q.join(model.User, model.User.uuid == self.model_class.created_by_uuid)
|
||||
g.joiners['executed_by'] = lambda q: q.outerjoin(model.User, model.User.uuid == self.model_class.executed_by_uuid)
|
||||
|
||||
g.filters['executed'].default_active = True
|
||||
g.filters['executed'].default_verb = 'is_null'
|
||||
|
||||
# TODO: not sure this todo is still relevant?
|
||||
# TODO: in some cases grid has no sorters yet..e.g. when building query for bulk-delete
|
||||
# if hasattr(g, 'sorters'):
|
||||
g.sorters['created_by'] = g.make_sorter(model.User.username)
|
||||
g.sorters['executed_by'] = g.make_sorter(model.User.username)
|
||||
|
||||
g.default_sortkey = 'id'
|
||||
g.default_sortdir = 'desc'
|
||||
|
||||
g.set_enum('status_code', self.model_class.STATUS)
|
||||
|
||||
g.set_type('created', 'datetime')
|
||||
g.set_type('executed', 'datetime')
|
||||
|
||||
g.set_renderer('id', self.render_batch_id)
|
||||
|
||||
g.set_link('id')
|
||||
|
||||
g.set_label('id', "Batch ID")
|
||||
g.set_label('created_by', "Created by")
|
||||
g.set_label('rowcount', "Rows")
|
||||
g.set_label('status_code', "Status")
|
||||
g.set_label('executed_by', "Executed by")
|
||||
|
||||
def render_batch_id(self, batch, column):
|
||||
return batch.id_str
|
||||
|
||||
def configure_row_grid(self, g):
|
||||
super(BatchMasterView2, self).configure_row_grid(g)
|
||||
|
||||
g.filters['status_code'].set_value_renderer(grids.filters.EnumValueRenderer(self.model_row_class.STATUS))
|
||||
|
||||
g.default_sortkey = 'sequence'
|
||||
|
||||
g.set_enum('status_code', self.model_row_class.STATUS)
|
||||
|
||||
g.set_renderer('status_code', self.render_row_status)
|
||||
|
||||
g.set_label('sequence', "Seq.")
|
||||
g.set_label('status_code', "Status")
|
||||
|
||||
def render_row_status(self, row, column):
|
||||
code = row.status_code
|
||||
if code is None:
|
||||
return ""
|
||||
text = self.model_row_class.STATUS.get(code, six.text_type(code))
|
||||
if row.status_text:
|
||||
return HTML.tag('span', title=row.status_text, c=text)
|
||||
return text
|
||||
|
||||
def make_mobile_filters(self):
|
||||
"""
|
||||
Returns a set of filters for the mobile grid.
|
||||
"""
|
||||
filters = grids.filters.GridFilterSet()
|
||||
filters['status'] = MobileBatchStatusFilter(self.model_class, 'status', default_value='pending')
|
||||
return filters
|
||||
|
||||
|
||||
class FileBatchMasterView2(BatchMasterView2, FileBatchMasterView):
|
||||
"""
|
||||
Base class for all file-based "batch master" views
|
||||
"""
|
|
@ -1,4 +1,4 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# -*- coding: utf-8; -*-
|
||||
################################################################################
|
||||
#
|
||||
# Rattail -- Retail Software Framework
|
||||
|
@ -29,7 +29,7 @@ from __future__ import unicode_literals, absolute_import
|
|||
from rattail.db import model
|
||||
|
||||
from tailbone import forms
|
||||
from tailbone.views.batch import BatchMasterView
|
||||
from tailbone.views.batch import BatchMasterView2 as BatchMasterView
|
||||
|
||||
|
||||
class PricingBatchView(BatchMasterView):
|
||||
|
@ -46,6 +46,31 @@ class PricingBatchView(BatchMasterView):
|
|||
rows_editable = True
|
||||
bulk_deletable = True
|
||||
|
||||
grid_columns = [
|
||||
'id',
|
||||
'created',
|
||||
'created_by',
|
||||
'rowcount',
|
||||
# 'status_code',
|
||||
# 'complete',
|
||||
'executed',
|
||||
'executed_by',
|
||||
]
|
||||
|
||||
row_grid_columns = [
|
||||
'sequence',
|
||||
'upc',
|
||||
'brand_name',
|
||||
'description',
|
||||
'size',
|
||||
'discounted_unit_cost',
|
||||
'old_price',
|
||||
'new_price',
|
||||
'price_margin',
|
||||
'price_diff',
|
||||
'status_code',
|
||||
]
|
||||
|
||||
def configure_fieldset(self, fs):
|
||||
fs.configure(
|
||||
include=[
|
||||
|
@ -57,43 +82,25 @@ class PricingBatchView(BatchMasterView):
|
|||
fs.executed_by,
|
||||
])
|
||||
|
||||
def _preconfigure_row_grid(self, g):
|
||||
super(PricingBatchView, self)._preconfigure_row_grid(g)
|
||||
g.upc.set(label="UPC")
|
||||
g.brand_name.set(label="Brand")
|
||||
g.regular_unit_cost.set(label="Reg. Cost")
|
||||
g.discounted_unit_cost.set(label="Disc. Cost")
|
||||
g.old_price.set(renderer=forms.renderers.CurrencyFieldRenderer)
|
||||
g.new_price.set(renderer=forms.renderers.CurrencyFieldRenderer)
|
||||
g.price_margin.set(label="Margin")
|
||||
g.price_markup.set(label="Markup")
|
||||
g.price_diff.set(label="Diff", renderer=forms.renderers.CurrencyFieldRenderer)
|
||||
|
||||
def configure_row_grid(self, g):
|
||||
g.configure(
|
||||
include=[
|
||||
g.sequence,
|
||||
g.upc,
|
||||
g.brand_name,
|
||||
g.description,
|
||||
g.size,
|
||||
g.discounted_unit_cost,
|
||||
g.old_price,
|
||||
g.new_price,
|
||||
g.price_margin,
|
||||
g.price_diff,
|
||||
g.status_code,
|
||||
],
|
||||
readonly=True)
|
||||
super(PricingBatchView, self).configure_row_grid(g)
|
||||
|
||||
def row_grid_row_attrs(self, row, i):
|
||||
attrs = {}
|
||||
if row.status_code in (row.STATUS_PRICE_INCREASE,
|
||||
row.STATUS_PRICE_DECREASE):
|
||||
attrs['class_'] = 'notice'
|
||||
elif row.status_code == row.STATUS_CANNOT_CALCULATE_PRICE:
|
||||
attrs['class_'] = 'warning'
|
||||
return attrs
|
||||
g.set_type('old_price', 'currency')
|
||||
g.set_type('new_price', 'currency')
|
||||
g.set_type('price_diff', 'currency')
|
||||
|
||||
g.set_label('upc', "UPC")
|
||||
g.set_label('brand_name', "Brand")
|
||||
g.set_label('regular_unit_cost', "Reg. Cost")
|
||||
g.set_label('price_margin', "Margin")
|
||||
g.set_label('price_markup', "Markup")
|
||||
g.set_label('price_diff', "Diff")
|
||||
|
||||
def row_grid_extra_class(self, row, i):
|
||||
if row.status_code == row.STATUS_CANNOT_CALCULATE_PRICE:
|
||||
return 'warning'
|
||||
if row.status_code in (row.STATUS_PRICE_INCREASE, row.STATUS_PRICE_DECREASE):
|
||||
return 'notice'
|
||||
|
||||
def _preconfigure_row_fieldset(self, fs):
|
||||
super(PricingBatchView, self)._preconfigure_row_fieldset(fs)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue