From 4d3b29c7b7f41aaa1d297a1f3147f41373a8cf10 Mon Sep 17 00:00:00 2001 From: Jeremy Kersten Date: Mon, 12 Jul 2021 12:16:19 +0000 Subject: [PATCH] [IMP] web, product: reintroduce _get_placeholder_filename on model MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Re-introduce after discussion with AL the function that allow to specify a custom placeholder for a specific model. It has been removed because no more used since we use avatar mixin for res.users and res.company. But it doesn't means that each model should add his own mixin and controller and ... Keep it simple! Use it for product and product template to have a default placeholder more representative of the model. Courtesy of xlu-odoo for this design opw-2513801 closes odoo/odoo#73576 Signed-off-by: Jérémy Kersten (jke) --- addons/product/models/product.py | 6 ++++++ addons/product/models/product_template.py | 6 ++++++ addons/product/static/img/placeholder.png | Bin 0 -> 20039 bytes addons/web/controllers/main.py | 9 +++++++-- odoo/models.py | 10 ++++++++++ 5 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 addons/product/static/img/placeholder.png diff --git a/addons/product/models/product.py b/addons/product/models/product.py index 704feebb00e..6987b612f98 100644 --- a/addons/product/models/product.py +++ b/addons/product/models/product.py @@ -207,6 +207,12 @@ class ProductProduct(models.Model): for record in self: record.can_image_1024_be_zoomed = record.can_image_variant_1024_be_zoomed if record.image_variant_1920 else record.product_tmpl_id.can_image_1024_be_zoomed + def _get_placeholder_filename(self, field): + image_fields = ['image_%s' % size for size in [1920, 1024, 512, 256, 128]] + if field in image_fields: + return 'product/static/img/placeholder.png' + return super()._get_placeholder_filename(field) + def init(self): """Ensure there is at most one active variant for each combination. diff --git a/addons/product/models/product_template.py b/addons/product/models/product_template.py index 3586370cf63..d1e14b0176e 100644 --- a/addons/product/models/product_template.py +++ b/addons/product/models/product_template.py @@ -1219,6 +1219,12 @@ class ProductTemplate(models.Model): self.ensure_one() return self.env.company + def _get_placeholder_filename(self, field): + image_fields = ['image_%s' % size for size in [1920, 1024, 512, 256, 128]] + if field in image_fields: + return 'product/static/img/placeholder.png' + return super()._get_placeholder_filename(field) + def get_single_product_variant(self): """ Method used by the product configurator to check if the product is configurable or not. diff --git a/addons/product/static/img/placeholder.png b/addons/product/static/img/placeholder.png new file mode 100644 index 0000000000000000000000000000000000000000..61efef843bdaf74536a87b844500ff0a6f71bffb GIT binary patch literal 20039 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