Final grid refactor; we now have just 'grids' :)

this also removes some old UI stuff for the first attempt at continuum
versioning..among other cruft
This commit is contained in:
Lance Edgar 2017-07-14 20:30:00 -05:00
parent 52c7f485ab
commit c57e2e17cc
61 changed files with 179 additions and 1590 deletions

View file

@ -22,9 +22,6 @@
################################################################################
"""
Base views for maintaining "new-style" batches.
.. note::
This is all still somewhat experimental.
"""
from __future__ import unicode_literals, absolute_import
@ -50,7 +47,7 @@ from pyramid.response import FileResponse
from pyramid_simpleform import Form
from webhelpers2.html import HTML, tags
from tailbone import forms, newgrids as grids
from tailbone import forms, grids
from tailbone.db import Session
from tailbone.views import MasterView
from tailbone.forms.renderers.batch import FileFieldRenderer

View file

@ -30,7 +30,7 @@ import six
from rattail.db import model
from tailbone import grids3 as grids
from tailbone import grids
from tailbone.views import MasterView2
from tailbone.views.batch import BatchMasterView, FileBatchMasterView
from tailbone.views.batch.core import MobileBatchStatusFilter

View file

@ -37,7 +37,7 @@ import formalchemy
from pyramid.response import FileResponse
from webhelpers2.html import literal
from tailbone import grids3 as grids
from tailbone import grids
from tailbone.db import Session
from tailbone.views import MasterView2 as MasterView
from tailbone.forms.renderers.bouncer import BounceMessageFieldRenderer

View file

@ -30,7 +30,7 @@ import six
from rattail.db import model
from tailbone import grids3 as grids
from tailbone import grids
from tailbone.views import MasterView2 as MasterView, AutocompleteView

View file

@ -32,7 +32,7 @@ from rattail.db import model
import formalchemy as fa
from tailbone import forms, grids3 as grids
from tailbone import forms, grids
from tailbone.db import Session
from tailbone.views import MasterView2 as MasterView, AutocompleteView

View file

@ -41,9 +41,8 @@ from pyramid import httpexceptions
from pyramid.renderers import get_renderer, render_to_response, render
from webhelpers2.html import HTML, tags
from tailbone import forms, newgrids as grids
from tailbone import forms, grids
from tailbone.views import View
from tailbone.newgrids import filters, AlchemyGrid, GridAction, MobileGrid
class MasterView(View):
@ -161,24 +160,6 @@ class MasterView(View):
grid.load_settings()
return grid
@classmethod
def get_mobile_grid_factory(cls):
"""
Must return a callable to be used when creating new mobile grid
instances. Instead of overriding this, you can set
:attr:`mobile_grid_factory`. Default factory is :class:`MobileGrid`.
"""
return getattr(cls, 'mobile_grid_factory', MobileGrid)
@classmethod
def get_mobile_row_grid_factory(cls):
"""
Must return a callable to be used when creating new mobile grid
instances. Instead of overriding this, you can set
:attr:`mobile_grid_factory`. Default factory is :class:`MobileGrid`.
"""
return getattr(cls, 'mobile_row_grid_factory', MobileGrid)
@classmethod
def get_mobile_grid_key(cls):
"""
@ -422,14 +403,6 @@ class MasterView(View):
grid.load_settings()
return grid
@classmethod
def get_version_grid_factory(cls):
"""
Returns the grid factory or class which is to be used when creating new
version grid instances.
"""
return getattr(cls, 'version_grid_factory', AlchemyGrid)
@classmethod
def get_version_grid_key(cls):
"""
@ -1254,23 +1227,6 @@ class MasterView(View):
# Grid Stuff
##############################
@classmethod
def get_grid_factory(cls):
"""
Returns the grid factory or class which is to be used when creating new
grid instances.
"""
return getattr(cls, 'grid_factory', AlchemyGrid)
@classmethod
def get_row_grid_factory(cls):
"""
Must return a callable to be used when creating new row grid instances.
Instead of overriding this, you can set :attr:`row_grid_factory`.
Default factory is :class:`AlchemyGrid`.
"""
return getattr(cls, 'row_grid_factory', AlchemyGrid)
@classmethod
def get_grid_key(cls):
"""
@ -1385,7 +1341,7 @@ class MasterView(View):
if url is None:
route = '{}.{}'.format(self.get_route_prefix(), key)
url = lambda r, i: self.request.route_url(route, **self.get_action_route_kwargs(r))
return GridAction(key, url=url, **kwargs)
return grids.GridAction(key, url=url, **kwargs)
def get_action_route_kwargs(self, row):
"""
@ -1424,20 +1380,6 @@ class MasterView(View):
def _preconfigure_grid(self, grid):
pass
def configure_grid(self, grid):
"""
Configure the grid, customizing as necessary. Subclasses are
encouraged to override this method.
As a bare minimum, the logic for this method must at some point invoke
the ``configure()`` method on the grid instance. The default
implementation does exactly (and only) this, passing no arguments.
This requirement is a result of using FormAlchemy under the hood, and
it is in fact a call to :meth:`formalchemy:formalchemy.tables.Grid.configure()`.
"""
if hasattr(grid, 'configure'):
grid.configure()
def get_data(self, session=None):
"""
Generate the base data set for the grid. This typically will be a

View file

@ -26,7 +26,9 @@ Master View
from __future__ import unicode_literals, absolute_import
from tailbone import grids3 as grids
import sqlalchemy_continuum as continuum
from tailbone import grids
from tailbone.views import MasterView
@ -64,6 +66,14 @@ class MasterView2(MasterView):
"""
return getattr(cls, 'row_grid_factory', grids.Grid)
@classmethod
def get_version_grid_factory(cls):
"""
Returns the grid factory or class which is to be used when creating new
version grid instances.
"""
return getattr(cls, 'version_grid_factory', grids.Grid)
@classmethod
def get_mobile_grid_factory(cls):
"""
@ -82,6 +92,18 @@ class MasterView2(MasterView):
"""
return getattr(cls, 'mobile_row_grid_factory', grids.MobileGrid)
def get_effective_data(self, session=None, **kwargs):
"""
Convenience method which returns the "effective" data for the master
grid, filtered and sorted to match what would show on the UI, but not
paged etc.
"""
if session is None:
session = self.Session()
kwargs.setdefault('pageable', False)
grid = self.make_grid(session=session, **kwargs)
return grid.make_visible_data()
def make_grid(self, factory=None, key=None, data=None, columns=None, **kwargs):
"""
Creates a new grid instance
@ -102,18 +124,6 @@ class MasterView2(MasterView):
grid.load_settings()
return grid
def get_effective_data(self, session=None, **kwargs):
"""
Convenience method which returns the "effective" data for the master
grid, filtered and sorted to match what would show on the UI, but not
paged etc.
"""
if session is None:
session = self.Session()
kwargs.setdefault('pageable', False)
grid = self.make_grid(session=session, **kwargs)
return grid.make_visible_data()
def make_row_grid(self, factory=None, key=None, data=None, columns=None, **kwargs):
"""
Make and return a new (configured) rows grid instance.
@ -139,6 +149,30 @@ class MasterView2(MasterView):
grid.load_settings()
return grid
def make_version_grid(self, factory=None, key=None, data=None, columns=None, **kwargs):
"""
Creates a new version grid instance
"""
instance = kwargs.pop('instance', None)
if not instance:
instance = self.get_instance()
if factory is None:
factory = self.get_version_grid_factory()
if key is None:
key = self.get_version_grid_key()
if data is None:
data = self.get_version_data(instance)
if columns is None:
columns = self.get_version_grid_columns()
kwargs.setdefault('request', self.request)
kwargs = self.make_version_grid_kwargs(**kwargs)
grid = factory(key, data, columns, **kwargs)
self.configure_version_grid(grid)
grid.load_settings()
return grid
def make_mobile_grid(self, factory=None, key=None, data=None, columns=None, **kwargs):
"""
Creates a new mobile grid instance
@ -195,6 +229,17 @@ class MasterView2(MasterView):
# TODO
raise NotImplementedError
def get_version_grid_columns(self):
if hasattr(self, 'version_grid_columns'):
return self.version_grid_columns
# TODO
return [
'issued_at',
'user',
'remote_addr',
'comment',
]
def get_mobile_grid_columns(self):
if hasattr(self, 'mobile_grid_columns'):
return self.mobile_grid_columns
@ -269,6 +314,26 @@ class MasterView2(MasterView):
defaults.update(kwargs)
return defaults
def make_version_grid_kwargs(self, **kwargs):
"""
Return a dictionary of kwargs to be passed to the factory when
constructing a new version grid.
"""
defaults = {
'model_class': continuum.transaction_class(self.get_model_class()),
'width': 'full',
'pageable': True,
}
if 'main_actions' not in kwargs:
route = '{}.version'.format(self.get_route_prefix())
instance = kwargs.get('instance') or self.get_instance()
url = lambda txn, i: self.request.route_url(route, uuid=instance.uuid, txnid=txn.id)
defaults['main_actions'] = [
self.make_action('view', icon='zoomin', url=url),
]
defaults.update(kwargs)
return defaults
def make_mobile_grid_kwargs(self, **kwargs):
"""
Must return a dictionary of kwargs to be passed to the factory when
@ -342,6 +407,9 @@ class MasterView2(MasterView):
def configure_row_grid(self, grid):
pass
def configure_version_grid(self, grid):
pass
def configure_mobile_grid(self, grid):
pass

View file

@ -46,7 +46,7 @@ from pyramid import httpexceptions
from pyramid.renderers import render_to_response
from webhelpers2.html import tags, HTML
from tailbone import forms, grids3 as grids
from tailbone import forms, grids
from tailbone.db import Session
from tailbone.views import MasterView2 as MasterView, AutocompleteView
from tailbone.progress import SessionProgress

View file

@ -39,7 +39,7 @@ import formalchemy as fa
import formencode as fe
from webhelpers2.html import tags
from tailbone import forms, grids3 as grids
from tailbone import forms, grids
from tailbone.views.purchasing import PurchasingBatchView

View file

@ -34,7 +34,7 @@ from rattail.db.auth import has_permission, administrator_role, guest_role, auth
import formalchemy as fa
from formalchemy.fields import IntegerFieldRenderer
from tailbone import forms, grids3 as grids
from tailbone import forms, grids
from tailbone.db import Session
from tailbone.views.principal import PrincipalMasterView