summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorparp-odoo <parp@odoo.com>2025-01-28 12:05:14 +0530
committerparp-odoo <parp@odoo.com>2025-02-03 16:10:41 +0000
commitd7d3ed847f147dac23264e91b5d802cd67be6860 (patch)
treeeb2616b9083f64c9dfe8b68eda6c1f98fef6fa1a
parent1d20927b64630f651e3fed5da2d8181dde260e23 (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.py10
-rw-r--r--addons/point_of_sale/models/pos_session.py2
-rw-r--r--addons/point_of_sale/static/tests/tours/product_screen_tour.js3
-rw-r--r--addons/point_of_sale/tests/test_frontend.py13
-rw-r--r--addons/pos_self_order/models/pos_config.py2
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']