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 @@
- -
- + +
+
@@ -52,9 +52,9 @@
- -
- + +
+
@@ -88,9 +88,9 @@
- -
- + +
+
@@ -101,9 +101,12 @@
- + -
+
+
+ +
@@ -151,12 +154,19 @@ - + + + + + + + + @@ -177,10 +187,13 @@ - - - - + + + + + + + diff --git a/addons/stock/report/product_label_report.py b/addons/stock/report/product_label_report.py index e0444e16935..fd3c8a32f6b 100644 --- a/addons/stock/report/product_label_report.py +++ b/addons/stock/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 @@ -11,10 +13,20 @@ class ReportProductLabel(models.AbstractModel): def _get_report_values(self, docids, data): if data.get('active_model') == 'product.template': - data['quantity'] = {self.env['product.template'].browse(int(p)): q for p, q in data.get('quantity_by_product').items()} + Product = self.env['product.template'] elif data.get('active_model') == 'product.product': - data['quantity'] = {self.env['product.product'].browse(int(p)): q for p, q in data.get('quantity_by_product').items()} + Product = self.env['product.product'] else: raise UserError(_('Product model not defined, Please contact your administrator.')) + 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)) + 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) + data['quantity'] = quantity_by_product + return data diff --git a/addons/stock/report/product_templates.xml b/addons/stock/report/product_templates.xml index c5f9686f202..e13e09a7c32 100644 --- a/addons/stock/report/product_templates.xml +++ b/addons/stock/report/product_templates.xml @@ -2,10 +2,12 @@