changeset 3e2f053724b0 in modules/sale_supply_production:default
details: 
https://hg.tryton.org/modules/sale_supply_production?cmd=changeset;node=3e2f053724b0
description:
        Fill grouping values when assigning produced moves

        issue9480
        review310791003
diffstat:

 production.py |  44 +++++++++++++++++++++++++++++++++++---------
 1 files changed, 35 insertions(+), 9 deletions(-)

diffs (61 lines):

diff -r 72a35b8b127b -r 3e2f053724b0 production.py
--- a/production.py     Thu Jul 09 10:21:07 2020 +0100
+++ b/production.py     Mon Oct 12 17:49:42 2020 +0200
@@ -4,7 +4,7 @@
 from functools import wraps
 
 from trytond.i18n import gettext
-from trytond.model import ModelView, Workflow
+from trytond.model import Model, ModelView, Workflow
 from trytond.model.exceptions import AccessError
 from trytond.pool import PoolMeta, Pool
 from trytond.tools import grouped_slice
@@ -76,14 +76,40 @@
     @Workflow.transition('done')
     @process_sale_supply
     def done(cls, productions):
-        pool = Pool()
-        SaleLine = pool.get('sale.line')
         super().done(productions)
 
         for production in productions:
-            pbl = defaultdict(lambda: defaultdict(int))
-            for move in production.outputs:
-                pbl[move.product][move.to_location] += move.internal_quantity
-            if isinstance(production.origin, SaleLine):
-                sale_line = production.origin
-                sale_line.assign_supplied(pbl[sale_line.product])
+            production.assign_supplied()
+
+    def assign_supplied(self, grouping=('product',), filter_=None):
+        pool = Pool()
+        SaleLine = pool.get('sale.line')
+
+        if isinstance(self.origin, SaleLine):
+            sale_line = self.origin
+        else:
+            return
+
+        def filter_func(move):
+            if filter_ is None:
+                return True
+            for fieldname, values in filter_:
+                value = getattr(move, fieldname)
+                if isinstance(value, Model):
+                    value = value.id
+                if value not in values:
+                    return False
+
+        def get_key(move):
+            key = (move.to_location.id,)
+            for field in grouping:
+                value = getattr(move, field)
+                if isinstance(value, Model):
+                    value = value.id
+                key += (value,)
+            return key
+
+        pbl = defaultdict(lambda: defaultdict(int))
+        for move in filter(filter_func, self.outputs):
+            pbl[move.product][get_key(move)] += move.internal_quantity
+        sale_line.assign_supplied(pbl[sale_line.product], grouping=grouping)

Reply via email to