From a43ce9d57d0871b03982ba78f7f8311e0096bca6 Mon Sep 17 00:00:00 2001 From: juanjo-nan <57089222+juanjo-nan@users.noreply.github.com> Date: Tue, 27 Jul 2021 09:51:44 +0200 Subject: [PATCH] Add quality templates from products into productions. (#1) Add cron to create quality test in productions. 043843 --- __init__.py | 4 +- ir.py | 14 ++++ ir.xml | 10 +++ locale/ca.po | 54 ++++++++++++++- locale/es.po | 54 ++++++++++++++- message.xml | 7 ++ production.py | 107 +++++++++++++++++++++++++----- production.xml | 32 +++++++++ tryton.cfg | 2 + view/production_form.xml | 4 +- view/production_template_list.xml | 8 +++ view/template_form.xml | 3 +- 12 files changed, 277 insertions(+), 22 deletions(-) create mode 100644 ir.py create mode 100644 ir.xml create mode 100644 message.xml create mode 100644 view/production_template_list.xml diff --git a/__init__.py b/__init__.py index 22242b7..0f69384 100644 --- a/__init__.py +++ b/__init__.py @@ -2,10 +2,12 @@ # copyright notices and license terms. from trytond.pool import Pool from . import production - +from . import ir def register(): Pool.register( + ir.Cron, production.Template, production.Production, + production.ProductionTemplate, module='production_quality_control', type_='model') diff --git a/ir.py b/ir.py new file mode 100644 index 0000000..02c5966 --- /dev/null +++ b/ir.py @@ -0,0 +1,14 @@ +#The COPYRIGHT file at the top level of this repository contains the full +#copyright notices and license terms. +from trytond.pool import PoolMeta + + +class Cron(metaclass=PoolMeta): + __name__ = 'ir.cron' + + @classmethod + def __setup__(cls): + super().__setup__() + cls.method.selection.extend([ + ('production|create_quality_tests_worker', "Create quality control") + ]) \ No newline at end of file diff --git a/ir.xml b/ir.xml new file mode 100644 index 0000000..ba4de50 --- /dev/null +++ b/ir.xml @@ -0,0 +1,10 @@ + + + + + production|create_quality_tests_worker + 5 + minutes + + + \ No newline at end of file diff --git a/locale/ca.po b/locale/ca.po index 903b6b3..9689d5c 100644 --- a/locale/ca.po +++ b/locale/ca.po @@ -1,4 +1,4 @@ -# +# msgid "" msgstr "Content-Type: text/plain; charset=utf-8\n" @@ -6,14 +6,66 @@ msgctxt "field:product.template,quality_template:" msgid "Quality Template" msgstr "Plantilla de qualitat" +msgctxt "field:product.template,quality_templates:" +msgid "Quality Templates" +msgstr "Plantilles de qualitat" + +msgctxt "field:product.template-quality.template,company:" +msgid "Company" +msgstr "Empresa" + +msgctxt "field:product.template-quality.template,interval:" +msgid "Interval" +msgstr "Interval" + +msgctxt "field:product.template-quality.template,quality_template:" +msgid "Quality Template" +msgstr "Plantilla de qualitat" + +msgctxt "field:product.template-quality.template,template:" +msgid "Template" +msgstr "Plantilla" + msgctxt "field:production,quality_template:" msgid "Quality Template" msgstr "Plantilla de qualitat" +msgctxt "field:production,quality_templates:" +msgid "Quality Templates" +msgstr "Plantilles de qualitat" + msgctxt "field:production,quality_tests:" msgid "Quality Tests" msgstr "Tests de qualitat" +msgctxt "field:production,time_since_quality_control:" +msgid "Time since quality control" +msgstr "Temps des de control de qualitat" + +msgctxt "help:product.template-quality.template,interval:" +msgid "Interval in minutes" +msgstr "Interval en minuts" + +msgctxt "model:ir.action,name:act_quality_tests" +msgid "Quality Tests" +msgstr "Tests de qualitat" + +msgctxt "model:ir.message,text:msg_test_not_successful" +msgid "The production \"%(production)s\" has tests that are not correct." +msgstr "La producció \"%(production)s\" té tests que no són correctes." + +msgctxt "model:ir.rule.group,name:rule_product_quality_template" +msgid "Product Template Quality Template Rule" +msgstr "Regla de plantilles de producte i plantilles de qualitat " + +msgctxt "model:product.template-quality.template,name:" +msgid "Production Template" +msgstr "Produccions - Plantilles" + +msgctxt "selection:ir.cron,method:" +msgid "Create quality control" +msgstr "Crear control de qualitat" + msgctxt "view:production:" msgid "Quality" msgstr "Qualitat" diff --git a/locale/es.po b/locale/es.po index b9d66e1..98cb39c 100644 --- a/locale/es.po +++ b/locale/es.po @@ -1,4 +1,4 @@ -# +# msgid "" msgstr "Content-Type: text/plain; charset=utf-8\n" @@ -6,14 +6,66 @@ msgctxt "field:product.template,quality_template:" msgid "Quality Template" msgstr "Plantilla de calidad" +msgctxt "field:product.template,quality_templates:" +msgid "Quality Templates" +msgstr "Plantillas de calidad" + +msgctxt "field:product.template-quality.template,company:" +msgid "Company" +msgstr "Empresa" + +msgctxt "field:product.template-quality.template,interval:" +msgid "Interval" +msgstr "Intervalo" + +msgctxt "field:product.template-quality.template,quality_template:" +msgid "Quality Template" +msgstr "Plantilla de calidad" + +msgctxt "field:product.template-quality.template,template:" +msgid "Template" +msgstr "Plantilla" + msgctxt "field:production,quality_template:" msgid "Quality Template" msgstr "Plantilla de calidad" +msgctxt "field:production,quality_templates:" +msgid "Quality Templates" +msgstr "Plantillas de calidad" + msgctxt "field:production,quality_tests:" msgid "Quality Tests" msgstr "Tests de calidad" +msgctxt "field:production,time_since_quality_control:" +msgid "Time since quality control" +msgstr "Tiempo des de control de calidad" + +msgctxt "help:product.template-quality.template,interval:" +msgid "Interval in minutes" +msgstr "Intervalo en minutos" + +msgctxt "model:ir.action,name:act_quality_tests" +msgid "Quality Tests" +msgstr "Tests de calidad" + +msgctxt "model:ir.message,text:msg_test_not_successful" +msgid "The production \"%(production)s\" has tests that are not correct." +msgstr "La producción \"%(production)s\" tiene tests que no son correctos." + +msgctxt "model:ir.rule.group,name:rule_product_quality_template" +msgid "Product Template Quality Template Rule" +msgstr "Regla de plantillas de producto y plantillas de calidad" + +msgctxt "model:product.template-quality.template,name:" +msgid "Production Template" +msgstr "Producciones - Plantillas" + +msgctxt "selection:ir.cron,method:" +msgid "Create quality control" +msgstr "Crear control de calidad" + msgctxt "view:production:" msgid "Quality" msgstr "Calidad" diff --git a/message.xml b/message.xml new file mode 100644 index 0000000..60ed83d --- /dev/null +++ b/message.xml @@ -0,0 +1,7 @@ + + + + The production "%(production)s" has tests that are not correct. + + + \ No newline at end of file diff --git a/production.py b/production.py index 6cefb12..5883b7f 100644 --- a/production.py +++ b/production.py @@ -1,38 +1,115 @@ #The COPYRIGHT file at the top level of this repository contains the full #copyright notices and license terms. -from trytond.model import fields -from trytond.pool import PoolMeta -from trytond.pyson import Eval +from datetime import datetime -__all__ = ['Template', 'Production'] +from trytond.model import fields, ModelSQL, ModelView +from trytond.pool import Pool, PoolMeta +from trytond.pyson import Eval +from trytond.transaction import Transaction +from trytond.exceptions import UserError +from trytond.i18n import gettext class Template(metaclass=PoolMeta): __name__ = 'product.template' - quality_template = fields.Many2One('quality.template', 'Quality Template') + quality_templates = fields.One2Many('product.template-quality.template', + 'template', "Quality Templates") class Production(metaclass=PoolMeta): __name__ = 'production' - quality_template = fields.Many2One('quality.template', 'Quality Template') + 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_template': Eval('quality_template'), + 'default_quality_templates': Eval('quality_templates'), }, - depends=['quality_template']) + depends=['quality_templates']) + time_since_quality_control = fields.DateTime('Time since quality control', + readonly=True) - @fields.depends('product') - def on_change_product(self): - super(Production, self).on_change_product() - if self.product and self.product.template.quality_template: - self.quality_template = self.product.template.quality_template + 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): "Inherited from stock_supply_production" production = super(Production, cls).compute_request(product, warehouse, quantity, date, company) - if product.template.quality_template: - production.quality_template = product.template.quality_template + 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: + for quality_template in production.quality_templates: + total_time_since_quality_control = (datetime.now() - + production.time_since_quality_control).seconds/60 + if (total_time_since_quality_control >= + quality_template.interval): + for quality_contol in range(int( + total_time_since_quality_control/ + quality_template.interval)): + test = QualityTest() + test.document = production + test.templates = [quality_template.quality_template] + test.company = quality_template.company + to_save.append(test) + + production.time_since_quality_control = datetime.now() + + cls.save(production) + 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") + 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') \ No newline at end of file diff --git a/production.xml b/production.xml index 7fead89..84e2c4f 100644 --- a/production.xml +++ b/production.xml @@ -12,5 +12,37 @@ template_form + + + + product.template-quality.template + tree + + production_template_list + + + + Product Template Quality Template Rule + + + + + + + + + + + Quality Tests + quality.test + + + + form_relate + production,-1 + + diff --git a/tryton.cfg b/tryton.cfg index 71569fb..77d5092 100644 --- a/tryton.cfg +++ b/tryton.cfg @@ -6,4 +6,6 @@ depends: extras_depend: stock_supply_production xml: + ir.xml production.xml + message.xml diff --git a/view/production_form.xml b/view/production_form.xml index dcb32d8..dfddbf0 100644 --- a/view/production_form.xml +++ b/view/production_form.xml @@ -1,8 +1,8 @@ - diff --git a/view/production_template_list.xml b/view/production_template_list.xml new file mode 100644 index 0000000..f598044 --- /dev/null +++ b/view/production_template_list.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/view/template_form.xml b/view/template_form.xml index 9e6f6c1..6a237cf 100644 --- a/view/template_form.xml +++ b/view/template_form.xml @@ -4,8 +4,7 @@ -