view eventsRestService.py @ 3:f198c86dd1f6

umstellung fuer dariah browser
author dwinter
date Wed, 09 Jan 2013 14:37:39 +0100
parents 283badd62593
children 6d286ce1a64f
line wrap: on
line source

import web
import eventsDB2kml
import harvestDataFromEvents
import urllib
import urlparse

urls = (
    '/xpath/(.*)', 'xpath',
    '/xpathSearch', 'xpathSearch',
    '/sqlSearch', 'sqlSearch',
    '/sql', 'sql',
    '/species', 'species',
    '/applicants', 'applicants',
    '/locations','locations',
    '/restricted', 'restricted'
)
app = web.application(urls, globals())

#E4D_URL="http://localhost/mmpa/"
E4D_URL="http://localhost/~dwinter/mmpa/events2kml/mmpa/"
BASE_URL="http://localhost/m/"

APPLICANT_FILE_NAME="http://localhost/outApplicants.xml"
RESEARCH_FILE_NAME="http://localhost/outResearch.xml"
class locations:
    
    def GET(self):
        
        ret=""
        
        url1=urllib.quote_plus(APPLICANT_FILE_NAME)
        ret+="""
            
            <a href="
            %s?kml1=%s&source1=1"  
            >applicants</a><br/>
            """%(E4D_URL,url1)
            
            
        url2=urllib.quote_plus(RESEARCH_FILE_NAME)
        ret+="""
            
            <a href="
            %s?kml1=%s&source1=1"  
            >research</a><br/>
            """%(E4D_URL,url2)
            
        ret+= """
        <a href="
           %s?kml1=%s&source1=1&kml2=%s&source2=1"  
            >both</a><br/>
            """%(E4D_URL,url1,url2)
            
        return ret
        
class restricted:
    def GET(self):      
        x=web.input()
        pathes=x.get("path")
        print pathes
        select=x.get("select")
        newRestriction=x.get("newRestriction")
        
        if select is None:
            select="data"
        
        
        
        #path kann meherer abfragen enthalten durch | getrennt
      
        splittedPath = pathes.split("|")
        print splittedPath
        queriesArray=[]
        for xlinkPath in splittedPath:
            url = urllib.unquote_plus(xlinkPath);
        
       
            qs=urlparse.urlparse(url).query
      
            queries=urlparse.parse_qsl(qs)
            q=""
            for query in queries:
                if query[0]=='q':
                    q=query[1]
        
        
        
        
        
            url= urlparse.urlparse(url).path
            
            pathSplitted=url.split("xpath/")
            if len(pathSplitted)>1:
                path=pathSplitted[1]
                queriesArray.append((path,q))
        print queriesArray
        
        
        
        db = eventsDB2kml.DBQuery()
       
        if newRestriction is None: # keine weiteren Einschaenkungen dann erzeugen das kml file
            res= "<events>"+ db.searchXPaths(queriesArray)+"</events>"
        
        
           
            hv=harvestDataFromEvents.EventKMLTransformer()
        
        
            #x,cnt=hv.readString(res, ".//research_location/place_information", 0)
            x,cnt=hv.readString(res, ".//place_information", 0)
        
            
        
            s = hv.toKML(x)
            
            return s
             
             
        #sonst suche nach restriction suche muss eine liste von werten ergeben die sich mit der REstriction versteht, dh. restriction =wert wird dann in die Links eingebaut
        # e.g. man such nach name d.h
        # select=%20distinct%20cast%28xpath%28%27//applicant/name/text%28%29%27,%20data%29%20as%20text[]%29%20AS%20name
        # dann muss die Restriction darauf passen i.a. wird die Restriction dem xpath im Suchstring entsprechen,
        # newRestriction=http%3A%2F%2Flocalhost%2Fm%2Fxpath%2F%2F%2Fapplicant%2Fnam%2Ftext%28%29%
        
        newRestriction=urllib.unquote_plus(newRestriction)
       
        vals = db.searchXPaths(queriesArray,select,True)
        
        
        ret=""
        
        
        #berechen den neuer link = alter path ergaenzt um neue restriction
        for val in vals:
            val=val[0] # result ist immer ein tuple
            # mehr als ein Treffer pro eintrag
            for v in val:
                newQuery=""
                splittedPath.append(newRestriction+"?q="+v)
                splittedPathQuoted=[urllib.quote_plus(x) for x in splittedPath]
                
                pathNew="|".join(splittedPathQuoted)
                urlNew=urllib.quote_plus("""%srestricted?path=%s"""%(BASE_URL,pathNew))
                ret+="""<a href="%s?kml1=%s&source1=1">%s</a><br/>"""%(E4D_URL,urlNew,v)
        return ret
        
class sqlSearch:
    def GET(self):      
        x=web.input()
        sql=x.get("sql")
        p=x.get("xpathPlace")
        output=x.get("output")
        
       
            
        url="%ssql?q=%s&p=%s"%(BASE_URL,urllib.quote_plus(sql),p)
        
        if output=="sql":
            raise web.seeother(url)
        
        url=urllib.quote_plus(url)
        
        
        
        url="""%s?kml1=%s&source1=1"""%(E4D_URL,url)
        raise web.seeother(url)
    
    
class xpathSearch:
    def GET(self):      
        x=web.input()
        path=x.get("path")
        value=x.get("value")
        
        url="%sxpath/%s?q=%s"%(BASE_URL,path,value)
        
        url=urllib.quote_plus(url)
        
        
        
        url="""%s?kml1=%s&source1=1"""%(E4D_URL,url)
        raise web.seeother(url)
  
class sql:
    def GET(self):
        x = web.input()
        q= x.get("q")
        p= x.get("p")
        db = eventsDB2kml.DBQuery()
        res= "<events>"+db.sql(q)+"</events>"
    
    
       
        hv=harvestDataFromEvents.EventKMLTransformer()
    
    
        #x,cnt=hv.readString(res, ".//research_location/place_information", 0)
        x,cnt=hv.readString(res, p, 0)
    
        
    
        s = hv.toKML(x)
        
        return s
      
      
class xpath:
 
    def GET(self, path):
        
        if not path: 
            return ""
        
        x = web.input()
        q= x.get("q")
        
        db = eventsDB2kml.DBQuery()
        res= "<events>"+db.searchXPath(path, q)+"</events>"
    
    
       
        hv=harvestDataFromEvents.EventKMLTransformer()
    
    
        #x,cnt=hv.readString(res, ".//research_location/place_information", 0)
        x,cnt=hv.readString(res, ".//place_information", 0)
    
        
    
        s = hv.toKML(x)
        
        return s

class applicants:
    
     def GET(self):
        db = eventsDB2kml.DBQuery()
        
           
        x = web.input()
        where= x.get("where")
      
        whereClause=""

#Beispiel:
#select distinct
# 
#cast (xpath('//name/text()',data) as text[]) AS name
#
#from locations
#        where
#        'Astrophytum asterius'  = ANY (cast (xpath('//species/text()', data) as text[])) ;
        
        if where!="" and where is not None:
            whereClause="where %s"%where
            
        q="""
          select 
            cast(xpath('//applicant/name/text()', data) as text[]) AS name 
            from locations
            %s
            """%whereClause
            
        res=db.query(q)
        #hole alle species
        spec=set()
       
        for r in res:
           
            l=r[0] 
            for x in l:
                spec.add(x)
                
        ret=""
        spList=[x for x in spec]
        
        spList.sort()
        for x in spList:
          
            ret+="""<a href="%sxpath///applicant/name/text()?q=%s">%s</a>"""%(BASE_URL,x,x)
            
            url=urllib.quote_plus("%sxpath///applicant/name/text()?q=%s"%(BASE_URL,x))
            ret+="""
            
            <a href="
            %s?kml1=%s&source1=1"  
            >e4D</a><br/>
            """%(E4D_URL,url)
        
        return ret
class species:
    
    def GET(self):
        db = eventsDB2kml.DBQuery()
        
        x = web.input()
        where= x.get("where")
        
        whereClause=""
        
# Beispiel:       
#select 
# 
#cast (xpath('//species/text()',data) as text[]) AS name
#
#from locations
#        where
#        'Anna George'  = ANY (cast (xpath('//name/text()', data) as text[])) ;
#        
        if where!="" and where is not None:
            whereClause="where %s"%where
            
        q="""
          select distinct
            cast(xpath('//species/text()', data) as text[]) AS name 
            from locations
            %s
            """%whereClause
        
      
        res=db.query(q)
        #hole alle species
        spec=set()
       
        for r in res:
           
            l=r[0] 
            for x in l:
                spec.add(x)
                
        ret=""
        spList=[x for x in spec]
        
        spList.sort()
        for x in spList:
            
            ret+="""<a href="%sxpath///species/text()?q=%s">%s</a>"""%(BASE_URL,x,x)
            
            url=urllib.quote_plus("%sxpath///species/text()?q=%s"%(BASE_URL,x))
            ret+="""
            
            <a href="
            %s?kml1=%s&source1=1"  
            >e4D</a><br/>
            """%(E4D_URL,url)
        
        return ret
          
if __name__ == "__main__":
    app.run()