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