# HG changeset patch
# User casties
# Date 1274442510 0
# Node ID 61a3764cd5fb71691df2a86d584f35591fe31d5d
# Parent 48de7c260ffeadf3a90a906dfb11919bc655eb7d
new version RestDbInterface with working traversal and templates
diff -r 48de7c260ffe -r 61a3764cd5fb .project
--- a/.project Wed May 12 14:34:42 2010 +0000
+++ b/.project Fri May 21 11:48:30 2010 +0000
@@ -3,6 +3,7 @@
ChinaGisRestApi
+ Zope 2.12
diff -r 48de7c260ffe -r 61a3764cd5fb .pydevproject
--- a/.pydevproject Wed May 12 14:34:42 2010 +0000
+++ b/.pydevproject Fri May 21 11:48:30 2010 +0000
@@ -5,7 +5,5 @@
python 2.6
Default
-
-/ChinaGisRestApi/src
-
+
diff -r 48de7c260ffe -r 61a3764cd5fb RestDbInterface.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/RestDbInterface.py Fri May 21 11:48:30 2010 +0000
@@ -0,0 +1,168 @@
+'''
+Created on 19.5.2010
+
+@author: casties
+'''
+
+from OFS.Folder import Folder
+from Products.PageTemplates.PageTemplateFile import PageTemplateFile
+from Products.ZSQLExtend import ZSQLExtend
+import logging
+
+from zope.interface import implements
+from zope.publisher.interfaces import IPublishTraverse
+from ZPublisher.BaseRequest import DefaultPublishTraverse
+#from zope.publisher.interfaces import NotFound
+#from zope.app import zapi
+#from zope.component import queryMultiAdapter
+
+
+class RestDbInterface(Folder):
+ """Object for RESTful database queries
+ path schema: /[XML,JSON,HTML]/{schema}/{table}/
+ omitting table gives a list of schemas
+ omitting table and schema gives a list of schemas
+ """
+ implements(IPublishTraverse)
+
+ meta_type="RESTdb"
+
+ # data templates
+ XML_list_schemas = PageTemplateFile('zpt/XML_list_schemas', globals())
+ XML_list_tables = PageTemplateFile('zpt/XML_list_tables', globals())
+ XML_table = PageTemplateFile('zpt/XML_table', globals())
+ HTML_list_schemas = PageTemplateFile('zpt/HTML_list_schemas', globals())
+ HTML_list_tables = PageTemplateFile('zpt/HTML_list_tables', globals())
+ HTML_table = PageTemplateFile('zpt/HTML_table', globals())
+
+
+
+ def __init__(self, id, title):
+ """init"""
+ self.id = id
+ self.title = title
+ # create template folder
+ self.manage_addFolder('template')
+
+
+ def publishTraverse(self,request,name):
+ """change the traversal"""
+ # get stored path
+ path = request.get('restdb_path', [])
+ logging.debug("publishtraverse: name=%s restdb_path=%s"%(name,path))
+
+ if name == "index_html":
+ # end of traversal
+ return self.index_html
+ #TODO: should we check more?
+ else:
+ # traverse
+ if len(path) == 0:
+ # first segment
+ if name in ['XML','JSON','HTML']:
+ # virtual path -- continue traversing
+ path = [name]
+ request['restdb_path'] = path
+ else:
+ # try real path
+ tr = DefaultPublishTraverse(self, request)
+ ob = tr.publishTraverse(request, name)
+ return ob
+ else:
+ path.append(name)
+
+ # continue traversing
+ return self
+
+ def index_html(self,REQUEST,RESPONSE):
+ """index method"""
+ path = REQUEST.get('restdb_path',[])
+ logging.debug("index_html path=%s"%path)
+ if len(path) == 1:
+ # list of schemas
+ return self.showListOfSchemas(format=path[0])
+ elif len(path) == 2:
+ # list of tables
+ return self.showListOfTables(format=path[0],schema=path[1])
+ elif len(path) == 3:
+ # table
+ return self.showTable(format=path[0],schema=path[1],table=path[2])
+
+ # don't know what to do
+ return str(REQUEST)
+
+
+ def showTable(self,format='XML',schema='public',table=None):
+ """returns PageTemplate with tables"""
+ logging.debug("showtable")
+ pt = getattr(self.template, '%s_table'%format, None)
+ if pt is None:
+ return "ERROR!! template %s_table not found"%format
+
+ data = self.getTable(schema,table)
+ return pt(data=data,tablename=table)
+
+
+ def getTable(self,schema='public',table=None,username='guest'):
+ """return table data"""
+ logging.debug("gettable")
+ qstr="select * from %s"%table
+ data=self.ZSQLSimpleSearch(qstr)
+ return data
+
+ def showListOfTables(self,format='XML',schema='public'):
+ """returns PageTemplate with list of tables"""
+ logging.debug("showlistoftables")
+ pt = getattr(self.template, '%s_list_tables'%format, None)
+ if pt is None:
+ return "ERROR!! template %s_list_tables not found"%format
+
+ data = self.getListOfTables(schema)
+ return pt(data=data,schema=schema)
+
+ def getListOfTables(self,schema='public',username='guest'):
+ """return list of tables"""
+ logging.debug("getlistoftables")
+ # get list of fields and types of db table
+ qstr="""select c.relname FROM pg_catalog.pg_class c
+ LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
+ WHERE c.relkind IN ('r','') AND n.nspname NOT IN ('pg_catalog', 'pg_toast')
+ AND pg_catalog.pg_table_is_visible(c.oid)"""
+ #qstr="select attname, format_type(pg_attribute.atttypid, pg_attribute.atttypmod) from pg_attribute, pg_class where attrelid = pg_class.oid and pg_attribute.attnum > 0"
+ data=self.ZSQLSimpleSearch(qstr)
+ return data
+
+ def showListOfSchemas(self,format='XML'):
+ """returns PageTemplate with list of schemas"""
+ logging.debug("showlistofschemas")
+ pt = getattr(self.template, '%s_list_schemas'%format, None)
+ if pt is None:
+ return "ERROR!! template %s_list_schemas not found"%format
+
+ data = self.getListOfSchemas()
+ return pt(data=data)
+
+ def getListOfSchemas(self,username='guest'):
+ """return list of schemas"""
+ logging.debug("getlistofschemas")
+ # TODO: really look up schemas
+ data=['public']
+ return data
+
+
+
+manage_addRestDbInterfaceForm=PageTemplateFile('zpt/addRestDbInterface',globals())
+
+def manage_addRestDbInterface(self, id, title='', label='', description='',
+ createPublic=0,
+ createUserF=0,
+ REQUEST=None):
+ """Add a new object with id *id*."""
+
+ ob=RestDbInterface(str(id),title)
+ self._setObject(id, ob)
+
+ #checkPermission=getSecurityManager().checkPermission
+ REQUEST.RESPONSE.redirect('manage_main')
+
+
\ No newline at end of file
diff -r 48de7c260ffe -r 61a3764cd5fb __init__.py
--- a/__init__.py Wed May 12 14:34:42 2010 +0000
+++ b/__init__.py Fri May 21 11:48:30 2010 +0000
@@ -1,5 +1,6 @@
-import REST_test
+import REST_test
+import RestDbInterface
#class RESTinterface(DefaultPublishTraverse):
# """VLP spezifische Erweiterung der Collection"""
@@ -28,3 +29,11 @@
REST_test.manage_addRESTclass
)
)
+
+ context.registerClass(
+ RestDbInterface.RestDbInterface,
+ constructors = (
+ RestDbInterface.manage_addRestDbInterfaceForm,
+ RestDbInterface.manage_addRestDbInterface
+ )
+ )
diff -r 48de7c260ffe -r 61a3764cd5fb zpt/HTML_list_schemas.zpt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/zpt/HTML_list_schemas.zpt Fri May 21 11:48:30 2010 +0000
@@ -0,0 +1,21 @@
+
+
+ The title
+
+
+
+ List of schemas
+
+
+
+
+
+
+
+
\ No newline at end of file
diff -r 48de7c260ffe -r 61a3764cd5fb zpt/HTML_list_tables.zpt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/zpt/HTML_list_tables.zpt Fri May 21 11:48:30 2010 +0000
@@ -0,0 +1,21 @@
+
+
+ The title
+
+
+
+ List of tables for schema
+
+
+
+
+
+
+
+
\ No newline at end of file
diff -r 48de7c260ffe -r 61a3764cd5fb zpt/HTML_table.zpt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/zpt/HTML_table.zpt Fri May 21 11:48:30 2010 +0000
@@ -0,0 +1,19 @@
+
+
+ The title
+
+
+
+ table
+
+
+
+
+
\ No newline at end of file
diff -r 48de7c260ffe -r 61a3764cd5fb zpt/XML_list_schemas.zpt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/zpt/XML_list_schemas.zpt Fri May 21 11:48:30 2010 +0000
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff -r 48de7c260ffe -r 61a3764cd5fb zpt/XML_list_tables.zpt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/zpt/XML_list_tables.zpt Fri May 21 11:48:30 2010 +0000
@@ -0,0 +1,6 @@
+
+
+
+
\ No newline at end of file
diff -r 48de7c260ffe -r 61a3764cd5fb zpt/XML_table.zpt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/zpt/XML_table.zpt Fri May 21 11:48:30 2010 +0000
@@ -0,0 +1,7 @@
+
+
diff -r 48de7c260ffe -r 61a3764cd5fb zpt/addRestDbInterface.zpt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/zpt/addRestDbInterface.zpt Fri May 21 11:48:30 2010 +0000
@@ -0,0 +1,9 @@
+ Header
+ Add a RESTclass
+