diff options
| author | parp-odoo <parp@odoo.com> | 2025-01-28 12:05:14 +0530 |
|---|---|---|
| committer | parp-odoo <parp@odoo.com> | 2025-02-03 16:10:41 +0000 |
| commit | d7d3ed847f147dac23264e91b5d802cd67be6860 (patch) | |
| tree | eb2616b9083f64c9dfe8b68eda6c1f98fef6fa1a | |
| parent | 1d20927b64630f651e3fed5da2d8181dde260e23 (diff) | |
[FIX] pos, pos_self_order: prevent loading empty categories
Before this commit:
- All POS categories were being loaded, even if they had no associated products.
After this commit:
- Only categories linked to products are loaded.
Task-4517979
closes odoo/odoo#195377
Signed-off-by: Vlad Stroia (vlst) <vlst@odoo.com>
| -rw-r--r-- | addons/point_of_sale/models/pos_category.py | 10 | ||||
| -rw-r--r-- | addons/point_of_sale/models/pos_session.py | 2 | ||||
| -rw-r--r-- | addons/point_of_sale/static/tests/tours/product_screen_tour.js | 3 | ||||
| -rw-r--r-- | addons/point_of_sale/tests/test_frontend.py | 13 | ||||
| -rw-r--r-- | addons/pos_self_order/models/pos_config.py | 2 |
5 files changed, 22 insertions, 8 deletions
diff --git a/addons/point_of_sale/models/pos_category.py b/addons/point_of_sale/models/pos_category.py index 17e0abb38d4..11e81e19f01 100644 --- a/addons/point_of_sale/models/pos_category.py +++ b/addons/point_of_sale/models/pos_category.py @@ -36,8 +36,14 @@ class PosCategory(models.Model): @api.model def _load_pos_data_domain(self, data): config_id = self.env['pos.config'].browse(data['pos.config']['data'][0]['id']) - domain = [('id', 'in', config_id._get_available_categories().ids)] if config_id.limit_categories and config_id.iface_available_categ_ids else [] - return domain + # Load categories according to loaded products + product_catg_ids = [] + for product in data['product.product']['data']: + product_catg_ids += product['pos_categ_ids'] + if config_id.limit_categories and config_id.iface_available_categ_ids: + category_ids = config_id._get_available_categories().ids + product_catg_ids = list(set(product_catg_ids) & set(category_ids)) + return [('id', 'in', product_catg_ids)] @api.model def _load_pos_data_fields(self, config_id): diff --git a/addons/point_of_sale/models/pos_session.py b/addons/point_of_sale/models/pos_session.py index 02143d54387..9effd6d233d 100644 --- a/addons/point_of_sale/models/pos_session.py +++ b/addons/point_of_sale/models/pos_session.py @@ -131,7 +131,7 @@ class PosSession(models.Model): @api.model def _load_pos_data_models(self, config_id): return ['pos.config', 'pos.order', 'pos.order.line', 'pos.pack.operation.lot', 'pos.payment', 'pos.payment.method', 'pos.printer', - 'pos.category', 'pos.bill', 'res.company', 'account.tax', 'account.tax.group', 'product.product', 'product.attribute', 'product.attribute.custom.value', + 'pos.bill', 'res.company', 'account.tax', 'account.tax.group', 'product.product', 'pos.category', 'product.attribute', 'product.attribute.custom.value', 'product.template.attribute.line', 'product.template.attribute.value', 'product.combo', 'product.combo.item', 'product.packaging', 'res.users', 'res.partner', 'decimal.precision', 'uom.uom', 'uom.category', 'res.country', 'res.country.state', 'res.lang', 'product.pricelist', 'product.pricelist.item', 'product.category', 'account.cash.rounding', 'account.fiscal.position', 'account.fiscal.position.tax', 'stock.picking.type', 'res.currency', 'pos.note', 'ir.ui.view', 'product.tag', 'ir.module.module'] diff --git a/addons/point_of_sale/static/tests/tours/product_screen_tour.js b/addons/point_of_sale/static/tests/tours/product_screen_tour.js index bef34621510..e12aae3745e 100644 --- a/addons/point_of_sale/static/tests/tours/product_screen_tour.js +++ b/addons/point_of_sale/static/tests/tours/product_screen_tour.js @@ -432,6 +432,9 @@ registry.category("web_tour.tours").add("PosCategoriesOrder", { { trigger: '.category-button:eq(3) > span:contains("AAY")', }, + { + trigger: '.category-button:not(:contains("AAD"))', + }, ].flat(), }); diff --git a/addons/point_of_sale/tests/test_frontend.py b/addons/point_of_sale/tests/test_frontend.py index 9810bc09f8d..e87a5bf8f6d 100644 --- a/addons/point_of_sale/tests/test_frontend.py +++ b/addons/point_of_sale/tests/test_frontend.py @@ -1504,16 +1504,21 @@ class TestUi(TestPointOfSaleHttpCommon): def test_product_categories_order(self): """ Verify that the order of categories doesnt change in the frontend """ self.env['pos.category'].search([]).write({'sequence': 100}) - self.env['pos.category'].create({ + catgA = self.env['pos.category'].create({ 'name': 'AAA', 'parent_id': False, 'sequence': 1, }) - self.env['pos.category'].create({ + catgB = self.env['pos.category'].create({ 'name': 'AAC', 'parent_id': False, 'sequence': 3, }) + self.env['pos.category'].create({ + 'name': 'AAD', + 'parent_id': False, + 'sequence': 4, + }) parentA = self.env['pos.category'].create({ 'name': 'AAB', 'parent_id': False, @@ -1523,7 +1528,7 @@ class TestUi(TestPointOfSaleHttpCommon): 'name': 'AAX', 'parent_id': parentA.id, }) - self.env['pos.category'].create({ + catgC = self.env['pos.category'].create({ 'name': 'AAY', 'parent_id': parentB.id, }) @@ -1531,7 +1536,7 @@ class TestUi(TestPointOfSaleHttpCommon): # It's presence is checked during the tour to make sure app doesn't crash. self.env['product.product'].create({ 'name': 'Product in AAB and AAX', - 'pos_categ_ids': [(6, 0, [parentA.id, parentB.id])], + 'pos_categ_ids': [(6, 0, [parentA.id, parentB.id, catgA.id, catgB.id, catgC.id])], 'available_in_pos': True, }) self.main_pos_config.with_user(self.pos_admin).open_ui() diff --git a/addons/pos_self_order/models/pos_config.py b/addons/pos_self_order/models/pos_config.py index 7055d46fd2d..410e0b51ab0 100644 --- a/addons/pos_self_order/models/pos_config.py +++ b/addons/pos_self_order/models/pos_config.py @@ -257,7 +257,7 @@ class PosConfig(models.Model): return encoded_images def _load_self_data_models(self): - return ['pos.session', 'pos.order', 'pos.order.line', 'pos.payment', 'pos.payment.method', 'res.currency', 'pos.category', 'product.product', 'product.combo', 'product.combo.item', + return ['pos.session', 'pos.order', 'pos.order.line', 'pos.payment', 'pos.payment.method', 'res.currency', 'product.product', 'pos.category', 'product.combo', 'product.combo.item', 'res.company', 'account.tax', 'account.tax.group', 'pos.printer', 'res.country', 'product.pricelist', 'product.pricelist.item', 'account.fiscal.position', 'account.fiscal.position.tax', 'res.lang', 'product.attribute', 'product.attribute.custom.value', 'product.template.attribute.line', 'product.template.attribute.value', 'decimal.precision', 'uom.uom', 'pos.printer', 'pos_self_order.custom_link', 'restaurant.floor', 'restaurant.table', 'account.cash.rounding'] |
