From 3bb8d5e235ec8615e4a3368c7a9b8b6d83303f70 Mon Sep 17 00:00:00 2001 From: mdipierro Date: Sun, 27 Jan 2013 10:25:02 -0600 Subject: [PATCH] configurable appadmin graphs, thanks Jose --- VERSION | 2 +- applications/admin/controllers/appadmin.py | 45 +++++++++++++++---- applications/admin/views/appadmin.html | 16 ++++++- applications/examples/controllers/appadmin.py | 45 +++++++++++++++---- applications/examples/views/appadmin.html | 16 ++++++- applications/welcome/controllers/appadmin.py | 45 +++++++++++++++---- applications/welcome/views/appadmin.html | 16 ++++++- 7 files changed, 157 insertions(+), 28 deletions(-) diff --git a/VERSION b/VERSION index b167470f..98d8ae98 100644 --- a/VERSION +++ b/VERSION @@ -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 diff --git a/applications/admin/controllers/appadmin.py b/applications/admin/controllers/appadmin.py index 99a0186d..a2b2c6ab 100644 --- a/applications/admin/controllers/appadmin.py +++ b/applications/admin/controllers/appadmin.py @@ -469,10 +469,10 @@ def ccache(): def table_template(table): from gluon.html import TR, TD, TABLE, TAG - + def FONT(*args, **kwargs): return TAG.font(*args, **kwargs) - + def types(field): f_type = field.type if not isinstance(f_type,str): @@ -480,7 +480,7 @@ def table_template(table): elif f_type == 'string': return field.length elif f_type == 'id': - return B('pk') + return B('pk') elif f_type.startswith('reference') or \ f_type.startswith('list:reference'): return B('fk') @@ -495,7 +495,7 @@ def table_template(table): face = "Helvetica" face_bold = "Helvetica Bold" border = 0 - + rows.append(TR(TD(FONT(table, _face=face_bold, _color=bgcolor), _colspan=3, _cellpadding=cellpadding, _align="center", _bgcolor=color))) @@ -515,10 +515,31 @@ def table_template(table): 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: - 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)) + + 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 field in db[tablename]: @@ -532,7 +553,15 @@ def bg_graph_model(): graph.add_edge(n1, n2, color="#4C4C4C", label='') 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) diff --git a/applications/admin/views/appadmin.html b/applications/admin/views/appadmin.html index a9f6dab8..95c60ecf 100644 --- a/applications/admin/views/appadmin.html +++ b/applications/admin/views/appadmin.html @@ -229,7 +229,21 @@ {{=T('pygraphviz library not found')}} {{elif not databases:}} {{=T("No databases in this application")}} - {{else:}} + {{else:}} +
+ + {{=T('Save model as...')}} + + + +
+
{{=IMG(_src=URL('appadmin', 'bg_graph_model'))}} {{pass}} {{pass}} diff --git a/applications/examples/controllers/appadmin.py b/applications/examples/controllers/appadmin.py index 99a0186d..a2b2c6ab 100644 --- a/applications/examples/controllers/appadmin.py +++ b/applications/examples/controllers/appadmin.py @@ -469,10 +469,10 @@ def ccache(): def table_template(table): from gluon.html import TR, TD, TABLE, TAG - + def FONT(*args, **kwargs): return TAG.font(*args, **kwargs) - + def types(field): f_type = field.type if not isinstance(f_type,str): @@ -480,7 +480,7 @@ def table_template(table): elif f_type == 'string': return field.length elif f_type == 'id': - return B('pk') + return B('pk') elif f_type.startswith('reference') or \ f_type.startswith('list:reference'): return B('fk') @@ -495,7 +495,7 @@ def table_template(table): face = "Helvetica" face_bold = "Helvetica Bold" border = 0 - + rows.append(TR(TD(FONT(table, _face=face_bold, _color=bgcolor), _colspan=3, _cellpadding=cellpadding, _align="center", _bgcolor=color))) @@ -515,10 +515,31 @@ def table_template(table): 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: - 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)) + + 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 field in db[tablename]: @@ -532,7 +553,15 @@ def bg_graph_model(): graph.add_edge(n1, n2, color="#4C4C4C", label='') 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) diff --git a/applications/examples/views/appadmin.html b/applications/examples/views/appadmin.html index a9f6dab8..95c60ecf 100644 --- a/applications/examples/views/appadmin.html +++ b/applications/examples/views/appadmin.html @@ -229,7 +229,21 @@ {{=T('pygraphviz library not found')}} {{elif not databases:}} {{=T("No databases in this application")}} - {{else:}} + {{else:}} +
+ + {{=T('Save model as...')}} + + + +
+
{{=IMG(_src=URL('appadmin', 'bg_graph_model'))}} {{pass}} {{pass}} diff --git a/applications/welcome/controllers/appadmin.py b/applications/welcome/controllers/appadmin.py index 99a0186d..a2b2c6ab 100644 --- a/applications/welcome/controllers/appadmin.py +++ b/applications/welcome/controllers/appadmin.py @@ -469,10 +469,10 @@ def ccache(): def table_template(table): from gluon.html import TR, TD, TABLE, TAG - + def FONT(*args, **kwargs): return TAG.font(*args, **kwargs) - + def types(field): f_type = field.type if not isinstance(f_type,str): @@ -480,7 +480,7 @@ def table_template(table): elif f_type == 'string': return field.length elif f_type == 'id': - return B('pk') + return B('pk') elif f_type.startswith('reference') or \ f_type.startswith('list:reference'): return B('fk') @@ -495,7 +495,7 @@ def table_template(table): face = "Helvetica" face_bold = "Helvetica Bold" border = 0 - + rows.append(TR(TD(FONT(table, _face=face_bold, _color=bgcolor), _colspan=3, _cellpadding=cellpadding, _align="center", _bgcolor=color))) @@ -515,10 +515,31 @@ def table_template(table): 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: - 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)) + + 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 field in db[tablename]: @@ -532,7 +553,15 @@ def bg_graph_model(): graph.add_edge(n1, n2, color="#4C4C4C", label='') 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) diff --git a/applications/welcome/views/appadmin.html b/applications/welcome/views/appadmin.html index a9f6dab8..95c60ecf 100644 --- a/applications/welcome/views/appadmin.html +++ b/applications/welcome/views/appadmin.html @@ -229,7 +229,21 @@ {{=T('pygraphviz library not found')}} {{elif not databases:}} {{=T("No databases in this application")}} - {{else:}} + {{else:}} +
+ + {{=T('Save model as...')}} + + + +
+
{{=IMG(_src=URL('appadmin', 'bg_graph_model'))}} {{pass}} {{pass}}