trytond-production_quality_.../production.py

120 lines
4.4 KiB
Python

#The COPYRIGHT file at the top level of this repository contains the full
#copyright notices and license terms.
from datetime import datetime
from trytond.model import fields, ModelSQL, ModelView
from trytond.pool import Pool, PoolMeta
from trytond.pyson import Eval
from trytond.transaction import Transaction
class Template(metaclass=PoolMeta):
__name__ = 'product.template'
quality_templates = fields.One2Many('product.template-quality.template',
'template', "Quality Templates")
# product.product setup must be executed so template's quality_templates field
# is created to product.product too
class Product(metaclass=PoolMeta):
__name__ = 'product.product'
class Production(metaclass=PoolMeta):
__name__ = 'production'
quality_templates = fields.Function(fields.One2Many(
'product.template-quality.template', None, "Quality Templates"),
'get_quality_templates')
quality_tests = fields.One2Many('quality.test', 'document', "Quality Tests",
context={
'default_quality_templates': Eval('quality_templates'),
},
depends=['quality_templates'])
time_since_quality_control = fields.DateTime("Time since quality control",
readonly=True)
def get_quality_templates(self, name):
context = Transaction().context
quality_templates = []
if self.product:
for quality_template in self.product.template.quality_templates:
if quality_template.company.id == context.get('company'):
quality_templates.append(quality_template.id)
return quality_templates
@classmethod
def compute_request(cls, product, warehouse, quantity, date, company,
order_point=None):
"Inherited from stock_supply_production"
production = super(Production, cls).compute_request(product,
warehouse, quantity, date, company, order_point)
if product.template.quality_templates:
production.quality_templates = product.template.quality_templates
return production
@classmethod
def run(cls, productions):
to_save = []
for production in productions:
production.time_since_quality_control = datetime.now()
to_save.append(production)
cls.save(to_save)
super(Production, cls).run(productions)
@classmethod
def create_quality_tests(cls, productions):
pool = Pool()
QualityTest = pool.get('quality.test')
to_save = []
for production in productions:
total_time_since_quality_control = (datetime.now() -
production.time_since_quality_control).seconds / 60
for qt in production.quality_templates:
interval = qt.interval
if (total_time_since_quality_control >= interval):
start = int(total_time_since_quality_control / interval)
for quality_contol in range(start):
test = QualityTest()
test.document = production
test.templates = [qt.quality_template]
test.company = qt.company
to_save.append(test)
production.time_since_quality_control = datetime.now()
cls.save(productions)
if to_save:
QualityTest.save(to_save)
QualityTest.apply_templates(to_save)
@classmethod
def create_quality_tests_worker(cls):
productions = cls.search([
('state','=','running')
])
for production in productions:
with Transaction().set_context(queue_name='production'):
cls.__queue__.create_quality_tests([production])
class ProductionTemplate(ModelSQL, ModelView):
"Production Template"
__name__ = 'product.template-quality.template'
template = fields.Many2One('product.template', "Template", required=True,
ondelete="CASCADE",
context={
'company': Eval('company', -1),
},
depends=['company'])
company = fields.Many2One('company.company', "Company", required=True)
interval = fields.Integer("Interval", required=True,
help="Interval in minutes")
quality_template = fields.Many2One('quality.template', "Quality Template",
required=True)
@classmethod
def default_company(cls):
return Transaction().context.get('company')