[Odoo 11.0]How to add default image to product

Ermin Trevisan

I try to migrate the module to Odoo 11.0.

Based on this post ( I have changed the code as follows:

product_image = fields.Binary(
string='Global Product Image',
default=lambda s: s._default_product_image(),
help='Use as the global image for all product default images. '
'Limited to 1024x1024.',

def _default_product_image(self):
image_path = get_module_resource(
'product_default_image', 'static/src/img', 'glob_prod_img.png'
with open(image_path, 'rb') as handler:
image_data =
return tools.image_resize_image_big(image_data)

But now I get the following error:

Odoo Server Error

Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/odoo/", line 653, in _handle_exception
return super(JsonRequest, self)._handle_exception(exception)
File "/usr/lib/python3/dist-packages/odoo/", line 312, in _handle_exception
raise pycompat.reraise(type(exception), exception, sys.exc_info()[2])
File "/usr/lib/python3/dist-packages/odoo/tools/", line 87, in reraise
raise value
File "/usr/lib/python3/dist-packages/odoo/", line 695, in dispatch
result = self._call_function(**self.params)
File "/usr/lib/python3/dist-packages/odoo/", line 344, in _call_function
return checked_call(self.db, *args, **kwargs)
File "/usr/lib/python3/dist-packages/odoo/service/", line 97, in wrapper
return f(dbname, *args, **kwargs)
File "/usr/lib/python3/dist-packages/odoo/", line 337, in checked_call
result = self.endpoint(*a, **kw)
File "/usr/lib/python3/dist-packages/odoo/", line 939, in __call__
return self.method(*args, **kw)
File "/usr/lib/python3/dist-packages/odoo/", line 517, in response_wrap
response = f(*args, **kw)
File "/usr/lib/python3/dist-packages/odoo/addons/web/controllers/", line 938, in call_button
action = self._call_kw(model, method, args, {})
File "/usr/lib/python3/dist-packages/odoo/addons/web/controllers/", line 926, in _call_kw
return call_kw(request.env[model], method, args, kwargs)
File "/usr/lib/python3/dist-packages/odoo/", line 689, in call_kw
return call_kw_multi(method, model, args, kwargs)
File "/usr/lib/python3/dist-packages/odoo/", line 680, in call_kw_multi
result = method(recs, *args, **kwargs)
File "<decorator-gen-42>", line 2, in button_immediate_install
File "/usr/lib/python3/dist-packages/odoo/addons/base/module/", line 72, in check_and_log
return method(self, *args, **kwargs)
File "/usr/lib/python3/dist-packages/odoo/addons/base/module/", line 450, in button_immediate_install
return self._button_immediate_function(type(self).button_install)
File "/usr/lib/python3/dist-packages/odoo/addons/base/module/", line 552, in _button_immediate_function, update_module=True)
File "/usr/lib/python3/dist-packages/odoo/modules/", line 85, in new
odoo.modules.load_modules(registry._db, force_demo, status, update_module)
File "/usr/lib/python3/dist-packages/odoo/modules/", line 380, in load_modules
loaded_modules, update_module, models_to_check)
File "/usr/lib/python3/dist-packages/odoo/modules/", line 274, in load_marked_modules
perform_checks=perform_checks, models_to_check=models_to_check
File "/usr/lib/python3/dist-packages/odoo/modules/", line 153, in load_module_graph
registry.init_models(cr, model_names, {'module':})
File "/usr/lib/python3/dist-packages/odoo/modules/", line 306, in init_models
File "/usr/lib/python3/dist-packages/odoo/", line 2220, in _auto_init
new = field.update_db(self, columns)
File "/usr/lib/python3/dist-packages/odoo/", line 849, in update_db
self.update_db_notnull(model, column)
File "/usr/lib/python3/dist-packages/odoo/", line 889, in update_db_notnull
File "/usr/lib/python3/dist-packages/odoo/", line 2137, in _init_column
value = field.default(self)
File "/usr/lib/python3/dist-packages/odoo/addons/product_default_image/models/", line 46, in <lambda>
default=lambda s: s._default_product_image(),
File "/usr/lib/python3/dist-packages/odoo/addons/product_default_image/models/", line 58, in _default_product_image
return tools.image_resize_image_big(image_data)
File "/usr/lib/python3/dist-packages/odoo/tools/", line 143, in image_resize_image_big
return image_resize_image(base64_source, size, encoding, filetype, avoid_if_small)
File "/usr/lib/python3/dist-packages/odoo/tools/", line 57, in image_resize_image
image =
File "/usr/lib/python3/dist-packages/PIL/", line 2590, in open
% (filename if filename else fp))
OSError: cannot identify image file <_io.BytesIO object at 0x7f0425bf8a98>

Any idea on how to solve this?

2 Answers
Best Answer

Hi Ermin,

I believe it is failing at your end because you don't read the base64 encoded content of the file. This example works for me and I have it running on a few of my instances:

def _get_default_image(self):
    with open(modules.get_module_resource('product_default_image', 
    'rb') as f:
        return base64.b64encode(

custom_image = fields.Binary(string='Image', default=_get_default_image)


Ermin Trevisan
Best Answer

Hi Yenthe,

Thank you very much for your answer.

This is the new code I have based on your answer:

product_image = fields.Binary(
string='Global Product Image',
help='Use as the global image for all product default images. '
'Limited to 1024x1024.',

def _get_default_image(self):
with open(modules.get_module_resource('product_default_image',
'rb') as f:
return base64.b64encode(

But the error message now is:

2019-07-21 14:52:45,485 5663 ERROR ? werkzeug: Error on request:
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/werkzeug/", line 270, in run_wsgi
File "/usr/lib/python3/dist-packages/werkzeug/", line 258, in execute
application_iter = app(environ, start_response)
File "/usr/lib/python3/dist-packages/odoo/service/", line 319, in app
return, s)
File "/usr/lib/python3/dist-packages/odoo/service/", line 164, in application
return werkzeug.contrib.fixers.ProxyFix(application_unproxied)(environ, start_response)
File "/usr/lib/python3/dist-packages/werkzeug/contrib/", line 152, in __call__
return, start_response)
File "/usr/lib/python3/dist-packages/odoo/service/", line 154, in application_unproxied
result = handler(environ, start_response)
File "/usr/lib/python3/dist-packages/odoo/", line 1320, in __call__
File "/usr/lib/python3/dist-packages/odoo/", line 1352, in load_addons
m = __import__('odoo.addons.' + module)
File "<frozen importlib._bootstrap>", line 971, in _find_and_load

File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked

File "<frozen importlib._bootstrap>", line 656, in _load_unlocked

File "<frozen importlib._bootstrap>", line 626, in _load_backward_compatible

File "/usr/lib/python3/dist-packages/odoo/modules/", line 82, in load_module
exec(open(modfile, 'rb').read(), new_mod.__dict__)
File "<string>", line 5, in <module>

File "/usr/lib/python3/dist-packages/odoo/addons/product_default_image/models/", line 8, in <module>
from . import res_company
File "/usr/lib/python3/dist-packages/odoo/addons/product_default_image/models/", line 16, in <module>
class ResCompany(models.Model):
File "/usr/lib/python3/dist-packages/odoo/addons/product_default_image/models/", line 45, in ResCompany
string='Global Product Image', default=_get_default_image,
NameError: name '_get_default_image' is not defined

How can I fix that?


Put the function above the field definition and it'll work. Default methods have to be above the field definition in order to work :) I've modified my answer too as it might confuse others.

Ermin Trevisan

I was thinking about that :-)

Thank you very much !

You're welcome! Best of luck Ermin :)