server-tools/base_conditional_image/models/abstract_image.py

70 lines
2.4 KiB
Python

# 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"
_description = "Abstract image"
image = fields.Binary(compute="_compute_image", store=False, readonly=True)
image_medium = fields.Binary(
compute="_compute_image",
string="Medium-sized image",
store=False,
readonly=True,
)
image_small = fields.Binary(
compute="_compute_image", string="Small-sized 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,
}
)