From d7e9f17c0c10263384205fbcbe45a2511477ffaa Mon Sep 17 00:00:00 2001 From: Simone Orsi Date: Thu, 12 Jun 2025 08:18:58 +0200 Subject: [PATCH 1/4] pdf_helper: rename to pdf_xml_attachment --- pdf_xml_attachment/README.rst | 112 +++++ pdf_xml_attachment/__init__.py | 1 + pdf_xml_attachment/__manifest__.py | 17 + pdf_xml_attachment/i18n/es.po | 22 + pdf_xml_attachment/i18n/hr.po | 23 + pdf_xml_attachment/i18n/it.po | 22 + pdf_xml_attachment/i18n/pdf_helper.pot | 19 + .../i18n/pdf_xml_attachment.pot | 19 + pdf_xml_attachment/models/__init__.py | 1 + pdf_xml_attachment/models/helper.py | 50 ++ pdf_xml_attachment/pyproject.toml | 3 + pdf_xml_attachment/readme/CONTRIBUTORS.md | 3 + pdf_xml_attachment/readme/DESCRIPTION.md | 1 + pdf_xml_attachment/readme/USAGE.md | 11 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 449 ++++++++++++++++++ pdf_xml_attachment/tests/__init__.py | 1 + .../tests/fixtures/pdf_with_xml_test.pdf | Bin 0 -> 86615 bytes pdf_xml_attachment/tests/test_helper.py | 57 +++ pdf_xml_attachment/utils.py | 43 ++ 20 files changed, 854 insertions(+) create mode 100644 pdf_xml_attachment/README.rst create mode 100644 pdf_xml_attachment/__init__.py create mode 100644 pdf_xml_attachment/__manifest__.py create mode 100644 pdf_xml_attachment/i18n/es.po create mode 100644 pdf_xml_attachment/i18n/hr.po create mode 100644 pdf_xml_attachment/i18n/it.po create mode 100644 pdf_xml_attachment/i18n/pdf_helper.pot create mode 100644 pdf_xml_attachment/i18n/pdf_xml_attachment.pot create mode 100644 pdf_xml_attachment/models/__init__.py create mode 100644 pdf_xml_attachment/models/helper.py create mode 100644 pdf_xml_attachment/pyproject.toml create mode 100644 pdf_xml_attachment/readme/CONTRIBUTORS.md create mode 100644 pdf_xml_attachment/readme/DESCRIPTION.md create mode 100644 pdf_xml_attachment/readme/USAGE.md create mode 100644 pdf_xml_attachment/static/description/icon.png create mode 100644 pdf_xml_attachment/static/description/index.html create mode 100644 pdf_xml_attachment/tests/__init__.py create mode 100644 pdf_xml_attachment/tests/fixtures/pdf_with_xml_test.pdf create mode 100644 pdf_xml_attachment/tests/test_helper.py create mode 100644 pdf_xml_attachment/utils.py diff --git a/pdf_xml_attachment/README.rst b/pdf_xml_attachment/README.rst new file mode 100644 index 0000000000..7e0ccf42b4 --- /dev/null +++ b/pdf_xml_attachment/README.rst @@ -0,0 +1,112 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + +================== +PDF XML attachment +================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:6e0344586a989498f4f002ea9a24c110578859af9750ea5f523fa76c938f063e + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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-LGPL--3-blue.png + :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html + :alt: License: LGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Freporting--engine-lightgray.png?logo=github + :target: https://github.com/OCA/reporting-engine/tree/18.0/pdf_xml_attachment + :alt: OCA/reporting-engine +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/reporting-engine-18-0/reporting-engine-18-0-pdf_xml_attachment + :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/reporting-engine&target_branch=18.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Technical module to share easily deal with XML attachments in PDF files. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +Inside Odoo env: + +:: + + res = env["pdf.xml.tool"].pdf_get_xml_files(pdf_filecontent) + + new_pdf_filecontent = env["pdf.xml.tool"].pdf_embed_xml(pdf_filecontent, filename, xml) + +Outside Odoo env: + +:: + + from odoo.addons.pdf_xml_attachment.utils import PDFParser + [...] + res = PDFParser(pdf_filecontent).get_xml_files() + +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 +------- + +* Camptocamp + +Contributors +------------ + +- Simone Orsi +- Alexis de Lattre +- Jacques-Etienne Baudoux (BCIM) + +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-simahawk| image:: https://github.com/simahawk.png?size=40px + :target: https://github.com/simahawk + :alt: simahawk +.. |maintainer-alexis-via| image:: https://github.com/alexis-via.png?size=40px + :target: https://github.com/alexis-via + :alt: alexis-via + +Current `maintainers `__: + +|maintainer-simahawk| |maintainer-alexis-via| + +This module is part of the `OCA/reporting-engine `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/pdf_xml_attachment/__init__.py b/pdf_xml_attachment/__init__.py new file mode 100644 index 0000000000..0650744f6b --- /dev/null +++ b/pdf_xml_attachment/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/pdf_xml_attachment/__manifest__.py b/pdf_xml_attachment/__manifest__.py new file mode 100644 index 0000000000..55fb8bbe4c --- /dev/null +++ b/pdf_xml_attachment/__manifest__.py @@ -0,0 +1,17 @@ +# Copyright 2022 Camptocamp SA +# @author: Simone Orsi +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +{ + "name": "PDF XML attachment", + "version": "18.0.1.0.0", + "category": "Tools", + "license": "LGPL-3", + "summary": "Provides helpers to work w/ PDFs and XML attachments", + "author": "Camptocamp, Odoo Community Association (OCA)", + "maintainers": ["simahawk", "alexis-via"], + "website": "https://github.com/OCA/reporting-engine", + "depends": [ + "base", + ], +} diff --git a/pdf_xml_attachment/i18n/es.po b/pdf_xml_attachment/i18n/es.po new file mode 100644 index 0000000000..59116fb6b4 --- /dev/null +++ b/pdf_xml_attachment/i18n/es.po @@ -0,0 +1,22 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * pdf_xml_attachment +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-08-07 11:09+0000\n" +"Last-Translator: Ivorra78 \n" +"Language-Team: none\n" +"Language: es\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 4.17\n" + +#. module: pdf_xml_attachment +#: model:ir.model,name:pdf_xml_attachment.model_pdf_xml_tool +msgid "PDF XML attachment" +msgstr "Ayudante de PDF" diff --git a/pdf_xml_attachment/i18n/hr.po b/pdf_xml_attachment/i18n/hr.po new file mode 100644 index 0000000000..cf62c59f29 --- /dev/null +++ b/pdf_xml_attachment/i18n/hr.po @@ -0,0 +1,23 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * pdf_xml_attachment +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-06-02 12:09+0000\n" +"Last-Translator: Bole \n" +"Language-Team: none\n" +"Language: hr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Weblate 4.17\n" + +#. module: pdf_xml_attachment +#: model:ir.model,name:pdf_xml_attachment.model_pdf_xml_tool +msgid "PDF XML attachment" +msgstr "PDF Pomoćnik" diff --git a/pdf_xml_attachment/i18n/it.po b/pdf_xml_attachment/i18n/it.po new file mode 100644 index 0000000000..0025bce5f5 --- /dev/null +++ b/pdf_xml_attachment/i18n/it.po @@ -0,0 +1,22 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * pdf_xml_attachment +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-02-04 23: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 4.17\n" + +#. module: pdf_xml_attachment +#: model:ir.model,name:pdf_xml_attachment.model_pdf_xml_tool +msgid "PDF XML attachment" +msgstr "Aiuto PDF" diff --git a/pdf_xml_attachment/i18n/pdf_helper.pot b/pdf_xml_attachment/i18n/pdf_helper.pot new file mode 100644 index 0000000000..8ec6bd2806 --- /dev/null +++ b/pdf_xml_attachment/i18n/pdf_helper.pot @@ -0,0 +1,19 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * pdf_xml_attachment +# +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: pdf_xml_attachment +#: model:ir.model,name:pdf_xml_attachment.model_pdf_xml_attachment +msgid "PDF XML attachment" +msgstr "" diff --git a/pdf_xml_attachment/i18n/pdf_xml_attachment.pot b/pdf_xml_attachment/i18n/pdf_xml_attachment.pot new file mode 100644 index 0000000000..a0bdca18b2 --- /dev/null +++ b/pdf_xml_attachment/i18n/pdf_xml_attachment.pot @@ -0,0 +1,19 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * pdf_xml_attachment +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.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: pdf_xml_attachment +#: model:ir.model,name:pdf_xml_attachment.model_pdf_xml_tool +msgid "PDF XML attachment" +msgstr "" diff --git a/pdf_xml_attachment/models/__init__.py b/pdf_xml_attachment/models/__init__.py new file mode 100644 index 0000000000..d533863bba --- /dev/null +++ b/pdf_xml_attachment/models/__init__.py @@ -0,0 +1 @@ +from . import helper diff --git a/pdf_xml_attachment/models/helper.py b/pdf_xml_attachment/models/helper.py new file mode 100644 index 0000000000..b95f09173f --- /dev/null +++ b/pdf_xml_attachment/models/helper.py @@ -0,0 +1,50 @@ +# Copyright 2022 Camptocamp SA +# @author: Simone Orsi +# Copyright 2023 Jacques-Etienne Baudoux (BCIM) +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +import io +import logging + +from odoo import api, models +from odoo.tools.pdf import NameObject, OdooPdfFileReader, OdooPdfFileWriter + +from ..utils import PDFParser + +_logger = logging.getLogger(__name__) + + +class PDFHelper(models.AbstractModel): + _name = "pdf.xml.tool" + _description = "PDF XML attachment" + + _PDF_PARSER_KLASS = PDFParser + + @api.model + def pdf_get_xml_files(self, pdf_file): + """Extract XML attachments from pdf + + :param pdf_file: binary PDF file content + :returns: a dict like {$filename: $parsed_xml_file_obj}. + """ + parser = self._PDF_PARSER_KLASS(pdf_file) + try: + return parser.get_xml_files() + except parser.get_xml_files_swallable_exceptions() as err: + _logger.error("PDF file parsing failed: %s", str(err)) + return {} + + @api.model + def pdf_embed_xml(self, pdf_content, xml_filename, xml_string): + """Add an XML attachment in a pdf""" + with io.BytesIO(pdf_content) as reader_buffer, io.BytesIO() as new_pdf_stream: + reader = OdooPdfFileReader(reader_buffer, strict=False) + writer = OdooPdfFileWriter() + writer.cloneReaderDocumentRoot(reader) + writer.addAttachment(xml_filename, xml_string, subtype="text/xml") + # show attachments when opening PDF + writer._root_object.update( + {NameObject("/PageMode"): NameObject("/UseAttachments")} + ) + writer.write(new_pdf_stream) + return new_pdf_stream.getvalue() diff --git a/pdf_xml_attachment/pyproject.toml b/pdf_xml_attachment/pyproject.toml new file mode 100644 index 0000000000..4231d0cccb --- /dev/null +++ b/pdf_xml_attachment/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/pdf_xml_attachment/readme/CONTRIBUTORS.md b/pdf_xml_attachment/readme/CONTRIBUTORS.md new file mode 100644 index 0000000000..532896fdcc --- /dev/null +++ b/pdf_xml_attachment/readme/CONTRIBUTORS.md @@ -0,0 +1,3 @@ +- Simone Orsi \<\> +- Alexis de Lattre \<\> +- Jacques-Etienne Baudoux (BCIM) \<\> diff --git a/pdf_xml_attachment/readme/DESCRIPTION.md b/pdf_xml_attachment/readme/DESCRIPTION.md new file mode 100644 index 0000000000..4a43d9a8e1 --- /dev/null +++ b/pdf_xml_attachment/readme/DESCRIPTION.md @@ -0,0 +1 @@ +Technical module to share easily deal with XML attachments in PDF files. diff --git a/pdf_xml_attachment/readme/USAGE.md b/pdf_xml_attachment/readme/USAGE.md new file mode 100644 index 0000000000..fef72cd80d --- /dev/null +++ b/pdf_xml_attachment/readme/USAGE.md @@ -0,0 +1,11 @@ +Inside Odoo env: + + res = env["pdf.xml.tool"].pdf_get_xml_files(pdf_filecontent) + + new_pdf_filecontent = env["pdf.xml.tool"].pdf_embed_xml(pdf_filecontent, filename, xml) + +Outside Odoo env: + + from odoo.addons.pdf_xml_attachment.utils import PDFParser + [...] + res = PDFParser(pdf_filecontent).get_xml_files() diff --git a/pdf_xml_attachment/static/description/icon.png b/pdf_xml_attachment/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/pdf_xml_attachment/static/description/index.html b/pdf_xml_attachment/static/description/index.html new file mode 100644 index 0000000000..0d89951cf5 --- /dev/null +++ b/pdf_xml_attachment/static/description/index.html @@ -0,0 +1,449 @@ + + + + + +README.rst + + + +
+ + + +Odoo Community Association + +
+

PDF XML attachment

+ +

Beta License: LGPL-3 OCA/reporting-engine Translate me on Weblate Try me on Runboat

+

Technical module to share easily deal with XML attachments in PDF files.

+

Table of contents

+ +
+

Usage

+

Inside Odoo env:

+
+res = env["pdf.xml.tool"].pdf_get_xml_files(pdf_filecontent)
+
+new_pdf_filecontent = env["pdf.xml.tool"].pdf_embed_xml(pdf_filecontent, filename, xml)
+
+

Outside Odoo env:

+
+from odoo.addons.pdf_xml_attachment.utils import PDFParser
+[...]
+res = PDFParser(pdf_filecontent).get_xml_files()
+
+
+
+

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

+
    +
  • Camptocamp
  • +
+
+
+

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 maintainers:

+

simahawk alexis-via

+

This module is part of the OCA/reporting-engine project on GitHub.

+

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

+
+
+
+
+ + diff --git a/pdf_xml_attachment/tests/__init__.py b/pdf_xml_attachment/tests/__init__.py new file mode 100644 index 0000000000..018dd86602 --- /dev/null +++ b/pdf_xml_attachment/tests/__init__.py @@ -0,0 +1 @@ +from . import test_helper diff --git a/pdf_xml_attachment/tests/fixtures/pdf_with_xml_test.pdf b/pdf_xml_attachment/tests/fixtures/pdf_with_xml_test.pdf new file mode 100644 index 0000000000000000000000000000000000000000..72dcaf7c7c17bd74c397de3a596621906a683c4c GIT binary patch literal 86615 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 (^%v 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
  • @aW55D4U|Lt0T)N9OTmHnZNG`u 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 +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +import os + +from lxml import etree + +from odoo.tests.case import TestCase +from odoo.tests.common import TransactionCase + +from odoo.addons.pdf_xml_attachment.utils import PDFParser + + +def read_test_file(filename, mode="r"): + path = os.path.join(os.path.dirname(__file__), "fixtures", filename) + with open(path, mode) as thefile: + return thefile.read() + + +class TestPDFHelperUtils(TestCase): + def test_parse_xml(self): + pdf_content = read_test_file("pdf_with_xml_test.pdf", mode="rb") + res = PDFParser(pdf_content).get_xml_files() + fname, xml_root = tuple(res.items())[0] + self.assertEqual(fname, "factur-x.xml") + self.assertTrue(isinstance(xml_root, etree._Element)) + + +class TestPDFHelper(TransactionCase): + def test_get_xml(self): + pdf_content = read_test_file("pdf_with_xml_test.pdf", mode="rb") + res = self.env["pdf.xml.tool"].pdf_get_xml_files(pdf_content) + fname, xml_root = tuple(res.items())[0] + self.assertEqual(fname, "factur-x.xml") + self.assertTrue(isinstance(xml_root, etree._Element)) + + def test_get_xml_fail(self): + with self.assertLogs( + "odoo.addons.pdf_xml_attachment.models.helper", level="ERROR" + ) as log_catcher: + self.env["pdf.xml.tool"].pdf_get_xml_files(b"") + self.assertIn( + "PDF file parsing failed: Cannot read an empty file", + log_catcher.output[0], + ) + + def _test_embed_xml(self): + pdf_content = read_test_file("pdf_with_xml_test.pdf", mode="rb") + filename = "test" + xml = b"test" + newpdf_content = self.env["pdf.xml.tool"].pdf_embed_xml( + pdf_content, filename, xml + ) + attachments = self.env["pdf.xml.tool"].pdf_get_xml_files(newpdf_content) + self.assertTrue(filename in attachments) + etree_content = attachments[filename] + self.assertEqual(xml, etree.tostring(etree_content)) diff --git a/pdf_xml_attachment/utils.py b/pdf_xml_attachment/utils.py new file mode 100644 index 0000000000..5a065f4d38 --- /dev/null +++ b/pdf_xml_attachment/utils.py @@ -0,0 +1,43 @@ +# Copyright 2015-2021 Akretion France +# @author: Alexis de Lattre +# Copyright 2022 Camptocamp SA +# @author: Simone Orsi +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +import logging +from io import BytesIO +from struct import error as StructError + +from lxml import etree + +from odoo.tools.pdf import OdooPdfFileReader, PdfReadError + +_logger = logging.getLogger(__name__) + + +class PDFParser: + def __init__(self, pdf_file): + self.pdf_file = pdf_file + + def get_xml_files(self): + """Parse PDF files to extract XML content. + + :param pdf_file: binary PDF file content + :returns: a dict like {$filename: $parsed_xml_file_obj}. + """ + res = {} + with BytesIO(self.pdf_file) as buffer: + pdf_reader = OdooPdfFileReader(buffer, strict=False) + + # Process embedded files. + for xml_name, content in pdf_reader.getAttachments(): + try: + res[xml_name] = etree.fromstring(content) + except Exception: + _logger.debug("Non XML file found in PDF") + if res: + _logger.debug("Valid XML files found in PDF: %s", list(res.keys())) + return res + + def get_xml_files_swallable_exceptions(self): + return (NotImplementedError, StructError, PdfReadError) From 525d717830b0051978f44e6a0ec3352f60a5fa1e Mon Sep 17 00:00:00 2001 From: Maksym Yankin Date: Mon, 27 Apr 2026 17:25:34 +0300 Subject: [PATCH 2/4] [MIG] pdf_xml_attachment: Migration to 19.0 --- pdf_xml_attachment/README.rst | 10 +++++----- pdf_xml_attachment/__manifest__.py | 2 +- pdf_xml_attachment/i18n/pdf_helper.pot | 19 ------------------- .../static/description/index.html | 6 +++--- pdf_xml_attachment/tests/test_helper.py | 2 +- 5 files changed, 10 insertions(+), 29 deletions(-) delete mode 100644 pdf_xml_attachment/i18n/pdf_helper.pot diff --git a/pdf_xml_attachment/README.rst b/pdf_xml_attachment/README.rst index 7e0ccf42b4..68fbff45d9 100644 --- a/pdf_xml_attachment/README.rst +++ b/pdf_xml_attachment/README.rst @@ -21,13 +21,13 @@ PDF XML attachment :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html :alt: License: LGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Freporting--engine-lightgray.png?logo=github - :target: https://github.com/OCA/reporting-engine/tree/18.0/pdf_xml_attachment + :target: https://github.com/OCA/reporting-engine/tree/19.0/pdf_xml_attachment :alt: OCA/reporting-engine .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/reporting-engine-18-0/reporting-engine-18-0-pdf_xml_attachment + :target: https://translation.odoo-community.org/projects/reporting-engine-19-0/reporting-engine-19-0-pdf_xml_attachment :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/reporting-engine&target_branch=18.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/reporting-engine&target_branch=19.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -64,7 +64,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. @@ -107,6 +107,6 @@ Current `maintainers `__: |maintainer-simahawk| |maintainer-alexis-via| -This module is part of the `OCA/reporting-engine `_ project on GitHub. +This module is part of the `OCA/reporting-engine `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/pdf_xml_attachment/__manifest__.py b/pdf_xml_attachment/__manifest__.py index 55fb8bbe4c..5e2d616684 100644 --- a/pdf_xml_attachment/__manifest__.py +++ b/pdf_xml_attachment/__manifest__.py @@ -4,7 +4,7 @@ { "name": "PDF XML attachment", - "version": "18.0.1.0.0", + "version": "19.0.1.0.0", "category": "Tools", "license": "LGPL-3", "summary": "Provides helpers to work w/ PDFs and XML attachments", diff --git a/pdf_xml_attachment/i18n/pdf_helper.pot b/pdf_xml_attachment/i18n/pdf_helper.pot deleted file mode 100644 index 8ec6bd2806..0000000000 --- a/pdf_xml_attachment/i18n/pdf_helper.pot +++ /dev/null @@ -1,19 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * pdf_xml_attachment -# -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: pdf_xml_attachment -#: model:ir.model,name:pdf_xml_attachment.model_pdf_xml_attachment -msgid "PDF XML attachment" -msgstr "" diff --git a/pdf_xml_attachment/static/description/index.html b/pdf_xml_attachment/static/description/index.html index 0d89951cf5..2ced463ab3 100644 --- a/pdf_xml_attachment/static/description/index.html +++ b/pdf_xml_attachment/static/description/index.html @@ -374,7 +374,7 @@

    PDF XML attachment

    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:6e0344586a989498f4f002ea9a24c110578859af9750ea5f523fa76c938f063e !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

    Beta License: LGPL-3 OCA/reporting-engine Translate me on Weblate Try me on Runboat

    +

    Beta License: LGPL-3 OCA/reporting-engine Translate me on Weblate Try me on Runboat

    Technical module to share easily deal with XML attachments in PDF files.

    Table of contents

    @@ -409,7 +409,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.

    @@ -439,7 +439,7 @@

    Maintainers

    promote its widespread use.

    Current maintainers:

    simahawk alexis-via

    -

    This module is part of the OCA/reporting-engine project on GitHub.

    +

    This module is part of the OCA/reporting-engine project on GitHub.

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

    diff --git a/pdf_xml_attachment/tests/test_helper.py b/pdf_xml_attachment/tests/test_helper.py index 1e29df6bf3..e03ccf9bb8 100644 --- a/pdf_xml_attachment/tests/test_helper.py +++ b/pdf_xml_attachment/tests/test_helper.py @@ -44,7 +44,7 @@ def test_get_xml_fail(self): log_catcher.output[0], ) - def _test_embed_xml(self): + def test_embed_xml(self): pdf_content = read_test_file("pdf_with_xml_test.pdf", mode="rb") filename = "test" xml = b"test" From 03c1d60e6957afb81d69aa8b5d6f161adc823904 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Wed, 29 Apr 2026 07:39:52 +0000 Subject: [PATCH 3/4] [UPD] Update pdf_xml_attachment.pot --- pdf_xml_attachment/i18n/pdf_xml_attachment.pot | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/pdf_xml_attachment/i18n/pdf_xml_attachment.pot b/pdf_xml_attachment/i18n/pdf_xml_attachment.pot index a0bdca18b2..c81b6da23d 100644 --- a/pdf_xml_attachment/i18n/pdf_xml_attachment.pot +++ b/pdf_xml_attachment/i18n/pdf_xml_attachment.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 18.0\n" +"Project-Id-Version: Odoo Server 19.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" @@ -13,6 +13,16 @@ msgstr "" "Content-Transfer-Encoding: \n" "Plural-Forms: \n" +#. module: pdf_xml_attachment +#: model:ir.model.fields,field_description:pdf_xml_attachment.field_pdf_xml_tool__display_name +msgid "Display Name" +msgstr "" + +#. module: pdf_xml_attachment +#: model:ir.model.fields,field_description:pdf_xml_attachment.field_pdf_xml_tool__id +msgid "ID" +msgstr "" + #. module: pdf_xml_attachment #: model:ir.model,name:pdf_xml_attachment.model_pdf_xml_tool msgid "PDF XML attachment" From 1eef0cf4111a1098c98f4ab7e7590ffadd720dfd Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 29 Apr 2026 07:42:36 +0000 Subject: [PATCH 4/4] [BOT] post-merge updates --- README.md | 1 + pdf_xml_attachment/README.rst | 2 +- pdf_xml_attachment/static/description/index.html | 2 +- setup/_metapackage/pyproject.toml | 3 ++- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index d6d67fc6b9..fa7c38f6ce 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,7 @@ addon | version | maintainers | summary --- | --- | --- | --- [base_comment_template](base_comment_template/) | 19.0.0.0.0 | | Add conditional mako template to any reporton models that inherits comment.template. [bi_sql_editor](bi_sql_editor/) | 19.0.1.0.1 | legalsylvain | BI Views builder, based on Materialized or Normal SQL Views +[pdf_xml_attachment](pdf_xml_attachment/) | 19.0.1.0.0 | simahawk alexis-via | Provides helpers to work w/ PDFs and XML attachments [report_context](report_context/) | 19.0.1.0.0 | | Adding context to reports [report_csv](report_csv/) | 19.0.1.0.0 | | Base module to create csv report [report_partner_address](report_partner_address/) | 19.0.1.0.0 | yostashiro aungkokolin1997 | Translatable partner address details for reports and portal diff --git a/pdf_xml_attachment/README.rst b/pdf_xml_attachment/README.rst index 68fbff45d9..aee6ffce84 100644 --- a/pdf_xml_attachment/README.rst +++ b/pdf_xml_attachment/README.rst @@ -11,7 +11,7 @@ PDF XML attachment !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:6e0344586a989498f4f002ea9a24c110578859af9750ea5f523fa76c938f063e + !! source digest: sha256:371ba278f875e21635be2293b5963acfc68e85c1ff13d55e8d7ff5049dbbe72f !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/pdf_xml_attachment/static/description/index.html b/pdf_xml_attachment/static/description/index.html index 2ced463ab3..9990ec7d33 100644 --- a/pdf_xml_attachment/static/description/index.html +++ b/pdf_xml_attachment/static/description/index.html @@ -372,7 +372,7 @@

    PDF XML attachment

    !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:6e0344586a989498f4f002ea9a24c110578859af9750ea5f523fa76c938f063e +!! source digest: sha256:371ba278f875e21635be2293b5963acfc68e85c1ff13d55e8d7ff5049dbbe72f !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

    Beta License: LGPL-3 OCA/reporting-engine Translate me on Weblate Try me on Runboat

    Technical module to share easily deal with XML attachments in PDF files.

    diff --git a/setup/_metapackage/pyproject.toml b/setup/_metapackage/pyproject.toml index 8a22d98dac..563c75af75 100644 --- a/setup/_metapackage/pyproject.toml +++ b/setup/_metapackage/pyproject.toml @@ -1,9 +1,10 @@ [project] name = "odoo-addons-oca-reporting-engine" -version = "19.0.20260425.0" +version = "19.0.20260429.0" dependencies = [ "odoo-addon-base_comment_template==19.0.*", "odoo-addon-bi_sql_editor==19.0.*", + "odoo-addon-pdf_xml_attachment==19.0.*", "odoo-addon-report_context==19.0.*", "odoo-addon-report_csv==19.0.*", "odoo-addon-report_partner_address==19.0.*",