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:}}
+
+
{{=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:}}
+
+
{{=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:}}
+
+
{{=IMG(_src=URL('appadmin', 'bg_graph_model'))}}
{{pass}}
{{pass}}