view scripts/schema_diagram.py @ 4483:22bc0426e348

Second patch from issue2550688 -- with some changes: - password.py now has a second class JournalPassword used for journal storage. We have some backends that directly store serialized python objects. Also when reading from the journal some backends expected the string read to be usable as a parameter to a Password constructor. This now calls a JournalPassword constructor in all these cases. The new JournalPassword just keeps the scheme and has an empty password. - some factoring, move redundant implementation of "history" from rdbms_common and back_anydbm to hyperdb.
author Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
date Thu, 14 Apr 2011 15:42:41 +0000
parents d56b7fc64923
children 64b05e24dbd8
line wrap: on
line source

#! /usr/bin/python
#
# Schema diagram generator contributed by Stefan Seefeld of the fresco
# project http://www.fresco.org/.
#
# It generates a 'dot file' that is then fed into the 'dot'
# tool (http://www.graphviz.org) to generate a graph:
#
# %> ./schema.py
# %> dot -Tps schema.dot -o schema.ps
# %> gv schema.ps
#
import sys
import roundup.instance

# open the instance
instance = roundup.instance.open(sys.argv[1])
db = instance.open()

# diagram preamble
print 'digraph schema {'
print 'size="8,6"'
print 'node [shape="record" bgcolor="#ffe4c4" style=filled]'
print 'edge [taillabel="1" headlabel="1" dir=back arrowtail=ediamond]'

# get all the classes
types = db.classes.keys()

# one record node per class
for i in range(len(types)):
    print 'node%d [label=\"{%s|}"]'%(i, types[i])

# now draw in the relations
for name in db.classes.keys():
    type = db.classes[name]
    attributes = type.getprops()
    for a in attributes.keys():
        attribute = attributes[a]
        if isinstance(attribute, roundup.hyperdb.Link):
            print 'node%d -> node%d [label=%s]'%(types.index(name),
                                                 types.index(attribute.classname),
                                                 a)
        elif isinstance(attribute, roundup.hyperdb.Multilink):
            print 'node%d -> node%d [taillabel="*" label=%s]'%(types.index(name),
                                                 types.index(attribute.classname),
                                                 a)
# all done
print '}'

Roundup Issue Tracker: http://roundup-tracker.org/