diff --git a/VERSION b/VERSION index edf46ca6..5a3539c4 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.4.1-alpha.1+timestamp.2012.12.24.11.22.50 +Version 2.4.1-alpha.1+timestamp.2012.12.24.12.13.23 diff --git a/applications/admin/controllers/appadmin.py b/applications/admin/controllers/appadmin.py index d9b81010..ee83434f 100644 --- a/applications/admin/controllers/appadmin.py +++ b/applications/admin/controllers/appadmin.py @@ -10,6 +10,10 @@ import datetime import copy import gluon.contenttype import gluon.fileutils +try: + import pygraphviz as pgv +except ImportError: + pgv = None response.subtitle = 'Database Administration (appadmin)' @@ -460,3 +464,50 @@ def ccache(): return dict(form=form, total=total, ram=ram, disk=disk, object_stats=hp != False) + + + +def table_template(table): + def types(field): + f_type = field.type + if not isinstance(f_type,str): + return ' ' + elif f_type == 'string': + return field.length + elif f_type == 'id': + return B('pk') + elif f_type.startswith('reference') or \ + f_type.startswith('list:reference'): + return B('fk') + else: + return ' ' + # this is horribe HTML but the only one graphiz understands + header = '%s' % table + fields = [] + for field in db[table]: + fields.append('%s%s%s' % (field.name,field.type,types(field))) + return '< %s %s
>' % (header, ' '.join(fields)) + +def bg_graph_model(): + graph = pgv.AGraph(layout='dot', directed=True, strict=False, rankdir='LR') + for tablename in db.tables: + graph.add_node(tablename, name=tablename, shape='plaintext', + label=table_template(tablename)) + + for tablename in db.tables: + for field in db[tablename]: + f_type = field.type + if isinstance(f_type,str) and ( + f_type.startswith('reference') or + f_type.startswith('list:reference')): + referenced_table = f_type.split()[1].split('.')[0] + n1 = graph.get_node(tablename) + n2 = graph.get_node(referenced_table) + graph.add_edge(n1, n2, color="#4C4C4C", label='') + + graph.layout() + return graph.draw(format='png', prog='dot') + +def graph_model(): + return dict(databases=databases, pgv=pgv) diff --git a/applications/admin/views/appadmin.html b/applications/admin/views/appadmin.html index f966b79c..a9f6dab8 100644 --- a/applications/admin/views/appadmin.html +++ b/applications/admin/views/appadmin.html @@ -2,7 +2,7 @@