From 531cb95e87438842e41a63d997f7d4792041187d Mon Sep 17 00:00:00 2001 From: roen-odoo Date: Mon, 5 Feb 2024 10:15:33 +0000 Subject: [PATCH] [FIX] stock: fix text product label reports with special characters Current behavior: When printing products ZPL Labels, special characters are not printed correctly. e.g. quotes become ' Steps to reproduce: - Modify a product name with special characters - Print a product label - Select ZPL Labels As the report is only rendered as text, the special characters are not dangerous and can be printed as is. opw-3684870 closes odoo/odoo#156624 X-original-commit: 7875c91be5dd467374b39bc1a7d05e9f983fbaef Signed-off-by: Quentin Wolfs (quwo) --- addons/stock/report/product_label_report.py | 39 +++++++++++++++- addons/stock/report/product_templates.xml | 33 +++++++------ addons/stock/tests/test_report.py | 52 +++++++++++++++++---- 3 files changed, 95 insertions(+), 29 deletions(-) diff --git a/addons/stock/report/product_label_report.py b/addons/stock/report/product_label_report.py index e6e876e09c5..42c42449b15 100644 --- a/addons/stock/report/product_label_report.py +++ b/addons/stock/report/product_label_report.py @@ -6,6 +6,7 @@ from collections import defaultdict from odoo import _, models from odoo.exceptions import UserError +import markupsafe class ReportProductLabel(models.AbstractModel): _name = 'report.stock.label_product_product_view' @@ -22,13 +23,47 @@ class ReportProductLabel(models.AbstractModel): quantity_by_product = defaultdict(list) for p, q in data.get('quantity_by_product').items(): product = Product.browse(int(p)) - quantity_by_product[product].append((product.barcode, q)) + default_code_markup = markupsafe.Markup(product.default_code) if product.default_code else '' + product_info = { + 'barcode': markupsafe.Markup(product.barcode), + 'quantity': q, + 'display_name_markup': markupsafe.Markup(product.display_name), + 'default_code': (default_code_markup[:15], default_code_markup[15:30]) + } + quantity_by_product[product].append(product_info) if data.get('custom_barcodes'): # we expect custom barcodes to be: {product: [(barcode, qty_of_barcode)]} for product, barcodes_qtys in data.get('custom_barcodes').items(): - quantity_by_product[Product.browse(int(product))] += (barcodes_qtys) + product = Product.browse(int(product)) + default_code_markup = markupsafe.Markup(product.default_code) if product.default_code else '' + for barcode_qty in barcodes_qtys: + quantity_by_product[product].append({ + 'barcode': markupsafe.Markup(barcode_qty[0]), + 'quantity': barcode_qty[1], + 'display_name_markup': markupsafe.Markup(product.display_name), + 'default_code': (default_code_markup[:15], default_code_markup[15:30]) + } + ) data['quantity'] = quantity_by_product layout_wizard = self.env['product.label.layout'].browse(data.get('layout_wizard')) data['pricelist'] = layout_wizard.pricelist_id return data + + +class ReportLotLabel(models.AbstractModel): + _name = 'report.stock.label_lot_template_view' + _description = 'Lot Label Report' + + def _get_report_values(self, docids, data): + lots = self.env['stock.lot'].browse(docids) + lot_list = [] + for lot in lots: + lot_list.append({ + 'display_name_markup': markupsafe.Markup(lot.product_id.display_name), + 'name': markupsafe.Markup(lot.name), + 'lot_record': lot + }) + return { + 'docs': lot_list, + } diff --git a/addons/stock/report/product_templates.xml b/addons/stock/report/product_templates.xml index 2aed1f80402..77c9830819e 100644 --- a/addons/stock/report/product_templates.xml +++ b/addons/stock/report/product_templates.xml @@ -4,23 +4,22 @@