70 lines
2.4 KiB
Python
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,
|
|
}
|
|
)
|