chiark / gitweb /
refactor to put findparents/spouses/children in one place
[familyTree.git] / familyTree / askQuestion.py
index 841df2f2fc0d69f368e4b43b42bcf1744d089ae6..9135befc362e277a064735879f9d2851148bb895 100755 (executable)
@@ -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 + '</p>'
 
        #find parents
+
+       [parents,parentIDs,parentNames] = find_parents(personID)
        mainDiv = mainDiv + '<p>'
-       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 + "</p>"
 
-       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 + '</p>'
        #find spouses
 
+       [spouses,spousesID,spousesNames] = find_spouses(personID)
+
        mainDiv = mainDiv + '<p>'
-       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 + '</p>'
 
        #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 + '</p>'
+       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 +'</p>'
                        mainDiv = mainDiv + '<p>'
-                       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 + '</p>'
 
        output = '<div id = "main" style = " float:left">';
@@ -940,21 +981,8 @@ def person_info(personID,newLine):
 
        output = output + imageDiv + "</div>"
 
-       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 ="<img src ="+ graph + '>'
 
        output = output + "<div id = 'graph' style = 'clear:both'>"