From 209a9e09fb44667a49e178461bb4f1b45293c6e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Mart=C3=ADnez?= Date: Mon, 30 Mar 2026 12:02:00 +0200 Subject: [PATCH 1/2] [ADD] document_page_product: New module TT61666 [UPD] Update document_page_product.pot [BOT] post-merge updates --- document_page_product/README.rst | 97 ++++ document_page_product/__init__.py | 2 + document_page_product/__manifest__.py | 20 + .../i18n/document_page_product.pot | 68 +++ document_page_product/i18n/es.po | 70 +++ document_page_product/models/__init__.py | 3 + document_page_product/models/document_page.py | 31 ++ document_page_product/models/product.py | 48 ++ document_page_product/pyproject.toml | 3 + document_page_product/readme/CONTRIBUTORS.md | 3 + document_page_product/readme/DESCRIPTION.md | 1 + document_page_product/readme/USAGE.md | 2 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 443 ++++++++++++++++++ document_page_product/tests/__init__.py | 1 + .../tests/test_document_page_product.py | 47 ++ .../views/document_page_views.xml | 54 +++ .../views/product_product_views.xml | 23 + .../views/product_template_views.xml | 23 + 19 files changed, 939 insertions(+) create mode 100644 document_page_product/README.rst create mode 100644 document_page_product/__init__.py create mode 100644 document_page_product/__manifest__.py create mode 100644 document_page_product/i18n/document_page_product.pot create mode 100644 document_page_product/i18n/es.po create mode 100644 document_page_product/models/__init__.py create mode 100644 document_page_product/models/document_page.py create mode 100644 document_page_product/models/product.py create mode 100644 document_page_product/pyproject.toml create mode 100644 document_page_product/readme/CONTRIBUTORS.md create mode 100644 document_page_product/readme/DESCRIPTION.md create mode 100644 document_page_product/readme/USAGE.md create mode 100644 document_page_product/static/description/icon.png create mode 100644 document_page_product/static/description/index.html create mode 100644 document_page_product/tests/__init__.py create mode 100644 document_page_product/tests/test_document_page_product.py create mode 100644 document_page_product/views/document_page_views.xml create mode 100644 document_page_product/views/product_product_views.xml create mode 100644 document_page_product/views/product_template_views.xml diff --git a/document_page_product/README.rst b/document_page_product/README.rst new file mode 100644 index 00000000000..d346f20a754 --- /dev/null +++ b/document_page_product/README.rst @@ -0,0 +1,97 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + +===================== +Document Page Product +===================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:2b3b558d78ece749084044a0ea1799a6967a26418621517c7a6793093e8d52ae + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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/license-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%2Fknowledge-lightgray.png?logo=github + :target: https://github.com/OCA/knowledge/tree/17.0/document_page_product + :alt: OCA/knowledge +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/knowledge-17-0/knowledge-17-0-document_page_product + :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/knowledge&target_branch=17.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module allow to link document pages to products. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +- Go to to a product and click on "Wiki Pages" to see linked documents + or to create new ones. + +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 \`: + + - Víctor Martínez + - Pedro M. Baeza + +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-victoralmau| image:: https://github.com/victoralmau.png?size=40px + :target: https://github.com/victoralmau + :alt: victoralmau + +Current `maintainer `__: + +|maintainer-victoralmau| + +This module is part of the `OCA/knowledge `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/document_page_product/__init__.py b/document_page_product/__init__.py new file mode 100644 index 00000000000..c32fd62b78d --- /dev/null +++ b/document_page_product/__init__.py @@ -0,0 +1,2 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +from . import models diff --git a/document_page_product/__manifest__.py b/document_page_product/__manifest__.py new file mode 100644 index 00000000000..22d09717c85 --- /dev/null +++ b/document_page_product/__manifest__.py @@ -0,0 +1,20 @@ +# Copyright 2026 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +{ + "name": "Document Page Product", + "summary": "This module links document pages to products", + "version": "17.0.1.0.0", + "category": "Product", + "author": "Tecnativa, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/knowledge", + "license": "AGPL-3", + "depends": ["product", "document_page"], + "data": [ + "views/document_page_views.xml", + "views/product_product_views.xml", + "views/product_template_views.xml", + ], + "installable": True, + "maintainers": ["victoralmau"], +} diff --git a/document_page_product/i18n/document_page_product.pot b/document_page_product/i18n/document_page_product.pot new file mode 100644 index 00000000000..eaed566060f --- /dev/null +++ b/document_page_product/i18n/document_page_product.pot @@ -0,0 +1,68 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * document_page_product +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.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: document_page_product +#: model_terms:ir.actions.act_window,help:document_page_product.action_document_page_products +msgid "Click to create a new web page." +msgstr "" + +#. module: document_page_product +#: model:ir.model,name:document_page_product.model_document_page +msgid "Document Page" +msgstr "" + +#. module: document_page_product +#: model:ir.model.fields,field_description:document_page_product.field_product_product__document_page_count +#: model:ir.model.fields,field_description:document_page_product.field_product_template__document_page_count +msgid "Document Page Count" +msgstr "" + +#. module: document_page_product +#: model:ir.model.fields,field_description:document_page_product.field_product_product__document_page_ids +#: model:ir.model.fields,field_description:document_page_product.field_product_template__document_page_ids +msgid "Document Pages" +msgstr "" + +#. module: document_page_product +#: model:ir.actions.act_window,name:document_page_product.action_document_page_products +#: model_terms:ir.ui.view,arch_db:document_page_product.product_normal_form_view +#: model_terms:ir.ui.view,arch_db:document_page_product.product_template_only_form_view +msgid "Knowledge" +msgstr "" + +#. module: document_page_product +#: model:ir.model,name:document_page_product.model_product_template +msgid "Product" +msgstr "" + +#. module: document_page_product +#: model:ir.model.fields,field_description:document_page_product.field_document_page__product_template_count +msgid "Product Template Count" +msgstr "" + +#. module: document_page_product +#: model:ir.model.fields,field_description:document_page_product.field_document_page__product_tmpl_ids +msgid "Product Templates" +msgstr "" + +#. module: document_page_product +#: model:ir.model,name:document_page_product.model_product_product +msgid "Product Variant" +msgstr "" + +#. module: document_page_product +#: model_terms:ir.ui.view,arch_db:document_page_product.view_wiki_form +msgid "Products" +msgstr "" diff --git a/document_page_product/i18n/es.po b/document_page_product/i18n/es.po new file mode 100644 index 00000000000..8514d632aaa --- /dev/null +++ b/document_page_product/i18n/es.po @@ -0,0 +1,70 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * document_page_product +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-04-06 07:49+0000\n" +"PO-Revision-Date: 2026-04-06 07:49+0000\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: document_page_product +#: model_terms:ir.actions.act_window,help:document_page_product.action_document_page_products +msgid "Click to create a new web page." +msgstr "Click para crear una página web nueva." + +#. module: document_page_product +#: model:ir.model,name:document_page_product.model_document_page +msgid "Document Page" +msgstr "Página del documento" + +#. module: document_page_product +#: model:ir.model.fields,field_description:document_page_product.field_product_product__document_page_count +#: model:ir.model.fields,field_description:document_page_product.field_product_template__document_page_count +msgid "Document Page Count" +msgstr "Total de páginas de documento" + +#. module: document_page_product +#: model:ir.model.fields,field_description:document_page_product.field_product_product__document_page_ids +#: model:ir.model.fields,field_description:document_page_product.field_product_template__document_page_ids +msgid "Document Pages" +msgstr "Páginas de conocimiento" + +#. module: document_page_product +#: model:ir.actions.act_window,name:document_page_product.action_document_page_products +#: model_terms:ir.ui.view,arch_db:document_page_product.product_normal_form_view +#: model_terms:ir.ui.view,arch_db:document_page_product.product_template_only_form_view +msgid "Knowledge" +msgstr "Conocimiento" + +#. module: document_page_product +#: model:ir.model,name:document_page_product.model_product_template +msgid "Product" +msgstr "Producto" + +#. module: document_page_product +#: model:ir.model.fields,field_description:document_page_product.field_document_page__product_template_count +msgid "Product Template Count" +msgstr "" + +#. module: document_page_product +#: model:ir.model.fields,field_description:document_page_product.field_document_page__product_tmpl_ids +msgid "Product Templates" +msgstr "Plantillas de producto" + +#. module: document_page_product +#: model:ir.model,name:document_page_product.model_product_product +msgid "Product Variant" +msgstr "Variante de producto" + +#. module: document_page_product +#: model_terms:ir.ui.view,arch_db:document_page_product.view_wiki_form +msgid "Products" +msgstr "Productos" diff --git a/document_page_product/models/__init__.py b/document_page_product/models/__init__.py new file mode 100644 index 00000000000..76e925f30e9 --- /dev/null +++ b/document_page_product/models/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +from . import document_page +from . import product diff --git a/document_page_product/models/document_page.py b/document_page_product/models/document_page.py new file mode 100644 index 00000000000..e3fa2c2a312 --- /dev/null +++ b/document_page_product/models/document_page.py @@ -0,0 +1,31 @@ +# Copyright 2026 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class DocumentPage(models.Model): + _inherit = "document.page" + + product_tmpl_ids = fields.Many2many( + comodel_name="product.template", + relation="document_page_product_rel", + column1="page_id", + column2="product_tmpl_id", + string="Product Templates", + ) + product_template_count = fields.Integer(compute="_compute_product_template_count") + + @api.depends("product_tmpl_ids") + def _compute_product_template_count(self): + for item in self: + item.product_template_count = len(item.product_tmpl_ids) + + def action_product_templates(self): + self.ensure_one() + action = self.env["ir.actions.actions"]._for_xml_id( + "product.product_template_action" + ) + action["domain"] = [("id", "in", self.product_tmpl_ids.ids)] + action["context"] = {} + return action diff --git a/document_page_product/models/product.py b/document_page_product/models/product.py new file mode 100644 index 00000000000..adfebe40639 --- /dev/null +++ b/document_page_product/models/product.py @@ -0,0 +1,48 @@ +# Copyright 2026 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class ProductTemplate(models.Model): + _inherit = "product.template" + + document_page_ids = fields.Many2many( + comodel_name="document.page", + relation="document_page_product_rel", + column1="product_tmpl_id", + column2="page_id", + string="Document Pages", + ) + document_page_count = fields.Integer(compute="_compute_document_page_count") + + @api.depends("document_page_ids") + def _compute_document_page_count(self): + for rec in self: + rec.document_page_count = len(rec.document_page_ids) + + +class ProductProduct(models.Model): + _inherit = "product.product" + + document_page_count = fields.Integer(compute="_compute_document_page_count") + + @api.depends("product_tmpl_id.document_page_count") + def _compute_document_page_count(self): + for rec in self: + rec.document_page_count = rec.product_tmpl_id.document_page_count + + def action_document_page_products(self): + self.ensure_one() + action = self.env["ir.actions.actions"]._for_xml_id( + "document_page_product.action_document_page_products" + ) + action["domain"] = [ + ("type", "=", "content"), + ("product_tmpl_ids", "in", self.product_tmpl_id.ids), + ] + action["context"] = { + "default_type": "content", + "default_product_tmpl_ids": self.product_tmpl_id.ids, + } + return action diff --git a/document_page_product/pyproject.toml b/document_page_product/pyproject.toml new file mode 100644 index 00000000000..4231d0cccb3 --- /dev/null +++ b/document_page_product/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/document_page_product/readme/CONTRIBUTORS.md b/document_page_product/readme/CONTRIBUTORS.md new file mode 100644 index 00000000000..53764902262 --- /dev/null +++ b/document_page_product/readme/CONTRIBUTORS.md @@ -0,0 +1,3 @@ +- \`Tecnativa \<\>\`: + - Víctor Martínez + - Pedro M. Baeza diff --git a/document_page_product/readme/DESCRIPTION.md b/document_page_product/readme/DESCRIPTION.md new file mode 100644 index 00000000000..706e8e812eb --- /dev/null +++ b/document_page_product/readme/DESCRIPTION.md @@ -0,0 +1 @@ +This module allow to link document pages to products. diff --git a/document_page_product/readme/USAGE.md b/document_page_product/readme/USAGE.md new file mode 100644 index 00000000000..887128294fa --- /dev/null +++ b/document_page_product/readme/USAGE.md @@ -0,0 +1,2 @@ +- Go to to a product and click on "Wiki Pages" to see linked documents + or to create new ones. diff --git a/document_page_product/static/description/icon.png b/document_page_product/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/document_page_product/static/description/index.html b/document_page_product/static/description/index.html new file mode 100644 index 00000000000..e49212c59f1 --- /dev/null +++ b/document_page_product/static/description/index.html @@ -0,0 +1,443 @@ + + + + + +README.rst + + + +
+ + + +Odoo Community Association + +
+

Document Page Product

+ +

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

+

This module allow to link document pages to products.

+

Table of contents

+ +
+

Usage

+
    +
  • Go to to a product and click on “Wiki Pages” to see linked documents +or to create new ones.
  • +
+
+
+

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

+ +
+
+

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:

+

victoralmau

+

This module is part of the OCA/knowledge project on GitHub.

+

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

+
+
+
+
+ + diff --git a/document_page_product/tests/__init__.py b/document_page_product/tests/__init__.py new file mode 100644 index 00000000000..f416293e396 --- /dev/null +++ b/document_page_product/tests/__init__.py @@ -0,0 +1 @@ +from . import test_document_page_product diff --git a/document_page_product/tests/test_document_page_product.py b/document_page_product/tests/test_document_page_product.py new file mode 100644 index 00000000000..33bac3c4b2c --- /dev/null +++ b/document_page_product/tests/test_document_page_product.py @@ -0,0 +1,47 @@ +# Copyright 2026 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import Command + +from odoo.addons.base.tests.common import BaseCommon + + +class TestDesguaceparisCustom(BaseCommon): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.product_a = cls.env["product.product"].create({"name": "Test product A"}) + cls.product_tmpl_a = cls.product_a.product_tmpl_id + cls.product_b = cls.env["product.product"].create({"name": "Test product B"}) + cls.product_tmpl_b = cls.product_b.product_tmpl_id + cls.default_page = cls.env["document.page"].create({"name": "Test page"}) + + def test_page_count(self): + self.assertEqual(self.product_a.document_page_count, 0) + self.assertEqual(self.product_tmpl_a.document_page_count, 0) + self.assertEqual(self.product_b.document_page_count, 0) + self.assertEqual(self.product_tmpl_b.document_page_count, 0) + self.default_page.product_tmpl_ids = [Command.set(self.product_tmpl_a.ids)] + self.assertEqual(self.product_a.document_page_count, 1) + self.assertEqual(self.product_tmpl_a.document_page_count, 1) + self.assertEqual(self.product_b.document_page_count, 0) + self.assertEqual(self.product_tmpl_b.document_page_count, 0) + self.assertIn(self.default_page, self.product_tmpl_a.document_page_ids) + self.assertNotIn(self.default_page, self.product_tmpl_b.document_page_ids) + action = self.product_a.action_document_page_products() + self.assertEqual( + action["domain"], + [ + ("type", "=", "content"), + ("product_tmpl_ids", "in", self.product_tmpl_a.ids), + ], + ) + self.assertEqual( + action["context"], + { + "default_type": "content", + "default_product_tmpl_ids": self.product_tmpl_a.ids, + }, + ) + action = self.default_page.action_product_templates() + self.assertEqual(action["domain"], [("id", "in", self.product_tmpl_a.ids)]) + self.assertEqual(action["context"], {}) diff --git a/document_page_product/views/document_page_views.xml b/document_page_product/views/document_page_views.xml new file mode 100644 index 00000000000..6e599e300ea --- /dev/null +++ b/document_page_product/views/document_page_views.xml @@ -0,0 +1,54 @@ + + + + document.page + + +
+ +
+ + + + +
+ + Knowledge + document.page + [('type','=','content'), ('product_tmpl_ids', 'in', [active_id])] + { + 'default_type': 'content', + 'default_product_tmpl_ids': [active_id]} + tree,form + + + +

+ Click to create a new web page. +

+
+
+
diff --git a/document_page_product/views/product_product_views.xml b/document_page_product/views/product_product_views.xml new file mode 100644 index 00000000000..a21ae9cba00 --- /dev/null +++ b/document_page_product/views/product_product_views.xml @@ -0,0 +1,23 @@ + + + + product.product + + +
+ +
+
+
+
diff --git a/document_page_product/views/product_template_views.xml b/document_page_product/views/product_template_views.xml new file mode 100644 index 00000000000..6f35874d6e6 --- /dev/null +++ b/document_page_product/views/product_template_views.xml @@ -0,0 +1,23 @@ + + + + product.template + + +
+ +
+
+
+
From 9179d549c057b11cc059f2886d0d63f700fbdd7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Mart=C3=ADnez?= Date: Mon, 13 Apr 2026 12:16:51 +0200 Subject: [PATCH 2/2] [MIG] document_page_product: Migration to 18.0 TT61666 --- document_page_product/README.rst | 26 +++++++--------- document_page_product/__manifest__.py | 2 +- .../static/description/index.html | 30 ++++++++----------- .../views/document_page_views.xml | 4 +-- 4 files changed, 26 insertions(+), 36 deletions(-) diff --git a/document_page_product/README.rst b/document_page_product/README.rst index d346f20a754..2f4513a10b6 100644 --- a/document_page_product/README.rst +++ b/document_page_product/README.rst @@ -1,7 +1,3 @@ -.. image:: https://odoo-community.org/readme-banner-image - :target: https://odoo-community.org/get-involved?utm_source=readme - :alt: Odoo Community Association - ===================== Document Page Product ===================== @@ -17,17 +13,17 @@ Document Page Product .. |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/license-AGPL--3-blue.png +.. |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%2Fknowledge-lightgray.png?logo=github - :target: https://github.com/OCA/knowledge/tree/17.0/document_page_product + :target: https://github.com/OCA/knowledge/tree/18.0/document_page_product :alt: OCA/knowledge .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/knowledge-17-0/knowledge-17-0-document_page_product + :target: https://translation.odoo-community.org/projects/knowledge-18-0/knowledge-18-0-document_page_product :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/knowledge&target_branch=17.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/knowledge&target_branch=18.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -42,8 +38,8 @@ This module allow to link document pages to products. Usage ===== -- Go to to a product and click on "Wiki Pages" to see linked documents - or to create new ones. +- Go to to a product and click on "Wiki Pages" to see linked documents + or to create new ones. Bug Tracker =========== @@ -51,7 +47,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. @@ -66,10 +62,10 @@ Authors Contributors ------------ -- \`Tecnativa \`: +- \`Tecnativa \`: - - Víctor Martínez - - Pedro M. Baeza + - Víctor Martínez + - Pedro M. Baeza Maintainers ----------- @@ -92,6 +88,6 @@ Current `maintainer `__: |maintainer-victoralmau| -This module is part of the `OCA/knowledge `_ project on GitHub. +This module is part of the `OCA/knowledge `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/document_page_product/__manifest__.py b/document_page_product/__manifest__.py index 22d09717c85..bc41729aff5 100644 --- a/document_page_product/__manifest__.py +++ b/document_page_product/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Document Page Product", "summary": "This module links document pages to products", - "version": "17.0.1.0.0", + "version": "18.0.1.0.0", "category": "Product", "author": "Tecnativa, Odoo Community Association (OCA)", "website": "https://github.com/OCA/knowledge", diff --git a/document_page_product/static/description/index.html b/document_page_product/static/description/index.html index e49212c59f1..30126571c55 100644 --- a/document_page_product/static/description/index.html +++ b/document_page_product/static/description/index.html @@ -3,7 +3,7 @@ -README.rst +Document Page Product -
+
+

Document Page Product

- - -Odoo Community Association - -
-

Document Page Product

-

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

+

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

This module allow to link document pages to products.

Table of contents

@@ -390,30 +385,30 @@

Document Page Product

-

Usage

+

Usage

  • Go to to a product and click on “Wiki Pages” to see linked documents or to create new ones.
-

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 -feedback.

+feedback.

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 @@ -433,11 +428,10 @@

Maintainers

promote its widespread use.

Current maintainer:

victoralmau

-

This module is part of the OCA/knowledge project on GitHub.

+

This module is part of the OCA/knowledge project on GitHub.

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

-
diff --git a/document_page_product/views/document_page_views.xml b/document_page_product/views/document_page_views.xml index 6e599e300ea..4f179f1f4f1 100644 --- a/document_page_product/views/document_page_views.xml +++ b/document_page_product/views/document_page_views.xml @@ -37,11 +37,11 @@ { 'default_type': 'content', 'default_product_tmpl_ids': [active_id]} - tree,form + list,form