chiark / gitweb /
files that make graphs
[familyTree.git] / cgiFiles / jointAncestorGraph.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 parents(ID,name,gr,attr,startLevel,stopLevel):
18
19         findParents = "SELECT Name,parentID FROM parents LEFT JOIN"\
20                         +" people ON people.id=parents.parentid"\
21                         +"  WHERE parents.id=?;"
22
23         startLevel = startLevel + 1
24         if int(startLevel) == int(stopLevel)+1:
25                 return gr
26
27         for row in askQuestion.run_query(findParents,(ID,)):
28                 if row[0]!=None:
29                         thisN = row[0] + ' '+str(row[1])
30                         if not gr.has_node(thisN):
31                                 gr.add_node(thisN,attr)
32                         if gr.has_edge((thisN,name)):
33                                 return gr       
34                         gr.add_edge((thisN,name))
35                         newName = thisN
36                         newID = row[1]
37                         gr = parents(newID,newName,gr,attr,startLevel,stopLevel)
38
39                 else:
40                         if not gr.has_node(row[1]):
41                                 gr.add_node(row[1],attr)
42                                 gr.add_edge((row[1],name))                      
43         return gr
44
45 def make_graph(ID,ID2,LA,LB):
46         
47         # Graph creation
48         gr = digraph()
49         attr = [('fontsize',8)]
50         # Add nodes and edges
51
52         if int(LA)!=0:
53                 s = "SELECT name, id FROM people WHERE ID = ?;"
54                 for row in askQuestion.run_query(s,(ID,)):
55                         thisN = row[0]+' ' + str(row[1])
56                         gr.add_node(thisN,attr)
57                         newName = (thisN)
58                         newID = row[1]
59                 gr = parents(newID,newName,gr,attr,0,LA)
60
61         if int(LB)!=0:
62                 s = "SELECT name, id FROM people WHERE ID = ?;"
63                 for row in askQuestion.run_query(s,(ID2,)):
64                         thisN = row[0] +' '+ str(row[1])
65                         gr.add_node(thisN,attr)
66                         newName = (thisN)
67                         newID = row[1]
68
69                 gr = parents(newID,newName,gr,attr,0,LB)
70
71          #Draw as jpg
72         dot = write(gr)
73         gvv = gv.readstring(dot)
74         gv.layout(gvv,'dot')
75
76         format = 'jpg'
77         print "Content-type: image/" + format + "\n"
78         print gv.render(gvv,format)
79         askQuestion.close(conn)
80
81 form = cgi.FieldStorage()
82
83 ID = form.getvalue('id')
84 ID2 = form.getvalue('id2')
85 LA = form.getvalue('LA')
86 LB = form.getvalue('LB')
87
88 conn = askQuestion.connect()
89 make_graph(ID,ID2,LA,LB)
90 askQuestion.close(conn)
91