From 34977b9cc5249f128aeff03504a7ace47b6e12a7 Mon Sep 17 00:00:00 2001
From: fah-mili
Date: Wed, 17 Jan 2024 15:37:57 +0100
Subject: [PATCH 1/2] [ADD] report_py3o_index
---
report_py3o_index/README.rst | 92 ++++
report_py3o_index/__init__.py | 7 +
report_py3o_index/__manifest__.py | 17 +
report_py3o_index/data/ModuleUpdateIndex.xba | 28 ++
report_py3o_index/hooks.py | 20 +
report_py3o_index/models/__init__.py | 7 +
report_py3o_index/models/ir_actions_report.py | 16 +
report_py3o_index/models/py3o_report.py | 92 ++++
report_py3o_index/models/py3o_template.py | 16 +
report_py3o_index/readme/CONTRIBUTORS.rst | 2 +
report_py3o_index/readme/DESCRIPTION.rst | 15 +
report_py3o_index/static/description/icon.png | Bin 0 -> 9455 bytes
.../static/description/index.html | 431 ++++++++++++++++++
.../static/src/js/py3oactionmanager.js | 38 ++
report_py3o_index/views/ir_actions_report.xml | 27 ++
report_py3o_index/views/py3o_template.xml | 38 ++
.../odoo/addons/report_py3o_index | 1 +
setup/report_py3o_index/setup.py | 6 +
18 files changed, 853 insertions(+)
create mode 100644 report_py3o_index/README.rst
create mode 100644 report_py3o_index/__init__.py
create mode 100644 report_py3o_index/__manifest__.py
create mode 100644 report_py3o_index/data/ModuleUpdateIndex.xba
create mode 100644 report_py3o_index/hooks.py
create mode 100644 report_py3o_index/models/__init__.py
create mode 100644 report_py3o_index/models/ir_actions_report.py
create mode 100644 report_py3o_index/models/py3o_report.py
create mode 100644 report_py3o_index/models/py3o_template.py
create mode 100644 report_py3o_index/readme/CONTRIBUTORS.rst
create mode 100644 report_py3o_index/readme/DESCRIPTION.rst
create mode 100644 report_py3o_index/static/description/icon.png
create mode 100644 report_py3o_index/static/description/index.html
create mode 100644 report_py3o_index/static/src/js/py3oactionmanager.js
create mode 100644 report_py3o_index/views/ir_actions_report.xml
create mode 100644 report_py3o_index/views/py3o_template.xml
create mode 120000 setup/report_py3o_index/odoo/addons/report_py3o_index
create mode 100644 setup/report_py3o_index/setup.py
diff --git a/report_py3o_index/README.rst b/report_py3o_index/README.rst
new file mode 100644
index 0000000000..09f2cade99
--- /dev/null
+++ b/report_py3o_index/README.rst
@@ -0,0 +1,92 @@
+==============================================
+Py3o Report Engine: Update Indices (TOC, etc.)
+==============================================
+
+..
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! This file is generated by oca-gen-addon-readme !!
+ !! changes will be overwritten. !!
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! source digest: sha256:527b4bd77cfdd3ff1f069091cc2701f01df1c9cbbd7ffab7ab5a207b0fc7a58d
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+.. |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%2Freporting--engine-lightgray.png?logo=github
+ :target: https://github.com/OCA/reporting-engine/tree/12.0/report_py3o_index
+ :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-12-0/reporting-engine-12-0-report_py3o_index
+ :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=12.0
+ :alt: Try me on Runboat
+
+|badge1| |badge2| |badge3| |badge4| |badge5|
+
+This module fills in the document indexes (e.g. a Table of Content) in a generated py3o document.
+
+This is to work around the missing feature first reported in 2012: https://bugs.documentfoundation.org/show_bug.cgi?id=44448
+
+It uses the workaround given in https://ask.libreoffice.org/t/update-toc-via-command-line/52518 and other similar threads.
+
+Note that to work, the macro has to be installed in libreoffice first.
+This is done at module install.
+It assumes the macro files are stored at `~/.config/libreoffice/4/user/basic/Standard`.
+If it fails, the function can be manually called with the real path using:
+`self.env["py3o.report"]._install_update_index_macro(real_path)`
+
+Make sure that this is correct as most failure paths of the macro application are silent.
+
+Once this is done, py3o templates have an "has index" boolean.
+If set, the macro is applied after generation (and before pdf conversion) to update all indices.
+
+**Table of contents**
+
+.. contents::
+ :local:
+
+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
+~~~~~~~
+
+* Lambdao
+
+Contributors
+~~~~~~~~~~~~
+
+* Fanny He (`Lambdao `_) ,
+* Nans Lefebvre (`Lambdao `_) ,
+
+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.
+
+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/report_py3o_index/__init__.py b/report_py3o_index/__init__.py
new file mode 100644
index 0000000000..ca9b305813
--- /dev/null
+++ b/report_py3o_index/__init__.py
@@ -0,0 +1,7 @@
+# Copyright 2024 fah-mili/Lambdao
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+
+from . import models
+
+from .hooks import post_init_hook
diff --git a/report_py3o_index/__manifest__.py b/report_py3o_index/__manifest__.py
new file mode 100644
index 0000000000..da3742ceea
--- /dev/null
+++ b/report_py3o_index/__manifest__.py
@@ -0,0 +1,17 @@
+# Copyright 2024 fah-mili/Lambdao
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+
+{
+ 'name': 'Py3o Report Engine: Update Indices (TOC, etc.)',
+ 'summary': 'Update indices (TOC, etc.) in Py3o reports',
+ 'version': '12.0.1.0.0',
+ 'category': 'Reporting',
+ 'license': 'AGPL-3',
+ 'author': 'Lambdao, Odoo Community Association (OCA)',
+ "website": "https://github.com/OCA/reporting-engine",
+ 'depends': ['report_py3o'],
+ 'data': ["views/ir_actions_report.xml", "views/py3o_template.xml"],
+ 'installable': True,
+ 'post_init_hook': 'post_init_hook',
+}
diff --git a/report_py3o_index/data/ModuleUpdateIndex.xba b/report_py3o_index/data/ModuleUpdateIndex.xba
new file mode 100644
index 0000000000..8f22be2f6a
--- /dev/null
+++ b/report_py3o_index/data/ModuleUpdateIndex.xba
@@ -0,0 +1,28 @@
+
+
+REM ***** BASIC *****
+
+ Option Explicit
+
+ Sub UpdateIndexes(path As String)
+ '''Update indexes, such as for the table of contents'''
+ Dim doc As Object
+ Dim args()
+
+ doc = StarDesktop.loadComponentFromUrl(convertToUrl(path), "_default", 0, args())
+
+ Dim i As Integer
+
+ With doc ' Only process Writer documents
+ If .supportsService("com.sun.star.text.GenericTextDocument") Then
+ For i = 0 To .getDocumentIndexes().count - 1
+ .getDocumentIndexes().getByIndex(i).update()
+ Next i
+ End If
+ End With ' ThisComponent
+
+ doc.store()
+ doc.close(True)
+
+ End Sub ' UpdateIndexes
+
diff --git a/report_py3o_index/hooks.py b/report_py3o_index/hooks.py
new file mode 100644
index 0000000000..3d617daf21
--- /dev/null
+++ b/report_py3o_index/hooks.py
@@ -0,0 +1,20 @@
+# Copyright 2024 fah-mili/Lambdao
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+import logging
+
+from odoo import SUPERUSER_ID, api
+
+_logger = logging.getLogger(__name__)
+
+
+def post_init_hook(cr, registry):
+ _logger.info("Install index update macro with default path.")
+ env = api.Environment(cr, SUPERUSER_ID, {})
+ try:
+ env["py3o.report"]._install_update_index_macro()
+ except Exception as e:
+ _logger.warn("Failed to install index update macro.")
+ _logger.warn("--------")
+ _logger.warn(e)
+ _logger.warn("--------")
diff --git a/report_py3o_index/models/__init__.py b/report_py3o_index/models/__init__.py
new file mode 100644
index 0000000000..7d8fdab53a
--- /dev/null
+++ b/report_py3o_index/models/__init__.py
@@ -0,0 +1,7 @@
+# Copyright 2024 fah-mili/Lambdao
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+
+from . import py3o_template
+from . import ir_actions_report
+from . import py3o_report
diff --git a/report_py3o_index/models/ir_actions_report.py b/report_py3o_index/models/ir_actions_report.py
new file mode 100644
index 0000000000..8e92609161
--- /dev/null
+++ b/report_py3o_index/models/ir_actions_report.py
@@ -0,0 +1,16 @@
+# Copyright 2024 fah-mili/Lambdao
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+
+from odoo import fields, models
+
+
+class IrActionsReport(models.Model):
+
+ _inherit = 'ir.actions.report'
+ py3o_has_index_fallback = fields.Boolean(
+ "Has Py3o Index? (Fallback)",
+ default=False,
+ help="Check if the template fallback has a py3o index. "
+ "It needs to be compiled twice to get the index right."
+ )
diff --git a/report_py3o_index/models/py3o_report.py b/report_py3o_index/models/py3o_report.py
new file mode 100644
index 0000000000..3818a63ce9
--- /dev/null
+++ b/report_py3o_index/models/py3o_report.py
@@ -0,0 +1,92 @@
+# Copyright 2024 fah-mili/Lambdao
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+
+import logging
+import os
+import subprocess
+import pkg_resources
+
+from odoo import api, fields, models
+
+logger = logging.getLogger(__name__)
+
+
+class Py3oReport(models.TransientModel):
+ _inherit = "py3o.report"
+
+ py3o_has_index = fields.Boolean(
+ "Has Py3o Index?",
+ default=False,
+ compute='_compute_py3o_has_index',
+ help="Check if the template has a py3o index. "
+ "It needs to be compiled twice to get the index right."
+ )
+
+ @api.depends(
+ 'ir_actions_report_id.py3o_template_id.py3o_has_index',
+ 'ir_actions_report_id.py3o_has_index_fallback'
+ )
+ def _compute_py3o_has_index(self):
+ for rec in self:
+ if rec.ir_actions_report_id.py3o_template_id:
+ value = rec.ir_actions_report_id.py3o_template_id.py3o_has_index
+ else:
+ value = rec.ir_actions_report_id.py3o_has_index_fallback
+ rec.py3o_has_index = value
+
+ @api.model
+ def _install_update_index_macro(self, path=None):
+ """ Install or update the py3o index macro
+ """
+ # the real path is an argument so that in case it fails it can be
+ # called again with the correct one; after that it's LO's internal
+ # macro naming that will be used
+ # we could also have a parameter for the macro name but
+ # is it worth the complexity?
+ if not path:
+ path = "~/.config/libreoffice/4/user/basic/Standard"
+ real_path = os.path.realpath(os.path.expanduser(path))
+ file_macro = "ModuleUpdateIndex.xba"
+ macro_path = os.path.join(real_path, file_macro)
+ if not os.path.exists(macro_path):
+ # copy the new macro to libreoffice macro folder
+ content_path = pkg_resources.resource_filename(
+ 'odoo.addons.report_py3o_index',
+ 'data/ModuleUpdateIndex.xba'
+ )
+ with open(content_path, 'r') as f:
+ content = f.read()
+ with open(macro_path, 'w') as f:
+ f.write(content)
+ file_script = "script.xlb"
+ script_path = os.path.join(real_path, file_script)
+ mac = ''
+ with open(script_path, 'r') as f:
+ script_content = f.read()
+ if mac not in script_content:
+ end_marker = ''
+ marker_line = mac + "\n" + end_marker
+ new_content = script_content.replace(end_marker, marker_line)
+ with open(script_path, 'w') as f:
+ f.write(new_content)
+
+ @api.multi
+ def _convert_single_report(self, result_path, model_instance, data):
+ # this needs to be done before the report is converted to pdf!
+ # data is an unused dict, the file is obtained from the result_path
+ if self.py3o_has_index:
+ self._update_index(result_path)
+ result = super(Py3oReport, self)._convert_single_report(
+ result_path, model_instance, data
+ )
+ return result
+
+ def _update_index(self, result_path):
+ """Run a command to update the index"""
+ path = "macro:///Standard.ModuleUpdateIndex.UpdateIndexes(%s)" % result_path
+ lo_bin = self.ir_actions_report_id.lo_bin_path
+ cmd = [lo_bin, '--headless', path]
+ # if something goes wrong, it's not giving any error message...
+ subprocess.check_output(cmd, cwd=os.path.dirname(result_path))
+ return result_path
diff --git a/report_py3o_index/models/py3o_template.py b/report_py3o_index/models/py3o_template.py
new file mode 100644
index 0000000000..a45154483c
--- /dev/null
+++ b/report_py3o_index/models/py3o_template.py
@@ -0,0 +1,16 @@
+# Copyright 2024 fah-mili/Lambdao
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+
+from odoo import fields, models
+
+
+class Py3oTemplate(models.Model):
+ _inherit = 'py3o.template'
+
+ py3o_has_index = fields.Boolean(
+ "Has Py3o Index?",
+ default=False,
+ help="Check if the template has a py3o index. "
+ "It needs to be compiled twice to get the index right."
+ )
diff --git a/report_py3o_index/readme/CONTRIBUTORS.rst b/report_py3o_index/readme/CONTRIBUTORS.rst
new file mode 100644
index 0000000000..db83247dba
--- /dev/null
+++ b/report_py3o_index/readme/CONTRIBUTORS.rst
@@ -0,0 +1,2 @@
+* Fanny He (`Lambdao `_) ,
+* Nans Lefebvre (`Lambdao `_) ,
diff --git a/report_py3o_index/readme/DESCRIPTION.rst b/report_py3o_index/readme/DESCRIPTION.rst
new file mode 100644
index 0000000000..3a0cea0296
--- /dev/null
+++ b/report_py3o_index/readme/DESCRIPTION.rst
@@ -0,0 +1,15 @@
+This module fills in the document indexes (e.g. a Table of Content) in a generated py3o document.
+
+This is to work around the missing feature first reported in 2012: https://bugs.documentfoundation.org/show_bug.cgi?id=44448
+
+It uses the workaround given in https://ask.libreoffice.org/t/update-toc-via-command-line/52518 and other similar threads.
+
+Note that to work, the macro has to be installed in libreoffice first.
+This is done at module install.
+It assumes the macro files are stored at `~/.config/libreoffice/4/user/basic/Standard`.
+If it fails, the function can be manually called with the real path using:
+`self.env["py3o.report"]._install_update_index_macro(real_path)`
+Make sure that this is correct as most failure paths of the macro application are silent.
+
+Once this is done, py3o templates have an "has index" boolean.
+If set, the macro is applied after generation (and before pdf conversion) to update all indices.
diff --git a/report_py3o_index/static/description/icon.png b/report_py3o_index/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/report_py3o_index/static/description/index.html b/report_py3o_index/static/description/index.html
new file mode 100644
index 0000000000..6c77b75b72
--- /dev/null
+++ b/report_py3o_index/static/description/index.html
@@ -0,0 +1,431 @@
+
+
+
+
+
+Py3o Report Engine: Update Indices (TOC, etc.)
+
+
+
+
+
Py3o Report Engine: Update Indices (TOC, etc.)
+
+
+

+
This module fills in the document indexes (e.g. a Table of Content) in a generated py3o document.
+
This is to work around the missing feature first reported in 2012: https://bugs.documentfoundation.org/show_bug.cgi?id=44448
+
It uses the workaround given in https://ask.libreoffice.org/t/update-toc-via-command-line/52518 and other similar threads.
+
Note that to work, the macro has to be installed in libreoffice first.
+This is done at module install.
+It assumes the macro files are stored at ~/.config/libreoffice/4/user/basic/Standard.
+If it fails, the function can be manually called with the real path using:
+self.env[“py3o.report”]._install_update_index_macro(real_path)
+Make sure that this is correct as most failure paths of the macro application are silent.
+
Once this is done, py3o templates have an “has index” boolean.
+If set, the macro is applied after generation (and before pdf conversion) to update all indices.
+
Table of contents
+
+
+
+
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.
+
+
+
+
+
+
+
+
This module is maintained by the OCA.
+

+
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.
+
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/report_py3o_index/static/src/js/py3oactionmanager.js b/report_py3o_index/static/src/js/py3oactionmanager.js
new file mode 100644
index 0000000000..cf27145c8f
--- /dev/null
+++ b/report_py3o_index/static/src/js/py3oactionmanager.js
@@ -0,0 +1,38 @@
+/* Copyright 2017-2018 ACSONE SA/NV
+ * License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). */
+odoo.define('report_py3o.report', function (require) {
+
+var ActionManager = require('web.ActionManager');
+
+ActionManager.include({
+ _executeReportAction: function (action, options) {
+ // Py3o reports
+ if ('report_type' in action && action.report_type === 'py3o' ) {
+ return this._triggerDownload(action, options, 'py3o');
+ } else {
+ return this._super.apply(this, arguments);
+ }
+ },
+
+ _makeReportUrls: function(action) {
+ var reportUrls = this._super.apply(this, arguments);
+ reportUrls.py3o = '/report/py3o/' + action.report_name;
+ // We may have to build a query string with `action.data`. It's the place
+ // were report's using a wizard to customize the output traditionally put
+ // their options.
+ if (_.isUndefined(action.data) || _.isNull(action.data) ||
+ (_.isObject(action.data) && _.isEmpty(action.data))) {
+ if (action.context.active_ids) {
+ var activeIDsPath = '/' + action.context.active_ids.join(',');
+ reportUrls.py3o += activeIDsPath;;
+ }
+ } else {
+ var serializedOptionsPath = '?options=' + encodeURIComponent(JSON.stringify(action.data));
+ serializedOptionsPath += '&context=' + encodeURIComponent(JSON.stringify(action.context));
+ reportUrls.py3o += serializedOptionsPath;
+ }
+ return reportUrls;
+ }
+});
+
+});
diff --git a/report_py3o_index/views/ir_actions_report.xml b/report_py3o_index/views/ir_actions_report.xml
new file mode 100644
index 0000000000..c57e3baf26
--- /dev/null
+++ b/report_py3o_index/views/ir_actions_report.xml
@@ -0,0 +1,27 @@
+
+
+
+
+ py3o_report_view
+ ir.actions.report
+
+
+
+
+
+
+
+
+
+ py3o_report_search_view_py3o_index
+ ir.actions.report
+
+
+
+
+
+
+
+
diff --git a/report_py3o_index/views/py3o_template.xml b/report_py3o_index/views/py3o_template.xml
new file mode 100644
index 0000000000..b5ea7061ab
--- /dev/null
+++ b/report_py3o_index/views/py3o_template.xml
@@ -0,0 +1,38 @@
+
+
+
+
+ py3o.template.configuration.search.view.index
+ py3o.template
+
+
+
+
+
+
+
+
+
+
+ py3o.template.configuration.form.view.index
+ py3o.template
+
+
+
+
+
+
+
+
+
+ py3o.template.configuration.tree.view
+ py3o.template
+
+
+
+
+
+
+
+
diff --git a/setup/report_py3o_index/odoo/addons/report_py3o_index b/setup/report_py3o_index/odoo/addons/report_py3o_index
new file mode 120000
index 0000000000..19848a3f28
--- /dev/null
+++ b/setup/report_py3o_index/odoo/addons/report_py3o_index
@@ -0,0 +1 @@
+../../../../report_py3o_index
\ No newline at end of file
diff --git a/setup/report_py3o_index/setup.py b/setup/report_py3o_index/setup.py
new file mode 100644
index 0000000000..28c57bb640
--- /dev/null
+++ b/setup/report_py3o_index/setup.py
@@ -0,0 +1,6 @@
+import setuptools
+
+setuptools.setup(
+ setup_requires=['setuptools-odoo'],
+ odoo_addon=True,
+)
From 50eabf1d3a7ee06534d7104ff00f51fd889e7943 Mon Sep 17 00:00:00 2001
From: len
Date: Mon, 10 Mar 2025 09:47:19 +0100
Subject: [PATCH 2/2] [MIG] report_py3o_index
---
report_py3o_index/README.rst | 13 +++----
report_py3o_index/__manifest__.py | 20 +++++-----
report_py3o_index/models/ir_actions_report.py | 4 +-
report_py3o_index/models/py3o_report.py | 28 +++++++-------
report_py3o_index/models/py3o_template.py | 4 +-
.../static/description/index.html | 17 +++++----
.../static/src/js/py3oactionmanager.js | 38 -------------------
report_py3o_index/views/ir_actions_report.xml | 11 ++++--
report_py3o_index/views/py3o_template.xml | 29 +++++++++++---
9 files changed, 73 insertions(+), 91 deletions(-)
delete mode 100644 report_py3o_index/static/src/js/py3oactionmanager.js
diff --git a/report_py3o_index/README.rst b/report_py3o_index/README.rst
index 09f2cade99..afbb62f8e9 100644
--- a/report_py3o_index/README.rst
+++ b/report_py3o_index/README.rst
@@ -2,7 +2,7 @@
Py3o Report Engine: Update Indices (TOC, etc.)
==============================================
-..
+..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
@@ -17,13 +17,13 @@ Py3o Report Engine: Update Indices (TOC, etc.)
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Freporting--engine-lightgray.png?logo=github
- :target: https://github.com/OCA/reporting-engine/tree/12.0/report_py3o_index
+ :target: https://github.com/OCA/reporting-engine/tree/16.0/report_py3o_index
: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-12-0/reporting-engine-12-0-report_py3o_index
+ :target: https://translation.odoo-community.org/projects/reporting-engine-16-0/reporting-engine-16-0-report_py3o_index
: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=12.0
+ :target: https://runboat.odoo-community.org/builds?repo=OCA/reporting-engine&target_branch=16.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
@@ -39,7 +39,6 @@ This is done at module install.
It assumes the macro files are stored at `~/.config/libreoffice/4/user/basic/Standard`.
If it fails, the function can be manually called with the real path using:
`self.env["py3o.report"]._install_update_index_macro(real_path)`
-
Make sure that this is correct as most failure paths of the macro application are silent.
Once this is done, py3o templates have an "has index" boolean.
@@ -56,7 +55,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.
@@ -87,6 +86,6 @@ 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.
-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/report_py3o_index/__manifest__.py b/report_py3o_index/__manifest__.py
index da3742ceea..61912eab0f 100644
--- a/report_py3o_index/__manifest__.py
+++ b/report_py3o_index/__manifest__.py
@@ -3,15 +3,15 @@
{
- 'name': 'Py3o Report Engine: Update Indices (TOC, etc.)',
- 'summary': 'Update indices (TOC, etc.) in Py3o reports',
- 'version': '12.0.1.0.0',
- 'category': 'Reporting',
- 'license': 'AGPL-3',
- 'author': 'Lambdao, Odoo Community Association (OCA)',
+ "name": "Py3o Report Engine: Update Indices (TOC, etc.)",
+ "summary": "Update indices (TOC, etc.) in Py3o reports",
+ "version": "16.0.1.0.0",
+ "category": "Reporting",
+ "license": "AGPL-3",
+ "author": "Lambdao, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/reporting-engine",
- 'depends': ['report_py3o'],
- 'data': ["views/ir_actions_report.xml", "views/py3o_template.xml"],
- 'installable': True,
- 'post_init_hook': 'post_init_hook',
+ "depends": ["report_py3o"],
+ "data": ["views/ir_actions_report.xml", "views/py3o_template.xml"],
+ "installable": True,
+ "post_init_hook": "post_init_hook",
}
diff --git a/report_py3o_index/models/ir_actions_report.py b/report_py3o_index/models/ir_actions_report.py
index 8e92609161..da65608511 100644
--- a/report_py3o_index/models/ir_actions_report.py
+++ b/report_py3o_index/models/ir_actions_report.py
@@ -7,10 +7,10 @@
class IrActionsReport(models.Model):
- _inherit = 'ir.actions.report'
+ _inherit = "ir.actions.report"
py3o_has_index_fallback = fields.Boolean(
"Has Py3o Index? (Fallback)",
default=False,
help="Check if the template fallback has a py3o index. "
- "It needs to be compiled twice to get the index right."
+ "It needs to be compiled twice to get the index right.",
)
diff --git a/report_py3o_index/models/py3o_report.py b/report_py3o_index/models/py3o_report.py
index 3818a63ce9..4f7a4bba62 100644
--- a/report_py3o_index/models/py3o_report.py
+++ b/report_py3o_index/models/py3o_report.py
@@ -5,6 +5,7 @@
import logging
import os
import subprocess
+
import pkg_resources
from odoo import api, fields, models
@@ -18,14 +19,14 @@ class Py3oReport(models.TransientModel):
py3o_has_index = fields.Boolean(
"Has Py3o Index?",
default=False,
- compute='_compute_py3o_has_index',
+ compute="_compute_py3o_has_index",
help="Check if the template has a py3o index. "
- "It needs to be compiled twice to get the index right."
+ "It needs to be compiled twice to get the index right.",
)
@api.depends(
- 'ir_actions_report_id.py3o_template_id.py3o_has_index',
- 'ir_actions_report_id.py3o_has_index_fallback'
+ "ir_actions_report_id.py3o_template_id.py3o_has_index",
+ "ir_actions_report_id.py3o_has_index_fallback",
)
def _compute_py3o_has_index(self):
for rec in self:
@@ -37,8 +38,7 @@ def _compute_py3o_has_index(self):
@api.model
def _install_update_index_macro(self, path=None):
- """ Install or update the py3o index macro
- """
+ """Install or update the py3o index macro"""
# the real path is an argument so that in case it fails it can be
# called again with the correct one; after that it's LO's internal
# macro naming that will be used
@@ -52,26 +52,24 @@ def _install_update_index_macro(self, path=None):
if not os.path.exists(macro_path):
# copy the new macro to libreoffice macro folder
content_path = pkg_resources.resource_filename(
- 'odoo.addons.report_py3o_index',
- 'data/ModuleUpdateIndex.xba'
+ "odoo.addons.report_py3o_index", "data/ModuleUpdateIndex.xba"
)
- with open(content_path, 'r') as f:
+ with open(content_path, "r") as f:
content = f.read()
- with open(macro_path, 'w') as f:
+ with open(macro_path, "w") as f:
f.write(content)
file_script = "script.xlb"
script_path = os.path.join(real_path, file_script)
mac = ''
- with open(script_path, 'r') as f:
+ with open(script_path, "r") as f:
script_content = f.read()
if mac not in script_content:
- end_marker = ''
+ end_marker = ""
marker_line = mac + "\n" + end_marker
new_content = script_content.replace(end_marker, marker_line)
- with open(script_path, 'w') as f:
+ with open(script_path, "w") as f:
f.write(new_content)
- @api.multi
def _convert_single_report(self, result_path, model_instance, data):
# this needs to be done before the report is converted to pdf!
# data is an unused dict, the file is obtained from the result_path
@@ -86,7 +84,7 @@ def _update_index(self, result_path):
"""Run a command to update the index"""
path = "macro:///Standard.ModuleUpdateIndex.UpdateIndexes(%s)" % result_path
lo_bin = self.ir_actions_report_id.lo_bin_path
- cmd = [lo_bin, '--headless', path]
+ cmd = [lo_bin, "--headless", path]
# if something goes wrong, it's not giving any error message...
subprocess.check_output(cmd, cwd=os.path.dirname(result_path))
return result_path
diff --git a/report_py3o_index/models/py3o_template.py b/report_py3o_index/models/py3o_template.py
index a45154483c..6dff248211 100644
--- a/report_py3o_index/models/py3o_template.py
+++ b/report_py3o_index/models/py3o_template.py
@@ -6,11 +6,11 @@
class Py3oTemplate(models.Model):
- _inherit = 'py3o.template'
+ _inherit = "py3o.template"
py3o_has_index = fields.Boolean(
"Has Py3o Index?",
default=False,
help="Check if the template has a py3o index. "
- "It needs to be compiled twice to get the index right."
+ "It needs to be compiled twice to get the index right.",
)
diff --git a/report_py3o_index/static/description/index.html b/report_py3o_index/static/description/index.html
index 6c77b75b72..41f592acc8 100644
--- a/report_py3o_index/static/description/index.html
+++ b/report_py3o_index/static/description/index.html
@@ -8,10 +8,11 @@
/*
:Author: David Goodger (goodger@python.org)
-:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $
+:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
+Despite the name, some widely supported CSS2 features are used.
See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
customize this style sheet.
@@ -274,7 +275,7 @@
margin-left: 2em ;
margin-right: 2em }
-pre.code .ln { color: grey; } /* line numbers */
+pre.code .ln { color: gray; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
@@ -300,7 +301,7 @@
span.pre {
white-space: pre }
-span.problematic {
+span.problematic, pre.problematic {
color: red }
span.section-subtitle {
@@ -368,7 +369,7 @@ Py3o Report Engine: Update Indices (TOC, etc.)
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:527b4bd77cfdd3ff1f069091cc2701f01df1c9cbbd7ffab7ab5a207b0fc7a58d
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-

+

This module fills in the document indexes (e.g. a Table of Content) in a generated py3o document.
This is to work around the missing feature first reported in 2012: https://bugs.documentfoundation.org/show_bug.cgi?id=44448
It uses the workaround given in https://ask.libreoffice.org/t/update-toc-via-command-line/52518 and other similar threads.
@@ -397,7 +398,7 @@
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.
@@ -418,11 +419,13 @@
This module is maintained by the OCA.
-

+
+
+
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.
-
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/report_py3o_index/static/src/js/py3oactionmanager.js b/report_py3o_index/static/src/js/py3oactionmanager.js
deleted file mode 100644
index cf27145c8f..0000000000
--- a/report_py3o_index/static/src/js/py3oactionmanager.js
+++ /dev/null
@@ -1,38 +0,0 @@
-/* Copyright 2017-2018 ACSONE SA/NV
- * License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). */
-odoo.define('report_py3o.report', function (require) {
-
-var ActionManager = require('web.ActionManager');
-
-ActionManager.include({
- _executeReportAction: function (action, options) {
- // Py3o reports
- if ('report_type' in action && action.report_type === 'py3o' ) {
- return this._triggerDownload(action, options, 'py3o');
- } else {
- return this._super.apply(this, arguments);
- }
- },
-
- _makeReportUrls: function(action) {
- var reportUrls = this._super.apply(this, arguments);
- reportUrls.py3o = '/report/py3o/' + action.report_name;
- // We may have to build a query string with `action.data`. It's the place
- // were report's using a wizard to customize the output traditionally put
- // their options.
- if (_.isUndefined(action.data) || _.isNull(action.data) ||
- (_.isObject(action.data) && _.isEmpty(action.data))) {
- if (action.context.active_ids) {
- var activeIDsPath = '/' + action.context.active_ids.join(',');
- reportUrls.py3o += activeIDsPath;;
- }
- } else {
- var serializedOptionsPath = '?options=' + encodeURIComponent(JSON.stringify(action.data));
- serializedOptionsPath += '&context=' + encodeURIComponent(JSON.stringify(action.context));
- reportUrls.py3o += serializedOptionsPath;
- }
- return reportUrls;
- }
-});
-
-});
diff --git a/report_py3o_index/views/ir_actions_report.xml b/report_py3o_index/views/ir_actions_report.xml
index c57e3baf26..2ca2e9334c 100644
--- a/report_py3o_index/views/ir_actions_report.xml
+++ b/report_py3o_index/views/ir_actions_report.xml
@@ -1,4 +1,4 @@
-
+
@@ -16,11 +16,14 @@
py3o_report_search_view_py3o_index
ir.actions.report
-
+
-
+
diff --git a/report_py3o_index/views/py3o_template.xml b/report_py3o_index/views/py3o_template.xml
index b5ea7061ab..8eba7ffb51 100644
--- a/report_py3o_index/views/py3o_template.xml
+++ b/report_py3o_index/views/py3o_template.xml
@@ -1,15 +1,26 @@
-
+
py3o.template.configuration.search.view.index
py3o.template
-
+
-
-
+
+
@@ -17,7 +28,10 @@
py3o.template.configuration.form.view.index
py3o.template
-
+
@@ -28,7 +42,10 @@
py3o.template.configuration.tree.view
py3o.template
-
+