-
-
Notifications
You must be signed in to change notification settings - Fork 162
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[MIG] l10n_ch_payment_slip: Migration to 11.0
Update headers Port code to python3 Update README Fix tests with correct report render calls Adapt code to report module split
- Loading branch information
Showing
13 changed files
with
138 additions
and
208 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,46 +1,107 @@ | ||
# -*- coding: utf-8 -*- | ||
# © 2012-2016 Camptocamp SA | ||
# Copyright 2012-2017 Camptocamp SA | ||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). | ||
import os | ||
import tempfile | ||
import io | ||
import PyPDF2 | ||
|
||
from odoo import models, fields, api | ||
|
||
|
||
class IrActionsReportXMLReportlab(models.Model): | ||
class IrActionsReportReportlab(models.Model): | ||
|
||
_inherit = 'ir.actions.report.xml' | ||
_inherit = 'ir.actions.report' | ||
|
||
report_type = fields.Selection(selection_add=[('reportlab-pdf', | ||
report_type = fields.Selection(selection_add=[('reportlab_pdf', | ||
'Report renderer')]) | ||
|
||
@api.model | ||
def _lookup_report(self, name): | ||
self.env.cr.execute( | ||
"SELECT * FROM ir_act_report_xml WHERE report_name=%s", (name,)) | ||
report = self.env.cr.dictfetchone() | ||
if report and report['report_type'] == 'reportlab-pdf': | ||
return report['report_name'] | ||
@api.multi | ||
def _generate_one_slip_per_page_from_invoice_pdf(self, report_name=None): | ||
"""Generate payment slip PDF(s) from report model. | ||
If there is many pdf they are merged in memory or on | ||
file system based on company settings | ||
:return: the generated PDF content | ||
""" | ||
user_model = self.env['res.users'] | ||
slip_model = self.env['l10n_ch.payment_slip'] | ||
invoice_model = self.env['account.invoice'] | ||
company = user_model.browse(self.env.uid).company_id | ||
invoices = invoice_model.browse(self.ids) | ||
|
||
docs = slip_model._compute_pay_slips_from_invoices(invoices) | ||
if len(docs) == 1: | ||
return docs[0]._draw_payment_slip(a4=True, | ||
b64=False, | ||
report_name=report_name, | ||
out_format='PDF') | ||
else: | ||
return super(IrActionsReportXMLReportlab, self)._lookup_report( | ||
name) | ||
pdfs = (x._draw_payment_slip(a4=True, b64=False, out_format='PDF', | ||
report_name=report_name) | ||
for x in docs) | ||
if company.merge_mode == 'in_memory': | ||
return self.merge_pdf_in_memory(pdfs) | ||
return self.merge_pdf_on_disk(pdfs) | ||
|
||
@api.multi | ||
def render_report(self, res_ids, name, data): | ||
""" | ||
Override to work with real pdf in testing and not html | ||
as we use reportlab as renderer | ||
""" | ||
context = self._context | ||
if context is None: | ||
context = {} | ||
if context.get('force_pdf'): | ||
new_report = self._lookup_report(name) | ||
if isinstance(new_report, (str, unicode)): | ||
return self.env['report'].get_pdf( | ||
res_ids, | ||
new_report, | ||
data=data, | ||
), 'pdf' | ||
return super(IrActionsReportXMLReportlab, self).render_report( | ||
res_ids, | ||
name, | ||
data, | ||
def render_reportlab_pdf(self, docids, data=None): | ||
if (self.report_name == 'l10n_ch_payment_slip.' | ||
'one_slip_per_page_from_invoice'): | ||
reports = self.browse(docids) | ||
pdf_content = reports._generate_one_slip_per_page_from_invoice_pdf( | ||
report_name=self.report_name, | ||
) | ||
return pdf_content, 'pdf' | ||
|
||
def merge_pdf_in_memory(self, docs): | ||
streams = [] | ||
merger = PyPDF2.PdfFileMerger() | ||
for doc in docs: | ||
current_buff = io.BytesIO() | ||
streams.append(current_buff) | ||
current_buff.write(doc) | ||
current_buff.seek(0) | ||
merger.append(PyPDF2.PdfFileReader(current_buff)) | ||
buff = io.BytesIO() | ||
try: | ||
# The writer close the reader file here | ||
merger.write(buff) | ||
return buff.getvalue() | ||
except IOError: | ||
raise | ||
finally: | ||
buff.close() | ||
for stream in streams: | ||
stream.close() | ||
|
||
def merge_pdf_on_disk(self, docs): | ||
streams = [] | ||
writer = PyPDF2.PdfFileWriter() | ||
for doc in docs: | ||
current_buff = tempfile.mkstemp( | ||
suffix='.pdf', | ||
prefix='credit_control_slip')[0] | ||
current_buff = os.fdopen(current_buff, 'w+b') | ||
current_buff.seek(0) | ||
streams.append(current_buff) | ||
current_buff.write(doc) | ||
current_buff.seek(0) | ||
reader = PyPDF2.PdfFileReader(current_buff) | ||
for page in range(reader.getNumPages()): | ||
writer.addPage(reader.getPage(page)) | ||
buff = tempfile.mkstemp( | ||
suffix='.pdf', | ||
prefix='credit_control_slip_merged')[0] | ||
try: | ||
buff = os.fdopen(buff, 'w+b') | ||
# The writer close the reader file here | ||
buff.seek(0) | ||
writer.write(buff) | ||
buff.seek(0) | ||
return buff.read() | ||
except IOError: | ||
raise | ||
finally: | ||
buff.close() | ||
for stream in streams: | ||
stream.close() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,112 +1,7 @@ | ||
# -*- coding: utf-8 -*- | ||
# © 2014-2016 Camptocamp SA | ||
# Copyright 2014-2017 Camptocamp SA | ||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). | ||
from odoo import models, api | ||
import os | ||
import tempfile | ||
import StringIO | ||
import pyPdf | ||
|
||
|
||
class BVRFromInvoice(models.AbstractModel): | ||
_name = 'report.one_slip_per_page_from_invoice' | ||
|
||
|
||
class Report(models.Model): | ||
|
||
_inherit = 'report' | ||
|
||
@api.multi | ||
def _generate_one_slip_per_page_from_invoice_pdf(self, report_name=None): | ||
"""Generate payment slip PDF(s) from report model. | ||
If there is many pdf they are merged in memory or on | ||
file system based on company settings | ||
:return: the generated PDF content | ||
""" | ||
user_model = self.env['res.users'] | ||
slip_model = self.env['l10n_ch.payment_slip'] | ||
invoice_model = self.env['account.invoice'] | ||
company = user_model.browse(self.env.uid).company_id | ||
invoices = invoice_model.browse(self.ids) | ||
|
||
docs = slip_model._compute_pay_slips_from_invoices(invoices) | ||
if len(docs) == 1: | ||
return docs[0]._draw_payment_slip(a4=True, | ||
b64=False, | ||
report_name=report_name, | ||
out_format='PDF') | ||
else: | ||
pdfs = (x._draw_payment_slip(a4=True, b64=False, out_format='PDF', | ||
report_name=report_name) | ||
for x in docs) | ||
if company.merge_mode == 'in_memory': | ||
return self.merge_pdf_in_memory(pdfs) | ||
return self.merge_pdf_on_disk(pdfs) | ||
|
||
@api.multi | ||
def get_pdf(self, docids, report_name, html=None, data=None): | ||
if (report_name == 'l10n_ch_payment_slip.' | ||
'one_slip_per_page_from_invoice'): | ||
reports = self.browse(docids) | ||
return reports._generate_one_slip_per_page_from_invoice_pdf( | ||
report_name=report_name, | ||
) | ||
else: | ||
return super(Report, self).get_pdf(docids, report_name, html=html, | ||
data=data) | ||
|
||
def merge_pdf_in_memory(self, docs): | ||
streams = [] | ||
writer = pyPdf.PdfFileWriter() | ||
for doc in docs: | ||
current_buff = StringIO.StringIO() | ||
streams.append(current_buff) | ||
current_buff.write(doc) | ||
current_buff.seek(0) | ||
reader = pyPdf.PdfFileReader(current_buff) | ||
for page in xrange(reader.getNumPages()): | ||
writer.addPage(reader.getPage(page)) | ||
buff = StringIO.StringIO() | ||
try: | ||
# The writer close the reader file here | ||
writer.write(buff) | ||
return buff.getvalue() | ||
except IOError: | ||
raise | ||
finally: | ||
buff.close() | ||
for stream in streams: | ||
stream.close() | ||
|
||
def merge_pdf_on_disk(self, docs): | ||
streams = [] | ||
writer = pyPdf.PdfFileWriter() | ||
for doc in docs: | ||
current_buff = tempfile.mkstemp( | ||
suffix='.pdf', | ||
prefix='credit_control_slip')[0] | ||
current_buff = os.fdopen(current_buff, 'w+b') | ||
current_buff.seek(0) | ||
streams.append(current_buff) | ||
current_buff.write(doc) | ||
current_buff.seek(0) | ||
reader = pyPdf.PdfFileReader(current_buff) | ||
for page in xrange(reader.getNumPages()): | ||
writer.addPage(reader.getPage(page)) | ||
buff = tempfile.mkstemp( | ||
suffix='.pdf', | ||
prefix='credit_control_slip_merged')[0] | ||
try: | ||
buff = os.fdopen(buff, 'w+b') | ||
# The writer close the reader file here | ||
buff.seek(0) | ||
writer.write(buff) | ||
buff.seek(0) | ||
return buff.read() | ||
except IOError: | ||
raise | ||
finally: | ||
buff.close() | ||
for stream in streams: | ||
stream.close() |
Oops, something went wrong.