changeset 92eff0a2b078 in modules/sale_supply:default
details: 
https://hg.tryton.org/modules/sale_supply?cmd=changeset&node=92eff0a2b078
description:
        Split process method to avoid create/write in loop

        issue10801
        review372071002
diffstat:

 sale.py |  43 ++++++++++++++++++++++++++-----------------
 1 files changed, 26 insertions(+), 17 deletions(-)

diffs (78 lines):

diff -r 8bd30f669360 -r 92eff0a2b078 sale.py
--- a/sale.py   Sun Jul 04 17:54:48 2021 +0200
+++ b/sale.py   Fri Oct 08 19:21:06 2021 +0200
@@ -17,22 +17,35 @@
                 return False
         return done
 
-    def create_shipment(self, shipment_type):
-        if shipment_type == 'out':
+    @classmethod
+    def _process_shipment(cls, sales):
+        pool = Pool()
+        Line = pool.get('sale.line')
+        Move = pool.get('stock.move')
+        PurchaseRequest = pool.get('purchase.request')
+        ShipmentOut = pool.get('stock.shipment.out')
+
+        requests, lines = [], []
+        moves_to_draft, shipments_to_wait = [], []
+        for sale in sales:
             # purchase requests must be created before shipments to get
             # information about requests during the shipments creation
             # like the supplier
-            self.create_purchase_requests()
-            self.create_move_from_supply()
-        shipments = super(Sale, self).create_shipment(shipment_type)
-        return shipments
+            reqs, lns = sale.create_purchase_requests()
+            requests.extend(reqs)
+            lines.extend(lns)
+
+            moves, shipments = sale.create_move_from_supply()
+            moves_to_draft.extend(moves)
+            shipments_to_wait.extend(shipments)
+        PurchaseRequest.save(requests)
+        Line.save(lines)
+        Move.draft(moves_to_draft)
+        ShipmentOut.wait(shipments_to_wait)
+        super()._process_shipment(sales)
 
     def create_purchase_requests(self):
-        pool = Pool()
-        PurchaseRequest = pool.get('purchase.request')
-        Line = pool.get('sale.line')
-        requests = []
-        lines = []
+        requests, lines = [], []
         for line in self.lines:
             request = line.get_purchase_request()
             if not request:
@@ -41,25 +54,21 @@
             assert not line.purchase_request
             line.purchase_request = request
             lines.append(line)
-        PurchaseRequest.save(requests)
-        Line.save(lines)
+        return requests, lines
 
     def create_move_from_supply(self):
         'Set to draft move linked to supply'
         pool = Pool()
-        Move = pool.get('stock.move')
         ShipmentOut = pool.get('stock.shipment.out')
-
         moves = []
         for line in self.lines:
             if line.supply_state in {'supplied', 'cancelled'}:
                 for move in line.moves:
                     if move.state == 'staging':
                         moves.append(move)
-        Move.draft(moves)
         shipments = {m.shipment for m in moves
             if isinstance(m.shipment, ShipmentOut)}
-        ShipmentOut.wait(shipments)
+        return moves, shipments
 
 
 class Line(metaclass=PoolMeta):

Reply via email to