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:
1 parent
5b37a3b9dd
commit
a9c8d58be5
2 files changed
+44
-3
No files matched your search
@@ -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()
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in new issue
Block a user