chiark / gitweb /
faff with graphs and searching
[familyTree.git] / familyTree / askQuestion.py
index c6273cc77c14b59e731d0ef53e04bfe81654c0c0..ecf810aa2e37199d06ac7e9c69be8f4741aefdc7 100755 (executable)
@@ -3,6 +3,7 @@
 import sqlite3
 import findYear
 from string import Template
+import cgi
 
 global link_Template 
 link_Template= Template(\
@@ -342,28 +343,35 @@ def search_name(name,newLine):
         +" WHERE name LIKE ?;"
 
         out = ''
+       IDs=[]
+       names=[]
 
-       out = out + 'Names start with ' + name + ':' + newLine
+       out = out + 'Names starting with ' + name + ':' + newLine
        t = (name + '%',)
        fullIDs=[]
        for row in run_query(s,t):
                 out = out + name_html(row,newLine) + newLine
                fullIDs.append(row[1])
+               names.append(row[0])
+               IDs.append(row[1])
+
         t = ('%' + name + '%',)
-       out = out+newLine + 'Names contain ' + name + ':' + newLine
+       out = out+newLine + 'Names containing ' + name + ':' + newLine
         for row in run_query(s,t):
                if row[1] not in fullIDs:
                        out = out + name_html(row,newLine) + newLine
+                       names.append(row[0])
+                       IDs.append(row[1])
        
        s = "SELECT name,people.ID,style"\
        +" FROM people INNER JOIN styles"\
        +" ON styles.id = people.id"\
        +" WHERE style LIKE ?;"
-       out = out +newLine+ 'Styles contain ' + name + ':' + newLine
+       out = out +newLine+ 'Styles containing ' + name + ':' + newLine
        for row in run_query(s,t):
                out = out + name_html(row,newLine)+' ' + row[2] + newLine
 
-        return out
+        return [out,names,IDs]
 
 
 def people_with_name(name,newLine):
@@ -493,8 +501,6 @@ def all_ancestors(personID,newLine):
        for row in run_query(t,id):
                out = out + name_html(row,newLine)+newLine
 
-       aDict={}
-       aDict[level] = ancestors
        while len(ancestors)>0:
                level = level+1
                newA =[]
@@ -515,14 +521,12 @@ def all_ancestors(personID,newLine):
                                        trackLevel.append(level)
                                
                ancestors = newA
-               if len(ancestors)>0:
-                       aDict[level]=ancestors
                out  = out+thisout
 
 
        image = "<img src = ancestorGraph.py?id="+str(personID)+">"
        out = out+newLine + image+newLine
-       return [out, allAncestors,trackLevel,aDict]
+       return [out, allAncestors,trackLevel]
 
 
 def common_ancestors(IDA, IDB,newLine):
@@ -613,13 +617,6 @@ def common_ancestors(IDA, IDB,newLine):
 
        out = out + ' of ' + name_html([names[0],IDA],newLine)+newLine
 
-       #out = out + newLine
-       #for b in indexB:
-       #       t = (common[b],)
-       #       out = out + print_tagged_query('',s,t,newLine)
-       #       if b!=indexB[-1]:
-       #               out = out + 'and' + newLine
-
        out = out + parent_level(bLevels[indexB[0]],'parent')
        if len(indexB)>1:
                out = out + 's'
@@ -815,56 +812,56 @@ def find_children(ID):
 
         t = (ID,ID)
 
-        children =[]
-        childrenID=[]
-       childrenNames=[]
        childrenBorn=[]
-        otherparents=[]
-        otherparentsID=[]
-       otherparentsNames=[]
+       nodes=[]
+       IDs=[]  
+       names=[]
 
         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
+                        op = row[2] + ',s ' + str(ID)
                         opID = 0
                        opN = row[2]
-                otherparents.append(op)
-                otherparentsID.append(opID)
-               otherparentsNames.append(opN)
 
-        return [children,childrenID,childrenNames\
-               ,otherparents,otherparentsID,otherparentsNames\
-               ,childrenBorn]
+               nodes.append([c,op])
+               IDs.append([cID,opID])
+               names.append([cName,opN])
+
+        return [nodes,IDs,names,childrenBorn]
 
 def person_info(personID,newLine):
        t = (personID,)
 
+       if newLine=='<br>':
+               startP = '<p>'
+               endP = '</p>'
+       else:
+               startP = ''
+               endP = newLine
+
        mainDiv = ''    
        #Id, Name, Dates, Style, Style-Dates
        s = "SELECT * FROM people WHERE ID = ?"
        for row in run_query(s,t):
-               mainDiv = mainDiv + '<p>'
+               mainDiv = mainDiv + startP
                mainDiv = mainDiv  + 'ID: '+str(row[0]) +newLine
                mainDiv = mainDiv + print_tagged_name('Name',[row[1], row[0]]\
                        ,newLine)
-               mainDiv = mainDiv + '</p>'
+               mainDiv = mainDiv + endP
                name = row[1]
                url = row[9]
                picture = row[10]
 
-               mainDiv = mainDiv + '<p>'
+               mainDiv = mainDiv + startP
                mainDiv = mainDiv + newLine + 'Born: '+row[3] + newLine
                bornYear = row[4]
                mainDiv = mainDiv + 'Died: '+row[5]
@@ -872,12 +869,12 @@ def person_info(personID,newLine):
                if row[6] != 0 and row[4] !=0:
                        mainDiv = mainDiv + ", aged " \
                                +str(row[6]-row[4])
-               mainDiv = mainDiv + '</p>'
+               mainDiv = mainDiv + endP
 
 
        s = "SELECT * FROM styles WHERE ID = ?"
        for row in run_query(s,t):
-               mainDiv = mainDiv + '<p>'
+               mainDiv = mainDiv + startP
                mainDiv = mainDiv +newLine+ 'Style: '+row[1] + newLine
 
                mainDiv = mainDiv + 'Territories:' + newLine
@@ -898,12 +895,12 @@ def person_info(personID,newLine):
                mainDiv = mainDiv +  'From: '+row[2] + newLine
                 mainDiv = mainDiv +  'To: '+row[4]     
 
-               mainDiv = mainDiv + '</p>'
+               mainDiv = mainDiv + endP
 
 
 
 
-       mainDiv = mainDiv + '<p>'
+       mainDiv = mainDiv + startP
        s = "SELECT people.Name,consort "\
                +"FROM consorts LEFT JOIN people"\
                +" ON people.ID = consorts.consort"\
@@ -911,22 +908,22 @@ def person_info(personID,newLine):
        for row in run_query(s,t):
                mainDiv = mainDiv + print_tagged_name\
                ('Consort of',row,newLine)
-       mainDiv = mainDiv + '</p>'
+       mainDiv = mainDiv + endP
 
        #find parents
 
        [parents,parentIDs,parentNames] = find_parents(personID)
-       mainDiv = mainDiv + '<p>'
+       mainDiv = mainDiv + startP
        for i in range(len(parents)):
                r = [parentNames[i],parentIDs[i]]
                mainDiv = mainDiv + print_tagged_name('Parent',r,newLine)
-       mainDiv = mainDiv + "</p>"
+       mainDiv = mainDiv + endP
 
        #find spouses
 
        [spouses,spousesID,spousesNames] = find_spouses(personID)
 
-       mainDiv = mainDiv + '<p>'
+       mainDiv = mainDiv + startP
 
        for i in range(len(spouses)):
                r = [spousesNames[i],spousesID[i]]
@@ -934,24 +931,22 @@ def person_info(personID,newLine):
                mainDiv = mainDiv + \
                relationship_html(personID,r[1],newLine)
 
-       mainDiv  = mainDiv + '</p>'
+       mainDiv  = mainDiv + endP
 
        #find children
-       [children,childrenID,childrenNames\
-                ,otherparents,otherparentsID,otherparentsNames\
-               ,childrenBorn] = \
+       [nodes,IDs,names,childrenBorn] = \
                find_children(personID)
 
        top = ''
-       for i in range(len(children)):
-               cr = [childrenNames[i],childrenID[i]]
+       for i in range(len(nodes)):
+               cr = [names[i][0],IDs[i][0]]
                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>'
+               opr=[names[i][1],IDs[i][1]]
+               top = names[i][1]
+               if i==0 or  top != names[i-1][1]:
+                       mainDiv = mainDiv +endP
+                       mainDiv = mainDiv + startP
                        mainDiv = mainDiv + print_tagged_name\
                         ('With',opr, newLine)
 
@@ -964,42 +959,113 @@ def person_info(personID,newLine):
                                " at the age of "+str(age) + newLine
                mainDiv = mainDiv + thisChild
        
-       mainDiv = mainDiv + '</p>'
-
-       output = '<div id = "main" style = " float:left">';
-       output = output + mainDiv +  "</div>"
+       mainDiv = mainDiv + endP
 
-       output = output + "<div id = 'image' "\
-               +"style = 'float:left; margin-left:20px'>"
-
-       imageDiv = ''
-       if picture!='.':
-               imageDiv = imageDiv + "<a href=" + url+">"\
-                +"<img src=" + picture +" alt = 'wiki link'"\
-                +" title = 'wiki link'></a>"\
-                + newLine
-
-       elif url!='.' and url!='. ':
-               imageDiv = imageDiv + "<a href=" + url +">"\
-               +name + " (wiki link)</a>"+newLine
-
-       output = output + imageDiv + "</div>"
-
-       graph =  "smallGraph.py?ID="+str(personID)
-
-       graph ="<img src ="+ graph + '>'
-
-       output = output + "<div id = 'graph' style = 'clear:both'>"
-       output = output +  graph
-       output = output + "</div>"
 
+       if newLine == '<br>':
+               output = '<div id = "main" style = " float:left">';
+               output = output + mainDiv +  "</div>"
+
+               output = output + "<div id = 'image' "\
+                       +"style = 'float:left; margin-left:20px'>"
+
+               imageDiv = ''
+               if picture!='.':
+                       imageDiv = imageDiv + "<a href=" + url+">"\
+                       +"<img src=" + picture +" alt = 'wiki link'"\
+                       +" title = 'wiki link'></a>"\
+                       + newLine
+
+               elif url!='.' and url!='. ':
+                       imageDiv = imageDiv + "<a href=" + url +">"\
+                       +name + " (wiki link)</a>"+newLine
+
+               output = output + imageDiv + "</div>"
+
+
+               url = 'http://www.chiark.greenend.org.uk/ucgi/~naath/'\
+                       +'smallGraph.py'
+
+               form = ''
+               form = form + "<form id ='controlForm'"\
+               +" action ="+ url +" method = 'get'>"
+
+               form = form +\
+                       "<input type = 'hidden' name = 'ID' value = "\
+                       +personID + "><br>"
+
+                form = form +\
+               "Generations of Parents: "\
+               +"<input type = 'text' name = 'pl' value='1'>"
+               form = form + newLine
+               form = form + \
+               "Generations of Children: "\
+               +" <input type = 'text' name = 'cl' value = '1'>"
+               form = form + newLine
+                form = form + \
+                "Show siblings: <select name = 's'>"+\
+                "<option value = '0'>No</option>"+\
+                "<option value = '1'>Yes</option>"+\
+               "</select>"
+               form = form + newLine
+                form = form + \
+                "Show spouse's other spouses: <select name = 'os'>"+\
+                "<option value = '0'>No</option>"+\
+                "<option value = '1'>Yes</option>"+\
+                "</select>"
+               form = form + newLine
+                form = form + \
+                "Show parents' other spouses: <select name = 'pos'>"+\
+                "<option value = '0'>No</option>"+\
+                "<option value = '1'>Yes</option>"+\
+                "</select>"            
+               form = form + newLine
+                form = form + \
+               "Fount size: "+\
+                "<input type = 'text' name = 'fs' value='8'>"
+                form = form + newLine
+               form = form + "</form>"
+
+               graph =  "smallGraph.py?ID="+str(personID)+"&fs=8"
+
+               graph = "<img src ="+ graph + '>'
+
+               output = output + "<div id = 'graph' style = 'clear:both'>"
+               output = output + "<p id = 'agraph'>"+graph+"</p>"
+               output = output + "Draw this graph with more relatives:"
+               output = output + newLine + form
+               
+               output = output + "<button onclick='myFunction()'>"+\
+                       "Go</button>"
+
+               output = output + "</div>"
+
+               output = output +\
+               '<script>'+\
+               'function myFunction()'+\
+               '{'+\
+               'var x = document.getElementById("controlForm");'+\
+               'var txt = "<img src = " + x.action + "?";'+\
+               'for (var i=0;i<x.length;i++)'+\
+               '{'+\
+               'var n=x.elements[i].name;'+\
+               'var v=x.elements[i].value;'+\
+               'txt = txt + "&"+n+"="+v;'+\
+               '}'+\
+               'txt = txt + ">";'+\
+               'document.getElementById("agraph").innerHTML=txt;'+\
+               '}'+\
+               '</script>'
 
+       else:
+               output = mainDiv
 
        return output
 
 def connect():
        global conn
-       conn = sqlite3.connect('/home/naath/familyTreeProject/familyTree/tree.db')
+       conn = sqlite3.connect\
+               ('/home/naath/familyTreeProject/familyTree/tree.db')
        return conn
 
 def make_cursor():
@@ -1008,13 +1074,3 @@ def make_cursor():
 def close(conn):
        conn.close
 
-#def main():
-
-#      [c, conn] = connect()   
-#
-#      person_info(1,c)
-#      person_info(17,c)
-#      person_info(38,c)
-#      person_info(90,c)
-#
-#      close(conn)