diff eventsRestService.py @ 1:283badd62593

new version for embedded e4D
author dwinter
date Fri, 12 Oct 2012 08:36:57 +0200
parents 26c06d568e1d
children f198c86dd1f6
line wrap: on
line diff
--- a/eventsRestService.py	Thu Sep 13 16:56:49 2012 +0200
+++ b/eventsRestService.py	Fri Oct 12 08:36:57 2012 +0200
@@ -2,49 +2,208 @@
 import eventsDB2kml
 import harvestDataFromEvents
 import urllib
+import urlparse
+
 urls = (
     '/xpath/(.*)', 'xpath',
+    '/xpathSearch', 'xpathSearch',
+    '/sqlSearch', 'sqlSearch',
+    '/sql', 'sql',
     '/species', 'species',
     '/applicants', 'applicants',
-    '/locations','locations'
+    '/locations','locations',
+    '/restricted', 'restricted'
 )
 app = web.application(urls, globals())
 
-E4D_URL="http://localhost:8180/e4D/"
-BASE_URL="http://localhost:8080/"
+E4D_URL="http://localhost/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("http://localhost/outApplicants.xml")
+        url1=urllib.quote_plus(APPLICANT_FILE_NAME)
         ret+="""
             
             <a href="
             %s?kml1=%s&source1=1"  
-            target="e4D">applicants</a><br/>
+            >applicants</a><br/>
             """%(E4D_URL,url1)
             
             
-        url2=urllib.quote_plus("http://localhost/outResearch.xml")
+        url2=urllib.quote_plus(RESEARCH_FILE_NAME)
         ret+="""
             
             <a href="
             %s?kml1=%s&source1=1"  
-            target="e4D">research</a><br/>
+            >research</a><br/>
             """%(E4D_URL,url2)
             
         ret+= """
         <a href="
            %s?kml1=%s&source1=1&kml2=%s&source2=1"  
-            target="e4D">both</a><br/>
+            >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):
@@ -76,11 +235,31 @@
     
      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
@@ -97,15 +276,15 @@
         
         spList.sort()
         for x in spList:
-            print x
-            ret+="""<a href="/xpath///applicant/name/text()?q=%s">%s</a>"""%(x,x)
+          
+            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"  
-            target="e4D">e4D</a><br/>
+            >e4D</a><br/>
             """%(E4D_URL,url)
         
         return ret
@@ -113,12 +292,32 @@
     
     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 
+          select distinct
             cast(xpath('//species/text()', data) as text[]) AS name 
             from locations
-            """
-            
+            %s
+            """%whereClause
+        
+      
         res=db.query(q)
         #hole alle species
         spec=set()
@@ -134,15 +333,15 @@
         
         spList.sort()
         for x in spList:
-            print x
-            ret+="""<a href="/xpath///species/text()?q=%s">%s</a>"""%(x,x)
+            
+            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"  
-            target="e4D">e4D</a><br/>
+            >e4D</a><br/>
             """%(E4D_URL,url)
         
         return ret