diff --git a/addons/product/report/product_label_report.py b/addons/product/report/product_label_report.py index 7ee922fa1e9..35c9eb5b4e7 100644 --- a/addons/product/report/product_label_report.py +++ b/addons/product/report/product_label_report.py @@ -1,6 +1,8 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. +from collections import defaultdict + from odoo import _, models from odoo.exceptions import UserError @@ -8,11 +10,24 @@ def _prepare_data(env, data): # change product ids by actual product object to get access to fields in xml template # we needed to pass ids because reports only accepts native python types (int, float, strings, ...) if data.get('active_model') == 'product.template': - quantity_by_product = {env['product.template'].with_context(display_default_code=False).browse(int(p)): q for p, q in data.get('quantity_by_product').items()} + Product = env['product.template'].with_context(display_default_code=False) elif data.get('active_model') == 'product.product': - quantity_by_product = {env['product.product'].with_context(display_default_code=False).browse(int(p)): q for p, q in data.get('quantity_by_product').items()} + Product = env['product.product'].with_context(display_default_code=False) else: raise UserError(_('Product model not defined, Please contact your administrator.')) + + total = 0 + 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)) + total += q + if data.get('custom_barcodes'): + # we expect custom barcodes format as: {product: [(barcode, qty_of_barcode)]} + for product, barcodes_qtys in data.get('custom_barcodes').items(): + quantity_by_product[Product.browse(int(product))] += (barcodes_qtys) + total += sum(qty for _, qty in barcodes_qtys) + layout_wizard = env['product.label.layout'].browse(data.get('layout_wizard')) if not layout_wizard: return {} @@ -21,7 +36,7 @@ def _prepare_data(env, data): 'quantity': quantity_by_product, 'rows': layout_wizard.rows, 'columns': layout_wizard.columns, - 'page_numbers': (sum(quantity_by_product.values()) - 1) // (layout_wizard.rows * layout_wizard.columns) + 1, + 'page_numbers': (total - 1) // (layout_wizard.rows * layout_wizard.columns) + 1, 'price_included': data.get('price_included'), 'extra_html': layout_wizard.extra_html, } diff --git a/addons/product/report/product_product_templates.xml b/addons/product/report/product_product_templates.xml index 749f879e14a..c6482f3398f 100644 --- a/addons/product/report/product_product_templates.xml +++ b/addons/product/report/product_product_templates.xml @@ -12,9 +12,9 @@