changeset 2f9e92d60164 in modules/sale_supply_drop_shipment:5.0
details: 
https://hg.tryton.org/modules/sale_supply_drop_shipment?cmd=changeset;node=2f9e92d60164
description:
        Do not rely on unique link between request and purchase or sale lines

        The purchase request can be grouped into a single purchase lines.
        And nothing prevent a custom module to merge request between different 
sale lines.

        issue9075
        review315271002
        (grafted from 2de777c46af5198c2ad1e40c0c163017e991b9a4)
diffstat:

 stock.py |  25 ++++++++++++++-----------
 1 files changed, 14 insertions(+), 11 deletions(-)

diffs (44 lines):

diff -r 4b686d2cbc45 -r 2f9e92d60164 stock.py
--- a/stock.py  Sat Apr 04 18:03:23 2020 +0200
+++ b/stock.py  Thu Apr 23 21:39:31 2020 +0200
@@ -511,26 +511,29 @@
             requests += PurchaseRequest.search([
                     ('purchase_line', 'in', list(sub_lines)),
                     ])
-        pline2request = {r.purchase_line: r for r in requests}
+        pline2requests = defaultdict(list)
+        for request in requests:
+            pline2requests[request.purchase_line].append(request)
         sale_lines = SaleLine.search([
                 ('purchase_request', 'in', [r.id for r in requests]),
                 ])
-        request2sline = {sl.purchase_request: sl for sl in sale_lines}
+        request2slines = defaultdict(list)
+        for sale_line in sale_lines:
+            request2slines[sale_line.purchase_request].append(sale_line)
 
         to_save = []
         for shipment in shipments:
             for move in shipment.supplier_moves:
                 if not move.origin:
                     continue
-                sale_line = request2sline.get(pline2request.get(move.origin))
-                if not sale_line:
-                    continue
-                for move in sale_line.moves:
-                    if (move.state not in ('cancel', 'done')
-                            and not move.shipment
-                            and move.from_location.type == 'drop'):
-                        move.shipment = shipment
-                        to_save.append(move)
+                for request in pline2requests[move.origin]:
+                    for sale_line in request2slines[request]:
+                        for move in sale_line.moves:
+                            if (move.state not in ('cancel', 'done')
+                                    and not move.shipment
+                                    and move.from_location.type == 'drop'):
+                                move.shipment = shipment
+                                to_save.append(move)
         Move.save(to_save)
         cls._synchronize_moves(shipments)
 

Reply via email to