From 22b4764470b3806caf51695f8a83ce8b66c2e0b8 Mon Sep 17 00:00:00 2001 From: Jairo Llopis Date: Wed, 20 Jul 2016 14:35:42 +0200 Subject: [PATCH 1/6] Use v9 ormcache. --- base_multi_image/models/image.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base_multi_image/models/image.py b/base_multi_image/models/image.py index dfb5501d327..2c9055de537 100644 --- a/base_multi_image/models/image.py +++ b/base_multi_image/models/image.py @@ -116,7 +116,7 @@ def _get_image_from_url(self): return self._get_image_from_url_cached(self.url) @api.model - @tools.ormcache(skiparg=1) + @tools.ormcache("url") def _get_image_from_url_cached(self, url): """Allow to download an image and cache it by its URL.""" if url: From ee63a073f579df63988005d781c6f3ef1f630bd2 Mon Sep 17 00:00:00 2001 From: Jairo Llopis Date: Wed, 20 Jul 2016 17:51:43 +0200 Subject: [PATCH 2/6] Add a reference field to get to the owner with 1 click. --- base_multi_image/hooks.py | 8 +++++++- base_multi_image/models/image.py | 19 +++++++++++++++++++ base_multi_image/views/image_view.xml | 1 + 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/base_multi_image/hooks.py b/base_multi_image/hooks.py index 55496df407d..2846af771a5 100644 --- a/base_multi_image/hooks.py +++ b/base_multi_image/hooks.py @@ -35,7 +35,12 @@ def pre_init_hook_for_submodules(cr, model, field): # fields.Binary(attachment=True), get the ir_attachment record ID else: extract_query = """ - SELECT res_id, res_model, 'filestore', id + SELECT + res_id, + res_model, + CONCAT_WS(',', res_model, res_id), + 'filestore', + id FROM ir_attachment WHERE res_field='%(field)s' AND res_model='%(model)s' """ % {"model": model, "field": field} @@ -45,6 +50,7 @@ def pre_init_hook_for_submodules(cr, model, field): INSERT INTO base_multi_image_image ( owner_id, owner_model, + owner_ref_id, storage, %s ) diff --git a/base_multi_image/models/image.py b/base_multi_image/models/image.py index 2c9055de537..eda04946e71 100644 --- a/base_multi_image/models/image.py +++ b/base_multi_image/models/image.py @@ -27,6 +27,12 @@ class Image(models.Model): required=True) owner_model = fields.Char( required=True) + owner_ref_id = fields.Reference( + selection="_selection_owner_ref_id", + string="Referenced Owner", + compute="_compute_owner_ref_id", + store=True, + ) storage = fields.Selection( [('url', 'URL'), ('file', 'OS file'), ('db', 'Database'), ('filestore', 'Filestore')], @@ -74,6 +80,19 @@ class Image(models.Model): show_technical = fields.Boolean( compute="_show_technical") + @api.model + @tools.ormcache("self") + def _selection_owner_ref_id(self): + """Allow any model; after all, this field is readonly.""" + return [(r.model, r.name) for r in self.env["ir.model"].search([])] + + @api.multi + @api.depends("owner_model", "owner_id") + def _compute_owner_ref_id(self): + """Get a reference field based on the split model and id fields.""" + for s in self: + s.owner_ref_id = "{0.owner_model},{0.owner_id}".format(s) + @api.multi @api.depends('storage', 'path', 'file_db_store', 'url') def _get_image(self): diff --git a/base_multi_image/views/image_view.xml b/base_multi_image/views/image_view.xml index e7bd342d210..8b41025ef23 100644 --- a/base_multi_image/views/image_view.xml +++ b/base_multi_image/views/image_view.xml @@ -19,6 +19,7 @@ + From 1f36eca4c5a61fa9f45168e72d4d1e47f4ca6ce0 Mon Sep 17 00:00:00 2001 From: Jairo Llopis Date: Wed, 20 Jul 2016 17:52:16 +0200 Subject: [PATCH 3/6] Add uninstall hook to avoid garbage images hanging around after submodule is uninstalled. --- base_multi_image/README.rst | 12 ++++++++++-- base_multi_image/hooks.py | 18 ++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/base_multi_image/README.rst b/base_multi_image/README.rst index 3674b6dd013..511dac181fc 100644 --- a/base_multi_image/README.rst +++ b/base_multi_image/README.rst @@ -57,18 +57,26 @@ To develop a module based on this one: * If the model you are extending already had an image field, and you want to trick Odoo to make those images to multi-image mode, you will need to make - use of the provided :meth:`~.hooks.pre_init_hook_for_submodules`, like - the ``product_multi_image`` module does:: + use of the provided :meth:`~.hooks.pre_init_hook_for_submodules` and + :meth:`~.hooks.uninstall_hook_for_submodules`, like the + ``product_multi_image`` module does:: from openerp.addons.base_multi_image.hooks import \ pre_init_hook_for_submodules def pre_init_hook(cr): + """Transform single into multi images.""" pre_init_hook_for_submodules(cr, "product.template", "image") pre_init_hook_for_submodules(cr, "product.product", "image_variant") + def uninstall_hook(cr, registry): + """Remove multi images for models that no longer use them.""" + uninstall_hook_for_submodules(cr, registry, "product.template") + uninstall_hook_for_submodules(cr, registry, "product.product") + + .. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas :alt: Try me on Runbot :target: https://runbot.odoo-community.org/runbot/149/9.0 diff --git a/base_multi_image/hooks.py b/base_multi_image/hooks.py index 2846af771a5..17e7a9618fc 100644 --- a/base_multi_image/hooks.py +++ b/base_multi_image/hooks.py @@ -59,6 +59,24 @@ def pre_init_hook_for_submodules(cr, model, field): ) +def uninstall_hook_for_submodules(cr, registry, model): + """Remove multi-images for a given model. + + :param openerp.sql_db.Cursor cr: + Database cursor. + + :param openerp.modules.registry.RegistryManager registry: + Database registry, using v7 api. + + :param str model: + Model technical name, like "res.partner". All multi-images for that + model will be deleted + """ + Image = registry["base_multi_image.image"] + ids = Image.search(cr, SUPERUSER_ID, [("owner_model", "=", model)]) + Image.unlink(cr, SUPERUSER_ID, ids) + + def table_has_column(cr, table, field): query = """ SELECT %(field)s From 0ee5e7ea599d9db07468cd69c74864417af19090 Mon Sep 17 00:00:00 2001 From: Jairo Llopis Date: Wed, 20 Jul 2016 18:12:27 +0200 Subject: [PATCH 4/6] Raise version. --- base_multi_image/__openerp__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base_multi_image/__openerp__.py b/base_multi_image/__openerp__.py index 7fc905cb8f4..77159b11f80 100644 --- a/base_multi_image/__openerp__.py +++ b/base_multi_image/__openerp__.py @@ -8,7 +8,7 @@ { "name": "Multiple images base", "summary": "Allow multiple images for database objects", - "version": "9.0.1.0.0", + "version": "9.0.1.1.0", "author": "Serv. Tecnol. Avanzados - Pedro M. Baeza, " "Antiun IngenierĂ­a, S.L., Sodexis, " "Odoo Community Association (OCA)", From f71b17e745f5ebe5a9a2a605660d94155b089050 Mon Sep 17 00:00:00 2001 From: Jairo Llopis Date: Thu, 21 Jul 2016 11:25:49 +0200 Subject: [PATCH 5/6] Add ondelete attribute, required for Many2one fields in v9. --- base_multi_image/models/image.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/base_multi_image/models/image.py b/base_multi_image/models/image.py index eda04946e71..cf8a228ef5c 100644 --- a/base_multi_image/models/image.py +++ b/base_multi_image/models/image.py @@ -24,7 +24,9 @@ class Image(models.Model): owner_id = fields.Integer( "Owner", - required=True) + required=True, + ondelete="cascade", # This Integer is really a split Many2one + ) owner_model = fields.Char( required=True) owner_ref_id = fields.Reference( From 3b44515b7dd116c4873c9cd887f57fd1c72e3663 Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Fri, 29 Jul 2016 19:41:37 +0200 Subject: [PATCH 6/6] [FIX] base_multi_image: Correct README instructions --- base_multi_image/README.rst | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/base_multi_image/README.rst b/base_multi_image/README.rst index 511dac181fc..8e05f046ed3 100644 --- a/base_multi_image/README.rst +++ b/base_multi_image/README.rst @@ -61,8 +61,11 @@ To develop a module based on this one: :meth:`~.hooks.uninstall_hook_for_submodules`, like the ``product_multi_image`` module does:: - from openerp.addons.base_multi_image.hooks import \ - pre_init_hook_for_submodules + try: + from openerp.addons.base_multi_image.hooks import \ + pre_init_hook_for_submodules + except: + pass def pre_init_hook(cr):