comparison RestDbGisApi.py @ 274:9b7db308d2e6

refactor RestDbGisApi to use RestDbInterface from ZDbInterface Product.
author casties
date Thu, 23 Feb 2012 08:35:26 +0100
parents 52b1247140b7
children eb8a18f94d2d
comparison
equal deleted inserted replaced
270:3a5d51c60e40 274:9b7db308d2e6
11 import re 11 import re
12 import time 12 import time
13 import datetime 13 import datetime
14 import urlFunctions 14 import urlFunctions
15 15
16 from RestDbInterface import * 16 from Products.ZDBInterface.WritableRestDbInterface import *
17 17
18 18
19 def kmlEncode(s): 19 def kmlEncode(s):
20 """returns string encoded for displaying in KML attribute""" 20 """returns string encoded for displaying in KML attribute"""
21 res = s.replace("'","__Apostroph__") 21 res = s.replace("'","__Apostroph__")
23 res = res.replace(';','__$$__') 23 res = res.replace(';','__$$__')
24 res = res.replace('&','&') 24 res = res.replace('&','&')
25 return res 25 return res
26 26
27 27
28 class RestDbGisApi(RestDbInterface): 28 class RestDbGisApi(WritableRestDbInterface):
29 """Object for RESTful GIS database queries 29 """Object for RESTful GIS database queries
30 path schema: /db/{schema}/{table}/ 30 path schema: /db/{schema}/{table}/
31 omitting table gives a list of schemas 31 omitting table gives a list of schemas
32 omitting table and schema gives a list of schemas 32 omitting table and schema gives a list of schemas
33 """ 33 """
34 34
35 meta_type="RESTgis" 35 meta_type="RESTgis"
36 36
37 # data templates
38 GIS_schema_table = PageTemplateFile('zpt/GIS_schema_table', globals())
39 KML_schema_table = PageTemplateFile('zpt/KML_schema_table', globals())
40 HTML_schema_usertables = PageTemplateFile('zpt/HTML_schema_usertables', globals())
37 41
38 # and scripts 42 # and scripts
39 def KML_URL_schema_table(self,schema,table, useTimestamp=True, args=None): 43 def KML_URL_schema_table(self,schema,table, useTimestamp=True, args=None):
40 """KML_URL table function""" 44 """KML_URL table function"""
41 self.REQUEST.RESPONSE.setHeader("Content-Type", "text/plain") 45 self.REQUEST.RESPONSE.setHeader("Content-Type", "text/plain")
136 140
137 141
138 def createEmptyTable(self,schema,table,fields): 142 def createEmptyTable(self,schema,table,fields):
139 """create a table with the given fields 143 """create a table with the given fields
140 returns list of created fields""" 144 returns list of created fields"""
141 sqlFields = RestDbInterface.createEmptyTable(self,schema,table,fields) 145 sqlFields = WritableRestDbInterface.createEmptyTable(self,schema,table,fields)
142 if sqlFields is not None: 146 if sqlFields is not None:
143 self.setTableMetaTypes(schema,table,sqlFields) 147 self.setTableMetaTypes(schema,table,sqlFields)
144 148
145 return sqlFields 149 return sqlFields
146 150
151 # TODO: move this
152 def getAttributeNames(self,schema='public',table=None):
153 return self.executeSQL("SELECT attname FROM pg_attribute, pg_class WHERE pg_class.oid = attrelid AND attnum>0 AND relname = '%s';"%(table))
154
155 # TODO: move this
156 def getAttributeTypes(self,schema='public',table=None):
157 return self.executeSQL("SELECT field_name, gis_type FROM public.gis_table_meta_rows WHERE table_name = '%s';"%(table))
158
159 # TODO: move back to inherited version
160 def showTable(self,format='XML',schema='public',table=None,REQUEST=None,RESPONSE=None):
161 """returns PageTemplate with tables"""
162 logging.debug("showtable")
163 if REQUEST is None:
164 REQUEST = self.REQUEST
165 queryArgs={'doc':None,'id':None}
166 queryArgs['doc'] = REQUEST.get('doc')
167 queryArgs['id'] = REQUEST.get('id')
168
169 # should be cross-site accessible
170 if RESPONSE is None:
171 RESPONSE = self.REQUEST.RESPONSE
172
173 RESPONSE.setHeader('Access-Control-Allow-Origin', '*')
174
175 # everything else has its own template
176 pt = getattr(self.template, '%s_schema_table'%format, REQUEST)
177 if pt is None:
178 return "ERROR!! template %s_schema_table not found at %s"%(format, self.template )
179 #data = self.getTable(schema,table)
180 return pt(schema=schema,table=table,args=queryArgs)
181
182 #TODO: move to parent class
183 def getLiveUrl(self,schema,table,useTimestamp=True,REQUEST=None):
184 if REQUEST is None:
185 REQUEST = self.REQUEST
186 logging.debug("getLiveUrl")
187 baseUrl = self.absolute_url()
188 timestamp = time.time()
189 # filter parameters in URL and add to new URL
190 params = [p for p in REQUEST.form.items() if p[0] not in ('format','timestamp')]
191 params.append(('format','KML'))
192 if useTimestamp:
193 # add timestamp so URL changes every time
194 params.append(('timestamp',timestamp))
195 paramstr = urllib.urlencode(params)
196 return "%s/db/%s/%s?%s"%(baseUrl,schema,table,paramstr)
197
198
199 # TODO: remove changes from parent version
200 def getTable(self,schema='public',table=None,sortBy=1,username='guest'):
201 """return table data"""
202 logging.debug("gettable")
203 attrNames=self.getAttributeNames(schema,table)
204 attrTypes=self.getAttributeTypes(schema,table)
205 attrString=""
206 # try:
207 for name in attrNames['rows']:
208 logging.debug("name: ", name[0])
209 not_added=True
210 if name[0] == "the_geom": #FJK: the table column is "the_geom"
211 attrString=attrString+"ST_AsText("+name[0]+"),"
212 not_added=False
213 break
214 for a_iter in attrTypes['rows']:
215 not_added = True
216 logging.debug("attrTypes.field_name: ", a_iter[0])
217 if a_iter[0]==name[0]:
218 logging.debug("attrTypes.gis_type: ", a_iter[1])
219 if a_iter[1] == "the_geom": #FJK: the table column is registered in gis_table_meta_rows as type "the_geom"
220 attrString=attrString+"ST_AsText("+name[0]+"),"
221 not_added=False
222 if not_added:
223 if name[0].find('pg.dropped')==-1:
224 attrString=attrString+name[0]+","
225 attrString=str(attrString).rsplit(",",1)[0] #to remove last ","
226 if sortBy:
227 data = self.executeSQL('select %s from "%s"."%s" order by %s'%(attrString,schema,table,sortBy))
228 else:
229 data = self.executeSQL('select %s from "%s"."%s"'%(attrString,schema,table))
230 # except:
231 """ table does not exist """
232 # fields=self.get
233 # self.createEmptyTable(schema, table, fields)
234 return data
235
147 236
148 def getLiveKmlUrl(self,schema,table,useTimestamp=True,REQUEST=None): 237 def getLiveKmlUrl(self,schema,table,useTimestamp=True,REQUEST=None):
149 return self.getLiveUrl(schema,table,useTimestamp,REQUEST) 238 return self.getLiveUrl(schema,table,useTimestamp,REQUEST)
150 239
151 def getKmlData(self, schema, table, ids=None, sortBy=1, gisIdField=None, latField=None, lonField=None, geomField="point", colorField="red_big"): 240 def getKmlData(self, schema, table, ids=None, sortBy=1, gisIdField=None, latField=None, lonField=None, geomField="point", colorField="red_big"):