chiark / gitweb /
files that make graphs
[familyTree.git] / cgiFiles / ancestorGraph.py
1 #!/usr/bin/python
2
3 import cgi
4 import cgitb
5 cgitb.enable()
6 import sys
7 sys.path.append('/home/naath/familyTreeProject/familyTree')
8 import pygraph
9 from pygraph.classes.graph import graph
10 from pygraph.classes.digraph import digraph
11 from pygraph.algorithms.searching import breadth_first_search
12 from pygraph.readwrite.dot import write
13 import gv
14 import StringIO
15 import askQuestion
16
17 def add_quotes(s):
18         s = str(s)
19         return '\"'+s+'\"'
20
21 def parents(ID,name,gr,attr,couples):
22
23         findParents = "SELECT Name,parentID FROM parents LEFT JOIN"\
24                         +" people ON people.id=parents.parentid"\
25                         +"  WHERE parents.id=?;"
26         
27         ps = ();
28         for row in askQuestion.run_query(findParents,(ID,)):
29                 if row[0]!=None:
30                         thisN = row[0] + ' '+str(row[1])
31                         ps = ps + (thisN,)
32                         if not gr.has_node(thisN):
33                                 gr.add_node(thisN,attr)
34                         if not gr.has_edge((thisN,name)):
35                                 gr.add_edge((thisN,name))
36                         newName = thisN
37                         newID = row[1]
38                         [gr, couples] = \
39                         parents(newID,newName,gr,attr,couples)
40
41                 else:
42                         thisN =  row[1] + ' p' + str(ID)
43                         if not gr.has_node(thisN):
44                                 ps = ps + (thisN,)
45                                 gr.add_node(thisN,attr)
46                                 gr.add_edge((thisN,name))
47         if len(ps)==2:
48                 if not gr.has_edge(ps):
49                         gr.add_edge(ps)
50                         gr.add_edge_attributes(ps,[('dir','none')])
51                         couples.append(ps)
52         return [gr, couples]
53
54 def make_graph(ID,conn):
55         
56         # Graph creation
57         gr = digraph()
58         attr = [('fontsize',8)]
59         # Add nodes and edges
60
61         couples = [];
62         s = "SELECT name, id FROM people WHERE ID = ?;"
63         for row in askQuestion.run_query(s,(ID,)):
64                 gr.add_node(row[0],attr)
65                 newName = (row[0])
66                 newID = row[1]
67
68
69         [gr,couples] = parents(newID,newName,gr,attr,couples)
70
71
72
73          #Draw as jpg
74         dot = write(gr)
75
76
77         dot = dot[:-2]
78
79         for couple in couples:
80                 n1 = add_quotes(couple[0])
81                 n2 = add_quotes(couple[1])
82                 line = "\n{rank=same "+n1 + ' '\
83                         +n2 + "}"
84                 dot = dot + line
85         dot = dot + '\n}'
86
87
88         gvv = gv.readstring(dot)
89         gv.layout(gvv,'dot')
90
91         format = 'jpg'
92         print "Content-type: image/" + format + "\n"
93         print gv.render(gvv,format)
94         askQuestion.close(conn)
95
96 form = cgi.FieldStorage()
97
98 ID = form.getvalue('id')
99
100 conn = askQuestion.connect()
101 make_graph(ID,conn)
102 askQuestion.close(conn)
103