Product Images on Sale Order Lines
Uniform thumbnails on the backend sale-order form, the customer portal, and the generated quote / sale PDF — miniaturas uniformes en pedido, portal y PDF.
Overview
Salespeople and customers should not stare at lists of bare
product names. This module adds a 48×48 px product thumbnail to
every sale.order.line in three places at
once: the backend sale-order form, the customer portal
order view (/my/orders/<id>), and the
generated quote / sale PDF (Pro-Forma included). Three
independent per-company switches in
Sales → Configuration → Settings → Quotations & Orders
— one per surface — let you turn images on or off on each
surface independently. All three default to ON at install.
Key features
🖼️ Three surfaces, three toggles
Backend column, portal cell, and PDF report each have their own per-company switch. Turn images on/off independently for each surface; Pro-Forma rides on the PDF toggle.
🏢 Per-company, multi-company-safe
The flag lives on res.company. Each sale order
respects its own company's setting, not the
operator's.
🎨 Uniform 48×48 px thumbnails
Every product line looks the same shape and size regardless of source image dimensions, aspect ratio or transparency.
🪄 PDF bullet-proof
Sources are pre-rendered onto a white canvas, so wkhtmltopdf's transparent-PNG-to-black bug cannot reach the output.
📐 Aligned with or without images
Image-less products keep their 48-px slot. Product names line up vertically across all rows.
🧬 PNG, JPEG, GIF, WebP, SVG
Every common source format works. SVG is rasterised via the
system magick CLI when present (graceful fallback
otherwise).
See it in action
/my/orders/<id> renders the same thumbnail
next to each product line. Image-less products keep their
slot so names stay vertically aligned.
How it works
| Switch location | Sales → Configuration → Settings → Quotations & Orders — three separate company_dependent settings: Product Image on Backend Order Lines, … on Customer Portal, … on Quote / Sale PDF. All default ON. |
| Backend list | New Image column on the embedded order_line list, sitting right after the line description. Hides when show_sol_image_backend is off; users can also hide it individually via the column gear menu. |
| Portal page | Inherits sale.sale_order_portal_content. Inline thumbnail next to the product name; reserves the same width on image-less lines so names align across all rows. |
| PDF report | Inherits sale.report_saleorder_document. Same media-object layout, white-background-baked thumbnails for reliable wkhtmltopdf rendering. |
| Compute | Stored Image on product.product, triggered by writes to image_variant_1920 or the template's image_1920. Each variant pays the cost once. |
Quick start
- Install the module.
- Upload an image to each product (Inventory → Products → open a product → image area). The thumbnail builds in the background.
- Open any sale order — the image column appears next to the product name on every line.
- Open the customer-portal link, or print the quote PDF — the same thumbnail appears.
- To hide everywhere: Sales → Configuration → Settings → Product Images on Order Lines → off → Save.
Compatibility & requirements
- Odoo 19.0, Community or Enterprise.
- Theme-agnostic — overrides target upstream
sale+portaltemplates only. - Pillow (ships with Odoo).
- Optional: ImageMagick (
magickon PATH) for SVG product images. Without it, SVG uploads fall through to the placeholder branch and a one-line warning is logged. Raster formats keep working.
Tested
Ten automated tests cover: settings round-trip; related field on the order line; canvas compositing for PNG, JPEG, RGBA, WebP and SVG sources; recompute-on-image-change; landscape-source letterboxing; missing-image fallback; and the default-true per-company flag at install time.
Resumen
Agrega una miniatura de 48×48 px del producto a cada
sale.order.line en tres lugares al mismo
tiempo: el formulario de pedido en el backend, la
página del pedido en el portal del cliente
(/my/orders/<id>) y el PDF generado del
presupuesto / pedido (incluyendo el Pro-Forma).
Tres interruptores independientes por compañía
en Ventas → Configuración → Ajustes → Quotations &
Orders — uno por superficie — te dejan activar o desactivar
la imagen en cada lugar por separado. Los tres vienen activados
al instalar.
Características clave
🖼️ Tres superficies, tres interruptores
La columna del backend, la celda del portal y el reporte PDF tienen cada uno su propio interruptor por compañía. Se activan o desactivan por separado. El Pro-Forma usa el mismo interruptor que el PDF.
🏢 Por compañía
Los ajustes viven en res.company. Cada pedido
respeta la configuración de su propia compañía, no la del
usuario que lo abre.
🎨 Miniaturas uniformes 48×48
Siempre la misma forma y el mismo tamaño, sin importar el tamaño / la proporción / la transparencia de la imagen original.
🪄 PDF a prueba de balas
El origen se prerrenderiza sobre fondo blanco, así el bug de wkhtmltopdf con PNG transparentes (alpha negro) no llega al PDF.
📐 Alineado con o sin imagen
Los productos sin imagen mantienen un hueco de 48 px. Los nombres quedan alineados verticalmente en todas las filas, no bailan según haya o no foto.
🧬 PNG, JPEG, GIF, WebP, SVG
Todos los formatos comunes. El SVG se rasteriza con el CLI
de magick cuando está disponible; si no, cae a
placeholder sin romper nada.
Para empezar
- Instalá el módulo.
- Subí una imagen a cada producto desde Inventario → Productos → abrir el producto → área de imagen.
- Abrí cualquier pedido de venta: la columna de imagen aparece al lado del nombre del producto.
- Abrí el enlace del portal o imprimí el PDF — la misma miniatura aparece en los dos.
- ¿Querés esconder alguna superficie? Andá a Ventas → Configuración → Ajustes → Quotations & Orders, apagá el interruptor que corresponda y guardá.
Compatibilidad y requisitos
- Odoo 19.0, Community o Enterprise.
- No depende de ningún tema: las plantillas que se modifican
son las de
saleyportalupstream. - Pillow (ya viene con Odoo).
- Opcional: ImageMagick (
magicken el PATH) para imágenes SVG. Si no está instalado, los SVG caen a placeholder con un warning en el log; los formatos raster siguen funcionando normal.
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Sales (sale_management)
• Invoicing (account) • Discuss (mail) |
| Lines of code | 214 |
| Technical Name |
mp_sale_order_line_image |
| License | OPL-1 |
| Website | https://micoraplus.com |
Odoo Proprietary License v1.0 This software and associated files (the "Software") may only be used (executed, modified, executed after modifications) if you have purchased a valid license from the authors, typically via Odoo Apps, or if you have received a written agreement from the authors of the Software (see the COPYRIGHT file). You may develop Odoo modules that use the Software as a library (typically by depending on it, importing it and using its resources), but without copying any source code or material from the Software. You may distribute those modules under the license of your choice, provided that this license is compatible with the terms of the Odoo Proprietary License (For example: LGPL, MIT, or proprietary licenses similar to this one). It is forbidden to publish, distribute, sublicense, or sell copies of the Software or modified copies of the Software. The above copyright notice and this permission notice must be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Please log in to comment on this module