view REST_test.py @ 4:e3ee1f358fe6

new version that doesn't use ZSQLExtend but the database connection more directly. new templates to go with that (returned data structures are different)
author casties
date Mon, 07 Jun 2010 14:02:17 +0000
parents 48de7c260ffe
children
line wrap: on
line source

'''
Created on 26.04.2010

@author: fknauft
'''

from OFS.Folder import Folder
from Acquisition import Implicit
from Globals import DTMLFile,package_home,Persistent
from Products.PageTemplates.PageTemplateFile import PageTemplateFile
from Products.ZSQLExtend import ZSQLExtend
import urllib
import re
import string

from zope.publisher.interfaces import IPublishTraverse
from zope.interface import implements
#from zope.publisher.interfaces import NotFound 
#from zope.app import zapi 
#from zope.component import queryMultiAdapter
try:
    from ZPublisher.BaseRequest import DefaultPublishTraverse
except:
    pass


class RESTclass(Folder,Persistent, Implicit):
    """Klasse die Methoden fuer die RESTful Abfragen zur Verfuegung stellt.    """

    meta_type="RESTclass"

    def publishTraverse(self,request,name):
        """change the traversal if literature object"""
        
        #actual_url=request['ACTUAL_URL']
        #lastActual=actual_url.split("/")[-1]
   
           
        tr=DefaultPublishTraverse(self, request)
        ob= tr.publishTraverse(request, name)
       
        return ob
    
    def RESTwrite2File(self,datadir, name,text):
#        try:
            fileid=name
            if fileid in datadir.objectIds():
                datadir.manage_delObjects(fileid)
            newfile=open(name,'w')
            newfile.write(text)
            newfile.close()
            file4Read=open(name,'r')
            fileInZope=datadir.manage_addFile(id=fileid,file=file4Read)
            return "Write successful"
#        except:
#            return "Could not write"
    
    def RESTexecuteString(self, function, params=[] ):
        
        try:        
            return eval(str(function))(params)
        except:
            return eval("self."+ str(function))(params)
        
                
    def REST_result2XML(self,data):
        listXML= """<?xml version="1.0" encoding="UTF-8" standalone="yes"?>"""
        for line in data:
            listXML=listXML+"<name>"
            for value in line:
                listXML=listXML +str(value)
                listXML=listXML +"</name>"
        return listXML
    
    def REST_result2HtmlTable(self,data):
        listHtml= "<table>"
        for line in data:
            listHtml=listHtml+"<tr>"
            for value in line:
                listHtml=listHtml +"<td>"+str(value)+"</td>"               
            listHtml=listHtml +"</tr>"
        listHtml=listHtml+ """ </table> """ 
        return listHtml

    def REST_getTableNames(self,schema,username,c_string,container):

        results=container.ZSQLSimpleSearch("SELECT oid FROM pg_namespace WHERE nspname LIKE '"+schema+"'")
        schema_id=0
        for result in results:
            schema_id=getattr(result,'oid')

        SQL="""SELECT relname  FROM pg_class WHERE relhaspkey
           AND  relname NOT LIKE 'pg/_toast%' ESCAPE '/' 
           AND relname NOT LIKE 'spatial_ref_sys' 
           AND relname NOT LIKE 'geometry_columns' 
           AND relname NOT LIKE 'markierung'"""
 #       AND tablename NOT LIKE 'sql/_%' ESCAPE '/'
        if username!={}:
            uid=''
            username=container.getVar('username')
            results=container.ZSQLSimpleSearch("SELECT uid FROM chgis.usernames WHERE username LIKE '"+ str(username) +"'")
            for result in results:
                uid=container.getAttr(result,'uid')
            SQL=SQL+"""AND relowner ="""+str(uid)
    
        if c_string == 'empty':
            SQL = SQL + """ AND int4(reltuples)=0"""
        if schema_id != 0:
            SQL = SQL + """ AND int4(relnamespace)=""" + str(schema_id)
        data=container.ZSQLSimpleSearch(SQL)
        return data

 
        
manage_addRESTclassForm=PageTemplateFile('zpt/RESTzopetemplate',globals())

def manage_addRESTclass(self, id, title='', label='', description='',
                     createPublic=0,
                     createUserF=0,
                     REQUEST=None):
        """Add a new Folder object with id *id*.
    
        If the 'createPublic' and 'createUserF' parameters are set to any true
        value, an 'index_html' and a 'UserFolder' objects are created respectively
        in the new folder.
        """
    
    
        ob=RESTclass()
        ob.id=str(id)
        ob.title=title
        self._setObject(id, ob)
        ob=self._getOb(id)
        setattr(ob,'label',label)
#        setattr(ob,'description',description)
#        setattr(ob,'connection_id',connection_id)
        
#        checkPermission=getSecurityManager().checkPermission
        REQUEST.RESPONSE.redirect('manage_main')