From f329de26eb78b8c4783edf6c8207f8a11c9073cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Voet=20=28ryv=29?= Date: Wed, 2 Jun 2021 12:50:58 +0000 Subject: [PATCH] [FIX] stock/mrp_landed_cost: fix domain no scalable. Making a dynamic domain with a `allowed_xxx_ids` field is a bad idea when the domain doesn't filter out the most of records. It can create a performance issue, if the `allowed_xxx_ids` contains too much ids (for 70K by example), then a lot of data will be exchange to/from server for each onchange (500Ko, > 1 sec) which slows down all the form views. Change it into a static domain, which slows down a little the search of the picking but the onchange becomes very fast. Also the JS won't parse anymore a huge `allowed_xxx_ids` fields (the form becomes smoother). task-2558097 --- .../mrp_landed_costs/models/stock_landed_cost.py | 12 ------------ .../tests/test_stock_landed_costs_mrp.py | 6 ++++-- .../views/stock_landed_cost_views.xml | 5 ++--- .../models/stock_landed_cost.py | 15 --------------- .../views/stock_landed_cost_views.xml | 5 +++-- 5 files changed, 9 insertions(+), 34 deletions(-) diff --git a/addons/mrp_landed_costs/models/stock_landed_cost.py b/addons/mrp_landed_costs/models/stock_landed_cost.py index 5d991f8c788..e6410269d78 100644 --- a/addons/mrp_landed_costs/models/stock_landed_cost.py +++ b/addons/mrp_landed_costs/models/stock_landed_cost.py @@ -13,18 +13,6 @@ class StockLandedCost(models.Model): mrp_production_ids = fields.Many2many( 'mrp.production', string='Manufacturing order', copy=False, states={'done': [('readonly', True)]}, groups='mrp.group_mrp_user') - allowed_mrp_production_ids = fields.Many2many( - 'mrp.production', compute='_compute_allowed_mrp_production_ids', groups='mrp.group_mrp_user') - - @api.depends('company_id') - def _compute_allowed_mrp_production_ids(self): - for cost in self: - moves = self.env['stock.move'].search([ - ('stock_valuation_layer_ids', '!=', False), - ('production_id', '!=', False), - ('company_id', '=', cost.company_id.id) - ]) - self.allowed_mrp_production_ids = moves.production_id @api.onchange('target_model') def _onchange_target_model(self): diff --git a/addons/mrp_landed_costs/tests/test_stock_landed_costs_mrp.py b/addons/mrp_landed_costs/tests/test_stock_landed_costs_mrp.py index 74c13d229c0..a81a89cbf0c 100644 --- a/addons/mrp_landed_costs/tests/test_stock_landed_costs_mrp.py +++ b/addons/mrp_landed_costs/tests/test_stock_landed_costs_mrp.py @@ -121,10 +121,12 @@ class TestStockLandedCostsMrp(ValuationReconciliationTestCommon): landed_cost = Form(self.env['stock.landed.cost'].with_user(self.allow_user)).save() landed_cost.target_model = 'manufacturing' - self.assertTrue(man_order.id in landed_cost.allowed_mrp_production_ids.ids) + # Check domain of the views + self.assertTrue(man_order in self.env['mrp.production'].search([ + ('move_finished_ids.stock_valuation_layer_ids', '!=', False), ('company_id', '=', landed_cost.company_id.id)])) + landed_cost.mrp_production_ids = [(6, 0, [man_order.id])] landed_cost.cost_lines = [(0, 0, {'product_id': self.landed_cost.id, 'price_unit': 5.0, 'split_method': 'equal'})] - landed_cost.button_validate() self.assertEqual(landed_cost.state, 'done') diff --git a/addons/mrp_landed_costs/views/stock_landed_cost_views.xml b/addons/mrp_landed_costs/views/stock_landed_cost_views.xml index 34f188abacc..c70749af799 100644 --- a/addons/mrp_landed_costs/views/stock_landed_cost_views.xml +++ b/addons/mrp_landed_costs/views/stock_landed_cost_views.xml @@ -10,11 +10,10 @@ mrp.group_mrp_user - + attrs="{'invisible': [('target_model', '!=', 'manufacturing')]}" + domain="[('company_id', '=', company_id), ('move_finished_ids.stock_valuation_layer_ids', '!=', False)]"/> diff --git a/addons/stock_landed_costs/models/stock_landed_cost.py b/addons/stock_landed_costs/models/stock_landed_cost.py index b12861e6f76..06e1437253a 100644 --- a/addons/stock_landed_costs/models/stock_landed_cost.py +++ b/addons/stock_landed_costs/models/stock_landed_cost.py @@ -44,7 +44,6 @@ class StockLandedCost(models.Model): picking_ids = fields.Many2many( 'stock.picking', string='Transfers', copy=False, states={'done': [('readonly', True)]}) - allowed_picking_ids = fields.Many2many('stock.picking', compute='_compute_allowed_picking_ids') cost_lines = fields.One2many( 'stock.landed.cost.lines', 'cost_id', 'Cost Lines', copy=True, states={'done': [('readonly', True)]}) @@ -79,20 +78,6 @@ class StockLandedCost(models.Model): for cost in self: cost.amount_total = sum(line.price_unit for line in cost.cost_lines) - @api.depends('company_id') - def _compute_allowed_picking_ids(self): - valued_picking_ids_per_company = defaultdict(list) - if self.company_id: - self.env.cr.execute("""SELECT sm.picking_id, sm.company_id - FROM stock_move AS sm - INNER JOIN stock_valuation_layer AS svl ON svl.stock_move_id = sm.id - WHERE sm.picking_id IS NOT NULL AND sm.company_id IN %s - GROUP BY sm.picking_id, sm.company_id""", [tuple(self.company_id.ids)]) - for res in self.env.cr.fetchall(): - valued_picking_ids_per_company[res[1]].append(res[0]) - for cost in self: - cost.allowed_picking_ids = valued_picking_ids_per_company[cost.company_id.id] - @api.onchange('target_model') def _onchange_target_model(self): if self.target_model != 'picking': diff --git a/addons/stock_landed_costs/views/stock_landed_cost_views.xml b/addons/stock_landed_costs/views/stock_landed_cost_views.xml index fce7378fef2..a86da51a2c8 100644 --- a/addons/stock_landed_costs/views/stock_landed_cost_views.xml +++ b/addons/stock_landed_costs/views/stock_landed_cost_views.xml @@ -29,9 +29,10 @@ - - +