[FIX] base: XML-RPC serialization error on HTML fields

In 01875541b1, HTML fields (and various
methods) were made to return markupsafe.Markup objects.

However at the time I didn't consider that XML-RPC serialization
remains based on type *identity*, and thus the `Markup` object would
not serialize outbound through XML-RPC, and would blow up instead.

This should fix the issue, by serializing Markup objects as str.

closes odoo/odoo#74684

X-original-commit: 165bd3bf88becc42416e49ad2f430e90675219fa
Signed-off-by: Xavier Morel (xmo) <xmo@odoo.com>
This commit is contained in:
Xavier Morel
2021-08-04 09:07:42 +00:00
parent a795a2f7d8
commit addf220fc3
2 changed files with 13 additions and 0 deletions
+2
View File
@@ -2,6 +2,7 @@ from datetime import date, datetime
from xmlrpc.client import dumps, loads
import xmlrpc.client
from markupsafe import Markup
from werkzeug.wrappers import Response
from odoo.http import Controller, dispatch_rpc, request, route
@@ -35,6 +36,7 @@ class OdooMarshaller(xmlrpc.client.Marshaller):
dispatch[lazy] = dump_lazy
dispatch[Command] = dispatch[int]
dispatch[Markup] = dispatch[str]
# monkey-patch xmlrpc.client's marshaller
+11
View File
@@ -18,6 +18,12 @@ class TestXMLRPC(common.HttpCase):
super(TestXMLRPC, self).setUp()
self.admin_uid = self.env.ref('base.user_admin').id
def xmlrpc(self, model, method, *args, **kwargs):
return self.xmlrpc_object.execute_kw(
common.get_db_name(), self.admin_uid, 'admin',
model, method, args, kwargs
)
def test_01_xmlrpc_login(self):
""" Try to login on the common service. """
db_name = common.get_db_name()
@@ -45,6 +51,11 @@ class TestXMLRPC(common.HttpCase):
'res.partner', 'name_search', "admin"
)
def test_xmlrpc_html_field(self):
pid = self.xmlrpc('res.partner', 'create', {'name': 'bob', 'comment': 'sucks'})
[p] = self.xmlrpc('res.partner', 'read', pid, ['comment'])
self.assertEqual(p['comment'], 'sucks')
def test_jsonrpc_read_group(self):
self._json_call(
common.get_db_name(), self.admin_uid, 'admin',