Mercurial > hg > ChinaGisRestApi
diff RestDbInterface.py @ 2:61a3764cd5fb
new version RestDbInterface with working traversal and templates
author | casties |
---|---|
date | Fri, 21 May 2010 11:48:30 +0000 |
parents | |
children | e3ee1f358fe6 |
line wrap: on
line diff
--- /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