You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
2.4 KiB
67 lines
2.4 KiB
# 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', string="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,
|
|
})
|