From: naath
Date: Fri, 11 Apr 2014 20:30:08 +0000 (+0100)
Subject: refactor to put findparents/spouses/children in one place
X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~naath/git?a=commitdiff_plain;h=65f7a25f4955c8feb02d226e58c4e6b57a091e4f;p=familyTree.git
refactor to put findparents/spouses/children in one place
---
diff --git a/cgiFiles/ancestorGraph.py b/cgiFiles/ancestorGraph.py
index 36a9bf3..4adb104 100755
--- a/cgiFiles/ancestorGraph.py
+++ b/cgiFiles/ancestorGraph.py
@@ -5,52 +5,47 @@ import cgitb
cgitb.enable()
import sys
sys.path.append('/home/naath/familyTreeProject/familyTree')
-import askQuestion
+import askQuestion as aQ
import make_dot as d
-def parents(ID,name):
- findParents = "SELECT Name,parentID FROM parents LEFT JOIN"\
- +" people ON people.id=parents.parentid"\
- +" WHERE parents.id=?;"
+def add_parents(ID,name):
- pair =[]
- for row in askQuestion.run_query(findParents,(ID,)):
- if row[0]!=None:
- thisN = row[0] + ' '+str(row[1])
- newName = thisN
- newID = row[1]
- if not d.has_node(thisN):
- d.add_person(thisN)
- parents(newID,newName)
- pair.append(thisN)
+ [parents, parentIDs,parentNames] = aQ.find_parents(ID)
- else:
- thisN = row[1] + ',p ' + str(ID)
- pair.append(thisN)
- d.add_person(thisN)
+ pair = []
+ for i in range(len(parents)):
+ newName = parents[i]
+ if parentIDs[i]!=0:
+ newID = parentIDs[i]
+ if not d.has_node(newName):
+ d.add_person(newName)
+ add_parents(newID,newName)
+ else:
+ d.add_person(newName)
+ pair.append(newName)
d.add_marriage(pair[0],pair[1],[name],1)
-def make_graph(ID,conn):
+def make_graph(ID):
global allAncestors
d.start_dot()
[out, allAncestors,trackLevel,aDict] = \
- askQuestion.all_ancestors(ID,'\n')
+ aQ.all_ancestors(ID,'\n')
Self = allAncestors[0]
s = "SELECT name||', '|| id FROM people WHERE ID=?"
t = (Self,)
- for row in askQuestion.run_query(s,t):
+ for row in aQ.run_query(s,t):
Self = row[0]
d.add_highlight(Self)
- parents(allAncestors[0],Self)
+ add_parents(allAncestors[0],Self)
d.add_subgraphs()
@@ -58,13 +53,11 @@ def make_graph(ID,conn):
d.render_dot()
- askQuestion.close(conn)
-
form = cgi.FieldStorage()
ID = form.getvalue('id')
-conn = askQuestion.connect()
-make_graph(ID,conn)
-askQuestion.close(conn)
+conn = aQ.connect()
+make_graph(ID)
+aQ.close(conn)
diff --git a/cgiFiles/bigGraph.py b/cgiFiles/bigGraph.py
index 35d2b33..8834ba1 100755
--- a/cgiFiles/bigGraph.py
+++ b/cgiFiles/bigGraph.py
@@ -20,7 +20,7 @@ famTree = askQuestion.list_people_parents()
d.start_dot()
for i in range(len(famTree)):
-#for i in range(200):
+#for i in range(100):
self = famTree[i][0]
d.add_person(self)
diff --git a/cgiFiles/jointAncestorGraph.py b/cgiFiles/jointAncestorGraph.py
index 099f042..0279bc9 100755
--- a/cgiFiles/jointAncestorGraph.py
+++ b/cgiFiles/jointAncestorGraph.py
@@ -6,36 +6,29 @@ cgitb.enable()
import sys
sys.path.append('/home/naath/familyTreeProject/familyTree')
import make_dot as d
-import askQuestion
+import askQuestion as aQ
-def parents(ID,name,startLevel,stopLevel):
-
- findParents = "SELECT Name,parentID FROM parents LEFT JOIN"\
- +" people ON people.id=parents.parentid"\
- +" WHERE parents.id=?;"
+def add_parents(ID,name,startLevel,stopLevel):
startLevel = startLevel + 1
if int(startLevel) == int(stopLevel)+1:
return
pair=[]
- for row in askQuestion.run_query(findParents,(ID,)):
- if row[0]!=None:
- thisN = row[0] + ' '+str(row[1])
-
- pair.append(thisN)
- newName = thisN
- newID = row[1]
- if not d.has_node(thisN):
- d.add_person(thisN)
- parents(newID,newName,startLevel,stopLevel)
-
- else:
- thisN = row[1] + ',p ' + str(ID)
- pair.append(thisN)
- d.add_person(thisN)
-
-
+ [parents, parentIDs,parentNames] = aQ.find_parents(ID)
+
+ pair = []
+ for i in range(len(parents)):
+ newName = parents[i]
+ if parentIDs[i]!=0:
+ newID = parentIDs[i]
+ if not d.has_node(newName):
+ d.add_person(newName)
+ add_parents(newID,newName,\
+ startLevel,stopLevel)
+ else:
+ d.add_person(newName)
+ pair.append(newName)
d.add_marriage(pair[0], pair[1],[name],1)
@@ -45,26 +38,26 @@ def make_graph(ID,ID2,LA,LB):
if int(LA)!=0:
s = "SELECT name, id FROM people WHERE ID = ?;"
- for row in askQuestion.run_query(s,(ID,)):
+ for row in aQ.run_query(s,(ID,)):
thisN = row[0]+' ' + str(row[1])
d.add_highlight(thisN)
newName = (thisN)
newID = row[1]
- parents(newID,newName,0,LA)
+ add_parents(newID,newName,0,LA)
if int(LB)!=0:
s = "SELECT name, id FROM people WHERE ID = ?;"
- for row in askQuestion.run_query(s,(ID2,)):
+ for row in aQ.run_query(s,(ID2,)):
thisN = row[0] +' '+ str(row[1])
d.add_highlight(thisN)
newName = (thisN)
newID = row[1]
- parents(newID,newName,0,LB)
+ add_parents(newID,newName,0,LB)
d.add_subgraphs()
d.end_dot()
d.render_dot()
- askQuestion.close(conn)
+ aQ.close(conn)
form = cgi.FieldStorage()
@@ -73,7 +66,7 @@ ID2 = form.getvalue('id2')
LA = form.getvalue('LA')
LB = form.getvalue('LB')
-conn = askQuestion.connect()
+conn = aQ.connect()
make_graph(ID,ID2,LA,LB)
-askQuestion.close(conn)
+aQ.close(conn)
diff --git a/cgiFiles/smallGraph.py b/cgiFiles/smallGraph.py
index ee15269..add7211 100755
--- a/cgiFiles/smallGraph.py
+++ b/cgiFiles/smallGraph.py
@@ -3,14 +3,30 @@
import cgi
import cgitb
import make_dot as d
-
+import sys
+sys.path.append('/home/naath/familyTreeProject/familyTree')
+import askQuestion as aQ
cgitb.enable()
-def make_graph(Self,parents,children,otherparents,spouses):
+def find_person(ID):
+ s = "SELECT name || ','||ID FROM people WHERE ID=?"
+ t = (ID,)
+
+ for row in aQ.run_query(s,t):
+ Self = row[0]
+ return Self
+
+#def make_graph(Self,parents,children,otherparents,spouses):
+def make_graph(ID):
+
d.start_dot()
+ Self = find_person(ID)
+
d.add_highlight(Self)
+ [parents, parentIDs,parentNames] = aQ.find_parents(ID)
+
countSame = 2;
for i in range(1,len(parents)):
if parents[i]==parents[i-1]:
@@ -19,10 +35,17 @@ def make_graph(Self,parents,children,otherparents,spouses):
d.add_marriage(parents[0],parents[1],[Self],1)
+ [children,childrenID,childrenNames\
+ ,otherparents,otherparentsID,otherParentsNames\
+ ,childrenBorn] = \
+ aQ.find_children(ID)
+
for i in range(len(otherparents)):
c = children[i]
op = otherparents[i]
d.add_marriage(Self,op,[c],1)
+
+ [spouses,spousesID,spousesNames] = aQ.find_spouses(ID)
for i in range(len(spouses)):
s = spouses[i]
@@ -40,10 +63,8 @@ def make_graph(Self,parents,children,otherparents,spouses):
form = cgi.FieldStorage()
-Self = form.getvalue('Self')
-p = form.getlist('p')
-c = form.getlist('c')
-op = form.getlist('op')
-s = form.getlist('s')
+ID = form.getvalue('ID')
-make_graph(Self,p,c,op,s)
+conn = aQ.connect()
+make_graph(ID)
+aQ.close(conn)
diff --git a/familyTree/askQuestion.py b/familyTree/askQuestion.py
index 841df2f..9135bef 100755
--- a/familyTree/askQuestion.py
+++ b/familyTree/askQuestion.py
@@ -224,42 +224,15 @@ def list_people_parents():
output = []
for row in run_query(s,()):
- t = "SELECT parentid"\
- +" FROM parents"\
- +" WHERE id = ?;"
-
- u = "SELECT name,id"\
- +" FROM people"\
- +" WHERE id = ?";
-
- parents =[]
- for r in run_query(t,(row[1],)):
- parentID = r[0]
- hasParent = 0
- for q in run_query(u,(r[0],)):
- parents.append(q[0] + ' ' + str(q[1]))
- hasParent=1
- if hasParent==0:
- parents.append(r[0] + ' p' +\
- str(row[1]))
-
- spouses=[]
- v = "SELECT name,idb"\
- +" FROM marriages LEFT JOIN people"\
- +" ON idb = id"\
- +" WHERE ida = ?"
- for r in run_query(v,(row[1],)):
- if r[0]!=None:
- spouses.append(r[0]+ ' '+str(r[1]))
- else:
- if len(r[1])>0:
- spouses.append(r[1] + ' s' +\
- str(row[1]))
+ ID = row[1]
+ [parents, parentIDs,parentNames] = find_parents(ID)
+ [spouses,spousesID,spousesNames] = find_spouses(ID)
+
myName = row[0]
myID = str(row[1])
- output.append([myName+ ' '+ myID,parents,spouses])
+ output.append([myName+ ','+ myID,parents,spouses])
return output
@@ -761,6 +734,116 @@ def rulers_of(aTerritory,newLine):
return out
+
+def find_parents(ID):
+ s = "SELECT name, parentID"\
+ +" FROM parents LEFT JOIN people"\
+ +" ON people.ID = parentID"\
+ +" WHERE parents.ID = ?;"
+ t = (ID,)
+
+ parents = []
+ parentIDs =[]
+ parentNames=[]
+
+ for row in run_query(s,t):
+ if row[0]!=None:
+ p = row[0] + ',' + str(row[1])
+ pID = row[1]
+ pN = row[0]
+ else:
+ p = row[1] + ',p ' + str(ID)
+ pID = 0
+ pN = row[1]
+ parents.append(p)
+ parentIDs.append(pID)
+ parentNames.append(pN)
+
+ if parents[1]==parents[0]:
+ parents[1] = parents[1] + ' 2'
+
+ return [parents,parentIDs,parentNames]
+
+def find_spouses(ID):
+ t = (ID,)
+
+ order = [["IDb","IDa"],["IDa","IDb"]]
+
+ spouses = []
+ spousesID=[]
+ spousesNames=[]
+ for o in order:
+ s = "SELECT name, marriages." + o[0]\
+ +" FROM marriages LEFT JOIN people"\
+ +" ON marriages." +o[0]+" = people.ID"\
+ +" WHERE marriages."+o[1]+" = ?;"
+
+
+ for row in run_query(s,t):
+ if row[0]!=None:
+ s = row[0] + "," +str(row[1])
+ sID = row[1]
+ sN = row[0]
+ elif row[1] !='':
+ s=row[1] + ",s " +str(ID)
+ sID = 0
+ sN = row[1]
+ if row[1] !='':
+ spouses.append(s)
+ spousesID.append(sID)
+ spousesNames.append(sN)
+
+ return [spouses,spousesID,spousesNames]
+
+
+def find_children(ID):
+ s = "SELECT p1.name, p1.ID,p3.parentID,p4.name,p1.bornYear"\
+ +" FROM people p1"\
+ +" INNER JOIN parents p2"\
+ +" ON p1.ID = p2.ID"\
+ +" INNER JOIN parents p3"\
+ +" ON p1.ID = p3.ID"\
+ +" LEFT JOIN people"\
+ +" p4 ON p3.parentID = p4.ID"\
+ +" WHERE p2.parentID = ?"\
+ +" AND p3.parentID<>?"\
+ +" ORDER BY p1.bornYear;"
+
+ t = (ID,ID)
+
+ children =[]
+ childrenID=[]
+ childrenNames=[]
+ childrenBorn=[]
+ otherparents=[]
+ otherparentsID=[]
+ otherparentsNames=[]
+
+ for row in run_query(s,t):
+ c = row[0] + ', ' + str(row[1])
+ cID = row[1]
+ cName = row[0]
+ born = row[4]
+ children.append(c)
+ childrenID.append(cID)
+ childrenNames.append(cName)
+ childrenBorn.append(born)
+ if row[3]!=None:
+ op = row[3] + ', ' + str(row[2])
+ opID = row[2]
+ opN = row[3]
+ else:
+ op = row[2] + ',s ' + ID
+ opID = 0
+ opN = row[2]
+ otherparents.append(op)
+ otherparentsID.append(opID)
+ otherparentsNames.append(opN)
+
+ return [children,childrenID,childrenNames\
+ ,otherparents,otherparentsID,otherparentsNames\
+ ,childrenBorn]
+
def person_info(personID,newLine):
t = (personID,)
@@ -827,98 +910,56 @@ def person_info(personID,newLine):
mainDiv = mainDiv + '
'
#find parents
+
+ [parents,parentIDs,parentNames] = find_parents(personID)
mainDiv = mainDiv + ''
- s = "SELECT people.Name,parents.parentID FROM"\
- +" parents LEFT JOIN people"\
- +" ON parents.parentID = people.ID"\
- +" WHERE parents.ID = ?"
+ for i in range(len(parents)):
+ r = [parentNames[i],parentIDs[i]]
+ mainDiv = mainDiv + print_tagged_name('Parent',r,newLine)
+ mainDiv = mainDiv + "
"
- parents =[]
- for row in run_query(s,t):
- mainDiv = mainDiv + print_tagged_name('Parent',row,newLine)
- if row[0]!=None:
- parents.append(row[0] + ', ' + row[1])
- else:
- parents.append(row[1] + ', p' + personID)
- mainDiv = mainDiv + ''
#find spouses
+ [spouses,spousesID,spousesNames] = find_spouses(personID)
+
mainDiv = mainDiv + ''
- s = "SELECT people.NAME, marriages.IDb from"\
- +" marriages LEFT JOIN people"\
- +" ON people.ID = marriages.IDb"\
- +" WHERE marriages.IDa = ?"\
- +" ORDER BY IDb;"
- spouses = []
- for row in run_query(s,t):
- if row[0]!=None:
- spouses.append(row[0] + ', '+str(row[1]))
- elif row[1]!='':
- spouses.append(row[1] + ', s' + personID)
- if row[1]!='':
- mainDiv = mainDiv + print_tagged_name('Spouse',row,newLine)
- mainDiv = mainDiv + relationship_html(personID,row[1],newLine)
-
- s = "SELECT people.NAME, marriages.IDa from"\
- +" marriages LEFT JOIN people"\
- +" ON people.ID = marriages.IDa"\
- +" WHERE marriages.IDb = ?"\
- +" ORDER BY IDa;"
- for row in run_query(s,t):
- if row[0]!=None:
- spouses.append(row[0] + ', '+str(row[1]))
- else:
- spouses.append(row[1] + ', s' + personID)
- mainDiv = mainDiv + print_tagged_name('Spouse',row,newLine)
- mainDiv = mainDiv + relationship_html(personID,row[1],newLine)
+
+ for i in range(len(spouses)):
+ r = [spousesNames[i],spousesID[i]]
+ mainDiv = mainDiv + print_tagged_name('Spouse',r,newLine)
+ mainDiv = mainDiv + \
+ relationship_html(personID,r[1],newLine)
+
mainDiv = mainDiv + '
'
#find children
- s = "Select people.NAME, people.ID ,people.bornYear"\
- +" FROM people INNER JOIN parents"\
- +" ON people.ID = parents.ID"\
- +" WHERE parents.parentID = ?"\
- +" ORDER BY people.bornYear;"
-
- children = []
- ops =[]
+ [children,childrenID,childrenNames\
+ ,otherparents,otherparentsID,otherparentsNames\
+ ,childrenBorn] = \
+ find_children(personID)
+
top = ''
- for row in run_query(s,t):
- thisChild = print_tagged_name('Child',row,newLine)
- children.append(row[0] + ', ' + str(row[1]))
-
- #find children's other parent
- u = "Select people.NAME, parents.parentID FROM"\
- +" parents LEFT JOIN people"\
- +" ON people.ID = parents.parentID"\
- +" WHERE parents.ID = ? AND parents.parentID <>?;"
-
- ids = (row[1],t[0])
-
- op = 0
- for r in run_query(u,ids):
- op = 1
- if r[0]!=None:
- ops.append(r[0] + ', ' + str(r[1]))
- else:
- ops.append(r[1] + ', s' + personID)
- if op==0:
- ops.append('?' + ', s' + personID)
-
- if top!=ops[-1]:
- mainDiv = mainDiv + ''
+ for i in range(len(children)):
+ cr = [childrenNames[i],childrenID[i]]
+ thisChild = print_tagged_name('Child',cr,newLine)
+
+ opr=[otherparentsNames[i],otherparentsID[i]]
+ top = otherparentsNames[i]
+ if i==0 or top != otherparentsNames[i-1]:
+ mainDiv = mainDiv +''
mainDiv = mainDiv + ''
- mainDiv = mainDiv + print_tagged_name('With',r, newLine)
+ mainDiv = mainDiv + print_tagged_name\
+ ('With',opr, newLine)
- top = ops[-1]
-
#age when child born
- if row[2] !=0 and bornYear != 0:
- age = row[2]-bornYear
+ cb = childrenBorn[i]
+ if cb!=0 and bornYear != 0:
+ age = cb-bornYear
thisChild = thisChild[:-4] + \
" at the age of "+str(age) + newLine
mainDiv = mainDiv + thisChild
+
mainDiv = mainDiv + '
'
output = '';
@@ -940,21 +981,8 @@ def person_info(personID,newLine):
output = output + imageDiv + "
"
- Self = name +', ' + str(personID)
-
- graph = "smallGraph.py?Self="+Self
- for p in parents:
- graph = graph + '&p='+p
- for c in children:
- graph = graph + '&c='+c
- for op in ops:
- if op !=None:
- graph = graph + '&op='+op
- for s in spouses:
- if s !=None:
- graph = graph + '&s='+str(s)
-
- graph = graph.replace(' ','%20')
+ graph = "smallGraph.py?ID="+str(personID)
+
graph ="
"