From fd169975174dc61bba4b6a9eb5150ac4e5aa14a2 Mon Sep 17 00:00:00 2001
From: Patrick Tombez
Date: Tue, 2 Oct 2018 10:57:52 +0200
Subject: [PATCH 01/21] Add module custom_image
---
base_conditional_image/README.rst | 106 +++++
base_conditional_image/__init__.py | 1 +
base_conditional_image/__manifest__.py | 19 +
base_conditional_image/i18n/custom_image.pot | 141 ++++++
base_conditional_image/models/__init__.py | 2 +
.../models/abstract_image.py | 66 +++
base_conditional_image/models/image.py | 63 +++
.../readme/CONTRIBUTORS.rst | 1 +
base_conditional_image/readme/DESCRIPTION.rst | 8 +
base_conditional_image/readme/INSTALL.rst | 11 +
base_conditional_image/readme/USAGE.rst | 7 +
.../security/ir.model.access.csv | 3 +
.../static/description/index.html | 447 ++++++++++++++++++
base_conditional_image/views/image_view.xml | 53 +++
14 files changed, 928 insertions(+)
create mode 100644 base_conditional_image/README.rst
create mode 100644 base_conditional_image/__init__.py
create mode 100644 base_conditional_image/__manifest__.py
create mode 100644 base_conditional_image/i18n/custom_image.pot
create mode 100644 base_conditional_image/models/__init__.py
create mode 100644 base_conditional_image/models/abstract_image.py
create mode 100644 base_conditional_image/models/image.py
create mode 100644 base_conditional_image/readme/CONTRIBUTORS.rst
create mode 100644 base_conditional_image/readme/DESCRIPTION.rst
create mode 100644 base_conditional_image/readme/INSTALL.rst
create mode 100644 base_conditional_image/readme/USAGE.rst
create mode 100644 base_conditional_image/security/ir.model.access.csv
create mode 100644 base_conditional_image/static/description/index.html
create mode 100644 base_conditional_image/views/image_view.xml
diff --git a/base_conditional_image/README.rst b/base_conditional_image/README.rst
new file mode 100644
index 00000000000..a0c93c5253e
--- /dev/null
+++ b/base_conditional_image/README.rst
@@ -0,0 +1,106 @@
+==================
+Conditional Images
+==================
+
+.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! This file is generated by oca-gen-addon-readme !!
+ !! changes will be overwritten. !!
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
+ :target: https://odoo-community.org/page/development-status
+ :alt: Beta
+.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
+ :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
+ :alt: License: AGPL-3
+.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--tools-lightgray.png?logo=github
+ :target: https://github.com/OCA/server-tools/tree/9.0/base_conditional_image
+ :alt: OCA/server-tools
+.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
+ :target: https://translation.odoo-community.org/projects/server-tools-9-0/server-tools-9-0-base_conditional_image
+ :alt: Translate me on Weblate
+.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
+ :target: https://runbot.odoo-community.org/runbot/149/9.0
+ :alt: Try me on Runbot
+
+|badge1| |badge2| |badge3| |badge4| |badge5|
+
+This module extends the functionality of any model to support conditional images
+(based on the record attributes) and to manage them either globally or by company.
+
+The main goal behind this module is to avoid storing the same image multiple times.
+For example, for every partner, there is a related image (most of the time, it's the default one).
+With this module properly set up, it will be stored only one time and you can change it whenever you want for all partners.
+
+**WARNING**: this module cannot be used on the same objects using the module `base_multi_image`.
+
+**Table of contents**
+
+.. contents::
+ :local:
+
+Installation
+============
+
+The sole purpose of this module is to add an abstract model to be inherited.
+So, you will not notice any changes on install.
+
+To develop using this module, you have to inherit the abstract model `abstract.conditional.image`
+to the model that needs the conditional images::
+
+ class ResPartner(models.Model):
+ _inherit = ['res.partner', 'abstract.conditional.image']
+ _name = 'res.partner'
+
+Then, configure how the images will be selected for each record.
+
+Usage
+=====
+
+Go to *Technical Settings > Settings > Images* to configure all the images.
+You can define images for specific objects, depending on the attributes and the company of the object.
+
+The `selector` should return a boolean expression. All fields of the object are available to compute the result.
+
+The system will first try to match an image with a company set up, then with the ones without a company.
+If your object does not have a `company_id` field, this check will be ignored and only images without a company will be used.
+
+Bug Tracker
+===========
+
+Bugs are tracked on `GitHub Issues `_.
+In case of trouble, please check there if your issue has already been reported.
+If you spotted it first, help us smashing it by providing a detailed and welcomed
+`feedback `_.
+
+Do not contact contributors directly about support or help with technical issues.
+
+Credits
+=======
+
+Authors
+~~~~~~~
+
+* Camptocamp
+
+Contributors
+~~~~~~~~~~~~
+
+* Patrick Tombez
+
+Maintainers
+~~~~~~~~~~~
+
+This module is maintained by the OCA.
+
+.. image:: https://odoo-community.org/logo.png
+ :alt: Odoo Community Association
+ :target: https://odoo-community.org
+
+OCA, or the Odoo Community Association, is a nonprofit organization whose
+mission is to support the collaborative development of Odoo features and
+promote its widespread use.
+
+This module is part of the `OCA/server-tools `_ project on GitHub.
+
+You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/base_conditional_image/__init__.py b/base_conditional_image/__init__.py
new file mode 100644
index 00000000000..0650744f6bc
--- /dev/null
+++ b/base_conditional_image/__init__.py
@@ -0,0 +1 @@
+from . import models
diff --git a/base_conditional_image/__manifest__.py b/base_conditional_image/__manifest__.py
new file mode 100644
index 00000000000..a1fc89cd768
--- /dev/null
+++ b/base_conditional_image/__manifest__.py
@@ -0,0 +1,19 @@
+# Copyright 2019 Camptocamp SA
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
+
+{
+ 'name': 'Conditional Images',
+ 'version': '12.0.1.0.0',
+ 'author': 'Camptocamp, Odoo Community Association (OCA)',
+ 'license': 'AGPL-3',
+ 'category': 'Misc',
+ 'depends': [
+ 'base',
+ ],
+ 'website': 'http://github.com/OCA/server-tools',
+ 'data': [
+ 'views/image_view.xml',
+ 'security/ir.model.access.csv',
+ ],
+ 'installable': True,
+}
diff --git a/base_conditional_image/i18n/custom_image.pot b/base_conditional_image/i18n/custom_image.pot
new file mode 100644
index 00000000000..bf3f96c9142
--- /dev/null
+++ b/base_conditional_image/i18n/custom_image.pot
@@ -0,0 +1,141 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * custom_image
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 9.0e\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-10-02 08:36+0000\n"
+"PO-Revision-Date: 2018-10-02 08:36+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: custom_image
+#: code:addons/custom_image/models/image.py:47
+#, python-format
+msgid "At least one image type must be specified"
+msgstr ""
+
+#. module: custom_image
+#: model:ir.model.fields,field_description:custom_image.field_image_company_id
+msgid "Company"
+msgstr ""
+
+#. module: custom_image
+#: model:ir.model.fields,help:custom_image.field_image_company_id
+msgid "Company related check. If inherited object does not have a `company_id` field, it will be ignored. The check will first take the records with a company then, if not match is found, the ones without a company."
+msgstr ""
+
+#. module: custom_image
+#: model:ir.model.fields,field_description:custom_image.field_image_create_uid
+msgid "Created by"
+msgstr ""
+
+#. module: custom_image
+#: model:ir.model.fields,field_description:custom_image.field_image_create_date
+msgid "Created on"
+msgstr ""
+
+#. module: custom_image
+#: model:ir.model.fields,field_description:custom_image.field_abstract_custom_image_display_name
+#: model:ir.model.fields,field_description:custom_image.field_image_display_name
+msgid "Display Name"
+msgstr ""
+
+#. module: custom_image
+#: model:ir.model.fields,field_description:custom_image.field_abstract_custom_image_id
+#: model:ir.model.fields,field_description:custom_image.field_image_id
+msgid "ID"
+msgstr ""
+
+#. module: custom_image
+#: model:ir.model.fields,field_description:custom_image.field_abstract_custom_image_image
+#: model:ir.model.fields,field_description:custom_image.field_abstract_custom_image_image_medium
+#: model:ir.model.fields,field_description:custom_image.field_abstract_custom_image_image_small
+#: model:ir.model.fields,field_description:custom_image.field_image_image
+msgid "Image"
+msgstr ""
+
+#. module: custom_image
+#: model:ir.actions.act_window,name:custom_image.image_action
+#: model:ir.ui.menu,name:custom_image.image_menu
+msgid "Images"
+msgstr ""
+
+#. module: custom_image
+#: model:ir.model.fields,field_description:custom_image.field_abstract_custom_image___last_update
+#: model:ir.model.fields,field_description:custom_image.field_image___last_update
+msgid "Last Modified on"
+msgstr ""
+
+#. module: custom_image
+#: model:ir.model.fields,field_description:custom_image.field_image_write_uid
+msgid "Last Updated by"
+msgstr ""
+
+#. module: custom_image
+#: model:ir.model.fields,field_description:custom_image.field_image_write_date
+msgid "Last Updated on"
+msgstr ""
+
+#. module: custom_image
+#: model:ir.model.fields,field_description:custom_image.field_image_image_medium
+msgid "Medium-sized image"
+msgstr ""
+
+#. module: custom_image
+#: model:ir.model.fields,help:custom_image.field_image_image_medium
+msgid "Medium-sized image. It is automatically resized as a 128x128px image, with aspect ratio preserved. Use this field in form views or some kanban views."
+msgstr ""
+
+#. module: custom_image
+#: model:ir.model.fields,field_description:custom_image.field_image_model_name
+msgid "Model Name"
+msgstr ""
+
+#. module: custom_image
+#: model:ir.model.fields,field_description:custom_image.field_image_name
+msgid "Name"
+msgstr ""
+
+#. module: custom_image
+#: model:ir.model.fields,help:custom_image.field_image_selector
+msgid "Python expression used to distinguish the images for the same object. The variable `object` refer to the actual record on which the expression will be executed. An empty expression will always return `True`."
+msgstr ""
+
+#. module: custom_image
+#: model:ir.model.fields,field_description:custom_image.field_image_selector
+#: model:ir.ui.view,arch_db:custom_image.view_image_form
+msgid "Selector"
+msgstr ""
+
+#. module: custom_image
+#: model:ir.model.fields,field_description:custom_image.field_image_image_small
+msgid "Small-sized image"
+msgstr ""
+
+#. module: custom_image
+#: model:ir.model.fields,help:custom_image.field_image_image_small
+msgid "Small-sized image. It is automatically resized as a 64x64px image, with aspect ratio preserved. Use this field anywhere a small image is required."
+msgstr ""
+
+#. module: custom_image
+#: model:ir.model.fields,help:custom_image.field_image_image
+msgid "This field holds the standard image, limited to 1024x1024px"
+msgstr ""
+
+#. module: custom_image
+#: model:ir.model,name:custom_image.model_abstract_custom_image
+msgid "abstract.custom.image"
+msgstr ""
+
+#. module: custom_image
+#: model:ir.model,name:custom_image.model_image
+msgid "image"
+msgstr ""
+
diff --git a/base_conditional_image/models/__init__.py b/base_conditional_image/models/__init__.py
new file mode 100644
index 00000000000..8deef0ec780
--- /dev/null
+++ b/base_conditional_image/models/__init__.py
@@ -0,0 +1,2 @@
+from . import image
+from . import abstract_image
diff --git a/base_conditional_image/models/abstract_image.py b/base_conditional_image/models/abstract_image.py
new file mode 100644
index 00000000000..0aa43c5786c
--- /dev/null
+++ b/base_conditional_image/models/abstract_image.py
@@ -0,0 +1,66 @@
+# Copyright 2019 Camptocamp SA
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
+
+from odoo import fields, models
+from odoo.tools.safe_eval import safe_eval
+
+
+class AbstractConditionalImage(models.AbstractModel):
+ _name = 'abstract.conditional.image'
+
+ image = fields.Binary(
+ compute='_compute_image', string="Image",
+ store=False, readonly=True
+ )
+ image_medium = fields.Binary(
+ compute='_compute_image', string="Image",
+ store=False, readonly=True
+ )
+ image_small = fields.Binary(
+ compute='_compute_image', string="Image",
+ store=False, readonly=True
+ )
+
+ @staticmethod
+ def _compute_selector_test_without_company(image_selector, record):
+ return bool(
+ safe_eval(image_selector.selector or "True", {'object': record})
+ )
+
+ @staticmethod
+ def _compute_selector_test_with_company(image_selector, record):
+ if (image_selector.company_id == record.company_id or
+ record.company_id and not image_selector.company_id):
+ return AbstractConditionalImage\
+ ._compute_selector_test_without_company(
+ image_selector, record
+ )
+ return False
+
+ def _compute_image(self):
+ if 'company_id' in self._fields:
+ search_clause = [('model_name', '=', self._name)]
+ test_method = self._compute_selector_test_with_company
+ else:
+ # If inherited object doesn't have a `company_id` field,
+ # remove the items with a company defined and the related checks
+ search_clause = [('model_name', '=', self._name),
+ ('company_id', '=', False)]
+ test_method = self._compute_selector_test_without_company
+
+ image_selectors = self.env['image'].search(
+ search_clause, order='company_id, selector'
+ )
+
+ for rec in self:
+ found = None
+ for image_selector in image_selectors:
+ if test_method(image_selector, rec):
+ found = image_selector
+ break
+
+ rec.update({
+ 'image': found and found.image,
+ 'image_medium': found and found.image_medium,
+ 'image_small': found and found.image_small,
+ })
diff --git a/base_conditional_image/models/image.py b/base_conditional_image/models/image.py
new file mode 100644
index 00000000000..f361fef2b20
--- /dev/null
+++ b/base_conditional_image/models/image.py
@@ -0,0 +1,63 @@
+# Copyright 2019 Camptocamp SA
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
+
+from odoo import api, fields, models, tools, _
+from odoo.exceptions import ValidationError
+
+
+class Image(models.Model):
+ _name = 'image'
+
+ name = fields.Char('Name', required=True)
+ model_name = fields.Char('Model Name', required=True)
+ selector = fields.Text(
+ 'Selector',
+ help='Python expression used as selector when multiple images are used'
+ 'for the same object. The variable `object` refer '
+ 'to the actual record on which the expression will be executed. '
+ 'An empty expression will always return `True`.'
+ )
+ company_id = fields.Many2one(
+ 'res.company', 'Company',
+ help='Company related check. If inherited object does not have a '
+ '`company_id` field, it will be ignored. '
+ 'The check will first take the records with a company then, '
+ 'if not match is found, the ones without a company.'
+ )
+
+ # image: all image fields are base64 encoded and PIL-supported
+ image = fields.Binary(
+ "Image", attachment=True,
+ help="This field holds the standard image, limited to 1024x1024px"
+ )
+ image_medium = fields.Binary(
+ "Medium-sized image", attachment=True,
+ help="Medium-sized image. It is automatically "
+ "resized as a 128x128px image, with aspect ratio preserved. "
+ "Use this field in form views or some kanban views."
+ )
+ image_small = fields.Binary(
+ "Small-sized image", attachment=True,
+ help="Small-sized image. It is automatically "
+ "resized as a 64x64px image, with aspect ratio preserved. "
+ "Use this field anywhere a small image is required."
+ )
+
+ @api.model
+ def _process_images(self, vals, required=False):
+ if set(['image', 'image_medium', 'image_small']) & set(vals.keys()):
+ tools.image_resize_images(vals)
+ elif required:
+ raise ValidationError(
+ _('At least one image type must be specified')
+ )
+
+ @api.model
+ def create(self, vals):
+ self._process_images(vals, required=True)
+ return super().create(vals)
+
+ @api.multi
+ def write(self, vals):
+ self._process_images(vals)
+ return super().write(vals)
diff --git a/base_conditional_image/readme/CONTRIBUTORS.rst b/base_conditional_image/readme/CONTRIBUTORS.rst
new file mode 100644
index 00000000000..78f10edddc1
--- /dev/null
+++ b/base_conditional_image/readme/CONTRIBUTORS.rst
@@ -0,0 +1 @@
+* Patrick Tombez
diff --git a/base_conditional_image/readme/DESCRIPTION.rst b/base_conditional_image/readme/DESCRIPTION.rst
new file mode 100644
index 00000000000..43630823e69
--- /dev/null
+++ b/base_conditional_image/readme/DESCRIPTION.rst
@@ -0,0 +1,8 @@
+This module extends the functionality of any model to support conditional images
+(based on the record attributes) and to manage them either globally or by company.
+
+The main goal behind this module is to avoid storing the same image multiple times.
+For example, for every partner, there is a related image (most of the time, it's the default one).
+With this module properly set up, it will be stored only one time and you can change it whenever you want for all partners.
+
+**WARNING**: this module cannot be used on the same objects using the module `base_multi_image`.
diff --git a/base_conditional_image/readme/INSTALL.rst b/base_conditional_image/readme/INSTALL.rst
new file mode 100644
index 00000000000..18474d1c9fe
--- /dev/null
+++ b/base_conditional_image/readme/INSTALL.rst
@@ -0,0 +1,11 @@
+The sole purpose of this module is to add an abstract model to be inherited.
+So, you will not notice any changes on install.
+
+To develop using this module, you have to inherit the abstract model `abstract.conditional.image`
+to the model that needs the conditional images::
+
+ class ResPartner(models.Model):
+ _inherit = ['res.partner', 'abstract.conditional.image']
+ _name = 'res.partner'
+
+Then, configure how the images will be selected for each record.
diff --git a/base_conditional_image/readme/USAGE.rst b/base_conditional_image/readme/USAGE.rst
new file mode 100644
index 00000000000..6c70db0389e
--- /dev/null
+++ b/base_conditional_image/readme/USAGE.rst
@@ -0,0 +1,7 @@
+Go to *Technical Settings > Settings > Images* to configure all the images.
+You can define images for specific objects, depending on the attributes and the company of the object.
+
+The `selector` should return a boolean expression. All fields of the object are available to compute the result.
+
+The system will first try to match an image with a company set up, then with the ones without a company.
+If your object does not have a `company_id` field, this check will be ignored and only images without a company will be used.
diff --git a/base_conditional_image/security/ir.model.access.csv b/base_conditional_image/security/ir.model.access.csv
new file mode 100644
index 00000000000..0609565ced6
--- /dev/null
+++ b/base_conditional_image/security/ir.model.access.csv
@@ -0,0 +1,3 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_conditional_image,Conditional Image,base_conditional_image.model_image,base.group_no_one,1,1,1,1
+access_conditional_image_users,Conditional Image Users,base_conditional_image.model_image,base.group_user,1,0,0,0
diff --git a/base_conditional_image/static/description/index.html b/base_conditional_image/static/description/index.html
new file mode 100644
index 00000000000..43ed7f52d66
--- /dev/null
+++ b/base_conditional_image/static/description/index.html
@@ -0,0 +1,447 @@
+
+
+
+
+
+
+Conditional Images
+
+
+
+
+
Conditional Images
+
+
+

+
This module extends the functionality of any model to support conditional images
+(based on the record attributes) and to manage them either globally or by company.
+
The main goal behind this module is to avoid storing the same image multiple times.
+For example, for every partner, there is a related image (most of the time, it’s the default one).
+With this module properly set up, it will be stored only one time and you can change it whenever you want for all partners.
+
WARNING: this module cannot be used on the same objects using the module base_multi_image.
+
Table of contents
+
+
+
+
The sole purpose of this module is to add an abstract model to be inherited.
+So, you will not notice any changes on install.
+
To develop using this module, you have to inherit the abstract model abstract.conditional.image
+to the model that needs the conditional images:
+
+class ResPartner(models.Model):
+ _inherit = ['res.partner', 'abstract.conditional.image']
+ _name = 'res.partner'
+
+
Then, configure how the images will be selected for each record.
+
+
+
+
Go to Technical Settings > Settings > Images to configure all the images.
+You can define images for specific objects, depending on the attributes and the company of the object.
+
The selector should return a boolean expression. All fields of the object are available to compute the result.
+
The system will first try to match an image with a company set up, then with the ones without a company.
+If your object does not have a company_id field, this check will be ignored and only images without a company will be used.
+
+
+
+
Bugs are tracked on GitHub Issues.
+In case of trouble, please check there if your issue has already been reported.
+If you spotted it first, help us smashing it by providing a detailed and welcomed
+feedback.
+
Do not contact contributors directly about support or help with technical issues.
+
+
+
+
+
+
+
+
This module is maintained by the OCA.
+

+
OCA, or the Odoo Community Association, is a nonprofit organization whose
+mission is to support the collaborative development of Odoo features and
+promote its widespread use.
+
This module is part of the OCA/server-tools project on GitHub.
+
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
+
+
+
+
+
diff --git a/base_conditional_image/views/image_view.xml b/base_conditional_image/views/image_view.xml
new file mode 100644
index 00000000000..837299b7c15
--- /dev/null
+++ b/base_conditional_image/views/image_view.xml
@@ -0,0 +1,53 @@
+
+
+
+
+ image.tree
+ image
+
+
+
+
+
+
+
+
+
+
+
+ image.form
+ image
+
+
+
+
+
+
+ Images
+ image
+ form
+ tree,form
+
+
+
+
+
From 2232ca8b7400561891890972614e94912c6e784e Mon Sep 17 00:00:00 2001
From: Patrick Tombez <35060345+p-tombez@users.noreply.github.com>
Date: Thu, 14 Nov 2019 10:30:53 +0100
Subject: [PATCH 02/21] Apply suggestions from code review
Co-Authored-By: Alex Saunier
---
base_conditional_image/README.rst | 10 +-
.../i18n/base_conditional_image.pot | 139 ++++++++++++++++++
base_conditional_image/models/image.py | 4 +-
.../static/description/icon.png | Bin 0 -> 9455 bytes
.../static/description/index.html | 8 +-
5 files changed, 150 insertions(+), 11 deletions(-)
create mode 100644 base_conditional_image/i18n/base_conditional_image.pot
create mode 100644 base_conditional_image/static/description/icon.png
diff --git a/base_conditional_image/README.rst b/base_conditional_image/README.rst
index a0c93c5253e..26327262477 100644
--- a/base_conditional_image/README.rst
+++ b/base_conditional_image/README.rst
@@ -14,13 +14,13 @@ Conditional Images
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--tools-lightgray.png?logo=github
- :target: https://github.com/OCA/server-tools/tree/9.0/base_conditional_image
+ :target: https://github.com/OCA/server-tools/tree/12.0/base_conditional_image
:alt: OCA/server-tools
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
- :target: https://translation.odoo-community.org/projects/server-tools-9-0/server-tools-9-0-base_conditional_image
+ :target: https://translation.odoo-community.org/projects/server-tools-12-0/server-tools-12-0-base_conditional_image
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
- :target: https://runbot.odoo-community.org/runbot/149/9.0
+ :target: https://runbot.odoo-community.org/runbot/149/12.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
@@ -71,7 +71,7 @@ Bug Tracker
Bugs are tracked on `GitHub Issues `_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
-`feedback `_.
+`feedback `_.
Do not contact contributors directly about support or help with technical issues.
@@ -101,6 +101,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
-This module is part of the `OCA/server-tools `_ project on GitHub.
+This module is part of the `OCA/server-tools `_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/base_conditional_image/i18n/base_conditional_image.pot b/base_conditional_image/i18n/base_conditional_image.pot
new file mode 100644
index 00000000000..a241befff1a
--- /dev/null
+++ b/base_conditional_image/i18n/base_conditional_image.pot
@@ -0,0 +1,139 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * base_conditional_image
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 12.0\n"
+"Report-Msgid-Bugs-To: \n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: base_conditional_image
+#: code:addons/base_conditional_image/models/image.py:52
+#, python-format
+msgid "At least one image type must be specified"
+msgstr ""
+
+#. module: base_conditional_image
+#: model:ir.model.fields,field_description:base_conditional_image.field_image__company_id
+msgid "Company"
+msgstr ""
+
+#. module: base_conditional_image
+#: model:ir.model.fields,help:base_conditional_image.field_image__company_id
+msgid "Company related check. If inherited object does not have a `company_id` field, it will be ignored. The check will first take the records with a company then, if no match is found, the ones without a company."
+msgstr ""
+
+#. module: base_conditional_image
+#: model:ir.model.fields,field_description:base_conditional_image.field_image__create_uid
+msgid "Created by"
+msgstr ""
+
+#. module: base_conditional_image
+#: model:ir.model.fields,field_description:base_conditional_image.field_image__create_date
+msgid "Created on"
+msgstr ""
+
+#. module: base_conditional_image
+#: model:ir.model.fields,field_description:base_conditional_image.field_abstract_conditional_image__display_name
+#: model:ir.model.fields,field_description:base_conditional_image.field_image__display_name
+msgid "Display Name"
+msgstr ""
+
+#. module: base_conditional_image
+#: model:ir.model.fields,field_description:base_conditional_image.field_abstract_conditional_image__id
+#: model:ir.model.fields,field_description:base_conditional_image.field_image__id
+msgid "ID"
+msgstr ""
+
+#. module: base_conditional_image
+#: model:ir.model.fields,field_description:base_conditional_image.field_abstract_conditional_image__image
+#: model:ir.model.fields,field_description:base_conditional_image.field_abstract_conditional_image__image_medium
+#: model:ir.model.fields,field_description:base_conditional_image.field_abstract_conditional_image__image_small
+#: model:ir.model.fields,field_description:base_conditional_image.field_image__image
+msgid "Image"
+msgstr ""
+
+#. module: base_conditional_image
+#: model:ir.actions.act_window,name:base_conditional_image.image_action
+#: model:ir.ui.menu,name:base_conditional_image.image_menu
+msgid "Images"
+msgstr ""
+
+#. module: base_conditional_image
+#: model:ir.model.fields,field_description:base_conditional_image.field_abstract_conditional_image____last_update
+#: model:ir.model.fields,field_description:base_conditional_image.field_image____last_update
+msgid "Last Modified on"
+msgstr ""
+
+#. module: base_conditional_image
+#: model:ir.model.fields,field_description:base_conditional_image.field_image__write_uid
+msgid "Last Updated by"
+msgstr ""
+
+#. module: base_conditional_image
+#: model:ir.model.fields,field_description:base_conditional_image.field_image__write_date
+msgid "Last Updated on"
+msgstr ""
+
+#. module: base_conditional_image
+#: model:ir.model.fields,field_description:base_conditional_image.field_image__image_medium
+msgid "Medium-sized image"
+msgstr ""
+
+#. module: base_conditional_image
+#: model:ir.model.fields,help:base_conditional_image.field_image__image_medium
+msgid "Medium-sized image. It is automatically resized as a 128x128px image, with aspect ratio preserved. Use this field in form views or some kanban views."
+msgstr ""
+
+#. module: base_conditional_image
+#: model:ir.model.fields,field_description:base_conditional_image.field_image__model_name
+msgid "Model Name"
+msgstr ""
+
+#. module: base_conditional_image
+#: model:ir.model.fields,field_description:base_conditional_image.field_image__name
+msgid "Name"
+msgstr ""
+
+#. module: base_conditional_image
+#: model:ir.model.fields,help:base_conditional_image.field_image__selector
+msgid "Python expression used as selector when multiple images are usedfor the same object. The variable `object` refers to the actual record on which the expression will be executed. An empty expression will always return `True`."
+msgstr ""
+
+#. module: base_conditional_image
+#: model:ir.model.fields,field_description:base_conditional_image.field_image__selector
+#: model_terms:ir.ui.view,arch_db:base_conditional_image.view_image_form
+msgid "Selector"
+msgstr ""
+
+#. module: base_conditional_image
+#: model:ir.model.fields,field_description:base_conditional_image.field_image__image_small
+msgid "Small-sized image"
+msgstr ""
+
+#. module: base_conditional_image
+#: model:ir.model.fields,help:base_conditional_image.field_image__image_small
+msgid "Small-sized image. It is automatically resized as a 64x64px image, with aspect ratio preserved. Use this field anywhere a small image is required."
+msgstr ""
+
+#. module: base_conditional_image
+#: model:ir.model.fields,help:base_conditional_image.field_image__image
+msgid "This field holds the standard image, limited to 1024x1024px"
+msgstr ""
+
+#. module: base_conditional_image
+#: model:ir.model,name:base_conditional_image.model_abstract_conditional_image
+msgid "abstract.conditional.image"
+msgstr ""
+
+#. module: base_conditional_image
+#: model:ir.model,name:base_conditional_image.model_image
+msgid "image"
+msgstr ""
+
diff --git a/base_conditional_image/models/image.py b/base_conditional_image/models/image.py
index f361fef2b20..6c32e0e9b20 100644
--- a/base_conditional_image/models/image.py
+++ b/base_conditional_image/models/image.py
@@ -13,7 +13,7 @@ class Image(models.Model):
selector = fields.Text(
'Selector',
help='Python expression used as selector when multiple images are used'
- 'for the same object. The variable `object` refer '
+ 'for the same object. The variable `object` refers '
'to the actual record on which the expression will be executed. '
'An empty expression will always return `True`.'
)
@@ -22,7 +22,7 @@ class Image(models.Model):
help='Company related check. If inherited object does not have a '
'`company_id` field, it will be ignored. '
'The check will first take the records with a company then, '
- 'if not match is found, the ones without a company.'
+ 'if no match is found, the ones without a company.'
)
# image: all image fields are base64 encoded and PIL-supported
diff --git a/base_conditional_image/static/description/icon.png b/base_conditional_image/static/description/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d
GIT binary patch
literal 9455
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
z
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
Xviia!U7SGha1wx#SCgwmn*{w2TRX*I
literal 0
HcmV?d00001
diff --git a/base_conditional_image/static/description/index.html b/base_conditional_image/static/description/index.html
index 43ed7f52d66..63a9f2d3a0f 100644
--- a/base_conditional_image/static/description/index.html
+++ b/base_conditional_image/static/description/index.html
@@ -3,7 +3,7 @@
-
+
Conditional Images
-
-
Conditional Images
+
+
+
+
+
+
+
Conditional Images
-

+

This module extends the functionality of any model to support
conditional images (based on the record attributes) and to manage them
either globally or by company.
@@ -396,7 +401,7 @@
Conditional Images
-
+
The sole purpose of this module is to add an abstract model to be
inherited. So, you will not notice any changes on install.
To develop using this module, you have to inherit the abstract model
@@ -410,7 +415,7 @@
Then, configure how the images will be selected for each record.
-
+
Go to Technical Settings > Settings > Images to configure all the
images. You can define images for specific objects, depending on the
attributes and the company of the object.
@@ -422,7 +427,7 @@
company will be used.
-
+
Bugs are tracked on GitHub Issues.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
@@ -430,15 +435,15 @@
Do not contact contributors directly about support or help with technical issues.
-
+
-
+
The migration of this module from 12.0 to 14.0 was financially supported
by Camptocamp
-
+
This module is maintained by the OCA.
@@ -474,5 +479,6 @@
+
From e288d994efa38bc04b26ecd3636a95685aa49700 Mon Sep 17 00:00:00 2001
From: Don Kendall
Date: Fri, 29 May 2026 20:10:55 -0400
Subject: [PATCH 21/21] [MIG] base_conditional_image: Migration to 19.0
Signed-off-by: Don Kendall
---
base_conditional_image/README.rst | 12 ++++++------
base_conditional_image/__manifest__.py | 2 +-
base_conditional_image/static/description/index.html | 8 ++++----
3 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/base_conditional_image/README.rst b/base_conditional_image/README.rst
index fd3437945cc..79eff351d62 100644
--- a/base_conditional_image/README.rst
+++ b/base_conditional_image/README.rst
@@ -11,7 +11,7 @@ Conditional Images
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- !! source digest: sha256:a43e69abc9d533d059e3ba3612b938ea0ac06b4e7b766dd472382b3e631b7138
+ !! source digest: sha256:da372508d2b504d34f4de952097a319aa6dfcd961ae78934ea4e523bc47864ff
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
@@ -21,13 +21,13 @@ Conditional Images
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--tools-lightgray.png?logo=github
- :target: https://github.com/OCA/server-tools/tree/18.0/base_conditional_image
+ :target: https://github.com/OCA/server-tools/tree/19.0/base_conditional_image
:alt: OCA/server-tools
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
- :target: https://translation.odoo-community.org/projects/server-tools-18-0/server-tools-18-0-base_conditional_image
+ :target: https://translation.odoo-community.org/projects/server-tools-19-0/server-tools-19-0-base_conditional_image
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
- :target: https://runboat.odoo-community.org/builds?repo=OCA/server-tools&target_branch=18.0
+ :target: https://runboat.odoo-community.org/builds?repo=OCA/server-tools&target_branch=19.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
@@ -89,7 +89,7 @@ Bug Tracker
Bugs are tracked on `GitHub Issues `_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
-`feedback `_.
+`feedback `_.
Do not contact contributors directly about support or help with technical issues.
@@ -136,6 +136,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
-This module is part of the `OCA/server-tools `_ project on GitHub.
+This module is part of the `OCA/server-tools `_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/base_conditional_image/__manifest__.py b/base_conditional_image/__manifest__.py
index 5403aa8c509..259110babac 100644
--- a/base_conditional_image/__manifest__.py
+++ b/base_conditional_image/__manifest__.py
@@ -4,7 +4,7 @@
{
"name": "Conditional Images",
"summary": "This module extends the functionality to support conditional images",
- "version": "18.0.1.0.0",
+ "version": "19.0.1.0.0",
"author": "Camptocamp, Odoo Community Association (OCA)",
"license": "AGPL-3",
"category": "Misc",
diff --git a/base_conditional_image/static/description/index.html b/base_conditional_image/static/description/index.html
index 1a42e4b008a..20c38d63ade 100644
--- a/base_conditional_image/static/description/index.html
+++ b/base_conditional_image/static/description/index.html
@@ -372,9 +372,9 @@ Conditional Images
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!! source digest: sha256:a43e69abc9d533d059e3ba3612b938ea0ac06b4e7b766dd472382b3e631b7138
+!! source digest: sha256:da372508d2b504d34f4de952097a319aa6dfcd961ae78934ea4e523bc47864ff
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-

+

This module extends the functionality of any model to support
conditional images (based on the record attributes) and to manage them
either globally or by company.
@@ -431,7 +431,7 @@
Bugs are tracked on GitHub Issues.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
-feedback.
+feedback.
Do not contact contributors directly about support or help with technical issues.
@@ -474,7 +474,7 @@
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
-
This module is part of the OCA/server-tools project on GitHub.
+
This module is part of the OCA/server-tools project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.