diff --git a/report_qweb_pdf_watermark/__manifest__.py b/report_qweb_pdf_watermark/__manifest__.py index 1d3af3261..0291a0736 100644 --- a/report_qweb_pdf_watermark/__manifest__.py +++ b/report_qweb_pdf_watermark/__manifest__.py @@ -2,18 +2,24 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). { "name": "Pdf watermark", - "version": "14.0.1.0.1", + "version": "15.0.1.0.0", "author": "Therp BV, " "Odoo Community Association (OCA)", "license": "AGPL-3", "category": "Technical Settings", + "development_status": "Production/Stable", "summary": "Add watermarks to your QWEB PDF reports", "website": "https://github.com/OCA/reporting-engine", "depends": ["web"], "data": [ "demo/report.xml", "views/ir_actions_report_xml.xml", - "views/layout_templates.xml", + "views/res_company.xml", ], + "assets": { + "web.report_assets_pdf": [ + "/report_qweb_pdf_watermark/static/src/css/report_qweb_pdf_watermark.css" + ], + }, "demo": ["demo/report.xml"], "installable": True, } diff --git a/report_qweb_pdf_watermark/demo/report.xml b/report_qweb_pdf_watermark/demo/report.xml index 8c752c53a..9e58bd395 100644 --- a/report_qweb_pdf_watermark/demo/report.xml +++ b/report_qweb_pdf_watermark/demo/report.xml @@ -1,22 +1,16 @@ - - - Demo report + + Watermark Demo report res.users qweb-pdf report_qweb_pdf_watermark.demo_report_view report_qweb_pdf_watermark.demo_report_view + docs[:1].company_id.logo report - - Demo report - res.users - report_qweb_pdf_watermark.demo_report_view - docs[:1].company_id.logo - - diff --git a/report_qweb_pdf_watermark/models/__init__.py b/report_qweb_pdf_watermark/models/__init__.py index 5db6f5b43..a305da900 100644 --- a/report_qweb_pdf_watermark/models/__init__.py +++ b/report_qweb_pdf_watermark/models/__init__.py @@ -1,4 +1,5 @@ # © 2016 Therp BV # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from . import res_company from . import report diff --git a/report_qweb_pdf_watermark/models/report.py b/report_qweb_pdf_watermark/models/report.py index 9362d13da..b5845228c 100644 --- a/report_qweb_pdf_watermark/models/report.py +++ b/report_qweb_pdf_watermark/models/report.py @@ -9,13 +9,13 @@ from PIL import Image from odoo import api, fields, models from odoo.tools.safe_eval import safe_eval +logger = getLogger(__name__) + try: # we need this to be sure PIL has loaded PDF support from PIL import PdfImagePlugin # noqa: F401 except ImportError: - pass - -logger = getLogger(__name__) + logger.error("ImportError: The PdfImagePlugin could not be imported") try: from PyPDF2 import PdfFileReader, PdfFileWriter # pylint: disable=W0404 @@ -27,7 +27,13 @@ except ImportError: class Report(models.Model): _inherit = "ir.actions.report" - pdf_watermark = fields.Binary("Watermark") + use_company_watermark = fields.Boolean( + default=False, + help="Use the pdf watermark defined globally in the company settings.", + ) + pdf_watermark = fields.Binary( + "Watermark", help="Upload an pdf file to use as an watermark on this report." + ) pdf_watermark_expression = fields.Char( "Watermark expression", help="An expression yielding the base64 " @@ -42,6 +48,17 @@ class Report(models.Model): ) return super(Report, self)._render_qweb_pdf(res_ids=res_ids, data=data) + def pdf_has_usable_pages(self, numpages): + if numpages < 1: + logger.error("Your watermark pdf does not contain any pages") + return False + if numpages > 1: + logger.debug( + "Your watermark pdf contains more than one page, " + "all but the first one will be ignored" + ) + return True + @api.model def _run_wkhtmltopdf( self, @@ -65,6 +82,8 @@ class Report(models.Model): watermark = None if self.pdf_watermark: watermark = b64decode(self.pdf_watermark) + elif self.use_company_watermark and self.env.company.pdf_watermark: + watermark = b64decode(self.env.company.pdf_watermark) elif docids: watermark = safe_eval( self.pdf_watermark_expression or "None", @@ -100,14 +119,8 @@ class Report(models.Model): logger.error("No usable watermark found, got %s...", watermark[:100]) return result - if pdf_watermark.numPages < 1: - logger.error("Your watermark pdf does not contain any pages") + if not self.pdf_has_usable_pages(pdf_watermark.numPages): return result - if pdf_watermark.numPages > 1: - logger.debug( - "Your watermark pdf contains more than one page, " - "all but the first one will be ignored" - ) for page in PdfFileReader(BytesIO(result)).pages: watermark_page = pdf.addBlankPage( diff --git a/report_qweb_pdf_watermark/models/res_company.py b/report_qweb_pdf_watermark/models/res_company.py new file mode 100644 index 000000000..a7bbf87f1 --- /dev/null +++ b/report_qweb_pdf_watermark/models/res_company.py @@ -0,0 +1,10 @@ +# Copyright 2022 360 ERP () +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). + +from odoo import fields, models + + +class ResCompany(models.Model): + _inherit = "res.company" + + pdf_watermark = fields.Binary("Watermark") diff --git a/report_qweb_pdf_watermark/readme/CONTRIBUTORS.rst b/report_qweb_pdf_watermark/readme/CONTRIBUTORS.rst index 475c9d681..ccce2bb44 100644 --- a/report_qweb_pdf_watermark/readme/CONTRIBUTORS.rst +++ b/report_qweb_pdf_watermark/readme/CONTRIBUTORS.rst @@ -3,3 +3,4 @@ * Rod Schouteden * Robin Goots * Foram Shah +* Emiel van Bokhoven diff --git a/report_qweb_pdf_watermark/readme/HISTORY.rst b/report_qweb_pdf_watermark/readme/HISTORY.rst index 236854067..a87254f69 100644 --- a/report_qweb_pdf_watermark/readme/HISTORY.rst +++ b/report_qweb_pdf_watermark/readme/HISTORY.rst @@ -14,3 +14,10 @@ ~~~~~~~~~~~~~~~~~~~~~~~ * [MIG] Migration to V14. + + +15.0.1.0.0 (2022-01-11) +~~~~~~~~~~~~~~~~~~~~~~~ + +* [MIG] Migration to V15. +* Define pdf watermark in company settings diff --git a/report_qweb_pdf_watermark/readme/USAGE.rst b/report_qweb_pdf_watermark/readme/USAGE.rst index 13dff9371..a725032f1 100644 --- a/report_qweb_pdf_watermark/readme/USAGE.rst +++ b/report_qweb_pdf_watermark/readme/USAGE.rst @@ -3,3 +3,18 @@ To use this module, you need to: #. go to your report #. select a PDF or image to use as watermark. Note that resolutions and size must match, otherwise you'll have funny results #. You can also fill in an expression that returns the data (base64 encoded) to be used as watermark + +To use the Company watermark, you need to: + +#. go to settings --> company --> update info +#. upload an pdf watermark +#. go to settings --> technical --> reporting --> reports +#. Select the report where you want to use it. +#. On the 'Advanced Properties' tab of the notebook check 'use company watermark' + +### Demo +And demo report is available (if you have demo data installed) on the users form view. + +#. go to Configuration --> users +#. Select an users +#. Click the print button --> Watermark Demo report. diff --git a/report_qweb_pdf_watermark/tests/test_report_qweb_pdf_watermark.py b/report_qweb_pdf_watermark/tests/test_report_qweb_pdf_watermark.py index 0ad4beba4..68d3fd8ad 100644 --- a/report_qweb_pdf_watermark/tests/test_report_qweb_pdf_watermark.py +++ b/report_qweb_pdf_watermark/tests/test_report_qweb_pdf_watermark.py @@ -23,11 +23,33 @@ class TestReportQwebPdfWatermark(HttpCase): # and now we should have three again self._test_report_images(3) - def _test_report_images(self, number): - report = self.env["ir.model.data"].xmlid_to_object( - "report_qweb_pdf_watermark.demo_report" + # test use company watermark + self.env.ref("report_qweb_pdf_watermark.demo_report").write( + {"pdf_watermark": False} ) + self.env.ref("report_qweb_pdf_watermark.demo_report").write( + {"use_company_watermark": True} + ) + self.env.ref("base.main_company").write( + {"pdf_watermark": self.env.user.company_id.logo} + ) + self._test_report_images(3) + + def _test_report_images(self, number): + report = self.env.ref("report_qweb_pdf_watermark.demo_report") pdf, _ = report.with_context(force_report_rendering=True)._render_qweb_pdf( self.env["res.users"].search([]).ids ) self.assertEqual(pdf.count(b"/Subtype /Image"), number) + + def test_pdf_has_usable_pages(self): + # test 0 + numpages = 0 + # pdf_has_usable_pages(self, pdf_watermark) + self.assertFalse(self.env["ir.actions.report"].pdf_has_usable_pages(numpages)) + # test 1 + numpages = 1 + self.assertTrue(self.env["ir.actions.report"].pdf_has_usable_pages(numpages)) + # test 2 + numpages = 2 + self.assertTrue(self.env["ir.actions.report"].pdf_has_usable_pages(numpages)) diff --git a/report_qweb_pdf_watermark/views/ir_actions_report_xml.xml b/report_qweb_pdf_watermark/views/ir_actions_report_xml.xml index fd3fbcb89..98b493f2b 100644 --- a/report_qweb_pdf_watermark/views/ir_actions_report_xml.xml +++ b/report_qweb_pdf_watermark/views/ir_actions_report_xml.xml @@ -6,14 +6,19 @@ + diff --git a/report_qweb_pdf_watermark/views/layout_templates.xml b/report_qweb_pdf_watermark/views/layout_templates.xml deleted file mode 100644 index 50819c373..000000000 --- a/report_qweb_pdf_watermark/views/layout_templates.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - diff --git a/report_qweb_pdf_watermark/views/res_company.xml b/report_qweb_pdf_watermark/views/res_company.xml new file mode 100644 index 000000000..66a55d487 --- /dev/null +++ b/report_qweb_pdf_watermark/views/res_company.xml @@ -0,0 +1,20 @@ + + + + + res.company + + + + + + + + + + +