configurable appadmin graphs, thanks Jose
This commit is contained in:
@@ -1 +1 @@
|
|||||||
Version 2.4.1-alpha.2+timestamp.2013.01.27.09.58.34
|
Version 2.4.1-alpha.2+timestamp.2013.01.27.10.24.17
|
||||||
|
|||||||
@@ -469,10 +469,10 @@ def ccache():
|
|||||||
|
|
||||||
def table_template(table):
|
def table_template(table):
|
||||||
from gluon.html import TR, TD, TABLE, TAG
|
from gluon.html import TR, TD, TABLE, TAG
|
||||||
|
|
||||||
def FONT(*args, **kwargs):
|
def FONT(*args, **kwargs):
|
||||||
return TAG.font(*args, **kwargs)
|
return TAG.font(*args, **kwargs)
|
||||||
|
|
||||||
def types(field):
|
def types(field):
|
||||||
f_type = field.type
|
f_type = field.type
|
||||||
if not isinstance(f_type,str):
|
if not isinstance(f_type,str):
|
||||||
@@ -480,7 +480,7 @@ def table_template(table):
|
|||||||
elif f_type == 'string':
|
elif f_type == 'string':
|
||||||
return field.length
|
return field.length
|
||||||
elif f_type == 'id':
|
elif f_type == 'id':
|
||||||
return B('pk')
|
return B('pk')
|
||||||
elif f_type.startswith('reference') or \
|
elif f_type.startswith('reference') or \
|
||||||
f_type.startswith('list:reference'):
|
f_type.startswith('list:reference'):
|
||||||
return B('fk')
|
return B('fk')
|
||||||
@@ -495,7 +495,7 @@ def table_template(table):
|
|||||||
face = "Helvetica"
|
face = "Helvetica"
|
||||||
face_bold = "Helvetica Bold"
|
face_bold = "Helvetica Bold"
|
||||||
border = 0
|
border = 0
|
||||||
|
|
||||||
rows.append(TR(TD(FONT(table, _face=face_bold, _color=bgcolor),
|
rows.append(TR(TD(FONT(table, _face=face_bold, _color=bgcolor),
|
||||||
_colspan=3, _cellpadding=cellpadding,
|
_colspan=3, _cellpadding=cellpadding,
|
||||||
_align="center", _bgcolor=color)))
|
_align="center", _bgcolor=color)))
|
||||||
@@ -515,10 +515,31 @@ def table_template(table):
|
|||||||
|
|
||||||
|
|
||||||
def bg_graph_model():
|
def bg_graph_model():
|
||||||
graph = pgv.AGraph(layout='dot', directed=True, strict=False, rankdir='LR')
|
graph = pgv.AGraph(layout='dot', directed=True, strict=False, rankdir='LR')
|
||||||
|
|
||||||
|
subgraphs = dict()
|
||||||
for tablename in db.tables:
|
for tablename in db.tables:
|
||||||
graph.add_node(tablename, name=tablename, shape='plaintext',
|
if hasattr(db[tablename],'_meta_graphmodel'):
|
||||||
|
meta_graphmodel = db[tablename]._meta_graphmodel
|
||||||
|
else:
|
||||||
|
meta_graphmodel = dict(group='Undefined', color='#ECECEC')
|
||||||
|
|
||||||
|
group = meta_graphmodel['group'].replace(' ', '')
|
||||||
|
if not subgraphs.has_key(group):
|
||||||
|
subgraphs[group] = dict(meta=meta_graphmodel, tables=[])
|
||||||
|
subgraphs[group]['tables'].append(tablename)
|
||||||
|
else:
|
||||||
|
subgraphs[group]['tables'].append(tablename)
|
||||||
|
|
||||||
|
graph.add_node(tablename, name=tablename, shape='plaintext',
|
||||||
label=table_template(tablename))
|
label=table_template(tablename))
|
||||||
|
|
||||||
|
for n, key in enumerate(subgraphs.iterkeys()):
|
||||||
|
graph.subgraph(nbunch=subgraphs[key]['tables'],
|
||||||
|
name='cluster%d' % n,
|
||||||
|
style='filled',
|
||||||
|
color=subgraphs[key]['meta']['color'],
|
||||||
|
label=subgraphs[key]['meta']['group'])
|
||||||
|
|
||||||
for tablename in db.tables:
|
for tablename in db.tables:
|
||||||
for field in db[tablename]:
|
for field in db[tablename]:
|
||||||
@@ -532,7 +553,15 @@ def bg_graph_model():
|
|||||||
graph.add_edge(n1, n2, color="#4C4C4C", label='')
|
graph.add_edge(n1, n2, color="#4C4C4C", label='')
|
||||||
|
|
||||||
graph.layout()
|
graph.layout()
|
||||||
return graph.draw(format='png', prog='dot')
|
#return graph.draw(format='png', prog='dot')
|
||||||
|
if not request.args:
|
||||||
|
return graph.draw(format='png', prog='dot')
|
||||||
|
else:
|
||||||
|
response.headers['Content-Disposition']='attachment;filename=graph.%s'%request.args(0)
|
||||||
|
if request.args(0) == 'dot':
|
||||||
|
return graph.string()
|
||||||
|
else:
|
||||||
|
return graph.draw(format=request.args(0), prog='dot')
|
||||||
|
|
||||||
def graph_model():
|
def graph_model():
|
||||||
return dict(databases=databases, pgv=pgv)
|
return dict(databases=databases, pgv=pgv)
|
||||||
|
|||||||
@@ -229,7 +229,21 @@
|
|||||||
{{=T('pygraphviz library not found')}}
|
{{=T('pygraphviz library not found')}}
|
||||||
{{elif not databases:}}
|
{{elif not databases:}}
|
||||||
{{=T("No databases in this application")}}
|
{{=T("No databases in this application")}}
|
||||||
{{else:}}
|
{{else:}}
|
||||||
|
<div class="btn-group">
|
||||||
|
<a class="btn dropdown-toggle" data-toggle="dropdown" href="#">
|
||||||
|
<i class="icon-download"></i> {{=T('Save model as...')}}
|
||||||
|
<span class="caret"></span>
|
||||||
|
</a>
|
||||||
|
<ul class="dropdown-menu">
|
||||||
|
<li><a href="{{=URL('appadmin', 'bg_graph_model', args=['png'])}}">png</a></li>
|
||||||
|
<li><a href="{{=URL('appadmin', 'bg_graph_model', args=['svg'])}}">svg</a></li>
|
||||||
|
<li><a href="{{=URL('appadmin', 'bg_graph_model', args=['pdf'])}}">pdf</a></li>
|
||||||
|
<li><a href="{{=URL('appadmin', 'bg_graph_model', args=['ps'])}}">ps</a></li>
|
||||||
|
<li><a href="{{=URL('appadmin', 'bg_graph_model', args=['dot'])}}">dot</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<br />
|
||||||
{{=IMG(_src=URL('appadmin', 'bg_graph_model'))}}
|
{{=IMG(_src=URL('appadmin', 'bg_graph_model'))}}
|
||||||
{{pass}}
|
{{pass}}
|
||||||
{{pass}}
|
{{pass}}
|
||||||
|
|||||||
@@ -469,10 +469,10 @@ def ccache():
|
|||||||
|
|
||||||
def table_template(table):
|
def table_template(table):
|
||||||
from gluon.html import TR, TD, TABLE, TAG
|
from gluon.html import TR, TD, TABLE, TAG
|
||||||
|
|
||||||
def FONT(*args, **kwargs):
|
def FONT(*args, **kwargs):
|
||||||
return TAG.font(*args, **kwargs)
|
return TAG.font(*args, **kwargs)
|
||||||
|
|
||||||
def types(field):
|
def types(field):
|
||||||
f_type = field.type
|
f_type = field.type
|
||||||
if not isinstance(f_type,str):
|
if not isinstance(f_type,str):
|
||||||
@@ -480,7 +480,7 @@ def table_template(table):
|
|||||||
elif f_type == 'string':
|
elif f_type == 'string':
|
||||||
return field.length
|
return field.length
|
||||||
elif f_type == 'id':
|
elif f_type == 'id':
|
||||||
return B('pk')
|
return B('pk')
|
||||||
elif f_type.startswith('reference') or \
|
elif f_type.startswith('reference') or \
|
||||||
f_type.startswith('list:reference'):
|
f_type.startswith('list:reference'):
|
||||||
return B('fk')
|
return B('fk')
|
||||||
@@ -495,7 +495,7 @@ def table_template(table):
|
|||||||
face = "Helvetica"
|
face = "Helvetica"
|
||||||
face_bold = "Helvetica Bold"
|
face_bold = "Helvetica Bold"
|
||||||
border = 0
|
border = 0
|
||||||
|
|
||||||
rows.append(TR(TD(FONT(table, _face=face_bold, _color=bgcolor),
|
rows.append(TR(TD(FONT(table, _face=face_bold, _color=bgcolor),
|
||||||
_colspan=3, _cellpadding=cellpadding,
|
_colspan=3, _cellpadding=cellpadding,
|
||||||
_align="center", _bgcolor=color)))
|
_align="center", _bgcolor=color)))
|
||||||
@@ -515,10 +515,31 @@ def table_template(table):
|
|||||||
|
|
||||||
|
|
||||||
def bg_graph_model():
|
def bg_graph_model():
|
||||||
graph = pgv.AGraph(layout='dot', directed=True, strict=False, rankdir='LR')
|
graph = pgv.AGraph(layout='dot', directed=True, strict=False, rankdir='LR')
|
||||||
|
|
||||||
|
subgraphs = dict()
|
||||||
for tablename in db.tables:
|
for tablename in db.tables:
|
||||||
graph.add_node(tablename, name=tablename, shape='plaintext',
|
if hasattr(db[tablename],'_meta_graphmodel'):
|
||||||
|
meta_graphmodel = db[tablename]._meta_graphmodel
|
||||||
|
else:
|
||||||
|
meta_graphmodel = dict(group='Undefined', color='#ECECEC')
|
||||||
|
|
||||||
|
group = meta_graphmodel['group'].replace(' ', '')
|
||||||
|
if not subgraphs.has_key(group):
|
||||||
|
subgraphs[group] = dict(meta=meta_graphmodel, tables=[])
|
||||||
|
subgraphs[group]['tables'].append(tablename)
|
||||||
|
else:
|
||||||
|
subgraphs[group]['tables'].append(tablename)
|
||||||
|
|
||||||
|
graph.add_node(tablename, name=tablename, shape='plaintext',
|
||||||
label=table_template(tablename))
|
label=table_template(tablename))
|
||||||
|
|
||||||
|
for n, key in enumerate(subgraphs.iterkeys()):
|
||||||
|
graph.subgraph(nbunch=subgraphs[key]['tables'],
|
||||||
|
name='cluster%d' % n,
|
||||||
|
style='filled',
|
||||||
|
color=subgraphs[key]['meta']['color'],
|
||||||
|
label=subgraphs[key]['meta']['group'])
|
||||||
|
|
||||||
for tablename in db.tables:
|
for tablename in db.tables:
|
||||||
for field in db[tablename]:
|
for field in db[tablename]:
|
||||||
@@ -532,7 +553,15 @@ def bg_graph_model():
|
|||||||
graph.add_edge(n1, n2, color="#4C4C4C", label='')
|
graph.add_edge(n1, n2, color="#4C4C4C", label='')
|
||||||
|
|
||||||
graph.layout()
|
graph.layout()
|
||||||
return graph.draw(format='png', prog='dot')
|
#return graph.draw(format='png', prog='dot')
|
||||||
|
if not request.args:
|
||||||
|
return graph.draw(format='png', prog='dot')
|
||||||
|
else:
|
||||||
|
response.headers['Content-Disposition']='attachment;filename=graph.%s'%request.args(0)
|
||||||
|
if request.args(0) == 'dot':
|
||||||
|
return graph.string()
|
||||||
|
else:
|
||||||
|
return graph.draw(format=request.args(0), prog='dot')
|
||||||
|
|
||||||
def graph_model():
|
def graph_model():
|
||||||
return dict(databases=databases, pgv=pgv)
|
return dict(databases=databases, pgv=pgv)
|
||||||
|
|||||||
@@ -229,7 +229,21 @@
|
|||||||
{{=T('pygraphviz library not found')}}
|
{{=T('pygraphviz library not found')}}
|
||||||
{{elif not databases:}}
|
{{elif not databases:}}
|
||||||
{{=T("No databases in this application")}}
|
{{=T("No databases in this application")}}
|
||||||
{{else:}}
|
{{else:}}
|
||||||
|
<div class="btn-group">
|
||||||
|
<a class="btn dropdown-toggle" data-toggle="dropdown" href="#">
|
||||||
|
<i class="icon-download"></i> {{=T('Save model as...')}}
|
||||||
|
<span class="caret"></span>
|
||||||
|
</a>
|
||||||
|
<ul class="dropdown-menu">
|
||||||
|
<li><a href="{{=URL('appadmin', 'bg_graph_model', args=['png'])}}">png</a></li>
|
||||||
|
<li><a href="{{=URL('appadmin', 'bg_graph_model', args=['svg'])}}">svg</a></li>
|
||||||
|
<li><a href="{{=URL('appadmin', 'bg_graph_model', args=['pdf'])}}">pdf</a></li>
|
||||||
|
<li><a href="{{=URL('appadmin', 'bg_graph_model', args=['ps'])}}">ps</a></li>
|
||||||
|
<li><a href="{{=URL('appadmin', 'bg_graph_model', args=['dot'])}}">dot</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<br />
|
||||||
{{=IMG(_src=URL('appadmin', 'bg_graph_model'))}}
|
{{=IMG(_src=URL('appadmin', 'bg_graph_model'))}}
|
||||||
{{pass}}
|
{{pass}}
|
||||||
{{pass}}
|
{{pass}}
|
||||||
|
|||||||
@@ -469,10 +469,10 @@ def ccache():
|
|||||||
|
|
||||||
def table_template(table):
|
def table_template(table):
|
||||||
from gluon.html import TR, TD, TABLE, TAG
|
from gluon.html import TR, TD, TABLE, TAG
|
||||||
|
|
||||||
def FONT(*args, **kwargs):
|
def FONT(*args, **kwargs):
|
||||||
return TAG.font(*args, **kwargs)
|
return TAG.font(*args, **kwargs)
|
||||||
|
|
||||||
def types(field):
|
def types(field):
|
||||||
f_type = field.type
|
f_type = field.type
|
||||||
if not isinstance(f_type,str):
|
if not isinstance(f_type,str):
|
||||||
@@ -480,7 +480,7 @@ def table_template(table):
|
|||||||
elif f_type == 'string':
|
elif f_type == 'string':
|
||||||
return field.length
|
return field.length
|
||||||
elif f_type == 'id':
|
elif f_type == 'id':
|
||||||
return B('pk')
|
return B('pk')
|
||||||
elif f_type.startswith('reference') or \
|
elif f_type.startswith('reference') or \
|
||||||
f_type.startswith('list:reference'):
|
f_type.startswith('list:reference'):
|
||||||
return B('fk')
|
return B('fk')
|
||||||
@@ -495,7 +495,7 @@ def table_template(table):
|
|||||||
face = "Helvetica"
|
face = "Helvetica"
|
||||||
face_bold = "Helvetica Bold"
|
face_bold = "Helvetica Bold"
|
||||||
border = 0
|
border = 0
|
||||||
|
|
||||||
rows.append(TR(TD(FONT(table, _face=face_bold, _color=bgcolor),
|
rows.append(TR(TD(FONT(table, _face=face_bold, _color=bgcolor),
|
||||||
_colspan=3, _cellpadding=cellpadding,
|
_colspan=3, _cellpadding=cellpadding,
|
||||||
_align="center", _bgcolor=color)))
|
_align="center", _bgcolor=color)))
|
||||||
@@ -515,10 +515,31 @@ def table_template(table):
|
|||||||
|
|
||||||
|
|
||||||
def bg_graph_model():
|
def bg_graph_model():
|
||||||
graph = pgv.AGraph(layout='dot', directed=True, strict=False, rankdir='LR')
|
graph = pgv.AGraph(layout='dot', directed=True, strict=False, rankdir='LR')
|
||||||
|
|
||||||
|
subgraphs = dict()
|
||||||
for tablename in db.tables:
|
for tablename in db.tables:
|
||||||
graph.add_node(tablename, name=tablename, shape='plaintext',
|
if hasattr(db[tablename],'_meta_graphmodel'):
|
||||||
|
meta_graphmodel = db[tablename]._meta_graphmodel
|
||||||
|
else:
|
||||||
|
meta_graphmodel = dict(group='Undefined', color='#ECECEC')
|
||||||
|
|
||||||
|
group = meta_graphmodel['group'].replace(' ', '')
|
||||||
|
if not subgraphs.has_key(group):
|
||||||
|
subgraphs[group] = dict(meta=meta_graphmodel, tables=[])
|
||||||
|
subgraphs[group]['tables'].append(tablename)
|
||||||
|
else:
|
||||||
|
subgraphs[group]['tables'].append(tablename)
|
||||||
|
|
||||||
|
graph.add_node(tablename, name=tablename, shape='plaintext',
|
||||||
label=table_template(tablename))
|
label=table_template(tablename))
|
||||||
|
|
||||||
|
for n, key in enumerate(subgraphs.iterkeys()):
|
||||||
|
graph.subgraph(nbunch=subgraphs[key]['tables'],
|
||||||
|
name='cluster%d' % n,
|
||||||
|
style='filled',
|
||||||
|
color=subgraphs[key]['meta']['color'],
|
||||||
|
label=subgraphs[key]['meta']['group'])
|
||||||
|
|
||||||
for tablename in db.tables:
|
for tablename in db.tables:
|
||||||
for field in db[tablename]:
|
for field in db[tablename]:
|
||||||
@@ -532,7 +553,15 @@ def bg_graph_model():
|
|||||||
graph.add_edge(n1, n2, color="#4C4C4C", label='')
|
graph.add_edge(n1, n2, color="#4C4C4C", label='')
|
||||||
|
|
||||||
graph.layout()
|
graph.layout()
|
||||||
return graph.draw(format='png', prog='dot')
|
#return graph.draw(format='png', prog='dot')
|
||||||
|
if not request.args:
|
||||||
|
return graph.draw(format='png', prog='dot')
|
||||||
|
else:
|
||||||
|
response.headers['Content-Disposition']='attachment;filename=graph.%s'%request.args(0)
|
||||||
|
if request.args(0) == 'dot':
|
||||||
|
return graph.string()
|
||||||
|
else:
|
||||||
|
return graph.draw(format=request.args(0), prog='dot')
|
||||||
|
|
||||||
def graph_model():
|
def graph_model():
|
||||||
return dict(databases=databases, pgv=pgv)
|
return dict(databases=databases, pgv=pgv)
|
||||||
|
|||||||
@@ -229,7 +229,21 @@
|
|||||||
{{=T('pygraphviz library not found')}}
|
{{=T('pygraphviz library not found')}}
|
||||||
{{elif not databases:}}
|
{{elif not databases:}}
|
||||||
{{=T("No databases in this application")}}
|
{{=T("No databases in this application")}}
|
||||||
{{else:}}
|
{{else:}}
|
||||||
|
<div class="btn-group">
|
||||||
|
<a class="btn dropdown-toggle" data-toggle="dropdown" href="#">
|
||||||
|
<i class="icon-download"></i> {{=T('Save model as...')}}
|
||||||
|
<span class="caret"></span>
|
||||||
|
</a>
|
||||||
|
<ul class="dropdown-menu">
|
||||||
|
<li><a href="{{=URL('appadmin', 'bg_graph_model', args=['png'])}}">png</a></li>
|
||||||
|
<li><a href="{{=URL('appadmin', 'bg_graph_model', args=['svg'])}}">svg</a></li>
|
||||||
|
<li><a href="{{=URL('appadmin', 'bg_graph_model', args=['pdf'])}}">pdf</a></li>
|
||||||
|
<li><a href="{{=URL('appadmin', 'bg_graph_model', args=['ps'])}}">ps</a></li>
|
||||||
|
<li><a href="{{=URL('appadmin', 'bg_graph_model', args=['dot'])}}">dot</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<br />
|
||||||
{{=IMG(_src=URL('appadmin', 'bg_graph_model'))}}
|
{{=IMG(_src=URL('appadmin', 'bg_graph_model'))}}
|
||||||
{{pass}}
|
{{pass}}
|
||||||
{{pass}}
|
{{pass}}
|
||||||
|
|||||||
Reference in New Issue
Block a user