Skip to content
Snippets Groups Projects

:sparkles: Field converter on a binary field use data uri

Open Vincent Hatakeyama requested to merge topic/18.0/data-uri into branch/18.0
5 files
+ 157
8
Compare changes
  • Side-by-side
  • Inline
Files
5
+ 82
1
##############################################################################
#
# Converter Odoo module
# Copyright © 2021 XCG Consulting <https://xcg-consulting.fr>
# Copyright © 2021, 2025 XCG Consulting <https://xcg-consulting.fr>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
@@ -110,3 +110,84 @@
)
),
)
def test_binary_data_uri(self):
converter = Field("avatar_1920")
partner = self.env.ref("base.partner_admin")
old_image = partner.avatar_1920
value = converter.odoo_to_message(partner)
# admin partner avatar is stored with application/octet-stream
self.assertTrue(value.startswith(b"data:application/octet-stream;base64,"))
# white 1920x1920 image
data_uri = """data:image/png;base64,
iVBORw0KGgoAAAANSUhEUgAAB4AAAAeAAQAAAAAH2XdrAAAABGdBTUEAALGPC/xhBQAAACBjSFJN
AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QAAd2KE6QAAAAHdElN
RQfpAhURBCXSFMwjAAAIE0lEQVR42u3PAQ0AMAjAMPyb/mWQjE7BOu9Ysz0ADAwMDAwMfCfgesD1
gOsB1wOuB1wPuB5wPeB6wPWA6wHXA64HXA+4HnA94HrA9YDrAdcDrgdcD7gecD3gesD1gOsB1wOu
B1wPuB5wPeB6wPWA6wHXA64HXA+4HnA94HrA9YDrAdcDrgdcD7gecD3gesD1gOsB1wOuB1wPuB5w
PeB6wPWA6wHXA64HXA+4HnA94HrA9YDrAdcDrgdcD7gecD3gesD1gOsB1wOuB1wPuB5wPeB6wPWA
6wHXA64HXA+4HnA94HrA9YDrAdcDrgdcD7gecD3gesD1gOsB1wOuB1wPuB5wPeB6wPWA6wHXA64H
XA+4HnA94HrA9YDrAdcDrgdcD7gecD3gesD1gOsB1wOuB1wPuB5wPeB6wPWA6wHXA64HXA+4HnA9
4HrA9YDrAdcDrgdcD7gecD3gesD1gOsB1wOuB1wPuB5wPeB6wPWA6wHXA64HXA+4HnA94HrA9YDr
AdcDrgdcD7gecD3gesD1gOsB1wOuB1wPuB5wPeB6wPWA6wHXA64HXA+4HnA94HrA9YDrAdcDrgdc
D7gecD3gesD1gOsB1wOuB1wPuB5wPeB6wPWA6wHXA64HXA+4HnA94HrA9YDrAdcDrgdcD7gecD3g
esD1gOsB1wOuB1wPuB5wPeB6wPWA6wHXA64HXA+4HnA94HrA9YDrAdcDrgdcD7gecD3gesD1gOsB
1wOuB1wPuB5wPeB6wPWA6wHXA64HXA+4HnA94HrA9YDrAdcDrgdcD7gecD3gesD1gOsB1wOuB1wP
uB5wPeB6wPWA6wHXA64HXA+4HnA94HrA9YDrAdcDrgdcD7gecD3gesD1gOsB1wOuB1wPuB5wPeB6
wPWA6wHXA64HXA+4HnA94HrA9YDrAdcDrgdcD7gecD3gesD1gOsB1wOuB1wPuB5wPeB6wPWA6wHX
A64HXA+4HnA94HrA9YDrAdcDrgdcD7gecD3gesD1gOsB1wOuB1wPuB5wPeB6wPWA6wHXA64HXA+4
HnA94HrA9YDrAdcDrgdcD7gecD3gesD1gOsB1wOuB1wPuB5wPeB6wPWA6wHXA64HXA+4HnA94HrA
9YDrAdcDrgdcD7gecD3gesD1gOsB1wOuB1wPuB5wPeB6wPWA6wHXA64HXA+4HnA94HrA9YDrAdcD
rgdcD7gecD3gesD1gOsB1wOuB1wPuB5wPeB6wPWA6wHXA64HXA+4HnA94HrA9YDrAdcDrgdcD7ge
cD3gesD1gOsB1wOuB1wPuB5wPeB6wPWA6wHXA64HXA+4HnA94HrA9YDrAdcDrgdcD7gecD3gesD1
gOsB1wOuB1wPuB5wPeB6wPWA6wHXA64HXA+4HnA94HrA9YDrAdcDrgdcD7gecD3gesD1gOsB1wOu
B1wPuB5wPeB6wPWA6wHXA64HXA+4HnA94HrA9YDrAdcDrgdcD7gecD3gesD1gOsB1wOuB1wPuB5w
PeB6wPWA6wHXA64HXA+4HnA94HrA9YDrAdcDrgdcD7gecD3gesD1gOsB1wOuB1wPuB5wPeB6wPWA
6wHXA64HXA+4HnA94HrA9YDrAdcDrgdcD7gecD3gesD1gOsB1wOuB1wPuB5wPeB6wPWA6wHXA64H
XA+4HnA94HrA9YDrAdcDrgdcD7gecD3gesD1gOsB1wOuB1wPuB5wPeB6wPWA6wHXA64HXA+4HnA9
4HrA9YDrAdcDrgdcD7gecD3gesD1gOsB1wOuB1wPuB5wPeB6wPWA6wHXA64HXA+4HnA94HrA9YDr
AdcDrgdcD7gecD3gesD1gOsB1wOuB1wPuB5wPeB6wPWA6wHXA64HXA+4HnA94HrA9YDrAdcDrgdc
D7gecD3gesD1gOsB1wOuB1wPuB5wPeB6wPWA6wHXA64HXA+4HnA94HrA9YDrAdcDrgdcD7gecD3g
esD1gOsB1wOuB1wPuB5wPeB6wPWA6wHXA64HXA+4HnA94HrA9YDrAdcDrgdcD7gecD3gesD1gOsB
1wOuB1wPuB5wPeB6wPWA6wHXA64HXA+4HnA94HrA9YDrAdcDrgdcD7gecD3gesD1gOsB1wOuB1wP
uB5wPeB6wPWA6wHXA64HXA+4HnA94HrA9YDrAdcDrgdcD7gecD3gesD1gOsB1wOuB1wPuB5wPeB6
wPWA6wHXA64HXA+4HnA94HrA9YDrAdcDrgdcD7gecD3gesD1gOsB1wOuB1wPuB5wPeB6wPWA6wHX
A64HXA+4HnA94HrA9YDrAdcDrgdcD7gecD3gesD1gOsB1wOuB1wPuB5wPeB6wPWA6wHXA64HXA+4
HnA94HrA9YDrAdcDrgdcD7gecD3gesD1gOsB1wOuB1wPuB5wPeB6wPWA6wHXA64HXA+4HnA94HrA
9YDrAdcDrgdcD7gecD3gesD1gOsB1wOuB1wPuB5wPeB6wPWA6wHXA64HXA+4HnA94HrA9YDrAdcD
rgdcD7gecD3gesD1gOsB1wOuB1wPuB5wPeB6wPWA6wHXA64HXA+4HnA94HrA9YDrAdcDrgdcD7ge
cD3gesD1gOsB1wOuB1wPuB5wPeB6wPWA6wHXA64HXA+4HnA94HrA9YDrAdcDrgdcD7gecD3gesD1
gOsB1wOuB1wPuB5wPeB6wPWA6wHXA64HXA+4HnA94HrA9YDrAdcDrgdcD7gecD3gesD1gOsB1wOu
B1wPuB5wPeB6wPWA6wHXA64HXA+4HnA94HrA9YDrfdjxYRCgcj/RAAAAJXRFWHRkYXRlOmNyZWF0
ZQAyMDI1LTAyLTIxVDE3OjA0OjM3KzAwOjAw60rorAAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyNS0w
Mi0yMVQxNzowNDozNyswMDowMJoXUBAAAAAASUVORK5CYII="""
values = converter.message_to_odoo(self.env, "update", data_uri, partner, True)
partner.write(values)
self.assertNotEqual(old_image, partner.avatar_1920)
value = converter.odoo_to_message(partner)
# not an attachment, mimetype is lost
self.assertTrue(value.startswith(b"data:application/octet-stream;base64,"))
converter = Field("image_1920")
main_company = self.env.ref("base.main_company").partner_id
values = converter.message_to_odoo(self.env, "update", data_uri, partner, True)
main_company.write(values)
value = converter.odoo_to_message(main_company)
self.assertTrue(value.startswith(b"data:image/png;base64,"))
# test on an attachment field
data_uri = (
"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElE"
"QVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="
)
menu = self.env["ir.ui.menu"].search([], limit=1)
old_image = menu.web_icon_data
converter = Field("web_icon_data")
values = converter.message_to_odoo(self.env, "update", data_uri, menu, True)
menu.write(values)
self.assertEqual(old_image, menu.web_icon_data)
converter.post_hook(menu, data_uri)
# TODO fix that, post_hook is not working
self.assertNotEqual(old_image, menu.web_icon_data)
value = converter.odoo_to_message(menu)
self.assertTrue(value.startswith(b"data:image/png;base64,"))
# TODO test with a image/svg and a non admin user
# TODO add more tests like text/plain
Loading