| author | Sandro Knauß <knauss@netzguerilla.net> |
| Fri, 16 Mar 2012 12:56:48 +0100 | |
| branch | devel |
| changeset 228 | 944edbe51145 |
| parent 77 | 7dce6c0f06fb |
| child 294 | 0e75bd39767d |
| permissions | -rw-r--r-- |
|
77
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
1 |
# updated SQLA schema display to work with pydot 1.0.2 |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
2 |
# download from: http://www.sqlalchemy.org/trac/wiki/UsageRecipes/SchemaDisplay |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
3 |
|
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
4 |
|
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
5 |
from sqlalchemy.orm.properties import PropertyLoader |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
6 |
import pydot |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
7 |
import types |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
8 |
|
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
9 |
__all__ = ['create_uml_graph', 'create_schema_graph', 'show_uml_graph', 'show_schema_graph'] |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
10 |
|
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
11 |
def _mk_label(mapper, show_operations, show_attributes, show_datatypes, bordersize): |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
12 |
html = '<<TABLE CELLSPACING="0" CELLPADDING="1" BORDER="0" CELLBORDER="%d" BALIGN="LEFT"><TR><TD><FONT POINT-SIZE="10">%s</FONT></TD></TR>' % (bordersize, mapper.class_.__name__) |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
13 |
def format_col(col): |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
14 |
colstr = '+%s' % (col.name) |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
15 |
if show_datatypes: |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
16 |
colstr += ' : %s' % (col.type.__class__.__name__) |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
17 |
return colstr |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
18 |
|
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
19 |
if show_attributes: |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
20 |
html += '<TR><TD ALIGN="LEFT">%s</TD></TR>' % '<BR ALIGN="LEFT"/>'.join(format_col(col) for col in sorted(mapper.columns, key=lambda col:not col.primary_key)) |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
21 |
else: |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
22 |
[format_col(col) for col in sorted(mapper.columns, key=lambda col:not col.primary_key)] |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
23 |
if show_operations: |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
24 |
html += '<TR><TD ALIGN="LEFT">%s</TD></TR>' % '<BR ALIGN="LEFT"/>'.join( |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
25 |
'%s(%s)' % (name,", ".join(default is _mk_label and ("%s") % arg or ("%s=%s" % (arg,repr(default))) for default,arg in |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
26 |
zip((func.func_defaults and len(func.func_code.co_varnames)-1-(len(func.func_defaults) or 0) or func.func_code.co_argcount-1)*[_mk_label]+list(func.func_defaults or []), func.func_code.co_varnames[1:]) |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
27 |
)) |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
28 |
for name,func in mapper.class_.__dict__.items() if isinstance(func, types.FunctionType) and func.__module__ == mapper.class_.__module__ |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
29 |
) |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
30 |
html+= '</TABLE>>' |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
31 |
return html |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
32 |
|
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
33 |
|
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
34 |
def create_uml_graph(mappers, show_operations=True, show_attributes=True, show_multiplicity_one=False, show_datatypes=True, linewidth=1.0, font="Bitstream-Vera Sans"): |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
35 |
graph = pydot.Dot(prog='neato',mode="major",overlap="0", sep="0.01",dim="3", pack="True", ratio=".75") |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
36 |
relations = set() |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
37 |
for mapper in mappers: |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
38 |
graph.add_node(pydot.Node(mapper.class_.__name__, |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
39 |
shape="plaintext", label=_mk_label(mapper, show_operations, show_attributes, show_datatypes, linewidth), |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
40 |
fontname=font, fontsize="8.0", |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
41 |
)) |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
42 |
if mapper.inherits: |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
43 |
graph.add_edge(pydot.Edge(mapper.inherits.class_.__name__,mapper.class_.__name__, |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
44 |
arrowhead='none',arrowtail='empty', style="setlinewidth(%s)" % linewidth, arrowsize=str(linewidth))) |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
45 |
for loader in mapper.iterate_properties: |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
46 |
if isinstance(loader, PropertyLoader) and loader.mapper in mappers: |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
47 |
if hasattr(loader, 'reverse_property'): |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
48 |
relations.add(frozenset([loader, loader.reverse_property])) |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
49 |
else: |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
50 |
relations.add(frozenset([loader])) |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
51 |
|
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
52 |
for relation in relations: |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
53 |
#if len(loaders) > 2: |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
54 |
# raise Exception("Warning: too many loaders for join %s" % join) |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
55 |
args = {} |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
56 |
def multiplicity_indicator(prop): |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
57 |
if prop.uselist: |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
58 |
return ' *' |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
59 |
if any(col.nullable for col in prop.local_side): |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
60 |
return ' 0..1' |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
61 |
if show_multiplicity_one: |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
62 |
return ' 1' |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
63 |
return '' |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
64 |
|
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
65 |
if len(relation) == 2: |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
66 |
src, dest = relation |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
67 |
from_name = src.parent.class_.__name__ |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
68 |
to_name = dest.parent.class_.__name__ |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
69 |
|
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
70 |
def calc_label(src,dest): |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
71 |
return '+' + src.key + multiplicity_indicator(src) |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
72 |
args['headlabel'] = calc_label(src,dest) |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
73 |
|
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
74 |
args['taillabel'] = calc_label(dest,src) |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
75 |
args['arrowtail'] = 'none' |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
76 |
args['arrowhead'] = 'none' |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
77 |
args['constraint'] = False |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
78 |
else: |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
79 |
prop, = relation |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
80 |
from_name = prop.parent.class_.__name__ |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
81 |
to_name = prop.mapper.class_.__name__ |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
82 |
args['headlabel'] = '+%s%s' % (prop.key, multiplicity_indicator(prop)) |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
83 |
args['arrowtail'] = 'none' |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
84 |
args['arrowhead'] = 'vee' |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
85 |
|
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
86 |
graph.add_edge(pydot.Edge(from_name,to_name, |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
87 |
fontname=font, fontsize="7.0", style="setlinewidth(%s)"%linewidth, arrowsize=str(linewidth), |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
88 |
**args) |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
89 |
) |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
90 |
|
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
91 |
return graph |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
92 |
|
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
93 |
#from sqlalchemy import Table, text |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
94 |
|
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
95 |
def _render_table_html(table, metadata, show_indexes, show_datatypes): |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
96 |
def format_col_type(col): |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
97 |
try: |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
98 |
return col.type.get_col_spec() |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
99 |
except NotImplementedError: |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
100 |
return str(col.type) |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
101 |
except AttributeError: |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
102 |
return str(col.type) |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
103 |
def format_col_str(col): |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
104 |
if show_datatypes: |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
105 |
return "- %s : %s" % (col.name, format_col_type(col)) |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
106 |
else: |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
107 |
return "- %s" % col.name |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
108 |
html = '<<TABLE BORDER="1" CELLBORDER="0" CELLSPACING="0"><TR><TD ALIGN="CENTER">%s</TD></TR><TR><TD BORDER="1" CELLPADDING="0"></TD></TR>' % table.name |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
109 |
|
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
110 |
html += ''.join('<TR><TD ALIGN="LEFT" PORT="%s">%s</TD></TR>' % (col.name, format_col_str(col)) for col in table.columns) |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
111 |
html += '</TABLE>>' |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
112 |
return html |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
113 |
|
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
114 |
def create_schema_graph(tables=None, metadata=None, show_indexes=True, show_datatypes=True, font="Bitstream-Vera Sans", |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
115 |
concentrate=True, relation_options={}, rankdir='TB'): |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
116 |
relation_kwargs = { |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
117 |
'fontsize':"7.0" |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
118 |
} |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
119 |
relation_kwargs.update(relation_options) |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
120 |
|
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
121 |
if not metadata and len(tables): |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
122 |
metadata = tables[0].metadata |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
123 |
elif not tables and metadata: |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
124 |
if not len(metadata.tables): |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
125 |
metadata.reflect() |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
126 |
tables = metadata.tables.values() |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
127 |
else: |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
128 |
raise Exception("You need to specify at least tables or metadata") |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
129 |
|
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
130 |
graph = pydot.Dot(prog="dot",mode="ipsep",overlap="ipsep",sep="0.01",concentrate=str(concentrate), rankdir=rankdir) |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
131 |
for table in tables: |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
132 |
graph.add_node(pydot.Node(str(table.name), |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
133 |
shape="plaintext", |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
134 |
label=_render_table_html(table, metadata, show_indexes, show_datatypes), |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
135 |
fontname=font, fontsize="7.0" |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
136 |
)) |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
137 |
|
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
138 |
for table in tables: |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
139 |
for fk in table.foreign_keys: |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
140 |
edge = [table.name, fk.column.table.name] |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
141 |
is_inheritance = fk.parent.primary_key and fk.column.primary_key |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
142 |
if is_inheritance: |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
143 |
edge = edge[::-1] |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
144 |
graph_edge = pydot.Edge( |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
145 |
headlabel="+ %s"%fk.column.name, taillabel='+ %s'%fk.parent.name, |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
146 |
arrowhead=is_inheritance and 'none' or 'odot' , |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
147 |
arrowtail=(fk.parent.primary_key or fk.parent.unique) and 'empty' or 'crow' , |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
148 |
fontname=font, |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
149 |
#samehead=fk.column.name, sametail=fk.parent.name, |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
150 |
*edge, **relation_kwargs |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
151 |
) |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
152 |
graph.add_edge(graph_edge) |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
153 |
|
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
154 |
# not sure what this part is for, doesn't work with pydot 1.0.2 |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
155 |
# graph_edge.parent_graph = graph.parent_graph |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
156 |
# if table.name not in [e.get_source() for e in graph.get_edge_list()]: |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
157 |
# graph.edge_src_list.append(table.name) |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
158 |
# if fk.column.table.name not in graph.edge_dst_list: |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
159 |
# graph.edge_dst_list.append(fk.column.table.name) |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
160 |
# graph.sorted_graph_elements.append(graph_edge) |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
161 |
return graph |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
162 |
|
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
163 |
def show_uml_graph(*args, **kwargs): |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
164 |
from cStringIO import StringIO |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
165 |
from PIL import Image |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
166 |
iostream = StringIO(create_uml_graph(*args, **kwargs).create_png()) |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
167 |
Image.open(iostream).show(command=kwargs.get('command','gwenview')) |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
168 |
|
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
169 |
def show_schema_graph(*args, **kwargs): |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
170 |
from cStringIO import StringIO |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
171 |
from PIL import Image |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
172 |
iostream = StringIO(create_schema_graph(*args, **kwargs).create_png()) |
|
7dce6c0f06fb
adding database schema to documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff
changeset
|
173 |
Image.open(iostream).show(command=kwargs.get('command','gwenview')) |