diff --git a/odoo/addons/base/controllers/rpc.py b/odoo/addons/base/controllers/rpc.py index e7bd958be40..6a2a0fe76a3 100644 --- a/odoo/addons/base/controllers/rpc.py +++ b/odoo/addons/base/controllers/rpc.py @@ -9,6 +9,7 @@ from odoo.http import Controller, dispatch_rpc, request, route from odoo.service import wsgi_server from odoo.fields import Date, Datetime, Command from odoo.tools import lazy +from odoo.tools.misc import frozendict class OdooMarshaller(xmlrpc.client.Marshaller): @@ -19,6 +20,11 @@ class OdooMarshaller(xmlrpc.client.Marshaller): dispatch = dict(xmlrpc.client.Marshaller.dispatch) + def dump_frozen_dict(self, value, write): + value = dict(value) + self.dump_struct(value, write) + dispatch[frozendict] = dump_frozen_dict + def dump_datetime(self, value, write): # override to marshall as a string for backwards compatibility value = Datetime.to_string(value) diff --git a/odoo/addons/base/tests/test_xmlrpc.py b/odoo/addons/base/tests/test_xmlrpc.py index 22074deaf97..c3cb059791d 100644 --- a/odoo/addons/base/tests/test_xmlrpc.py +++ b/odoo/addons/base/tests/test_xmlrpc.py @@ -62,6 +62,15 @@ class TestXMLRPC(common.HttpCase): [x] = self.xmlrpc('res.users', 'read', r.id, ['signature']) self.assertEqual(x['signature'], sig) + def test_xmlrpc_frozendict_marshalling(self): + """ Test that the marshalling of a frozendict object works properly over XMLRPC """ + ctx = self.xmlrpc_object.execute( + common.get_db_name(), self.admin_uid, 'admin', + 'res.users', 'context_get', + ) + self.assertEqual(ctx['lang'], 'en_US') + self.assertEqual(ctx['tz'], 'Europe/Brussels') + def test_jsonrpc_read_group(self): self._json_call( common.get_db_name(), self.admin_uid, 'admin',