Add introspection and use better syntax for XML-RPC

Syntax:
    url = http://ip:port/database_name
    method = (model|wizard|report).object_name.method
This commit is contained in:
Cédric Krier committed 2009-02-27 00:52:40 +01:00
1 parent 5b37a3b9dd
commit a9c8d58be5
2 files changed
+44 -3

No files matched your search

+25
View File
@@ -13,6 +13,7 @@ import time
import sys
import sha
import base64
import pydoc
def dispatch(database_name, user, session, object_type, object_name, method,
*args, **kargs):
@@ -65,6 +66,30 @@ def dispatch(database_name, user, session, object_type, object_name, method,
elif method == 'dump':
return dump(*args, **kargs)
return
elif object_type == 'system':
database = Database(database_name).connect()
database_list = Pool.database_list()
pool = Pool(database_name)
if not database_name in database_list:
pool.init()
if method == 'listMethods':
res = []
for type in ('model', 'wizard', 'report'):
for object_name in pool.object_name_list(type=type):
obj = pool.get(object_name, type=type)
for method in obj._rpc:
res.append(type + '.' + object_name + '.' + method)
return res
elif method == 'methodSignature':
return 'signatures not supported'
elif method == 'methodHelp':
res = []
args_list = args[0].split('.')
object_type = args_list[0]
object_name = '.'.join(args_list[1:-1])
method = args_list[-1]
obj = pool.get(object_name, type=object_type)
return pydoc.getdoc(getattr(obj, method))
database = Database(database_name).connect()
cursor = database.cursor()
+19 -3
View File
@@ -27,9 +27,25 @@ class GenericXMLRPCRequestHandler:
host, port = self.client_address[:2]
logging.getLogger('xmlrpc').info('connection from %s:%d' % (host, port))
try:
database_name, object_type, object_name = self.path.split("/")[-3:]
args = (database_name, params[0], params[1], object_type,
object_name, method) + params[2:]
database_name = self.path[1:]
method_list = method.split('.')
object_type = method_list[0]
object_name = '.'.join(method_list[1:-1])
method = method_list[-1]
if object_type == 'system' and method == 'getCapabilities':
return {
'introspect': {
'specUrl': 'http://xmlrpc-c.sourceforge.net/' \
'xmlrpc-c/introspection.html',
'specVersion': 1,
},
}
if object_type == 'system':
args = (database_name, None, None, object_type, None,
method) + params
else:
args = (database_name, params[0], params[1], object_type,
object_name, method) + params[2:]
res = dispatch(*args)
return res
except: