# 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

+
+

ID

+

+

Title

+

+

+