[13.0][MIG] report_qweb_pdf_watermark
parent
5554601d7e
commit
929e2309a4
|
@ -62,6 +62,11 @@ Changelog
|
|||
|
||||
* [MIG] Migration to V12.
|
||||
|
||||
13.0.1.0.0 (2021-01-27)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* [MIG] Migration to V13.
|
||||
|
||||
Bug Tracker
|
||||
===========
|
||||
|
||||
|
@ -87,6 +92,7 @@ Contributors
|
|||
* Stefan Rijnhart <stefan@opener.am>
|
||||
* Rod Schouteden <rod.schouteden@dynapps.be>
|
||||
* Robin Goots <robin.goots@dynapps.be>
|
||||
* Foram Shah <foram.shah@initos.com>
|
||||
|
||||
Maintainers
|
||||
~~~~~~~~~~~
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# © 2016 Therp BV <http://therp.nl>
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
||||
|
||||
from . import models
|
||||
from . import models # pyflakes.ignore
|
||||
|
|
|
@ -2,28 +2,19 @@
|
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
||||
{
|
||||
"name": "Pdf watermark",
|
||||
"version": "12.0.1.0.1",
|
||||
"author": "Therp BV, "
|
||||
"Odoo Community Association (OCA)",
|
||||
"version": "13.0.1.0.0",
|
||||
"author": "Therp BV, " "Odoo Community Association (OCA)",
|
||||
"license": "AGPL-3",
|
||||
"category": "Technical Settings",
|
||||
"summary": "Add watermarks to your QWEB PDF reports",
|
||||
"website": "https://github.com/oca/reporting-engine",
|
||||
"depends": [
|
||||
'web',
|
||||
],
|
||||
"depends": ["web"],
|
||||
"data": [
|
||||
"demo/report.xml",
|
||||
"views/ir_actions_report_xml.xml",
|
||||
"views/layout_templates.xml",
|
||||
],
|
||||
"demo": [
|
||||
"demo/report.xml"
|
||||
],
|
||||
"demo": ["demo/report.xml"],
|
||||
"installable": True,
|
||||
'external_dependencies': {
|
||||
'python': [
|
||||
'PyPDF2',
|
||||
],
|
||||
},
|
||||
"external_dependencies": {"python": ["PyPDF2"]},
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
<report
|
||||
id="demo_report"
|
||||
|
@ -8,7 +8,7 @@
|
|||
name="report_qweb_pdf_watermark.demo_report_view"
|
||||
file="report_qweb_pdf_watermark.demo_report_view"
|
||||
paperformat="base.paperformat_euro"
|
||||
/>
|
||||
/>
|
||||
<record id="demo_report" model="ir.actions.report">
|
||||
<field name="pdf_watermark_expression">docs[:1].company_id.logo</field>
|
||||
</record>
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
# © 2016 Therp BV <http://therp.nl>
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
||||
|
||||
from . import report
|
||||
|
|
|
@ -1,16 +1,18 @@
|
|||
# © 2016 Therp BV <http://therp.nl>
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
||||
from base64 import b64decode
|
||||
from logging import getLogger
|
||||
from PIL import Image
|
||||
from io import BytesIO
|
||||
from logging import getLogger
|
||||
|
||||
from PIL import Image
|
||||
|
||||
from odoo import api, fields, models, tools
|
||||
|
||||
try:
|
||||
# we need this to be sure PIL has loaded PDF support
|
||||
from PIL import PdfImagePlugin # noqa: F401
|
||||
except ImportError:
|
||||
pass
|
||||
from odoo import api, models, fields, tools
|
||||
|
||||
logger = getLogger(__name__)
|
||||
|
||||
|
@ -18,42 +20,53 @@ try:
|
|||
from PyPDF2 import PdfFileWriter, PdfFileReader # pylint: disable=W0404
|
||||
from PyPDF2.utils import PdfReadError # pylint: disable=W0404
|
||||
except ImportError:
|
||||
logger.debug('Can not import PyPDF2')
|
||||
logger.debug("Can not import PyPDF2")
|
||||
|
||||
|
||||
class Report(models.Model):
|
||||
_inherit = 'ir.actions.report'
|
||||
_inherit = "ir.actions.report"
|
||||
|
||||
pdf_watermark = fields.Binary('Watermark')
|
||||
pdf_watermark = fields.Binary("Watermark")
|
||||
pdf_watermark_expression = fields.Char(
|
||||
'Watermark expression', help='An expression yielding the base64 '
|
||||
'encoded data to be used as watermark. \n'
|
||||
'You have access to variables `env` and `docs`')
|
||||
"Watermark expression",
|
||||
help="An expression yielding the base64 "
|
||||
"encoded data to be used as watermark. \n"
|
||||
"You have access to variables `env` and `docs`",
|
||||
)
|
||||
|
||||
@api.multi
|
||||
def render_qweb_pdf(self, res_ids=None, data=None):
|
||||
if not self.env.context.get('res_ids'):
|
||||
return super(
|
||||
Report, self.with_context(res_ids=res_ids)
|
||||
).render_qweb_pdf(res_ids=res_ids, data=data)
|
||||
if not self.env.context.get("res_ids"):
|
||||
return super(Report, self.with_context(res_ids=res_ids)).render_qweb_pdf(
|
||||
res_ids=res_ids, data=data
|
||||
)
|
||||
return super(Report, self).render_qweb_pdf(res_ids=res_ids, data=data)
|
||||
|
||||
@api.model
|
||||
def _run_wkhtmltopdf(self, bodies, header=None, footer=None,
|
||||
landscape=False, specific_paperformat_args=None,
|
||||
set_viewport_size=False):
|
||||
def _run_wkhtmltopdf(
|
||||
self,
|
||||
bodies,
|
||||
header=None,
|
||||
footer=None,
|
||||
landscape=False,
|
||||
specific_paperformat_args=None,
|
||||
set_viewport_size=False,
|
||||
):
|
||||
result = super(Report, self)._run_wkhtmltopdf(
|
||||
bodies, header=header, footer=footer, landscape=landscape,
|
||||
bodies,
|
||||
header=header,
|
||||
footer=footer,
|
||||
landscape=landscape,
|
||||
specific_paperformat_args=specific_paperformat_args,
|
||||
set_viewport_size=set_viewport_size)
|
||||
set_viewport_size=set_viewport_size,
|
||||
)
|
||||
|
||||
docids = self.env.context.get('res_ids', False)
|
||||
docids = self.env.context.get("res_ids", False)
|
||||
watermark = None
|
||||
if self.pdf_watermark:
|
||||
watermark = b64decode(self.pdf_watermark)
|
||||
elif docids:
|
||||
watermark = tools.safe_eval(
|
||||
self.pdf_watermark_expression or 'None',
|
||||
self.pdf_watermark_expression or "None",
|
||||
dict(env=self.env, docs=self.env[self.model].browse(docids)),
|
||||
)
|
||||
if watermark:
|
||||
|
@ -72,30 +85,28 @@ class Report(models.Model):
|
|||
Image.init()
|
||||
image = Image.open(BytesIO(watermark))
|
||||
pdf_buffer = BytesIO()
|
||||
if image.mode != 'RGB':
|
||||
image = image.convert('RGB')
|
||||
resolution = image.info.get(
|
||||
'dpi', self.paperformat_id.dpi or 90
|
||||
)
|
||||
if image.mode != "RGB":
|
||||
image = image.convert("RGB")
|
||||
resolution = image.info.get("dpi", self.paperformat_id.dpi or 90)
|
||||
if isinstance(resolution, tuple):
|
||||
resolution = resolution[0]
|
||||
image.save(pdf_buffer, 'pdf', resolution=resolution)
|
||||
image.save(pdf_buffer, "pdf", resolution=resolution)
|
||||
pdf_watermark = PdfFileReader(pdf_buffer)
|
||||
except:
|
||||
logger.exception('Failed to load watermark')
|
||||
except Exception as e:
|
||||
logger.exception("Failed to load watermark", e)
|
||||
|
||||
if not pdf_watermark:
|
||||
logger.error(
|
||||
'No usable watermark found, got %s...', watermark[:100]
|
||||
)
|
||||
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')
|
||||
logger.error("Your watermark pdf does not contain any pages")
|
||||
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')
|
||||
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(
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
# © 2016 Therp BV <http://therp.nl>
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
||||
|
||||
from . import test_report_qweb_pdf_watermark
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
# © 2016 Therp BV <http://therp.nl>
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
||||
from PIL import Image
|
||||
|
||||
from odoo.tests.common import HttpCase
|
||||
|
||||
|
||||
|
|
|
@ -1,12 +1,19 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
<record id="act_report_xml_view" model="ir.ui.view">
|
||||
<field name="model">ir.actions.report</field>
|
||||
<field name="inherit_id" ref="base.act_report_xml_view" />
|
||||
<field name="arch" type="xml">
|
||||
<field name="attachment" position="after">
|
||||
<field name="pdf_watermark" attrs="{'invisible': [('report_type', '!=', 'qweb-pdf')]}" />
|
||||
<field name="pdf_watermark_expression" attrs="{'invisible': [('report_type', '!=', 'qweb-pdf')]}" groups="base.group_no_one" />
|
||||
<field
|
||||
name="pdf_watermark"
|
||||
attrs="{'invisible': [('report_type', '!=', 'qweb-pdf')]}"
|
||||
/>
|
||||
<field
|
||||
name="pdf_watermark_expression"
|
||||
attrs="{'invisible': [('report_type', '!=', 'qweb-pdf')]}"
|
||||
groups="base.group_no_one"
|
||||
/>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
|
|
@ -1,10 +1,12 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
<!-- Include fix for https://github.com/odoo/odoo/issues/16610 -->
|
||||
<template id="assets_pdf" inherit_id="web.report_assets_pdf">
|
||||
<link position="after">
|
||||
<link href="/report_qweb_pdf_watermark/static/src/css/report_qweb_pdf_watermark.css"
|
||||
rel="stylesheet"/>
|
||||
<link
|
||||
href="/report_qweb_pdf_watermark/static/src/css/report_qweb_pdf_watermark.css"
|
||||
rel="stylesheet"
|
||||
/>
|
||||
</link>
|
||||
</template>
|
||||
</odoo>
|
||||
|
|
Loading…
Reference in New Issue