File:  [Repository] / XMLRpcTools / XmlRpcProxy.py
Revision 1.2: download - view: text, annotated - select for diffs - revision graph
Fri Oct 26 21:41:14 2007 UTC (16 years, 8 months ago) by casties
Branches: MAIN
CVS tags: HEAD
new version of xmlrpctools
* new XmlRpcProxyFolder
* new XmlRpcProxyMethod

    1: 
    2: from OFS.SimpleItem import SimpleItem
    3: from OFS.Folder import Folder
    4: from Globals import InitializeClass
    5: import xmlrpclib
    6: import httplib
    7: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
    8: import os.path
    9: from Globals import package_home
   10: import re
   11: import logging
   12: 
   13: class XmlRpcProxyFolder(Folder):
   14:     """XML-RPC server proxy folder containing XmlRpcProxyMethods"""
   15:     
   16:     meta_type = 'XmlRpcProxyFolder'
   17:     
   18:     # base URL to the server
   19:     serverUrl = None
   20:     
   21:     # server proxy object
   22:     _v_proxy = None
   23:     
   24:     manage_options= Folder.manage_options + (
   25:         {'label':'Main Config','action':'mainConfigForm'},
   26:         )
   27: 
   28:     def __init__(self,id,serverUrl):
   29:         """init server proxy"""
   30:         self.id=id
   31:         self.serverUrl=serverUrl
   32:         
   33:         
   34:     def getProxy(self):
   35:         """get the proxy"""
   36:         if not self.serverUrl:
   37:             return None
   38:       
   39:         # TODO cache proxy and add alive test
   40:         self._v_proxy = xmlrpclib.ServerProxy(self.serverUrl)
   41:        
   42:         return self._v_proxy
   43:         
   44:     mainConfigForm = PageTemplateFile('zpt/manageXmlRpcProxyFolder',globals())
   45:     
   46:     def mainConfig(self,serverUrl,RESPONSE=None):
   47:         """main config"""
   48:         
   49:         self.serverUrl=serverUrl
   50:         
   51:         if RESPONSE:
   52:             RESPONSE.redirect("manage_main")
   53:             
   54: 
   55: def manage_addXmlRpcProxyFolderForm(self):
   56:     """add the XmlRpcProxyFolder"""
   57:     pt=PageTemplateFile('zpt/addXmlRpcProxyFolder',globals()).__of__(self)
   58:     return pt()
   59: 
   60: def manage_addXmlRpcProxyFolder(self,id,serverUrl,RESPONSE=None):
   61:     """add the basket"""
   62:     ob=XmlRpcProxyFolder(id,serverUrl)
   63:     self._setObject(id, ob)
   64:     
   65:     if RESPONSE is not None:
   66:         RESPONSE.redirect('manage_main')
   67: 
   68: 
   69: 
   70: class XmlRpcProxyMethod(SimpleItem):
   71:     """XML-RPC server proxy method. the id is also the remote method name"""
   72:     
   73:     meta_type="XmlRpcProxyMethod"
   74:     
   75:     rpc_arg_expr='[^A-z0-9]'
   76:     
   77:     manage_options= (
   78:         {'label':'Main Config','action':'mainConfigForm'},
   79:         )+ SimpleItem.manage_options
   80: 
   81:     
   82:     def __init__(self,id,rpc_arg_expr=None):
   83:         """init server proxy"""
   84:         self.id=id
   85:         if rpc_arg_expr:
   86:             self.rpc_arg_expr = rpc_arg_expr
   87: 
   88:     def eval(self,*argv):
   89:         """do proxy request"""
   90:         server=self.aq_parent.getProxy()
   91: 
   92:         # clean arguments
   93:         args = [ re.sub(self.rpc_arg_expr,'',a) for a in argv]
   94:             
   95:         # call the method self.id on the server with the args
   96:         return getattr(server, self.id)(*args)
   97:         
   98:     __call__ = eval
   99:     
  100: 
  101:     mainConfigForm = PageTemplateFile('zpt/manageXmlRpcProxyMethod',globals())
  102:         
  103:     def mainConfig(self,rpc_arg_expr=None,RESPONSE=None):
  104:         """main config"""
  105:                 
  106:         if rpc_arg_expr is not None:
  107:             self.rpc_arg_expr = rpc_arg_expr
  108:         
  109:         if RESPONSE:
  110:             RESPONSE.redirect("manage_main")
  111:             
  112: 
  113: def manage_addXmlRpcProxyMethodForm(self):
  114:     """add the XmlRpcProxyFolder"""
  115:     pt=PageTemplateFile('zpt/addXmlRpcProxyMethod',globals()).__of__(self)
  116:     return pt()
  117: 
  118: def manage_addXmlRpcProxyMethod(self,id,rpc_arg_expr,RESPONSE=None):
  119:     """add the basket"""
  120:     ob=XmlRpcProxyMethod(id,rpc_arg_expr)
  121:     self._setObject(id, ob)
  122:     
  123:     if RESPONSE is not None:
  124:         RESPONSE.redirect('manage_main')
  125: 
  126: 
  127: 
  128: # init classes
  129: InitializeClass(XmlRpcProxyFolder)
  130: InitializeClass(XmlRpcProxyMethod)

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>