--- /dev/null
+#!/usr/bin/python
+
+import cgi
+import cgitb
+
+import pygraph
+from pygraph.classes.graph import graph
+from pygraph.classes.digraph import digraph
+from pygraph.algorithms.searching import breadth_first_search
+from pygraph.readwrite.dot import write
+import gv
+import StringIO
+
+cgitb.enable()
+def add_quotes(s):
+ return '\"'+str(s)+'\"'
+
+
+def make_graph(Self,parents,children,otherparents,spouses):
+ # Graph creation
+ gr = digraph()
+
+ node_attr = [('fontsize',8)]
+
+ # Add nodes and edges
+ gr.add_node(Self,node_attr)
+
+
+ for p in parents:
+ if not gr.has_node(p):
+ gr.add_node(p,node_attr)
+ if not gr.has_edge((p,Self)):
+ gr.add_edge((p,Self))
+
+ couples=[]
+ if len(parents)==2:
+ ps = (parents[0],parents[1])
+ if not gr.has_edge(ps):
+ gr.add_edge(ps)
+ attr = [('dir','none')]
+ gr.add_edge_attributes(ps,attr)
+ couples.append(ps)
+
+ for i in range(len(children)):
+ if not gr.has_node(children[i]):
+ gr.add_node(children[i],node_attr)
+ if not gr.has_edge ((Self,children[i])):
+ gr.add_edge((Self,children[i]))
+ if not gr.has_node(otherparents[i]):
+ gr.add_node(otherparents[i],node_attr)
+ if not gr.has_edge((otherparents[i],children[i])):
+ gr.add_edge((otherparents[i],children[i]))
+
+
+ if not gr.has_edge((otherparents[i],Self)):
+ e = (otherparents[i],Self)
+ attr = [('dir','none')]
+ gr.add_edge(e)
+ gr.add_edge_attributes(e,attr)
+ couples.append(e)
+
+ for s in spouses:
+ if not gr.has_node(s):
+ gr.add_node(s,node_attr)
+ if not gr.has_edge((s,Self)):
+ e = (s,Self)
+ attr = [('dir','none')]
+ gr.add_edge(e)
+ gr.add_edge_attributes(e,attr)
+ couples.append(e)
+
+
+
+ #Draw as jpg
+ dot = write(gr)
+ dot = dot[:-2]
+
+ for couple in couples:
+ line = "\n{rank=same "+add_quotes(couple[0]) + ' '\
+ +add_quotes(couple[1])+"}"
+
+ dot = dot + line
+
+ dot = dot + '\n}'
+ gvv = gv.readstring(dot)
+ gv.layout(gvv,'dot')
+
+ format = 'jpg'
+
+ print "Content-type: image/" + format + "\n"
+ print gv.render(gvv,format)
+
+form = cgi.FieldStorage()
+
+Self = form.getvalue('Self')
+p = form.getlist('p')
+c = form.getlist('c')
+op = form.getlist('op')
+s = form.getlist('s')
+
+make_graph(Self,p,c,op,s)
+