From 07446abd3aa72a530dd7642096458465aca36543 Mon Sep 17 00:00:00 2001 From: sergio-teruel Date: Wed, 11 Oct 2023 17:03:22 +0200 Subject: [PATCH 1/9] [ADD] product_ingredient: New module --- product_ingredient/README.rst | 98 ++++ product_ingredient/__init__.py | 1 + product_ingredient/__manifest__.py | 24 + .../data/product_allergen_data.xml | 10 + product_ingredient/models/__init__.py | 8 + .../models/product_attribute.py | 14 + .../models/product_attribute_value.py | 14 + .../models/product_ingredient.py | 19 + .../models/product_ingredient_value.py | 18 + product_ingredient/models/product_product.py | 31 ++ product_ingredient/models/product_template.py | 18 + .../models/production_lot_ingredient_value.py | 19 + .../models/stock_production_lot.py | 45 ++ product_ingredient/readme/CONTRIBUTORS.rst | 4 + product_ingredient/readme/DESCRIPTION.rst | 1 + product_ingredient/readme/USAGE.rst | 7 + .../security/ir.model.access.csv | 4 + .../static/description/index.html | 438 ++++++++++++++++++ .../views/product_attribute_value_views.xml | 17 + .../views/product_ingredient_views.xml | 19 + product_ingredient/views/product_views.xml | 76 +++ .../views/stock_production_lot_view.xml | 36 ++ 22 files changed, 921 insertions(+) create mode 100644 product_ingredient/README.rst create mode 100644 product_ingredient/__init__.py create mode 100644 product_ingredient/__manifest__.py create mode 100644 product_ingredient/data/product_allergen_data.xml create mode 100644 product_ingredient/models/__init__.py create mode 100644 product_ingredient/models/product_attribute.py create mode 100644 product_ingredient/models/product_attribute_value.py create mode 100644 product_ingredient/models/product_ingredient.py create mode 100644 product_ingredient/models/product_ingredient_value.py create mode 100644 product_ingredient/models/product_product.py create mode 100644 product_ingredient/models/product_template.py create mode 100644 product_ingredient/models/production_lot_ingredient_value.py create mode 100644 product_ingredient/models/stock_production_lot.py create mode 100644 product_ingredient/readme/CONTRIBUTORS.rst create mode 100644 product_ingredient/readme/DESCRIPTION.rst create mode 100644 product_ingredient/readme/USAGE.rst create mode 100644 product_ingredient/security/ir.model.access.csv create mode 100644 product_ingredient/static/description/index.html create mode 100644 product_ingredient/views/product_attribute_value_views.xml create mode 100644 product_ingredient/views/product_ingredient_views.xml create mode 100644 product_ingredient/views/product_views.xml create mode 100644 product_ingredient/views/stock_production_lot_view.xml diff --git a/product_ingredient/README.rst b/product_ingredient/README.rst new file mode 100644 index 00000000000..9c87a2ae9eb --- /dev/null +++ b/product_ingredient/README.rst @@ -0,0 +1,98 @@ +=================== +Product Ingredients +=================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:1dc7d3334f8ad49a0cd0b9009ef8e79c847ce6603f4dc701c86765ab23097d56 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fproduct--attribute-lightgray.png?logo=github + :target: https://github.com/OCA/product-attribute/tree/15.0/product_ingredient + :alt: OCA/product-attribute +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/product-attribute-15-0/product-attribute-15-0-product_ingredient + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/webui/builds.html?repo=OCA/product-attribute&target_branch=15.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module allows to set ingredients information for a given product. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +To use this module you have to: + +- Create or edit a product variant or product template with just a variant. +- Go to ingredients page +- Create some ingredients for the product. + +Now you can print the "Ingredients Info" report label. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Tecnativa + +Contributors +~~~~~~~~~~~~ + +* `Tecnativa `_ + + * Sergio Teruel + * Carlos Dauden + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +.. |maintainer-sergio-teruel| image:: https://github.com/sergio-teruel.png?size=40px + :target: https://github.com/sergio-teruel + :alt: sergio-teruel + +Current `maintainer `__: + +|maintainer-sergio-teruel| + +This module is part of the `OCA/product-attribute `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/product_ingredient/__init__.py b/product_ingredient/__init__.py new file mode 100644 index 00000000000..0650744f6bc --- /dev/null +++ b/product_ingredient/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/product_ingredient/__manifest__.py b/product_ingredient/__manifest__.py new file mode 100644 index 00000000000..e163b299dee --- /dev/null +++ b/product_ingredient/__manifest__.py @@ -0,0 +1,24 @@ +# Copyright 2023 Tecnativa - Sergio Teruel +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + "name": "Product Ingredients", + "summary": "Product ingredients", + "version": "15.0.1.0.0", + "development_status": "Beta", + "category": "Technical Settings", + "website": "https://github.com/OCA/product-attribute", + "author": "Tecnativa, Odoo Community Association (OCA)", + "maintainers": ["sergio-teruel"], + "license": "AGPL-3", + "depends": ["product", "stock"], + "data": [ + "security/ir.model.access.csv", + "data/product_allergen_data.xml", + "views/product_attribute_value_views.xml", + "views/product_ingredient_views.xml", + "views/product_views.xml", + "views/stock_production_lot_view.xml", + ], + "application": False, + "installable": True, +} diff --git a/product_ingredient/data/product_allergen_data.xml b/product_ingredient/data/product_allergen_data.xml new file mode 100644 index 00000000000..c132ce4a922 --- /dev/null +++ b/product_ingredient/data/product_allergen_data.xml @@ -0,0 +1,10 @@ + + + + + Allergens + no_variant + select + + + diff --git a/product_ingredient/models/__init__.py b/product_ingredient/models/__init__.py new file mode 100644 index 00000000000..282fb8e3a8d --- /dev/null +++ b/product_ingredient/models/__init__.py @@ -0,0 +1,8 @@ +from . import product_attribute +from . import product_attribute_value +from . import stock_production_lot +from . import product_ingredient +from . import product_ingredient_value +from . import production_lot_ingredient_value +from . import product_product +from . import product_template diff --git a/product_ingredient/models/product_attribute.py b/product_ingredient/models/product_attribute.py new file mode 100644 index 00000000000..edacd1a0ba7 --- /dev/null +++ b/product_ingredient/models/product_attribute.py @@ -0,0 +1,14 @@ +# Copyright 2023 Tecnativa - Carlos Dauden +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import api, models +from odoo.tools import ormcache + + +class ProductAttribute(models.Model): + _inherit = "product.attribute" + + @api.model + @ormcache() + def get_allergen_id(self): + """Helper to get allergen attribute id""" + return self.env.ref("product_ingredient.product_allergen_attribute").id diff --git a/product_ingredient/models/product_attribute_value.py b/product_ingredient/models/product_attribute_value.py new file mode 100644 index 00000000000..9c00eaad9e5 --- /dev/null +++ b/product_ingredient/models/product_attribute_value.py @@ -0,0 +1,14 @@ +# Copyright 2023 Tecnativa - Carlos Dauden +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import api, models + + +class ProductAttributeValue(models.Model): + _inherit = "product.attribute.value" + + @api.model + def default_get(self, fields_list): + res = super().default_get(fields_list) + if self.env.context.get("set_allergen_attribute"): + res["attribute_id"] = self.env["product.attribute"].get_allergen_id() + return res diff --git a/product_ingredient/models/product_ingredient.py b/product_ingredient/models/product_ingredient.py new file mode 100644 index 00000000000..b102dfffa5f --- /dev/null +++ b/product_ingredient/models/product_ingredient.py @@ -0,0 +1,19 @@ +# Copyright 2023 Tecnativa - Sergio Teruel +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import fields, models + + +class ProductIngredients(models.Model): + _name = "product.ingredient" + _description = "Ingredients of a product." + + name = fields.Char(translate=True) + scientific_name = fields.Char() + allergen_id = fields.Many2one( + comodel_name="product.attribute.value", + domain=lambda self: [ + ("attribute_id", "=", self.env["product.attribute"].get_allergen_id()) + ], + context={"set_allergen_attribute": True, "show_attribute": False}, + ) + is_allergen = fields.Boolean() diff --git a/product_ingredient/models/product_ingredient_value.py b/product_ingredient/models/product_ingredient_value.py new file mode 100644 index 00000000000..9a295824c9c --- /dev/null +++ b/product_ingredient/models/product_ingredient_value.py @@ -0,0 +1,18 @@ +# Copyright 2023 Tecnativa - Sergio Teruel +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import fields, models + + +class ProductIngredientValue(models.Model): + _name = "product.ingredient.value" + _description = "Ingredient values for a product." + _rec_name = "ingredient_id" + _order = "sequence, id" + + sequence = fields.Integer() + product_id = fields.Many2one(comodel_name="product.product") + ingredient_id = fields.Many2one(comodel_name="product.ingredient") + scientific_name = fields.Char(related="ingredient_id.scientific_name") + allergen_id = fields.Many2one(related="ingredient_id.allergen_id") + percentage = fields.Float(digits="Product Unit of Measure") + is_allergen = fields.Boolean(related="ingredient_id.is_allergen") diff --git a/product_ingredient/models/product_product.py b/product_ingredient/models/product_product.py new file mode 100644 index 00000000000..c521587ad57 --- /dev/null +++ b/product_ingredient/models/product_product.py @@ -0,0 +1,31 @@ +# Copyright 2023 Tecnativa - Sergio Teruel +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import api, fields, models + + +class ProductProduct(models.Model): + _inherit = "product.product" + + allergen_id = fields.Many2many( + comodel_name="product.attribute.value", compute="_compute_allergen_id" + ) + ingredient_ids = fields.One2many( + comodel_name="product.ingredient.value", inverse_name="product_id" + ) + ingredient_allergen_trace_ids = fields.Many2many( + comodel_name="product.attribute.value", + string="Allergen traces", + domain=lambda self: [ + ("attribute_id", "=", self.env["product.attribute"].get_allergen_id()) + ], + context={"set_allergen_attribute": True, "show_attribute": False}, + ) + ingredient_additional_info = fields.Text(translate=True) + + @api.depends("ingredient_ids", "ingredient_allergen_trace_ids") + def _compute_allergen_id(self): + for product in self: + product.allergen_id = ( + product.ingredient_ids.mapped("allergen_id") + + product.ingredient_allergen_trace_ids + ) diff --git a/product_ingredient/models/product_template.py b/product_ingredient/models/product_template.py new file mode 100644 index 00000000000..c7b497f02a5 --- /dev/null +++ b/product_ingredient/models/product_template.py @@ -0,0 +1,18 @@ +# Copyright 2023 Tecnativa - Sergio Teruel +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import fields, models + + +class ProductTemplate(models.Model): + _inherit = "product.template" + + allergen_id = fields.Many2many(related="product_variant_ids.allergen_id") + ingredient_ids = fields.One2many( + related="product_variant_ids.ingredient_ids", readonly=False + ) + ingredient_allergen_trace_ids = fields.Many2many( + related="product_variant_ids.ingredient_allergen_trace_ids", readonly=False + ) + ingredient_additional_info = fields.Text( + related="product_variant_ids.ingredient_additional_info", readonly=False + ) diff --git a/product_ingredient/models/production_lot_ingredient_value.py b/product_ingredient/models/production_lot_ingredient_value.py new file mode 100644 index 00000000000..26abb033087 --- /dev/null +++ b/product_ingredient/models/production_lot_ingredient_value.py @@ -0,0 +1,19 @@ +# Copyright 2023 Tecnativa - Sergio Teruel +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import fields, models + + +class ProductionLotIngredientValue(models.Model): + _name = "production.lot.ingredient.value" + _description = "Ingredient values for a product lots." + _rec_name = "ingredient_id" + _order = "sequence, id" + + sequence = fields.Integer() + lot_id = fields.Many2one(comodel_name="stock.production.lot") + # product_id = fields.Many2one(related='lot_id.product_id') + ingredient_id = fields.Many2one(comodel_name="product.ingredient") + scientific_name = fields.Char(related="ingredient_id.scientific_name") + allergen_id = fields.Many2one(related="ingredient_id.allergen_id") + percentage = fields.Float(digits="Product Unit of Measure") + is_allergen = fields.Boolean(related="ingredient_id.is_allergen") diff --git a/product_ingredient/models/stock_production_lot.py b/product_ingredient/models/stock_production_lot.py new file mode 100644 index 00000000000..c6b2bfc6373 --- /dev/null +++ b/product_ingredient/models/stock_production_lot.py @@ -0,0 +1,45 @@ +# Copyright 2023 Tecnativa - Sergio Teruel +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import api, fields, models + + +class StockProductionLot(models.Model): + _inherit = "stock.production.lot" + + ingredient_ids = fields.One2many( + comodel_name="production.lot.ingredient.value", + inverse_name="lot_id", + compute="_compute_ingredient_values", + store=True, + readonly=False, + ) + ingredient_allergen_trace_ids = fields.Many2many( + comodel_name="product.attribute.value", + compute="_compute_ingredient_values", + readonly=False, + domain=lambda self: [ + ("attribute_id", "=", self.env["product.attribute"].get_allergen_id()) + ], + context={"set_allergen_attribute": True, "show_attribute": False}, + store=True, + ) + ingredient_additional_info = fields.Text( + compute="_compute_ingredient_values", readonly=False, store=True, translate=True + ) + + @api.depends("product_id") + def _compute_ingredient_values(self): + self.ingredient_ids = False + for lot in self: + for ingredient_line in lot.product_id.ingredient_ids: + lot.ingredient_ids += self.env["production.lot.ingredient.value"].new( + { + "sequence": ingredient_line.sequence, + "ingredient_id": ingredient_line.ingredient_id.id, + "percentage": ingredient_line.percentage, + } + ) + lot.ingredient_allergen_trace_ids = ( + lot.product_id.ingredient_allergen_trace_ids + ) + lot.ingredient_additional_info = lot.product_id.ingredient_additional_info diff --git a/product_ingredient/readme/CONTRIBUTORS.rst b/product_ingredient/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000000..12df71f65d4 --- /dev/null +++ b/product_ingredient/readme/CONTRIBUTORS.rst @@ -0,0 +1,4 @@ +* `Tecnativa `_ + + * Sergio Teruel + * Carlos Dauden diff --git a/product_ingredient/readme/DESCRIPTION.rst b/product_ingredient/readme/DESCRIPTION.rst new file mode 100644 index 00000000000..f5490ee8b09 --- /dev/null +++ b/product_ingredient/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +This module allows to set ingredients information for a given product. diff --git a/product_ingredient/readme/USAGE.rst b/product_ingredient/readme/USAGE.rst new file mode 100644 index 00000000000..0c76da39252 --- /dev/null +++ b/product_ingredient/readme/USAGE.rst @@ -0,0 +1,7 @@ +To use this module you have to: + +- Create or edit a product variant or product template with just a variant. +- Go to ingredients page +- Create some ingredients for the product. + +Now you can print the "Ingredients Info" report label. diff --git a/product_ingredient/security/ir.model.access.csv b/product_ingredient/security/ir.model.access.csv new file mode 100644 index 00000000000..bccc1b2e6ad --- /dev/null +++ b/product_ingredient/security/ir.model.access.csv @@ -0,0 +1,4 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +product_ingredient.access_product_ingredient,access_product_ingredient,product_ingredient.model_product_ingredient,base.group_user,1,1,1,1 +product_ingredient.access_product_ingredient_value,access_product_ingredient_value,product_ingredient.model_product_ingredient_value,base.group_user,1,1,1,1 +product_ingredient.access_production_lot_ingredient_value,access_production_lot_ingredient_value,product_ingredient.model_production_lot_ingredient_value,base.group_user,1,1,1,1 diff --git a/product_ingredient/static/description/index.html b/product_ingredient/static/description/index.html new file mode 100644 index 00000000000..51eba693b12 --- /dev/null +++ b/product_ingredient/static/description/index.html @@ -0,0 +1,438 @@ + + + + + + +Product Ingredients + + + +
+

Product Ingredients

+ + +

Beta License: AGPL-3 OCA/product-attribute Translate me on Weblate Try me on Runboat

+

This module allows to set ingredients information for a given product.

+

Table of contents

+ +
+

Usage

+

To use this module you have to:

+
    +
  • Create or edit a product variant or product template with just a variant.
  • +
  • Go to ingredients page
  • +
  • Create some ingredients for the product.
  • +
+

Now you can print the “Ingredients Info” report label.

+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Tecnativa
  • +
+
+
+

Contributors

+
    +
  • Tecnativa
      +
    • Sergio Teruel
    • +
    • Carlos Dauden
    • +
    +
  • +
+
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

Current maintainer:

+

sergio-teruel

+

This module is part of the OCA/product-attribute project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/product_ingredient/views/product_attribute_value_views.xml b/product_ingredient/views/product_attribute_value_views.xml new file mode 100644 index 00000000000..536b0f78995 --- /dev/null +++ b/product_ingredient/views/product_attribute_value_views.xml @@ -0,0 +1,17 @@ + + + + product.attribute.value.form + product.attribute.value + +
+ + + + + + +
+
+
+
diff --git a/product_ingredient/views/product_ingredient_views.xml b/product_ingredient/views/product_ingredient_views.xml new file mode 100644 index 00000000000..0f466a9128e --- /dev/null +++ b/product_ingredient/views/product_ingredient_views.xml @@ -0,0 +1,19 @@ + + + + product.ingredient.form.view + product.ingredient + +
+ + + + + + + + +
+
+
+
diff --git a/product_ingredient/views/product_views.xml b/product_ingredient/views/product_views.xml new file mode 100644 index 00000000000..7d750d19391 --- /dev/null +++ b/product_ingredient/views/product_views.xml @@ -0,0 +1,76 @@ + + + + + product.product + + + + + + + + + + + + + + + + + + + + + + + + + + + + product.template + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/product_ingredient/views/stock_production_lot_view.xml b/product_ingredient/views/stock_production_lot_view.xml new file mode 100644 index 00000000000..4557d5e8713 --- /dev/null +++ b/product_ingredient/views/stock_production_lot_view.xml @@ -0,0 +1,36 @@ + + + + + + stock.production.lot + + + + + + + + + + + + + + + + + + + + + + + From 2c9e46c29293f504fa84a7daeadfc67a9cbd07b2 Mon Sep 17 00:00:00 2001 From: Carlos Dauden Date: Mon, 6 Nov 2023 19:40:41 +0100 Subject: [PATCH 2/9] [FIX] product_ingredient: Create product_allergen_attribute in pre_init_hook --- product_ingredient/__init__.py | 1 + product_ingredient/__manifest__.py | 2 ++ product_ingredient/data/product_allergen_data.xml | 3 +-- product_ingredient/hooks.py | 11 +++++++++++ 4 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 product_ingredient/hooks.py diff --git a/product_ingredient/__init__.py b/product_ingredient/__init__.py index 0650744f6bc..6d58305f5dd 100644 --- a/product_ingredient/__init__.py +++ b/product_ingredient/__init__.py @@ -1 +1,2 @@ from . import models +from .hooks import pre_init_hook diff --git a/product_ingredient/__manifest__.py b/product_ingredient/__manifest__.py index e163b299dee..6035d0ddac4 100644 --- a/product_ingredient/__manifest__.py +++ b/product_ingredient/__manifest__.py @@ -11,6 +11,7 @@ "maintainers": ["sergio-teruel"], "license": "AGPL-3", "depends": ["product", "stock"], + "external_dependencies": {"python": ["openupgradelib"]}, "data": [ "security/ir.model.access.csv", "data/product_allergen_data.xml", @@ -19,6 +20,7 @@ "views/product_views.xml", "views/stock_production_lot_view.xml", ], + "pre_init_hook": "pre_init_hook", "application": False, "installable": True, } diff --git a/product_ingredient/data/product_allergen_data.xml b/product_ingredient/data/product_allergen_data.xml index c132ce4a922..b092685c9d8 100644 --- a/product_ingredient/data/product_allergen_data.xml +++ b/product_ingredient/data/product_allergen_data.xml @@ -1,10 +1,9 @@ + - Allergens no_variant select - diff --git a/product_ingredient/hooks.py b/product_ingredient/hooks.py new file mode 100644 index 00000000000..5697fddbe41 --- /dev/null +++ b/product_ingredient/hooks.py @@ -0,0 +1,11 @@ +# Copyright 2023 Tecnativa - Carlos Dauden +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +from openupgradelib import openupgrade + + +def pre_init_hook(cr): + """ + Create product_allergen_attribute to can be used in get_allergen_id() used in compute + methods + """ + openupgrade.load_data(cr, "product_ingredient", "data/product_allergen_data.xml") From 8ce421f60fa4bc96caef97f08b83b4b76a39e175 Mon Sep 17 00:00:00 2001 From: Carlos Dauden Date: Wed, 9 Oct 2024 16:04:08 +0200 Subject: [PATCH 3/9] [FIX] product_ingredient: Field ingredient_ids is not store when it is not in view TT51200 --- product_ingredient/README.rst | 4 +- .../i18n/product_ingredient.pot | 188 ++++++++++++++++++ .../models/stock_production_lot.py | 19 +- .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 46 +++-- 5 files changed, 226 insertions(+), 31 deletions(-) create mode 100644 product_ingredient/i18n/product_ingredient.pot create mode 100644 product_ingredient/static/description/icon.png diff --git a/product_ingredient/README.rst b/product_ingredient/README.rst index 9c87a2ae9eb..df39ecf14d8 100644 --- a/product_ingredient/README.rst +++ b/product_ingredient/README.rst @@ -7,7 +7,7 @@ Product Ingredients !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:1dc7d3334f8ad49a0cd0b9009ef8e79c847ce6603f4dc701c86765ab23097d56 + !! source digest: sha256:7f088b3719ce22a7fa5851e30da9f08533efba31f397b17b841bcd1e3c828193 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png @@ -23,7 +23,7 @@ Product Ingredients :target: https://translation.odoo-community.org/projects/product-attribute-15-0/product-attribute-15-0-product_ingredient :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png - :target: https://runboat.odoo-community.org/webui/builds.html?repo=OCA/product-attribute&target_branch=15.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/product-attribute&target_branch=15.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| diff --git a/product_ingredient/i18n/product_ingredient.pot b/product_ingredient/i18n/product_ingredient.pot new file mode 100644 index 00000000000..9f36c9844f4 --- /dev/null +++ b/product_ingredient/i18n/product_ingredient.pot @@ -0,0 +1,188 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * product_ingredient +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: product_ingredient +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient__allergen_id +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient_value__allergen_id +#: model:ir.model.fields,field_description:product_ingredient.field_product_product__allergen_id +#: model:ir.model.fields,field_description:product_ingredient.field_product_template__allergen_id +#: model:ir.model.fields,field_description:product_ingredient.field_production_lot_ingredient_value__allergen_id +msgid "Allergen" +msgstr "" + +#. module: product_ingredient +#: model:ir.model.fields,field_description:product_ingredient.field_product_product__ingredient_allergen_trace_ids +#: model:ir.model.fields,field_description:product_ingredient.field_product_template__ingredient_allergen_trace_ids +msgid "Allergen traces" +msgstr "" + +#. module: product_ingredient +#: model:product.attribute,name:product_ingredient.product_allergen_attribute +msgid "Allergens" +msgstr "" + +#. module: product_ingredient +#: model:ir.model,name:product_ingredient.model_product_attribute_value +msgid "Attribute Value" +msgstr "" + +#. module: product_ingredient +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient__create_uid +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient_value__create_uid +#: model:ir.model.fields,field_description:product_ingredient.field_production_lot_ingredient_value__create_uid +msgid "Created by" +msgstr "" + +#. module: product_ingredient +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient__create_date +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient_value__create_date +#: model:ir.model.fields,field_description:product_ingredient.field_production_lot_ingredient_value__create_date +msgid "Created on" +msgstr "" + +#. module: product_ingredient +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient__display_name +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient_value__display_name +#: model:ir.model.fields,field_description:product_ingredient.field_production_lot_ingredient_value__display_name +msgid "Display Name" +msgstr "" + +#. module: product_ingredient +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient__id +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient_value__id +#: model:ir.model.fields,field_description:product_ingredient.field_production_lot_ingredient_value__id +msgid "ID" +msgstr "" + +#. module: product_ingredient +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient_value__ingredient_id +#: model:ir.model.fields,field_description:product_ingredient.field_product_product__ingredient_ids +#: model:ir.model.fields,field_description:product_ingredient.field_product_template__ingredient_ids +#: model:ir.model.fields,field_description:product_ingredient.field_production_lot_ingredient_value__ingredient_id +#: model:ir.model.fields,field_description:product_ingredient.field_stock_production_lot__ingredient_ids +msgid "Ingredient" +msgstr "" + +#. module: product_ingredient +#: model:ir.model.fields,field_description:product_ingredient.field_product_product__ingredient_additional_info +#: model:ir.model.fields,field_description:product_ingredient.field_product_template__ingredient_additional_info +#: model:ir.model.fields,field_description:product_ingredient.field_stock_production_lot__ingredient_additional_info +msgid "Ingredient Additional Info" +msgstr "" + +#. module: product_ingredient +#: model:ir.model.fields,field_description:product_ingredient.field_stock_production_lot__ingredient_allergen_trace_ids +msgid "Ingredient Allergen Trace" +msgstr "" + +#. module: product_ingredient +#: model:ir.model,name:product_ingredient.model_production_lot_ingredient_value +msgid "Ingredient values for a product lots." +msgstr "" + +#. module: product_ingredient +#: model:ir.model,name:product_ingredient.model_product_ingredient_value +msgid "Ingredient values for a product." +msgstr "" + +#. module: product_ingredient +#: model_terms:ir.ui.view,arch_db:product_ingredient.product_normal_form_view +#: model_terms:ir.ui.view,arch_db:product_ingredient.product_template_only_form_view +#: model_terms:ir.ui.view,arch_db:product_ingredient.view_production_lot_form +msgid "Ingredients" +msgstr "" + +#. module: product_ingredient +#: model:ir.model,name:product_ingredient.model_product_ingredient +msgid "Ingredients of a product." +msgstr "" + +#. module: product_ingredient +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient__is_allergen +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient_value__is_allergen +#: model:ir.model.fields,field_description:product_ingredient.field_production_lot_ingredient_value__is_allergen +msgid "Is Allergen" +msgstr "" + +#. module: product_ingredient +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient____last_update +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient_value____last_update +#: model:ir.model.fields,field_description:product_ingredient.field_production_lot_ingredient_value____last_update +msgid "Last Modified on" +msgstr "" + +#. module: product_ingredient +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient__write_uid +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient_value__write_uid +#: model:ir.model.fields,field_description:product_ingredient.field_production_lot_ingredient_value__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: product_ingredient +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient__write_date +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient_value__write_date +#: model:ir.model.fields,field_description:product_ingredient.field_production_lot_ingredient_value__write_date +msgid "Last Updated on" +msgstr "" + +#. module: product_ingredient +#: model:ir.model.fields,field_description:product_ingredient.field_production_lot_ingredient_value__lot_id +msgid "Lot" +msgstr "" + +#. module: product_ingredient +#: model:ir.model,name:product_ingredient.model_stock_production_lot +msgid "Lot/Serial" +msgstr "" + +#. module: product_ingredient +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient__name +msgid "Name" +msgstr "" + +#. module: product_ingredient +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient_value__percentage +#: model:ir.model.fields,field_description:product_ingredient.field_production_lot_ingredient_value__percentage +msgid "Percentage" +msgstr "" + +#. module: product_ingredient +#: model:ir.model,name:product_ingredient.model_product_product +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient_value__product_id +msgid "Product" +msgstr "" + +#. module: product_ingredient +#: model:ir.model,name:product_ingredient.model_product_attribute +msgid "Product Attribute" +msgstr "" + +#. module: product_ingredient +#: model:ir.model,name:product_ingredient.model_product_template +msgid "Product Template" +msgstr "" + +#. module: product_ingredient +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient__scientific_name +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient_value__scientific_name +#: model:ir.model.fields,field_description:product_ingredient.field_production_lot_ingredient_value__scientific_name +msgid "Scientific Name" +msgstr "" + +#. module: product_ingredient +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient_value__sequence +#: model:ir.model.fields,field_description:product_ingredient.field_production_lot_ingredient_value__sequence +msgid "Sequence" +msgstr "" diff --git a/product_ingredient/models/stock_production_lot.py b/product_ingredient/models/stock_production_lot.py index c6b2bfc6373..8a5a3de3f5a 100644 --- a/product_ingredient/models/stock_production_lot.py +++ b/product_ingredient/models/stock_production_lot.py @@ -29,16 +29,21 @@ class StockProductionLot(models.Model): @api.depends("product_id") def _compute_ingredient_values(self): - self.ingredient_ids = False for lot in self: + ingredient_list = [(5, 0, 0)] for ingredient_line in lot.product_id.ingredient_ids: - lot.ingredient_ids += self.env["production.lot.ingredient.value"].new( - { - "sequence": ingredient_line.sequence, - "ingredient_id": ingredient_line.ingredient_id.id, - "percentage": ingredient_line.percentage, - } + ingredient_list.append( + ( + 0, + 0, + { + "sequence": ingredient_line.sequence, + "ingredient_id": ingredient_line.ingredient_id.id, + "percentage": ingredient_line.percentage, + }, + ) ) + lot.ingredient_ids = ingredient_list lot.ingredient_allergen_trace_ids = ( lot.product_id.ingredient_allergen_trace_ids ) diff --git a/product_ingredient/static/description/icon.png b/product_ingredient/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/product_ingredient/static/description/index.html b/product_ingredient/static/description/index.html index 51eba693b12..ae4352d04c4 100644 --- a/product_ingredient/static/description/index.html +++ b/product_ingredient/static/description/index.html @@ -1,20 +1,20 @@ - - + Product Ingredients -
-

Product Ingredients

+
+ + +Odoo Community Association + +
+

Product Ingredients

-

Beta License: AGPL-3 OCA/product-attribute Translate me on Weblate Try me on Runboat

+

Beta License: AGPL-3 OCA/product-attribute Translate me on Weblate Try me on Runboat

This module allows to set ingredients information for a given product.

Table of contents

@@ -385,7 +390,7 @@

Product Ingredients

-

Usage

+

Usage

To use this module you have to:

  • Create or edit a product variant or product template with just a @@ -396,7 +401,7 @@

    Usage

    Now you can print the “Ingredients Info” report label.

-

Bug Tracker

+

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed @@ -404,15 +409,15 @@

Bug Tracker

Do not contact contributors directly about support or help with technical issues.

-

Credits

+

Credits

-

Authors

+

Authors

  • Tecnativa
-

Contributors

+

Contributors

-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association @@ -437,5 +442,6 @@

Maintainers

+
diff --git a/product_ingredient/views/product_views.xml b/product_ingredient/views/product_views.xml index 7d750d19391..e673e659230 100644 --- a/product_ingredient/views/product_views.xml +++ b/product_ingredient/views/product_views.xml @@ -7,21 +7,21 @@ - + - + - + - + @@ -30,7 +30,7 @@ widget="many2many_tags" /> - + @@ -44,7 +44,7 @@ - + - + - + diff --git a/product_ingredient/views/stock_production_lot_view.xml b/product_ingredient/views/stock_lot_view.xml similarity index 85% rename from product_ingredient/views/stock_production_lot_view.xml rename to product_ingredient/views/stock_lot_view.xml index fe5d07f096a..0748d2a9378 100644 --- a/product_ingredient/views/stock_production_lot_view.xml +++ b/product_ingredient/views/stock_lot_view.xml @@ -2,7 +2,7 @@ - stock.production.lot + stock.lot @@ -11,14 +11,14 @@ nolabel="1" context="{'show_attribute': False}" > - + - + - + Date: Tue, 31 Mar 2026 09:07:59 +0000 Subject: [PATCH 7/9] Added translation using Weblate (Italian) --- product_ingredient/i18n/it.po | 184 ++++++++++++++++++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 product_ingredient/i18n/it.po diff --git a/product_ingredient/i18n/it.po b/product_ingredient/i18n/it.po new file mode 100644 index 00000000000..4657f810315 --- /dev/null +++ b/product_ingredient/i18n/it.po @@ -0,0 +1,184 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * product_ingredient +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2026-04-14 14:45+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.15.2\n" + +#. module: product_ingredient +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient__allergen_id +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient_value__allergen_id +#: model:ir.model.fields,field_description:product_ingredient.field_stock_lot_ingredient_value__allergen_id +msgid "Allergen" +msgstr "Allergene" + +#. module: product_ingredient +#: model:ir.model.fields,field_description:product_ingredient.field_product_product__ingredient_allergen_trace_ids +#: model:ir.model.fields,field_description:product_ingredient.field_product_template__ingredient_allergen_trace_ids +msgid "Allergen traces" +msgstr "Traccie di allergene" + +#. module: product_ingredient +#: model:ir.model.fields,field_description:product_ingredient.field_product_product__allergen_ids +#: model:ir.model.fields,field_description:product_ingredient.field_product_template__allergen_ids +#: model:product.attribute,name:product_ingredient.product_allergen_attribute +msgid "Allergens" +msgstr "Allergeni" + +#. module: product_ingredient +#: model:ir.model,name:product_ingredient.model_product_attribute_value +msgid "Attribute Value" +msgstr "Valore attributo" + +#. module: product_ingredient +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient__create_uid +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient_value__create_uid +#: model:ir.model.fields,field_description:product_ingredient.field_stock_lot_ingredient_value__create_uid +msgid "Created by" +msgstr "Creato da" + +#. module: product_ingredient +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient__create_date +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient_value__create_date +#: model:ir.model.fields,field_description:product_ingredient.field_stock_lot_ingredient_value__create_date +msgid "Created on" +msgstr "Creato il" + +#. module: product_ingredient +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient__display_name +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient_value__display_name +#: model:ir.model.fields,field_description:product_ingredient.field_stock_lot_ingredient_value__display_name +msgid "Display Name" +msgstr "Nome visualizzato" + +#. module: product_ingredient +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient__id +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient_value__id +#: model:ir.model.fields,field_description:product_ingredient.field_stock_lot_ingredient_value__id +msgid "ID" +msgstr "ID" + +#. module: product_ingredient +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient_value__ingredient_id +#: model:ir.model.fields,field_description:product_ingredient.field_stock_lot__ingredient_ids +#: model:ir.model.fields,field_description:product_ingredient.field_stock_lot_ingredient_value__ingredient_id +msgid "Ingredient" +msgstr "Ingrediente" + +#. module: product_ingredient +#: model:ir.model.fields,field_description:product_ingredient.field_product_product__ingredient_additional_info +#: model:ir.model.fields,field_description:product_ingredient.field_product_template__ingredient_additional_info +#: model:ir.model.fields,field_description:product_ingredient.field_stock_lot__ingredient_additional_info +msgid "Ingredient Additional Info" +msgstr "Informazioni addizionali ingrediente" + +#. module: product_ingredient +#: model:ir.model.fields,field_description:product_ingredient.field_stock_lot__ingredient_allergen_trace_ids +msgid "Ingredient Allergen Trace" +msgstr "Traccia allergene ingrediente" + +#. module: product_ingredient +#: model:ir.model,name:product_ingredient.model_stock_lot_ingredient_value +msgid "Ingredient values for a product lots." +msgstr "Valori ingrediente per i lotti di un prodotto." + +#. module: product_ingredient +#: model:ir.model,name:product_ingredient.model_product_ingredient_value +msgid "Ingredient values for a product." +msgstr "Valori ingrediente per un prodotto." + +#. module: product_ingredient +#: model:ir.model.fields,field_description:product_ingredient.field_product_product__ingredient_ids +#: model:ir.model.fields,field_description:product_ingredient.field_product_template__ingredient_ids +#: model_terms:ir.ui.view,arch_db:product_ingredient.product_normal_form_view +#: model_terms:ir.ui.view,arch_db:product_ingredient.product_template_only_form_view +#: model_terms:ir.ui.view,arch_db:product_ingredient.view_production_lot_form +msgid "Ingredients" +msgstr "Ingredienti" + +#. module: product_ingredient +#: model:ir.model,name:product_ingredient.model_product_ingredient +msgid "Ingredients of a product." +msgstr "Ingredienti di un prodotto." + +#. module: product_ingredient +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient__is_allergen +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient_value__is_allergen +#: model:ir.model.fields,field_description:product_ingredient.field_stock_lot_ingredient_value__is_allergen +msgid "Is Allergen" +msgstr "È allergene" + +#. module: product_ingredient +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient__write_uid +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient_value__write_uid +#: model:ir.model.fields,field_description:product_ingredient.field_stock_lot_ingredient_value__write_uid +msgid "Last Updated by" +msgstr "Ultimo aggiornamento di" + +#. module: product_ingredient +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient__write_date +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient_value__write_date +#: model:ir.model.fields,field_description:product_ingredient.field_stock_lot_ingredient_value__write_date +msgid "Last Updated on" +msgstr "Ultimo aggiornamento il" + +#. module: product_ingredient +#: model:ir.model.fields,field_description:product_ingredient.field_stock_lot_ingredient_value__lot_id +msgid "Lot" +msgstr "Lotto" + +#. module: product_ingredient +#: model:ir.model,name:product_ingredient.model_stock_lot +msgid "Lot/Serial" +msgstr "Lotto/seriale" + +#. module: product_ingredient +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient__name +msgid "Name" +msgstr "Nome" + +#. module: product_ingredient +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient_value__percentage +#: model:ir.model.fields,field_description:product_ingredient.field_stock_lot_ingredient_value__percentage +msgid "Percentage" +msgstr "Percentuale" + +#. module: product_ingredient +#: model:ir.model,name:product_ingredient.model_product_template +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient_value__product_id +msgid "Product" +msgstr "Prodotto" + +#. module: product_ingredient +#: model:ir.model,name:product_ingredient.model_product_attribute +msgid "Product Attribute" +msgstr "Attributo prodotto" + +#. module: product_ingredient +#: model:ir.model,name:product_ingredient.model_product_product +msgid "Product Variant" +msgstr "Variante prodotto" + +#. module: product_ingredient +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient__scientific_name +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient_value__scientific_name +#: model:ir.model.fields,field_description:product_ingredient.field_stock_lot_ingredient_value__scientific_name +msgid "Scientific Name" +msgstr "Nome scientifico" + +#. module: product_ingredient +#: model:ir.model.fields,field_description:product_ingredient.field_product_ingredient_value__sequence +#: model:ir.model.fields,field_description:product_ingredient.field_stock_lot_ingredient_value__sequence +msgid "Sequence" +msgstr "Sequenza" From b8f91fda6aaad44cb464697206cb832f16f2d42d Mon Sep 17 00:00:00 2001 From: sergio-teruel Date: Sat, 18 Apr 2026 06:44:10 +0200 Subject: [PATCH 8/9] [FIX] product_ingredient: missing argument --- product_ingredient/README.rst | 2 +- product_ingredient/__manifest__.py | 2 +- product_ingredient/migrations/18.0.1.0.0/pre-migration.py | 2 +- product_ingredient/static/description/index.html | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/product_ingredient/README.rst b/product_ingredient/README.rst index 304383efaa1..7725a4a320e 100644 --- a/product_ingredient/README.rst +++ b/product_ingredient/README.rst @@ -11,7 +11,7 @@ Product Ingredients !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:721fca4c93bb1864318f5b735fab42f06b1ed9f8ed3e9a1776e170a3d80199d4 + !! source digest: sha256:8182b2531e945caaaf3b9f2e6eb279e48e9ccaffa0ff52c8f17f041f09022306 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/product_ingredient/__manifest__.py b/product_ingredient/__manifest__.py index a3e30af4a17..aeaa16ea93e 100644 --- a/product_ingredient/__manifest__.py +++ b/product_ingredient/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Product Ingredients", "summary": "Product ingredients", - "version": "18.0.1.0.0", + "version": "18.0.1.0.1", "development_status": "Beta", "category": "Technical Settings", "website": "https://github.com/OCA/product-attribute", diff --git a/product_ingredient/migrations/18.0.1.0.0/pre-migration.py b/product_ingredient/migrations/18.0.1.0.0/pre-migration.py index 238ea276fc2..31b36231899 100644 --- a/product_ingredient/migrations/18.0.1.0.0/pre-migration.py +++ b/product_ingredient/migrations/18.0.1.0.0/pre-migration.py @@ -16,4 +16,4 @@ def migrate(env, version): ("product.product", "product_product", "allergen_id", "allergen_ids"), ("product.template", "product_template", "allergen_id", "allergen_ids"), ] - openupgrade.rename_fields(fields_rename_spec) + openupgrade.rename_fields(env, fields_rename_spec) diff --git a/product_ingredient/static/description/index.html b/product_ingredient/static/description/index.html index 49290ae78ee..f7806b5ae0a 100644 --- a/product_ingredient/static/description/index.html +++ b/product_ingredient/static/description/index.html @@ -372,7 +372,7 @@

Product Ingredients

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:721fca4c93bb1864318f5b735fab42f06b1ed9f8ed3e9a1776e170a3d80199d4 +!! source digest: sha256:8182b2531e945caaaf3b9f2e6eb279e48e9ccaffa0ff52c8f17f041f09022306 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Beta License: AGPL-3 OCA/product-attribute Translate me on Weblate Try me on Runboat

This module allows to set ingredients information for a given product.

From aa51109e207112895ade37898147764c6b7544ea Mon Sep 17 00:00:00 2001 From: David Vidal Date: Thu, 30 Apr 2026 10:28:25 +0200 Subject: [PATCH 9/9] [MIG] product_ingredient: Migration to 16.0 MT-14764 --- product_ingredient/README.rst | 10 +-- product_ingredient/__manifest__.py | 2 +- .../pre-migration.py | 0 .../static/description/index.html | 6 +- product_ingredient/views/product_views.xml | 67 +++++++++---------- product_ingredient/views/stock_lot_view.xml | 6 +- .../odoo/addons/product_ingredient | 1 + setup/product_ingredient/setup.py | 6 ++ 8 files changed, 52 insertions(+), 46 deletions(-) rename product_ingredient/migrations/{18.0.1.0.0 => 16.0.1.0.0}/pre-migration.py (100%) create mode 120000 setup/product_ingredient/odoo/addons/product_ingredient create mode 100644 setup/product_ingredient/setup.py diff --git a/product_ingredient/README.rst b/product_ingredient/README.rst index 7725a4a320e..b1a5d744400 100644 --- a/product_ingredient/README.rst +++ b/product_ingredient/README.rst @@ -21,13 +21,13 @@ Product Ingredients :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fproduct--attribute-lightgray.png?logo=github - :target: https://github.com/OCA/product-attribute/tree/18.0/product_ingredient + :target: https://github.com/OCA/product-attribute/tree/16.0/product_ingredient :alt: OCA/product-attribute .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/product-attribute-18-0/product-attribute-18-0-product_ingredient + :target: https://translation.odoo-community.org/projects/product-attribute-16-0/product-attribute-16-0-product_ingredient :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png - :target: https://runboat.odoo-community.org/builds?repo=OCA/product-attribute&target_branch=18.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/product-attribute&target_branch=16.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -57,7 +57,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -98,6 +98,6 @@ Current `maintainer `__: |maintainer-sergio-teruel| -This module is part of the `OCA/product-attribute `_ project on GitHub. +This module is part of the `OCA/product-attribute `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/product_ingredient/__manifest__.py b/product_ingredient/__manifest__.py index aeaa16ea93e..37a52609f7a 100644 --- a/product_ingredient/__manifest__.py +++ b/product_ingredient/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Product Ingredients", "summary": "Product ingredients", - "version": "18.0.1.0.1", + "version": "16.0.1.0.1", "development_status": "Beta", "category": "Technical Settings", "website": "https://github.com/OCA/product-attribute", diff --git a/product_ingredient/migrations/18.0.1.0.0/pre-migration.py b/product_ingredient/migrations/16.0.1.0.0/pre-migration.py similarity index 100% rename from product_ingredient/migrations/18.0.1.0.0/pre-migration.py rename to product_ingredient/migrations/16.0.1.0.0/pre-migration.py diff --git a/product_ingredient/static/description/index.html b/product_ingredient/static/description/index.html index f7806b5ae0a..da90b5531d0 100644 --- a/product_ingredient/static/description/index.html +++ b/product_ingredient/static/description/index.html @@ -374,7 +374,7 @@

Product Ingredients

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:8182b2531e945caaaf3b9f2e6eb279e48e9ccaffa0ff52c8f17f041f09022306 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Beta License: AGPL-3 OCA/product-attribute Translate me on Weblate Try me on Runboat

+

Beta License: AGPL-3 OCA/product-attribute Translate me on Weblate Try me on Runboat

This module allows to set ingredients information for a given product.

Table of contents

@@ -405,7 +405,7 @@

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -feedback.

+feedback.

Do not contact contributors directly about support or help with technical issues.

@@ -437,7 +437,7 @@

Maintainers

promote its widespread use.

Current maintainer:

sergio-teruel

-

This module is part of the OCA/product-attribute project on GitHub.

+

This module is part of the OCA/product-attribute project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

diff --git a/product_ingredient/views/product_views.xml b/product_ingredient/views/product_views.xml index e673e659230..4970061a3db 100644 --- a/product_ingredient/views/product_views.xml +++ b/product_ingredient/views/product_views.xml @@ -7,23 +7,24 @@ - - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + - + - + - +