diff --git a/addons/product/report/product_label_report.py b/addons/product/report/product_label_report.py index 6a934f2d4f8..a3fd37e68ed 100644 --- a/addons/product/report/product_label_report.py +++ b/addons/product/report/product_label_report.py @@ -6,16 +6,31 @@ from collections import defaultdict from odoo import _, models from odoo.exceptions import UserError -def _prepare_data(env, data): + +def _prepare_data(env, docids, 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': Product = env['product.template'].with_context(display_default_code=False) elif data.get('active_model') == 'product.product': Product = env['product.product'].with_context(display_default_code=False) + elif data.get("studio") and docids: + # special case: users trying to customize labels + products = env['product.template'].with_context(display_default_code=False).browse(docids) + quantity_by_product = defaultdict(list) + for product in products: + quantity_by_product[product].append((product.barcode, 1)) + return { + 'quantity': quantity_by_product, + 'page_numbers': 1, + } else: raise UserError(_('Product model not defined, Please contact your administrator.')) + layout_wizard = env['product.label.layout'].browse(data.get('layout_wizard')) + if not layout_wizard: + return {} + total = 0 qty_by_product_in = data.get('quantity_by_product') # search for products all at once, ordered by name desc since popitem() used in xml to print the labels @@ -32,30 +47,50 @@ def _prepare_data(env, data): 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 {} - return { 'quantity': quantity_by_product, - 'rows': layout_wizard.rows, - 'columns': layout_wizard.columns, 'page_numbers': (total - 1) // (layout_wizard.rows * layout_wizard.columns) + 1, 'price_included': data.get('price_included'), 'extra_html': layout_wizard.extra_html, 'pricelist': layout_wizard.pricelist_id, } -class ReportProductTemplateLabel(models.AbstractModel): - _name = 'report.product.report_producttemplatelabel' - _description = 'Product Label Report' + +class ReportProductTemplateLabel2x7(models.AbstractModel): + _name = 'report.product.report_producttemplatelabel2x7' + _description = 'Product Label Report 2x7' def _get_report_values(self, docids, data): - return _prepare_data(self.env, data) + return _prepare_data(self.env, docids, data) + + +class ReportProductTemplateLabel4x7(models.AbstractModel): + _name = 'report.product.report_producttemplatelabel4x7' + _description = 'Product Label Report 4x7' + + def _get_report_values(self, docids, data): + return _prepare_data(self.env, docids, data) + + +class ReportProductTemplateLabel4x12(models.AbstractModel): + _name = 'report.product.report_producttemplatelabel4x12' + _description = 'Product Label Report 4x12' + + def _get_report_values(self, docids, data): + return _prepare_data(self.env, docids, data) + + +class ReportProductTemplateLabel4x12NoPrice(models.AbstractModel): + _name = 'report.product.report_producttemplatelabel4x12noprice' + _description = 'Product Label Report 4x12 No Price' + + def _get_report_values(self, docids, data): + return _prepare_data(self.env, docids, data) + class ReportProductTemplateLabelDymo(models.AbstractModel): _name = 'report.product.report_producttemplatelabel_dymo' _description = 'Product Label Report' def _get_report_values(self, docids, data): - return _prepare_data(self.env, data) + return _prepare_data(self.env, docids, data) diff --git a/addons/product/report/product_product_templates.xml b/addons/product/report/product_product_templates.xml index 4268b451dcf..8dfbee01fe9 100644 --- a/addons/product/report/product_product_templates.xml +++ b/addons/product/report/product_product_templates.xml @@ -61,20 +61,34 @@