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)