[FIX] stock: performance with 2000 serial numbers
It takes 70s to generate a receipt with 2000 serial numbers. It happens because during the first part of the loop (model `stock.move.line` in the `create` method). It will update the initial demand of the move based on the new stock.move.line and their qty_done. Writing the initial demand of the `stock.move` will try to reassign it (useless in our case) and rewrite the same value on its state's field. The consequence is the invalidation of the field on the `stock.move.line` because it's a related to the `stock.move`. In the second part of the loop, it check the sml state. Since it was invalidate upper, it recompute it. That prevent a correct prefetch and cause a performance issue. We fix it by writing only once the information by move. And it prevent the recompute later since the state is not write during the loop. closes odoo/odoo#122651 X-original-commit: 9dbc374fb89550444fc6f1c9445cb57067af214c Signed-off-by: William Henrotin (whe) <whe@odoo.com>
This commit is contained in:
committed by
William Henrotin
parent
e2533a85e8
commit
25e7fa44f8
@@ -343,16 +343,20 @@ class StockMoveLine(models.Model):
|
||||
reserved_uom_qty = product.uom_id._compute_quantity(reserved_qty, ml_uom, rounding_method='HALF-UP')
|
||||
move_line.with_context(bypass_reservation=True).reserved_uom_qty = reserved_uom_qty
|
||||
|
||||
moves_to_update = mls.filtered(
|
||||
lambda ml:
|
||||
ml.move_id and
|
||||
ml.qty_done and (
|
||||
ml.move_id.state == 'done' or (
|
||||
ml.move_id.picking_id and
|
||||
ml.move_id.picking_id.immediate_transfer
|
||||
))
|
||||
).move_id
|
||||
for move in moves_to_update:
|
||||
move.with_context(avoid_putaway_rules=True).product_uom_qty = move.quantity_done
|
||||
|
||||
for ml, vals in zip(mls, vals_list):
|
||||
if ml.move_id and \
|
||||
ml.move_id.picking_id and \
|
||||
ml.move_id.picking_id.immediate_transfer and \
|
||||
ml.move_id.state != 'done' and \
|
||||
'qty_done' in vals:
|
||||
ml.move_id.with_context(avoid_putaway_rules=True).product_uom_qty = ml.move_id.quantity_done
|
||||
if ml.state == 'done':
|
||||
if 'qty_done' in vals:
|
||||
ml.move_id.product_uom_qty = ml.move_id.quantity_done
|
||||
if ml.product_id.type == 'product' and not self.env.context.get('bypass_reservation_update'):
|
||||
Quant = self.env['stock.quant']
|
||||
quantity = ml.product_uom_id._compute_quantity(ml.qty_done, ml.move_id.product_id.uom_id,rounding_method='HALF-UP')
|
||||
|
||||
Reference in New Issue
Block a user