Merge pull request #507 from ilvalle/master
hooks panel in appadmin for _before_*/_after_* callbacks
This commit is contained in:
@@ -667,3 +667,42 @@ def manage():
|
|||||||
kwargs.update(**smartgrid_args.get(table._tablename, {}))
|
kwargs.update(**smartgrid_args.get(table._tablename, {}))
|
||||||
grid = SQLFORM.smartgrid(table, args=request.args[:2], formname=formname, **kwargs)
|
grid = SQLFORM.smartgrid(table, args=request.args[:2], formname=formname, **kwargs)
|
||||||
return grid
|
return grid
|
||||||
|
|
||||||
|
def hooks():
|
||||||
|
import functools
|
||||||
|
import inspect
|
||||||
|
list_op=['_%s_%s' %(h,m) for h in ['before', 'after'] for m in ['insert','update','delete']]
|
||||||
|
tables=[]
|
||||||
|
with_build_it=False
|
||||||
|
for db_str in sorted(databases):
|
||||||
|
db = databases[db_str]
|
||||||
|
for t in db.tables:
|
||||||
|
method_hooks=[]
|
||||||
|
for op in list_op:
|
||||||
|
functions = []
|
||||||
|
for f in getattr(db[t], op):
|
||||||
|
if hasattr(f, '__call__'):
|
||||||
|
if isinstance(f, (functools.partial)):
|
||||||
|
f = f.func
|
||||||
|
filename = inspect.getsourcefile(f)
|
||||||
|
details = {'funcname':f.__name__,
|
||||||
|
'filename':filename[len(request.folder):] if request.folder in filename else None,
|
||||||
|
'lineno': inspect.getsourcelines(f)[1]}
|
||||||
|
if details['filename']: # Built in functions as delete_uploaded_files are not editable
|
||||||
|
details['url'] = URL(a='admin',c='default',f='edit', args=[request['application'], details['filename']],vars={'lineno':details['lineno']})
|
||||||
|
if details['filename'] or with_build_it:
|
||||||
|
functions.append(details)
|
||||||
|
if len(functions):
|
||||||
|
method_hooks.append({'name':op, 'functions':functions})
|
||||||
|
if len(method_hooks):
|
||||||
|
tables.append({'name':"%s.%s" % (db_str,t), 'slug': IS_SLUG()("%s.%s" % (db_str,t))[0], 'method_hooks':method_hooks})
|
||||||
|
# Render
|
||||||
|
ul_main = UL(_class='nav nav-list')
|
||||||
|
for t in tables:
|
||||||
|
ul_main.append(A(t['name'], _onclick="collapse('a_%s')" % t['slug']))
|
||||||
|
ul_t = UL(_class='nav nav-list', _id="a_%s" % t['slug'], _style='display:none')
|
||||||
|
for op in t['method_hooks']:
|
||||||
|
ul_t.append(LI (op['name']))
|
||||||
|
ul_t.append(UL([LI(A(f['funcname'], _href=f['url']if 'url' in f else None)) for f in op['functions']]))
|
||||||
|
ul_main.append(ul_t)
|
||||||
|
return ul_main
|
||||||
|
|||||||
@@ -12,35 +12,45 @@
|
|||||||
{{if request.function=='index':}}
|
{{if request.function=='index':}}
|
||||||
<h2>{{=T("Available Databases and Tables")}}</h2>
|
<h2>{{=T("Available Databases and Tables")}}</h2>
|
||||||
{{if not databases:}}{{=T("No databases in this application")}}{{pass}}
|
{{if not databases:}}{{=T("No databases in this application")}}{{pass}}
|
||||||
<table>
|
<ul class="nav nav-tabs" id="myTab">
|
||||||
{{for db in sorted(databases):}}
|
<li class="active" ><a href="#alltables" data-toggle="tab">Tables</a></li>
|
||||||
{{for table in databases[db].tables:}}
|
<li><a href="#hooks" data-toggle="tab">Hooks</a></li>
|
||||||
{{qry='%s.%s.id>0'%(db,table)}}
|
</ul>
|
||||||
{{tbl=databases[db][table]}}
|
<div class="tab-content">
|
||||||
{{if hasattr(tbl,'_primarykey'):}}
|
<div class="tab-pane active" id="alltables">
|
||||||
{{if tbl._primarykey:}}
|
<table>
|
||||||
{{firstkey=tbl[tbl._primarykey[0]]}}
|
{{for db in sorted(databases):}}
|
||||||
{{if firstkey.type in ['string','text']:}}
|
{{for table in databases[db].tables:}}
|
||||||
{{qry='%s.%s.%s!=""'%(db,table,firstkey.name)}}
|
{{qry='%s.%s.id>0'%(db,table)}}
|
||||||
{{else:}}
|
{{tbl=databases[db][table]}}
|
||||||
{{qry='%s.%s.%s>0'%(db,table,firstkey.name)}}
|
{{if hasattr(tbl,'_primarykey'):}}
|
||||||
{{pass}}
|
{{if tbl._primarykey:}}
|
||||||
{{else:}}
|
{{firstkey=tbl[tbl._primarykey[0]]}}
|
||||||
{{qry=''}}
|
{{if firstkey.type in ['string','text']:}}
|
||||||
{{pass}}
|
{{qry='%s.%s.%s!=""'%(db,table,firstkey.name)}}
|
||||||
{{pass}}
|
{{else:}}
|
||||||
<tr>
|
{{qry='%s.%s.%s>0'%(db,table,firstkey.name)}}
|
||||||
<th style="font-size: 1.75em;">
|
{{pass}}
|
||||||
{{=A("%s.%s" % (db,table),_href=URL('select',args=[db],vars=dict(query=qry)))}}
|
{{else:}}
|
||||||
</th>
|
{{qry=''}}
|
||||||
<td>
|
{{pass}}
|
||||||
{{=A(str(T('New Record')),_href=URL('insert',args=[db,table]),_class="btn")}}
|
{{pass}}
|
||||||
</td>
|
<tr>
|
||||||
</tr>
|
<th style="font-size: 1.75em;">
|
||||||
{{pass}}
|
{{=A("%s.%s" % (db,table),_href=URL('select',args=[db],vars=dict(query=qry)))}}
|
||||||
{{pass}}
|
</th>
|
||||||
</table>
|
<td>
|
||||||
|
{{=A(str(T('New Record')),_href=URL('insert',args=[db,table]),_class="btn")}}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{{pass}}
|
||||||
|
{{pass}}
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<div class="tab-pane" id="hooks">
|
||||||
|
{{=LOAD('appadmin', 'hooks', ajax=True)}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
{{elif request.function=='select':}}
|
{{elif request.function=='select':}}
|
||||||
<h2>{{=XML(str(T("Database %s select"))%A(request.args[0],_href=URL('index'))) }}
|
<h2>{{=XML(str(T("Database %s select"))%A(request.args[0],_href=URL('index'))) }}
|
||||||
</h2>
|
</h2>
|
||||||
|
|||||||
Reference in New Issue
Block a user