diff --git a/report_qweb_encrypt/__manifest__.py b/report_qweb_encrypt/__manifest__.py index 4644b6ffce..8442ddbd1b 100644 --- a/report_qweb_encrypt/__manifest__.py +++ b/report_qweb_encrypt/__manifest__.py @@ -5,7 +5,7 @@ { "name": "Report Qweb Encrypt", "summary": "Allow to encrypt qweb pdfs", - "version": "15.0.1.0.0", + "version": "16.0.1.0.0", "license": "AGPL-3", "author": "Creu Blanca,Ecosoft,Odoo Community Association (OCA)", "website": "https://github.com/OCA/reporting-engine", @@ -17,12 +17,10 @@ ], "assets": { "web.assets_backend": [ - "report_qweb_encrypt/static/src/js/report/action_manager_report.esm.js", + "report_qweb_encrypt/static/src/report/action_manager_report.esm.js", + "report_qweb_encrypt/static/src/report/encrypt_dialog.xml", ], }, - "external_dependencies": { - "python": ["PyPDF2"] # Python third party libraries required for module - }, "installable": True, "maintainers": ["kittiu"], } diff --git a/report_qweb_encrypt/controllers/main.py b/report_qweb_encrypt/controllers/main.py index f7beea4aa8..f3450ed254 100644 --- a/report_qweb_encrypt/controllers/main.py +++ b/report_qweb_encrypt/controllers/main.py @@ -7,13 +7,13 @@ from odoo.http import request, route -from odoo.addons.web.controllers import main as report +from odoo.addons.web.controllers.report import ReportController -class ReportController(report.ReportController): +class ReportControllerEncrypt(ReportController): @route() def report_download(self, data, context=None): - result = super(ReportController, self).report_download(data, context=context) + result = super().report_download(data, context=context) # When report is downloaded from print action, this function is called, # but this function cannot pass context (manually entered password) to # report.render_qweb_pdf(), encrypton for manual password is done here. diff --git a/report_qweb_encrypt/models/ir_actions_report.py b/report_qweb_encrypt/models/ir_actions_report.py index b72c7b9017..6df9a3d04b 100644 --- a/report_qweb_encrypt/models/ir_actions_report.py +++ b/report_qweb_encrypt/models/ir_actions_report.py @@ -25,12 +25,16 @@ class IrActionsReport(models.Model): help="Python code syntax to gnerate password.", ) - def _render_qweb_pdf(self, res_ids=None, data=None): - document, ttype = super(IrActionsReport, self)._render_qweb_pdf( - res_ids=res_ids, data=data + def _render_qweb_pdf(self, reportname, res_ids=None, data=None): + document, ttype = super()._render_qweb_pdf( + reportname, res_ids=res_ids, data=data ) if res_ids: - password = self._get_pdf_password(res_ids[:1]) + encrypt_password = self._context.get("encrypt_password") + report = self._get_report_from_name(reportname).with_context( + encrypt_password=encrypt_password + ) + password = report._get_pdf_password(res_ids[:1]) document = self._encrypt_pdf(document, password) return document, ttype @@ -55,8 +59,10 @@ def _get_pdf_password(self, res_ids): ) except Exception as e: raise ValidationError( - _("Python code used for encryption password is invalid.\n%s") - % self.encrypt_password + _( + "Python code used for encryption password is invalid.\n%s", + self.encrypt_password, + ) ) from e return encrypt_password diff --git a/report_qweb_encrypt/static/src/js/report/encrypt_dialog.xml b/report_qweb_encrypt/static/src/js/report/encrypt_dialog.xml deleted file mode 100644 index 45c359fc96..0000000000 --- a/report_qweb_encrypt/static/src/js/report/encrypt_dialog.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - -
-
- -
diff --git a/report_qweb_encrypt/static/src/js/report/action_manager_report.esm.js b/report_qweb_encrypt/static/src/report/action_manager_report.esm.js similarity index 77% rename from report_qweb_encrypt/static/src/js/report/action_manager_report.esm.js rename to report_qweb_encrypt/static/src/report/action_manager_report.esm.js index fcf110a3f4..48e5664fa4 100644 --- a/report_qweb_encrypt/static/src/js/report/action_manager_report.esm.js +++ b/report_qweb_encrypt/static/src/report/action_manager_report.esm.js @@ -3,11 +3,15 @@ import {Dialog} from "@web/core/dialog/dialog"; import {download} from "@web/core/network/download"; import {registry} from "@web/core/registry"; +const {Component} = owl; async function download_function(action, options, env) { - const type = action.report_type; + const type = action.report_type === "qweb-pdf" ? "pdf" : action.report_type; let url = `/report/${type}/${action.report_name}`; const actionContext = action.context || {}; + const userContext = Object.assign(env.services.user.context, { + encrypt_password: action.context.encrypt_password, + }); if (action.data && JSON.stringify(action.data) !== "{}") { // Build a query string with `action.data` (it's the place where reports // using a wizard to customize the output traditionally put their options) @@ -19,9 +23,7 @@ async function download_function(action, options, env) { url += `/${actionContext.active_ids.join(",")}`; } if (type === "html") { - const context = encodeURIComponent( - JSON.stringify(env.services.user.context) - ); + const context = encodeURIComponent(JSON.stringify(userContext)); url += `?context=${context}`; } } @@ -31,7 +33,7 @@ async function download_function(action, options, env) { url: "/report/download", data: { data: JSON.stringify([url, action.report_type]), - context: JSON.stringify(env.services.user.context), + context: JSON.stringify(userContext), }, }); } finally { @@ -49,19 +51,19 @@ async function download_function(action, options, env) { return Promise.resolve(true); } -class EncryptDialog extends Dialog { +class EncryptDialog extends Component { onClick() { const action = this.props.action; action.context = _.extend({}, action.context, { - encrypt_password: this.el.find(".o_password").val() || false, + encrypt_password: + $("#qweb_encrypt_pdf_password > .o_password").val() || false, }); return download_function(action, this.props.options, this.props.env); } } -EncryptDialog.size = "small"; -EncryptDialog.title = "Encrypt"; -EncryptDialog.bodyTemplate = "report_qweb_encrypt.EncryptDialogBody"; -EncryptDialog.footerTemplate = "report_qweb_encrypt.EncryptDialogFooter"; + +EncryptDialog.components = {Dialog}; +EncryptDialog.template = "report_qweb_encrypt.EncryptDialogBody"; registry .category("ir.actions.report handlers") diff --git a/report_qweb_encrypt/static/src/report/encrypt_dialog.xml b/report_qweb_encrypt/static/src/report/encrypt_dialog.xml new file mode 100644 index 0000000000..3027450055 --- /dev/null +++ b/report_qweb_encrypt/static/src/report/encrypt_dialog.xml @@ -0,0 +1,16 @@ + + + + + +
+ +
+ + + + +
+
+ +
diff --git a/report_qweb_encrypt/tests/test_report_qweb_encrypt.py b/report_qweb_encrypt/tests/test_report_qweb_encrypt.py index 0de5e0cb0b..2095531c1d 100644 --- a/report_qweb_encrypt/tests/test_report_qweb_encrypt.py +++ b/report_qweb_encrypt/tests/test_report_qweb_encrypt.py @@ -9,7 +9,7 @@ def test_report_qweb_no_encrypt(self): ctx = {"force_report_rendering": True} report = self.env.ref("web.action_report_internalpreview") report.encrypt = False - pdf, _ = report.with_context(**ctx)._render_qweb_pdf([1]) + pdf, _ = report.with_context(**ctx)._render_qweb_pdf(report.report_name, [1]) self.assertFalse(pdf.count(b"/Encrypt")) def test_report_qweb_auto_encrypt(self): @@ -19,17 +19,19 @@ def test_report_qweb_auto_encrypt(self): report.encrypt_password = False # If no encrypt_password, still not encrypted - pdf, _ = report.with_context(**ctx)._render_qweb_pdf([1]) + pdf, _ = report.with_context(**ctx)._render_qweb_pdf(report.report_name, [1]) self.assertFalse(pdf.count(b"/Encrypt")) # If invalid encrypt_password, show error report.encrypt_password = "invalid python syntax" with self.assertRaises(ValidationError): - pdf, _ = report.with_context(**ctx)._render_qweb_pdf([1]) + pdf, _ = report.with_context(**ctx)._render_qweb_pdf( + report.report_name, [1] + ) # Valid python string for password report.encrypt_password = "'secretcode'" - pdf, _ = report.with_context(**ctx)._render_qweb_pdf([1]) + pdf, _ = report.with_context(**ctx)._render_qweb_pdf(report.report_name, [1]) self.assertTrue(pdf.count(b"/Encrypt")) def test_report_qweb_manual_encrypt(self): @@ -38,12 +40,12 @@ def test_report_qweb_manual_encrypt(self): report.encrypt = "manual" # If no encrypt_password, still not encrypted - pdf, _ = report.with_context(**ctx)._render_qweb_pdf([1]) + pdf, _ = report.with_context(**ctx)._render_qweb_pdf(report.report_name, [1]) self.assertFalse(pdf.count(b"/Encrypt")) # Valid python string for password ctx.update({"encrypt_password": "secretcode"}) - pdf, _ = report.with_context(**ctx)._render_qweb_pdf([1]) + pdf, _ = report.with_context(**ctx)._render_qweb_pdf(report.report_name, [1]) self.assertTrue(pdf.count(b"/Encrypt")) # TODO: test_report_qweb_manual_encrypt, require JS test?