trytond-stock_number_of_pac.../period.py
2019-07-15 14:17:22 +02:00

107 lines
3.8 KiB
Python

# The COPYRIGHT file at the top level of this repository contains the full
# copyright notices and license terms.
from trytond.model import ModelSQL, ModelView, fields
from trytond.pool import Pool, PoolMeta
from trytond.transaction import Transaction
__all__ = ['Period', 'PeriodCache', 'PeriodCacheLot', 'PeriodCachePackage']
class NumberOfPackagesCacheMixin(object):
number_of_packages = fields.Integer('Number of packages', readonly=True)
@classmethod
def compute_number_of_packages(cls, vlist, grouping):
pool = Pool()
Period = pool.get('stock.period')
Product = pool.get('product.product')
vlist_by_period_location = {}
for values in vlist:
vlist_by_period_location.setdefault(values['period'], {})\
.setdefault(values['location'], []).append(values)
vlist = []
for period_id, vlist_by_location in \
vlist_by_period_location.items():
period = Period(period_id)
with Transaction().set_context(
stock_date_end=period.date,
stock_date_start=None,
stock_assign=False,
forecast=False,
stock_destinations=None,
number_of_packages=True,
):
llist=[x for x in vlist_by_location]
pbl = Product.products_by_location(
llist, grouping=grouping)
for location_id, location_vlist in vlist_by_location.items():
for values in location_vlist:
key = tuple([location_id] + [values[x] for x in grouping])
values['number_of_packages'] = int(pbl.get(key, 0.0))
vlist.append(values)
return vlist
class Period(metaclass=PoolMeta):
__name__ = 'stock.period'
package_caches = fields.One2Many('stock.period.cache.package', 'period',
'Package Caches', readonly=True)
@classmethod
def groupings(cls):
return super(Period, cls).groupings() + [('product', 'package')]
@classmethod
def get_cache(cls, grouping):
pool = Pool()
Cache = super(Period, cls).get_cache(grouping)
if grouping == ('product', 'package'):
return pool.get('stock.period.cache.package')
return Cache
class PeriodCache(NumberOfPackagesCacheMixin, metaclass=PoolMeta):
__name__ = 'stock.period.cache'
@classmethod
def create(cls, vlist):
vlist = cls.compute_number_of_packages(vlist, ('product',))
return super(PeriodCache, cls).create(vlist)
class PeriodCacheLot(NumberOfPackagesCacheMixin, metaclass=PoolMeta):
__name__ = 'stock.period.cache.lot'
@classmethod
def create(cls, vlist):
vlist = cls.compute_number_of_packages(vlist, ('product', 'lot'))
return super(PeriodCacheLot, cls).create(vlist)
class PeriodCachePackage(ModelSQL, ModelView, NumberOfPackagesCacheMixin):
'''
Stock Period Cache per Package
It is used to store cached computation of stock quantities per package.
'''
__name__ = 'stock.period.cache.package'
period = fields.Many2One('stock.period', 'Period', required=True,
readonly=True, select=True, ondelete='CASCADE')
location = fields.Many2One('stock.location', 'Location', required=True,
readonly=True, select=True, ondelete='CASCADE')
product = fields.Many2One('product.product', 'Product', required=True,
readonly=True, ondelete='CASCADE')
package = fields.Many2One('product.pack', 'Package', readonly=True,
ondelete='CASCADE')
internal_quantity = fields.Float('Internal Quantity', readonly=True)
@classmethod
def create(cls, vlist):
vlist = cls.compute_number_of_packages(vlist,
('product', 'package'))
return super(PeriodCachePackage, cls).create(vlist)