From ebda1101e379e55a02beec27c453e63e2178af2d Mon Sep 17 00:00:00 2001 From: Sebastien LANGE Date: Wed, 11 Sep 2019 21:01:54 +0000 Subject: [PATCH] [FIX] stock: slow downs in stock move line creation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit — Create a new product, it's tracking must be set to 'By Unique Serial Number'; — Create a new purchase order, with 500 lines. Each line with 10 units of quantity of the previously created product; — Confirm the purchase. Before this commit, the creation of the stock piking take a quite some time, and becomes difficult to use this functionality. Now, the creation of the stock piking time was significantly improved. opw-2070738 closes odoo/odoo#37107 X-original-commit: a434b087c86888903e320532b5e75856fa32bd13 Signed-off-by: Jorge Pinna Puissant (jpp) --- addons/stock/models/stock_move.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/addons/stock/models/stock_move.py b/addons/stock/models/stock_move.py index fd9cd3b25f6..fdf6e37d8ca 100644 --- a/addons/stock/models/stock_move.py +++ b/addons/stock/models/stock_move.py @@ -915,6 +915,7 @@ class StockMove(models.Model): # cache invalidation when actually reserving the move. reserved_availability = {move: move.reserved_availability for move in self} roundings = {move: move.product_id.uom_id.rounding for move in self} + move_line_vals_list = [] for move in self.filtered(lambda m: m.state in ['confirmed', 'waiting', 'partially_available']): rounding = roundings[move] missing_reserved_uom_quantity = move.product_uom_qty - reserved_availability[move] @@ -924,7 +925,7 @@ class StockMove(models.Model): # create the move line(s) but do not impact quants if move.product_id.tracking == 'serial' and (move.picking_type_id.use_create_lots or move.picking_type_id.use_existing_lots): for i in range(0, int(missing_reserved_quantity)): - self.env['stock.move.line'].create(move._prepare_move_line_vals(quantity=1)) + move_line_vals_list.append(move._prepare_move_line_vals(quantity=1)) else: to_update = move.move_line_ids.filtered(lambda ml: ml.product_uom_id == move.product_uom and ml.location_id == move.location_id and @@ -936,7 +937,7 @@ class StockMove(models.Model): if to_update: to_update[0].product_uom_qty += missing_reserved_uom_quantity else: - self.env['stock.move.line'].create(move._prepare_move_line_vals(quantity=missing_reserved_quantity)) + move_line_vals_list.append(move._prepare_move_line_vals(quantity=missing_reserved_quantity)) assigned_moves |= move else: if not move.move_orig_ids: @@ -1027,6 +1028,7 @@ class StockMove(models.Model): assigned_moves |= move break partially_available_moves |= move + self.env['stock.move.line'].create(move_line_vals_list) partially_available_moves.write({'state': 'partially_available'}) assigned_moves.write({'state': 'assigned'}) self.mapped('picking_id')._check_entire_pack()