From 08deba16b3a3375db27714a85ffa77b1249d079d Mon Sep 17 00:00:00 2001 From: "Solan Delvenne (sode)" Date: Tue, 20 Sep 2022 10:52:19 +0000 Subject: [PATCH] [IMP] snailmail: Generate a cover page if the "Cover Page" option is turned on Pingen's v2 API does not offer an endpoint to generate a Cover Page automatically with an API call anymore, thus the need to generate it and append it to the invoice from the client-side beforehand. X-original-commit: 13f934cebc35511f8ba587b9d07a658bf7c1e640 Part-of: odoo/odoo#103806 --- addons/snailmail/models/snailmail_letter.py | 40 +++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/addons/snailmail/models/snailmail_letter.py b/addons/snailmail/models/snailmail_letter.py index c5162fdde7f..a6558948175 100644 --- a/addons/snailmail/models/snailmail_letter.py +++ b/addons/snailmail/models/snailmail_letter.py @@ -2,6 +2,14 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. import re import base64 +import io + +from PyPDF2 import PdfFileReader, PdfFileMerger +from reportlab.platypus import Frame, Paragraph, KeepInFrame +from reportlab.lib.units import mm +from reportlab.lib.pagesizes import A4 +from reportlab.lib.styles import getSampleStyleSheet +from reportlab.pdfgen.canvas import Canvas from odoo import fields, models, api, _ from odoo.addons.iap.tools import iap_tools @@ -139,6 +147,8 @@ class SnailmailLetter(models.Model): report_name = 'Document' filename = "%s.%s" % (report_name, "pdf") pdf_bin, _ = self.env['ir.actions.report'].with_context(snailmail_layout=not self.cover)._render_qweb_pdf(report, self.res_id) + if self.cover: + pdf_bin = self._append_cover_page(pdf_bin) attachment = self.env['ir.attachment'].create({ 'name': filename, 'datas': base64.b64encode(pdf_bin), @@ -428,3 +438,33 @@ class SnailmailLetter(models.Model): record.ensure_one() required_keys = ['street', 'city', 'zip', 'country_id'] return all(record[key] for key in required_keys) + + def _append_cover_page(self, invoice_bin: bytes): + address = self.partner_id.contact_address.replace('\n', '
') + address_x = 118 * mm + address_y = 60 * mm + frame_width = 85.5 * mm + frame_height = 25.5 * mm + + cover_buf = io.BytesIO() + canvas = Canvas(cover_buf, pagesize=A4) + styles = getSampleStyleSheet() + + frame = Frame(address_x, A4[1] - address_y - frame_height, frame_width, frame_height) + story = [Paragraph(address, styles['Normal'])] + address_inframe = KeepInFrame(0, 0, story) + frame.addFromList([address_inframe], canvas) + canvas.save() + cover_buf.seek(0) + + invoice = PdfFileReader(io.BytesIO(invoice_bin)) + cover_bin = io.BytesIO(cover_buf.getvalue()) + cover_file = PdfFileReader(cover_bin) + merger = PdfFileMerger() + + merger.append(cover_file, import_bookmarks=False) + merger.append(invoice, import_bookmarks=False) + + out_buff = io.BytesIO() + merger.write(out_buff) + return out_buff.getvalue()