From fb8f0222a36fb27a6b61549cedff3a86f1e45554 Mon Sep 17 00:00:00 2001 From: jared-nan <60256728+jared-nan@users.noreply.github.com> Date: Mon, 12 Jul 2021 15:58:50 +0200 Subject: [PATCH] Add template agronomic type and product.product fields #044761 --- __init__.py | 9 ++ locale/ca.po | 216 +++++++++++++++++++++++++++++++++++- locale/es.po | 216 +++++++++++++++++++++++++++++++++++- message.xml | 6 + plot.xml | 142 ++++++++++++++++++++++++ product.py | 142 ++++++++++++++++++++++++ product.xml | 159 ++++++++++++++++++++++++++ tryton.cfg | 2 + view/certification_form.xml | 6 + view/certification_list.xml | 4 + view/container_form.xml | 6 + view/container_list.xml | 4 + view/product_form.xml | 20 ++++ view/product_list.xml | 13 +++ view/template_form.xml | 10 ++ view/template_list.xml | 7 ++ 16 files changed, 954 insertions(+), 8 deletions(-) create mode 100644 product.py create mode 100644 product.xml create mode 100644 view/certification_form.xml create mode 100644 view/certification_list.xml create mode 100644 view/container_form.xml create mode 100644 view/container_list.xml create mode 100644 view/product_form.xml create mode 100644 view/product_list.xml create mode 100644 view/template_form.xml create mode 100644 view/template_list.xml diff --git a/__init__.py b/__init__.py index 395ad35..1f76ece 100644 --- a/__init__.py +++ b/__init__.py @@ -4,6 +4,7 @@ from trytond.pool import Pool from . import party from . import plot +from . import product def register(): @@ -19,6 +20,14 @@ def register(): plot.Parcel, plot.ParcelDo, plot.Beneficiaries, + product.Certification, + product.Container, + product.Product, + product.ProductCrop, + product.ProductDO, + product.ProductEcological, + product.ProductVariety, + product.Template, module='agronomics', type_='model') Pool.register( module='agronomics', type_='wizard') diff --git a/locale/ca.po b/locale/ca.po index b346f4c..3cfa297 100644 --- a/locale/ca.po +++ b/locale/ca.po @@ -14,6 +14,22 @@ msgctxt "field:agronomics.beneficiary,percent:" msgid "Percent" msgstr "Percentatge" +msgctxt "field:agronomics.certification,date:" +msgid "Date" +msgstr "Data" + +msgctxt "field:agronomics.certification,number:" +msgid "Number" +msgstr "Número" + +msgctxt "field:agronomics.container,capacity:" +msgid "Capacity" +msgstr "Capacitat" + +msgctxt "field:agronomics.container,name:" +msgid "Name" +msgstr "Nom" + msgctxt "field:agronomics.crop,code:" msgid "Code" msgstr "Codi" @@ -146,10 +162,6 @@ msgctxt "field:agronomics.parcel,species:" msgid "Spices" msgstr "Espècie" -msgctxt "field:agronomics.parcel,spieces:" -msgid "Spices" -msgstr "Espècie" - msgctxt "field:agronomics.parcel,surface:" msgid "Surface" msgstr "Superfície" @@ -198,10 +210,114 @@ msgctxt "field:party.party,plantations:" msgid "Plantation" msgstr "Plantacións" +msgctxt "field:product.product,agronomic_type:" +msgid "Agronomic Type" +msgstr "Tipus Agronòmic" + +msgctxt "field:product.product,alcohol_volume:" +msgid "Alcohol Volume" +msgstr "Volum Alcohol" + +msgctxt "field:product.product,capacity:" +msgid "Capacity" +msgstr "Capacitat" + +msgctxt "field:product.product,certification:" +msgid "Certification" +msgstr "Certificació" + +msgctxt "field:product.product,container:" +msgid "Container" +msgstr "Envàs" + +msgctxt "field:product.product,denominations_of_origin:" +msgid "DOs" +msgstr "DOs" + +msgctxt "field:product.product,ecologicals:" +msgid "Ecologicals" +msgstr "Ecológics" + +msgctxt "field:product.product,needs_sample:" +msgid "Needs Samples" +msgstr "Necesita mostres" + +msgctxt "field:product.product,quality_sample:" +msgid "Quality Sample" +msgstr "Mostra de qualitat" + +msgctxt "field:product.product,shipment_in_quality_template:" +msgid "Shipment In Quality Template" +msgstr "Plantilla qualitat albarà entrada" + +msgctxt "field:product.product,shipment_out_quality_template:" +msgid "Shipment Out Quality Template" +msgstr "Plantilla qualitat albarà sortida" + +msgctxt "field:product.product,varieties:" +msgid "Varieties" +msgstr "Varietats" + +msgctxt "field:product.product,vintages:" +msgid "Vintages" +msgstr "Collites" + +msgctxt "field:product.product-agronomics.crop,crop:" +msgid "Crop" +msgstr "Collita" + +msgctxt "field:product.product-agronomics.crop,product:" +msgid "Product" +msgstr "Productes" + +msgctxt "field:product.product-agronomics.denomination_of_origin,do:" +msgid "DO" +msgstr "DO" + +msgctxt "field:product.product-agronomics.denomination_of_origin,product:" +msgid "Product" +msgstr "Productes" + +msgctxt "field:product.product-agronomics.ecological,ecological:" +msgid "Ecological" +msgstr "Ecològic" + +msgctxt "field:product.product-agronomics.ecological,product:" +msgid "Product" +msgstr "Productes" + +msgctxt "field:product.product-product.taxon,product:" +msgid "Product" +msgstr "Productes" + +msgctxt "field:product.product-product.taxon,variety:" +msgid "Variety" +msgstr "Varietat" + +msgctxt "field:product.template,agronomic_type:" +msgid "Agronomic Type" +msgstr "Tipus Agronòmic" + +msgctxt "field:product.template,capacity:" +msgid "Capacity" +msgstr "Capacitat" + +msgctxt "field:product.template,container:" +msgid "Container" +msgstr "Envàs" + msgctxt "model:agronomics.beneficiary,name:" msgid "Beneficiaries" msgstr "Beneficiaris" +msgctxt "model:agronomics.certification,name:" +msgid "Certification" +msgstr "Certificació" + +msgctxt "model:agronomics.container,name:" +msgid "Container" +msgstr "Envàs" + msgctxt "model:agronomics.crop,name:" msgid "Crop" msgstr "Collita" @@ -238,6 +354,14 @@ msgctxt "model:agronomics.plantation,name:" msgid "Plantation" msgstr "Plantació" +msgctxt "model:ir.action,name:act_certification_tree" +msgid "Certification" +msgstr "Certificació" + +msgctxt "model:ir.action,name:act_container_tree" +msgid "Container" +msgstr "Envàs" + msgctxt "model:ir.action,name:act_crop_tree" msgid "Crop" msgstr "Collita" @@ -278,14 +402,38 @@ msgstr "" "Els Beneficiares de les collites \"%(crop)s\" i la plantació " "\"%(plantation)s\" han de sumar 100." +msgctxt "model:ir.message,text:msg_variety_limit" +msgid "" +"Product \"%(product)s\" cannot have more than one Variety because of its " +"agronomic type." +msgstr "" +"El producte \"%(product)s\" no pot tenir més d'una varietat degut al seu " +"tipus agronòmic" + +msgctxt "model:ir.message,text:msg_vintage_limit" +msgid "" +"Product \"%(product)s\" cannot have more than one Vintage because of its " +"agronomic type." +msgstr "" +"El producte \"%(product)s\" no pot tenir més d'una collita degut al seu " +"tipus agronòmic" + msgctxt "model:ir.ui.menu,name:menu_agronomics" msgid "Agronomics" msgstr "Agronomics" +msgctxt "model:ir.ui.menu,name:menu_certification_list" +msgid "Certification" +msgstr "Certificació" + msgctxt "model:ir.ui.menu,name:menu_configuration" msgid "Configuration" msgstr "Configuració" +msgctxt "model:ir.ui.menu,name:menu_container_list" +msgid "Container" +msgstr "Envàs" + msgctxt "model:ir.ui.menu,name:menu_crop_list" msgid "Crop" msgstr "Collita" @@ -318,6 +466,22 @@ msgctxt "model:ir.ui.menu,name:menu_plantation_list" msgid "Plantation" msgstr "Plantació" +msgctxt "model:product.product-agronomics.crop,name:" +msgid "Product - Crop" +msgstr "Producte - Collita" + +msgctxt "model:product.product-agronomics.denomination_of_origin,name:" +msgid "Product - DO" +msgstr "Producte - DO" + +msgctxt "model:product.product-agronomics.ecological,name:" +msgid "Product - Ecological" +msgstr "Producte - Ecològic" + +msgctxt "model:product.product-product.taxon,name:" +msgid "Product - Variety" +msgstr "Producte - Varietat" + msgctxt "model:res.group,name:group_agronomics" msgid "Agronomics" msgstr "Agronomics" @@ -325,3 +489,47 @@ msgstr "Agronomics" msgctxt "model:res.group,name:group_agronomics_admin" msgid "Agronomics Administration" msgstr "Administració Agronomics" + +msgctxt "selection:product.product,agronomic_type:" +msgid "Bottled Wine" +msgstr "Vi Embotellat" + +msgctxt "selection:product.product,agronomic_type:" +msgid "DO Wort" +msgstr "Most DO" + +msgctxt "selection:product.product,agronomic_type:" +msgid "Grape" +msgstr "Raïm" + +msgctxt "selection:product.product,agronomic_type:" +msgid "Not DO Wort" +msgstr "Most no DO" + +msgctxt "selection:product.product,agronomic_type:" +msgid "Wine" +msgstr "Vi" + +msgctxt "selection:product.template,agronomic_type:" +msgid "Bottled Wine" +msgstr "Vi Embotellat" + +msgctxt "selection:product.template,agronomic_type:" +msgid "DO Wort" +msgstr "Most DO" + +msgctxt "selection:product.template,agronomic_type:" +msgid "Grape" +msgstr "Raïm" + +msgctxt "selection:product.template,agronomic_type:" +msgid "Not DO Wort" +msgstr "Most no DO" + +msgctxt "selection:product.template,agronomic_type:" +msgid "Wine" +msgstr "Vi" + +msgctxt "view:product.product:" +msgid "Agronomics" +msgstr "Agronomics" diff --git a/locale/es.po b/locale/es.po index b203398..f8e2a46 100644 --- a/locale/es.po +++ b/locale/es.po @@ -14,6 +14,22 @@ msgctxt "field:agronomics.beneficiary,percent:" msgid "Percent" msgstr "Porcentaje" +msgctxt "field:agronomics.certification,date:" +msgid "Date" +msgstr "Fecha" + +msgctxt "field:agronomics.certification,number:" +msgid "Number" +msgstr "Número" + +msgctxt "field:agronomics.container,capacity:" +msgid "Capacity" +msgstr "Capacidad" + +msgctxt "field:agronomics.container,name:" +msgid "Name" +msgstr "Nombre" + msgctxt "field:agronomics.crop,code:" msgid "Code" msgstr "Código" @@ -146,10 +162,6 @@ msgctxt "field:agronomics.parcel,species:" msgid "Spices" msgstr "Especie" -msgctxt "field:agronomics.parcel,spieces:" -msgid "Spices" -msgstr "Especie" - msgctxt "field:agronomics.parcel,surface:" msgid "Surface" msgstr "Superficie" @@ -198,10 +210,114 @@ msgctxt "field:party.party,plantations:" msgid "Plantation" msgstr "Plantaciónes" +msgctxt "field:product.product,agronomic_type:" +msgid "Agronomic Type" +msgstr "Tipo Agronómico" + +msgctxt "field:product.product,alcohol_volume:" +msgid "Alcohol Volume" +msgstr "Volumen Alcohol" + +msgctxt "field:product.product,capacity:" +msgid "Capacity" +msgstr "Capacidad" + +msgctxt "field:product.product,certification:" +msgid "Certification" +msgstr "Certificación" + +msgctxt "field:product.product,container:" +msgid "Container" +msgstr "Envase" + +msgctxt "field:product.product,denominations_of_origin:" +msgid "DOs" +msgstr "DOs" + +msgctxt "field:product.product,ecologicals:" +msgid "Ecologicals" +msgstr "Ecológicos" + +msgctxt "field:product.product,needs_sample:" +msgid "Needs Samples" +msgstr "Requiere muestras" + +msgctxt "field:product.product,quality_sample:" +msgid "Quality Sample" +msgstr "Muestra de calidad" + +msgctxt "field:product.product,shipment_in_quality_template:" +msgid "Shipment In Quality Template" +msgstr "Plantilla calidad albarán de entrada" + +msgctxt "field:product.product,shipment_out_quality_template:" +msgid "Shipment Out Quality Template" +msgstr "Plantilla calidad albarán de salida" + +msgctxt "field:product.product,varieties:" +msgid "Varieties" +msgstr "Variedades" + +msgctxt "field:product.product,vintages:" +msgid "Vintages" +msgstr "Cosechas" + +msgctxt "field:product.product-agronomics.crop,crop:" +msgid "Crop" +msgstr "Cosecha" + +msgctxt "field:product.product-agronomics.crop,product:" +msgid "Product" +msgstr "Productos" + +msgctxt "field:product.product-agronomics.denomination_of_origin,do:" +msgid "DO" +msgstr "DO" + +msgctxt "field:product.product-agronomics.denomination_of_origin,product:" +msgid "Product" +msgstr "Productos" + +msgctxt "field:product.product-agronomics.ecological,ecological:" +msgid "Ecological" +msgstr "Ecológico" + +msgctxt "field:product.product-agronomics.ecological,product:" +msgid "Product" +msgstr "Productos" + +msgctxt "field:product.product-product.taxon,product:" +msgid "Product" +msgstr "Productos" + +msgctxt "field:product.product-product.taxon,variety:" +msgid "Variety" +msgstr "Variedad" + +msgctxt "field:product.template,agronomic_type:" +msgid "Agronomic Type" +msgstr "Tipo Agronómico" + +msgctxt "field:product.template,capacity:" +msgid "Capacity" +msgstr "Capacidad" + +msgctxt "field:product.template,container:" +msgid "Container" +msgstr "Envase" + msgctxt "model:agronomics.beneficiary,name:" msgid "Beneficiaries" msgstr "Beneficiarios" +msgctxt "model:agronomics.certification,name:" +msgid "Certification" +msgstr "Certificación" + +msgctxt "model:agronomics.container,name:" +msgid "Container" +msgstr "Envase" + msgctxt "model:agronomics.crop,name:" msgid "Crop" msgstr "Cosecha" @@ -238,6 +354,14 @@ msgctxt "model:agronomics.plantation,name:" msgid "Plantation" msgstr "Plantación" +msgctxt "model:ir.action,name:act_certification_tree" +msgid "Certification" +msgstr "Certificación" + +msgctxt "model:ir.action,name:act_container_tree" +msgid "Container" +msgstr "Envase" + msgctxt "model:ir.action,name:act_crop_tree" msgid "Crop" msgstr "Cosecha" @@ -278,14 +402,38 @@ msgstr "" "Los beneficiarios de la cosecha \"%(crop)s\" y de la plantación " "\"%(plantation)s\" han de sumar 100." +msgctxt "model:ir.message,text:msg_variety_limit" +msgid "" +"Product \"%(product)s\" cannot have more than one Variety because of its " +"agronomic type." +msgstr "" +"El producto \"%(product)s\" no puede tener más de una variedad debido a su " +"Tipo Agronómico" + +msgctxt "model:ir.message,text:msg_vintage_limit" +msgid "" +"Product \"%(product)s\" cannot have more than one Vintage because of its " +"agronomic type." +msgstr "" +"El producto \"%(product)s\" no puede tener más de una cosecha debido a su " +"Tipo Agronómico" + msgctxt "model:ir.ui.menu,name:menu_agronomics" msgid "Agronomics" msgstr "Agronomics" +msgctxt "model:ir.ui.menu,name:menu_certification_list" +msgid "Certification" +msgstr "Certificación" + msgctxt "model:ir.ui.menu,name:menu_configuration" msgid "Configuration" msgstr "Configuración" +msgctxt "model:ir.ui.menu,name:menu_container_list" +msgid "Container" +msgstr "Envase" + msgctxt "model:ir.ui.menu,name:menu_crop_list" msgid "Crop" msgstr "Cosecha" @@ -318,6 +466,22 @@ msgctxt "model:ir.ui.menu,name:menu_plantation_list" msgid "Plantation" msgstr "Plantación" +msgctxt "model:product.product-agronomics.crop,name:" +msgid "Product - Crop" +msgstr "Producto - Cosecha" + +msgctxt "model:product.product-agronomics.denomination_of_origin,name:" +msgid "Product - DO" +msgstr "Producto - DO" + +msgctxt "model:product.product-agronomics.ecological,name:" +msgid "Product - Ecological" +msgstr "Producto - Ecológico" + +msgctxt "model:product.product-product.taxon,name:" +msgid "Product - Variety" +msgstr "Producto - Variedad" + msgctxt "model:res.group,name:group_agronomics" msgid "Agronomics" msgstr "Agronomics" @@ -325,3 +489,47 @@ msgstr "Agronomics" msgctxt "model:res.group,name:group_agronomics_admin" msgid "Agronomics Administration" msgstr "Agronomics Administración" + +msgctxt "selection:product.product,agronomic_type:" +msgid "Bottled Wine" +msgstr "Vino Embotellado" + +msgctxt "selection:product.product,agronomic_type:" +msgid "DO Wort" +msgstr "Mosto DO" + +msgctxt "selection:product.product,agronomic_type:" +msgid "Grape" +msgstr "Uva" + +msgctxt "selection:product.product,agronomic_type:" +msgid "Not DO Wort" +msgstr "Mosto no DO" + +msgctxt "selection:product.product,agronomic_type:" +msgid "Wine" +msgstr "Vino" + +msgctxt "selection:product.template,agronomic_type:" +msgid "Bottled Wine" +msgstr "Vino Embotellado" + +msgctxt "selection:product.template,agronomic_type:" +msgid "DO Wort" +msgstr "Mosto DO" + +msgctxt "selection:product.template,agronomic_type:" +msgid "Grape" +msgstr "Uva" + +msgctxt "selection:product.template,agronomic_type:" +msgid "Not DO Wort" +msgstr "Mosto no DO" + +msgctxt "selection:product.template,agronomic_type:" +msgid "Wine" +msgstr "Vino" + +msgctxt "view:product.product:" +msgid "Agronomics" +msgstr "Agronomics" diff --git a/message.xml b/message.xml index 7650ee8..5c93173 100644 --- a/message.xml +++ b/message.xml @@ -6,5 +6,11 @@ this repository contains the full copyright notices and license terms. --> Beneficiaris of Crop "%(crop)s" and Plantation "%(plantation)s" must sum 100. + + Product "%(product)s" cannot have more than one Vintage because of its agronomic type. + + + Product "%(product)s" cannot have more than one Variety because of its agronomic type. + diff --git a/plot.xml b/plot.xml index 6de508e..60a2bc4 100644 --- a/plot.xml +++ b/plot.xml @@ -400,6 +400,148 @@ beneficiary_list + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/product.py b/product.py new file mode 100644 index 0000000..a30e282 --- /dev/null +++ b/product.py @@ -0,0 +1,142 @@ +# 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 trytond.model import ModelSQL, ModelView, fields +from trytond.pool import PoolMeta, Pool +from trytond.pyson import Eval +from trytond.exceptions import UserError +from trytond.i18n import gettext + + +class Certification(ModelSQL, ModelView): + "Certification" + __name__ = 'agronomics.certification' + _rec_name = 'number' + + number = fields.Char('Number') + date = fields.Date('Date') + + def get_rec_name(self, name): + return self.number + + +class Container(ModelSQL, ModelView): + "Container" + __name__ = 'agronomics.container' + + name = fields.Char('Name') + capacity = fields.Numeric('Capacity', digits=(16, 2)) + + +class Template(metaclass=PoolMeta): + __name__ = 'product.template' + + agronomic_type = fields.Selection([ + (None, ''), + ('grape', "Grape"), + ('do-wort', "DO Wort"), + ('not-do-wort', "Not DO Wort"), + ('wine', "Wine"), + ('bottled-wine', "Bottled Wine"), + ], "Agronomic Type", select=True) + container = fields.Many2One('agronomics.container', 'Container', + states={ + 'invisible': Eval('agronomic_type') != 'bottled-wine', + }, depends=['agronomic_type']) + capacity = fields.Function(fields.Numeric('Capacity', digits=(16, 2), + states={ + 'invisible': Eval('agronomic_type') != 'bottled-wine', + }, depends=['agronomic_type']), 'get_capacity', + searcher='search_capacity') + + def get_capacity(self, name): + if self.container: + return self.container.capacity + + @classmethod + def search_capacity(cls, name, clause): + return [('container.capacity',) + tuple(clause[1:])] + + +class Product(metaclass=PoolMeta): + __name__ = 'product.product' + + vintages = fields.Many2Many('product.product-agronomics.crop', 'product', + 'crop', 'Vintages') + varieties = fields.Many2Many('product.product-product.taxon', 'product', + 'variety', 'Varieties') + denominations_of_origin = fields.Many2Many( + 'product.product-agronomics.denomination_of_origin', 'product', + 'do', 'DOs', + states={ + 'invisible': Eval('agronomic_type').in_( + ['not-do-wort'] + ) + }, depends=['agronomic_type']) + ecologicals = fields.Many2Many('product.product-agronomics.ecological', + 'product', 'ecological', 'Ecologicals') + quality_sample = fields.Many2One('quality.sample', 'Quality Sample', + states={ + 'invisible': ~ Eval('agronomic_type').in_( + ['wine', 'bottled-wine'] + ) + }, depends=['agronomic_type']) + certification = fields.Many2One('agronomics.certification', + 'Certification', states={ + 'invisible': ~ Eval('agronomic_type').in_( + ['wine', 'bottled-wine'] + ) + }, depends=['agronomic_type']) + alcohol_volume = fields.Numeric('Alcohol Volume', digits=(16, 2), states={ + 'invisible': ~ Eval('agronomic_type').in_( + ['wine', 'bottled-wine'] + )}, depends=['agronomic_type']) + + @classmethod + def validate(cls, products): + for product in products: + if (product.agronomic_type in + ['grape', 'do-wort', 'not-do-wort', 'bottled-wine']): + if len(product.vintages) > 1: + raise UserError(gettext('agronomics.msg_vintage_limit', + product=product.rec_name)) + if (product.agronomic_type in + ['grape']): + if len(product.varieties) > 1: + raise UserError(gettext('agronomics.msg_variety_limit', + product=product.rec_name)) + + +class ProductCrop(ModelSQL): + "Product - Crop" + __name__ = 'product.product-agronomics.crop' + product = fields.Many2One('product.product', 'Product', + ondelete='CASCADE', select=True, required=True) + crop = fields.Many2One('agronomics.crop', 'Crop', + ondelete='CASCADE', select=True, required=True) + + +class ProductVariety(ModelSQL): + "Product - Variety" + __name__ = 'product.product-product.taxon' + product = fields.Many2One('product.product', 'Product', + ondelete='CASCADE', select=True, required=True) + variety = fields.Many2One('product.taxon', 'Variety', + ondelete='CASCADE', select=True, required=True) + + +class ProductDO(ModelSQL): + "Product - DO" + __name__ = 'product.product-agronomics.denomination_of_origin' + product = fields.Many2One('product.product', 'Product', + ondelete='CASCADE', select=True, required=True) + do = fields.Many2One('agronomics.denomination_of_origin', 'DO', + ondelete='CASCADE', select=True, required=True) + + +class ProductEcological(ModelSQL): + "Product - Ecological" + __name__ = 'product.product-agronomics.ecological' + product = fields.Many2One('product.product', 'Product', + ondelete='CASCADE', select=True, required=True) + ecological = fields.Many2One('agronomics.ecological', 'Ecological', + ondelete='CASCADE', select=True, required=True) \ No newline at end of file diff --git a/product.xml b/product.xml new file mode 100644 index 0000000..3150f14 --- /dev/null +++ b/product.xml @@ -0,0 +1,159 @@ + + + + + product.template + template_form + + + + product.template + template_list + + + + + product.product + product_form + + + + product.product + product_list + + + + + agronomics.certification + form + certification_form + + + agronomics.certification + tree + + certification_list + + + + Certification + agronomics.certification + + + + + + + + + + + + + + + + + + + + + + + + + + agronomics.container + form + container_form + + + agronomics.container + tree + + container_list + + + + Container + agronomics.container + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tryton.cfg b/tryton.cfg index e0810ab..d67166e 100644 --- a/tryton.cfg +++ b/tryton.cfg @@ -4,7 +4,9 @@ depends: party product_classification product_classification_taxonomic + quality_control_sample xml: plot.xml party.xml message.xml + product.xml diff --git a/view/certification_form.xml b/view/certification_form.xml new file mode 100644 index 0000000..8d2065d --- /dev/null +++ b/view/certification_form.xml @@ -0,0 +1,6 @@ +
+