← Back to the web2py-plugin list
Table Scope
This plugin provides buttons to select table records by a value of a field, showing the record count for each value of the field.
Demo
| sample_1 | : | |
| sample_2 | : |
Usage
-
controllers/plugin_tablescope.py
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.from plugin_tablescope import TableScope
from plugin_solidtable import SOLIDTABLE
from gluon.contrib.populate import populate
db = DAL('sqlite:memory:')
db.define_table('product',
Field('status', requires=IS_IN_SET([(1, 'Reserve'), (2, 'Available'), (3, ' Terminate')])))
_status_options = dict(db.product.status.requires.options())
db.product.status.represent = lambda v: _status_options[v]
db.product.bulk_insert([{'status':1}, {'status':1}, {'status':1}, {'status':2},
{'status':2}, {'status':3}])
def index():
dataset = db(db.product.id>0)
################################ The core ######################################
scope_1 = TableScope(dataset, db.product.status, renderstyle=True)
rows_1 = scope_1.scoped_dataset.select()
scope_2 = TableScope(dataset, db.product.status, all=False, default=2,
scope_var='scope_2', renderstyle=True)
rows_2 = scope_2.scoped_dataset.select()
################################################################################
return dict(sample_1=dict(table=SOLIDTABLE(rows_1, renderstyle=True), scope=scope_1),
sample_2=dict(table=SOLIDTABLE(rows_2, renderstyle=True), scope=scope_2))
Source code
-
modules/plugin_tablescope.py
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.from gluon import *
# For referencing static and views from other application
import os
APP = os.path.basename(os.path.dirname(os.path.dirname(__file__)))
class TableScope(DIV):
def __init__(self, dataset, field=None,
all=True, default=None,
queries=None,
left=None, groupby=None, scope_var='scope', page_var='page',
renderstyle=False, **attributes):
DIV.__init__(self, **attributes)
self.attributes['_class'] = 'tablescope'
self.dataset, self.scope_var, self.page_var = (
dataset, scope_var, page_var
)
self.scopes = []
self.scope_details = {}
def _get_count(_dataset):
if groupby:
return len(_dataset.select(field, left=left, groupby=groupby))
elif left:
counter = field.count()
return _dataset.select(counter, left=left).first()[counter]
else:
return _dataset.count()
if queries:
for k, v, query in queries:
self.scopes.append(k)
_dataset = self.dataset(query)
self.scope_details[k] = dict(label=v, count=_get_count(_dataset))
if field:
for k, v in field.requires.options():
if str(v):
self.scopes.append(k)
_dataset = self.dataset(field == k)
self.scope_details[k] = dict(label=v, count=_get_count(_dataset))
if all == True:
count = sum([e['count'] for e in self.scope_details.values()])
self.scope_details['__all__'] = dict(label=current.T('All'), count=count)
self.scopes.insert(0, '__all__')
self.scope = str(current.request.get_vars.get(self.scope_var) or (default or self.scopes[0]))
if self.scope == '__all__':
self.scoped_dataset = dataset
else:
if queries:
self.scoped_dataset = dataset(dict([(k, query) for k, v, query in queries])[self.scope])
if field:
self.scoped_dataset = dataset(field == self.scope)
if renderstyle:
_url = URL(APP, 'static', 'plugin_tablescope/tablescope.css')
if _url not in current.response.files:
current.response.files.append(_url)
def _url(self, scope):
vars = current.request.get_vars.copy()
vars[self.page_var] = 1
vars[self.scope_var] = scope
return URL(args=current.request.args, vars=vars)
def xml(self):
for scope in self.scopes:
scope_detail = self.scope_details[scope]
count = scope_detail['count']
label = scope_detail['label']
if scope == self.scope:
self.append(
SPAN(EM(label), ' ', SPAN('(%s)' % count, _class='count'),
_class='scope selected'))
else:
self.append(
SPAN(A(label, _class='w2p_trap', _href=self._url(scope=scope)),
' ', SPAN('(%s)' % count, _class='count'),
_class='scope'))
return DIV.xml(self)
