diff --git a/document_page/views/report_document_page.xml b/document_page/views/report_document_page.xml index 9da9041c..cec98a35 100644 --- a/document_page/views/report_document_page.xml +++ b/document_page/views/report_document_page.xml @@ -4,7 +4,7 @@

-
+
diff --git a/document_page_reference/README.rst b/document_page_reference/README.rst index 6b7a0bfe..ffd701b4 100644 --- a/document_page_reference/README.rst +++ b/document_page_reference/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 Reference ======================= @@ -17,7 +13,7 @@ Document Page Reference .. |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 @@ -43,7 +39,7 @@ the link between document pages. Usage ===== -When editing a document page add elements like ${XXX} where XXX is the +When editing a document page add elements like {{XXX}} where XXX is the reference of another page. Now, when viewing the document, it will link directly to the page. Also, the name will be parsed as the display name. @@ -68,7 +64,7 @@ Authors Contributors ------------ -- Enric Tobella +- Enric Tobella Maintainers ----------- diff --git a/document_page_reference/__manifest__.py b/document_page_reference/__manifest__.py index 988fc223..8accb744 100644 --- a/document_page_reference/__manifest__.py +++ b/document_page_reference/__manifest__.py @@ -5,7 +5,7 @@ "name": "Document Page Reference", "summary": """ Include references on document pages""", - "version": "18.0.1.0.0", + "version": "18.0.1.1.0", "license": "AGPL-3", "author": "Creu Blanca,Odoo Community Association (OCA)", "website": "https://github.com/OCA/knowledge", diff --git a/document_page_reference/migrations/18.0.1.1.0/post-migration.py b/document_page_reference/migrations/18.0.1.1.0/post-migration.py new file mode 100644 index 00000000..0f15f1eb --- /dev/null +++ b/document_page_reference/migrations/18.0.1.1.0/post-migration.py @@ -0,0 +1,12 @@ +# Copyright 2025 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +import re + +from openupgradelib import openupgrade + + +@openupgrade.migrate() +def migrate(env, version): + for item in env["document.page"].search([("content", "ilike", "${")]): + item.content = re.sub(r"\${(.+)}", r"{{\1}}", item.content) diff --git a/document_page_reference/models/document_page.py b/document_page_reference/models/document_page.py index f745ee41..6fb1a481 100644 --- a/document_page_reference/models/document_page.py +++ b/document_page_reference/models/document_page.py @@ -1,19 +1,15 @@ # Copyright 2019 Creu Blanca +# Copyright 2025 Tecnativa - Víctor Martínez # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -import logging import re -from jinja2.sandbox import SandboxedEnvironment from markupsafe import Markup -from odoo import _, api, fields, models +from odoo import api, fields, models from odoo.exceptions import ValidationError from odoo.tools import html_escape -_logger = logging.getLogger(__name__) -env = SandboxedEnvironment(autoescape=False) - class DocumentPage(models.Model): _inherit = "document.page" @@ -35,15 +31,7 @@ class DocumentPage(models.Model): @api.depends("content") def _compute_content_parsed(self): for record in self: - try: - raw = record.content or "" - converted = re.sub(r"\$\{([\w_]+)\}", r"{{ resolve('\1') }}", raw) - template = env.from_string(converted) - rendered = template.render(resolve=record._resolve_reference) - record.content_parsed = rendered - except Exception as e: - _logger.info("Render failed for %s: %s", record.id, e) - record.content_parsed = record.content or "" + record.content_parsed = record.get_content() @api.constrains("reference") def _check_reference_validity(self): @@ -52,42 +40,36 @@ class DocumentPage(models.Model): continue regex = r"^[a-zA-Z_][a-zA-Z0-9_]*$" if not re.match(regex, rec.reference): - raise ValidationError(_("Reference is not valid")) + raise ValidationError(self.env._("Reference is not valid")) domain = [("reference", "=", rec.reference), ("id", "!=", rec.id)] if self.search(domain): - raise ValidationError(_("Reference must be unique")) + raise ValidationError(self.env._("Reference must be unique")) def _get_document(self, code): return self.search([("reference", "=", code)], limit=1) def get_content(self): - for record in self: - try: - raw = record.content or "" - converted = re.sub(r"\$\{([\w_]+)\}", r"{{ resolve('\1') }}", raw) - template = env.from_string(converted) - return template.render(resolve=record._resolve_reference) - except Exception: - _logger.error( - "Template from page with id = %s cannot be processed", record.id - ) - return record.content + self.ensure_one() + content_parsed = raw = self.content or "" + for text in re.findall(r"\{\{.*?\}\}", raw): + reference = text.replace("{{", "").replace("}}", "") + content_parsed = content_parsed.replace( + text, self._resolve_reference(reference) + ) + return content_parsed def _resolve_reference(self, code): doc = self._get_document(code) if self.env.context.get("raw_reference", False): return html_escape(doc.display_name if doc else code) sanitized_code = html_escape(code) - if not doc: - return ( - f"{sanitized_code}" - ) + oe_model = doc._name if doc else self._name + oe_id = doc.id if doc else "" + name = html_escape(doc.display_name) if doc else sanitized_code return ( - f"" - f"{html_escape(doc.display_name)}" + f"" + f"{name}" ) def get_raw_content(self): diff --git a/document_page_reference/readme/USAGE.md b/document_page_reference/readme/USAGE.md index 6fa5061f..6a9530ff 100644 --- a/document_page_reference/readme/USAGE.md +++ b/document_page_reference/readme/USAGE.md @@ -1,3 +1,3 @@ -When editing a document page add elements like \${XXX} where XXX is the +When editing a document page add elements like {{XXX}} where XXX is the reference of another page. Now, when viewing the document, it will link directly to the page. Also, the name will be parsed as the display name. diff --git a/document_page_reference/static/description/index.html b/document_page_reference/static/description/index.html index a2cd632a..82055931 100644 --- a/document_page_reference/static/description/index.html +++ b/document_page_reference/static/description/index.html @@ -3,7 +3,7 @@ -README.rst +Document Page Reference -
+
+

Document Page Reference

- - -Odoo Community Association - -
-

Document Page Reference

-

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 allows to add a reference name on documents and simplifies the link between document pages.

Table of contents

@@ -391,13 +386,13 @@ the link between document pages.

-

Usage

-

When editing a document page add elements like ${XXX} where XXX is the +

Usage

+

When editing a document page add elements like {{XXX}} where XXX is the reference of another page. Now, when viewing the document, it will link directly to the page. Also, the name will be parsed as the display name.

-

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 @@ -405,21 +400,21 @@ If you spotted it first, help us to smash it by providing a detailed and welcome

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

-
diff --git a/document_page_reference/tests/test_document_reference.py b/document_page_reference/tests/test_document_reference.py index 73581b8b..7ef9b644 100644 --- a/document_page_reference/tests/test_document_reference.py +++ b/document_page_reference/tests/test_document_reference.py @@ -1,21 +1,24 @@ # Copyright 2019 Creu Blanca +# Copyright 2025 Tecnativa - Víctor Martínez # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from markupsafe import Markup from odoo.exceptions import ValidationError -from odoo.tests.common import TransactionCase + +from odoo.addons.base.tests.common import BaseCommon -class TestDocumentReference(TransactionCase): +class TestDocumentReference(BaseCommon): @classmethod def setUpClass(cls): super().setUpClass() cls.page_obj = cls.env["document.page"] cls.history_obj = cls.env["document.page.history"] cls.page1 = cls.page_obj.create( - {"name": "Test Page 1", "content": "${r2}", "reference": "R1"} + {"name": "Test Page 1", "content": Markup("{{r2}}"), "reference": "R1"} ) cls.page2 = cls.page_obj.create( - {"name": "Test Page 1", "content": "${r1}", "reference": "r2"} + {"name": "Test Page 1", "content": Markup("{{r1}}"), "reference": "r2"} ) def test_constraints_duplicate_reference(self): @@ -28,6 +31,15 @@ class TestDocumentReference(TransactionCase): with self.assertRaises(ValidationError): self.page2.write({"reference": self.page2.reference + "-02"}) + def test_no_contrains(self): + self.page1.write({"reference": False}) + self.assertFalse(self.page1.reference) + self.page2.write({"reference": False}) + self.assertFalse(self.page2.reference) + + def test_check_raw(self): + self.assertEqual(self.page2.display_name, self.page1.get_raw_content()) + def test_auto_reference(self): """Test if reference is proposed when saving a page without one.""" self.assertEqual(self.page1.reference, "R1") @@ -52,7 +64,6 @@ class TestDocumentReference(TransactionCase): "type": "ir.actions.act_window", "res_model": "document.page", "res_id": self.page1.id, - "context": {}, "target": "current", "views": [(view_id, "form")], } @@ -60,6 +71,5 @@ class TestDocumentReference(TransactionCase): self.assertEqual(res.get(key), expected_value, f"Mismatch in key: {key}") def test_compute_content_parsed(self): - self.page1.content = "

" - self.page1._compute_content_parsed() - self.assertEqual(str(self.page1.content_parsed), "

") + self.page1.content = Markup("

") + self.assertEqual(self.page1.content_parsed, Markup("

")) diff --git a/document_page_reference/views/report_document_page.xml b/document_page_reference/views/report_document_page.xml index 47ff1298..de2e4379 100644 --- a/document_page_reference/views/report_document_page.xml +++ b/document_page_reference/views/report_document_page.xml @@ -4,10 +4,10 @@ id="report_documentpage_doc" inherit_id="document_page.report_documentpage_doc" > - + 1==0 - +