Files
tryton/stock.py
T

131 lines
4.8 KiB
Python

#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
from itertools import izip, groupby
from functools import partial
from trytond.model import Model
from trytond.pool import Pool
class ShipmentIn(Model):
_name = 'stock.shipment.in'
def _group_parcel_key(self, lines, line):
"""
The key to group lines by parcel
"""
return None
def _get_carrier_context(self, values):
pool = Pool()
carrier_obj = pool.get('carrier')
product_obj = pool.get('product.product')
uom_obj = pool.get('product.uom')
context = super(ShipmentIn, self)._get_carrier_context(values)
if not values.get('carrier'):
return context
carrier = carrier_obj.browse(values['carrier'])
if carrier.carrier_cost_method != 'weight':
return context
context = context.copy()
weights = []
context['weights'] = weights
product_ids = [line['product']
for line in values.get('incoming_moves') or []
if line.get('product')]
id2product = dict((p.id, p) for p in product_obj.browse(product_ids))
uom_ids = [line['uom'] for line in values.get('incoming_moves') or []
if line.get('uom')]
id2uom = dict((u.id, u) for u in uom_obj.browse(uom_ids))
lines = values.get('incoming_moves') or []
keyfunc = partial(self._group_parcel_key, lines)
lines = sorted(lines, key=keyfunc)
for key, parcel in groupby(lines, key=keyfunc):
weight = 0
for line in parcel:
if (line.get('product')
and line.get('quantity')
and line.get('uom')):
product = id2product[line['product']]
quantity = uom_obj.compute_qty(id2uom[line['uom']],
line['quantity'], product.default_uom, round=False)
weight += uom_obj.compute_qty(product.weight_uom,
product.weight * quantity, carrier.weight_uom,
round=False)
weights.append(weight)
return context
ShipmentIn()
class ShipmentOut(Model):
_name = 'stock.shipment.out'
def _group_parcel_key(self, lines, line):
"""
The key to group lines by parcel
"""
return None
def _get_carrier_context(self, values):
pool = Pool()
carrier_obj = pool.get('carrier')
product_obj = pool.get('product.product')
uom_obj = pool.get('product.uom')
context = super(ShipmentOut, self)._get_carrier_context(values)
if not values.get('carrier'):
return context
carrier = carrier_obj.browse(values['carrier'])
if carrier.carrier_cost_method != 'weight':
return context
context = context.copy()
weights = []
context['weights'] = weights
product_ids = [line['product']
for line in values.get('inventory_moves') or []
if line.get('product')]
id2product = dict((p.id, p) for p in product_obj.browse(product_ids))
uom_ids = [line['uom'] for line in values.get('inventory_moves') or []
if line.get('uom')]
id2uom = dict((u.id, u) for u in uom_obj.browse(uom_ids))
lines = values.get('inventory_moves') or []
keyfunc = partial(self._group_parcel_key, lines)
lines = sorted(lines, key=keyfunc)
for key, parcel in groupby(lines, key=keyfunc):
weight = 0
for line in parcel:
if (line.get('product')
and line.get('quantity')
and line.get('uom')):
product = id2product[line['product']]
quantity = uom_obj.compute_qty(id2uom[line['uom']],
line['quantity'], product.default_uom, round=False)
weight += uom_obj.compute_qty(product.weight_uom,
product.weight * quantity, carrier.weight_uom,
round=False)
weights.append(weight)
return context
def get_carrier_context(self, shipment, values=None):
if values is None:
values = {}
values = values.copy()
inventory_moves = [{
'product': m.product.id,
'quantity': m.quantity,
'uom': m.uom.id,
} for m in shipment.inventory_moves]
values.setdefault('inventory_moves', inventory_moves)
for new, old in izip(inventory_moves, values['inventory_moves']):
old.update(new)
return super(ShipmentOut, self).get_carrier_context(shipment,
values=values)
ShipmentOut()