diff --git a/trytond/protocols/dispatcher.py b/trytond/protocols/dispatcher.py index b4f76b3c6c..9f9092a6fe 100644 --- a/trytond/protocols/dispatcher.py +++ b/trytond/protocols/dispatcher.py @@ -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() diff --git a/trytond/protocols/xmlrpc.py b/trytond/protocols/xmlrpc.py index 4e6ab53ad7..570219ab8a 100644 --- a/trytond/protocols/xmlrpc.py +++ b/trytond/protocols/xmlrpc.py @@ -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: