chiark / gitweb /
files that make graphs
[familyTree.git] / cgiFiles / smallGraph.py
diff --git a/cgiFiles/smallGraph.py b/cgiFiles/smallGraph.py
new file mode 100755 (executable)
index 0000000..eefee42
--- /dev/null
@@ -0,0 +1,102 @@
+#!/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)
+