diff --git a/report_py3o/__manifest__.py b/report_py3o/__manifest__.py index fc975fe4..9b8a0833 100644 --- a/report_py3o/__manifest__.py +++ b/report_py3o/__manifest__.py @@ -14,7 +14,8 @@ 'depends': ['web'], 'external_dependencies': { 'python': ['py3o.template', - 'py3o.formats'] + 'py3o.formats', + 'PyPDF2'] }, 'data': [ 'security/ir.model.access.csv', diff --git a/report_py3o/models/py3o_report.py b/report_py3o/models/py3o_report.py index c1eda37f..ab3f3cdb 100644 --- a/report_py3o/models/py3o_report.py +++ b/report_py3o/models/py3o_report.py @@ -28,7 +28,10 @@ try: from py3o.formats import Formats, UnkownFormatException except ImportError: logger.debug('Cannot import py3o.formats') - +try: + from PyPDF2 import PdfFileWriter, PdfFileReader +except ImportError: + logger.debug('Cannot import PyPDF2') _extender_functions = {} @@ -302,6 +305,23 @@ class Py3oReport(models.TransientModel): cpt += 1 return result_path + @api.model + def _merge_pdf(self, reports_path): + """ Merge PDF files into one. + + :param reports_path: list of path of pdf files + :returns: path of the merged pdf + """ + writer = PdfFileWriter() + for path in reports_path: + reader = PdfFileReader(path) + writer.appendPagesFromReader(reader) + merged_file_fd, merged_file_path = tempfile.mkstemp( + suffix='.pdf', prefix='report.merged.tmp.') + with closing(os.fdopen(merged_file_fd, 'wb')) as merged_file: + writer.write(merged_file) + return merged_file_path + @api.multi def _merge_results(self, reports_path): self.ensure_one() diff --git a/report_py3o/tests/test_report_py3o.py b/report_py3o/tests/test_report_py3o.py index 6a5d1e8c..b6f73f3f 100644 --- a/report_py3o/tests/test_report_py3o.py +++ b/report_py3o/tests/test_report_py3o.py @@ -18,6 +18,8 @@ from odoo.addons.base.tests.test_mimetypes import PNG from ..models.py3o_report import TemplateNotFound from ..models._py3o_parser_context import format_multiline_value from base64 import b64encode +from PyPDF2 import PdfFileWriter +from PyPDF2.pdf import PageObject import logging logger = logging.getLogger(__name__) @@ -79,7 +81,30 @@ class TestReportPy3o(TransactionCase): def test_reports(self): res = self.report.render(self.env.user.ids) self.assertTrue(res) - self.report.py3o_filetype = 'pdf' + + def test_reports_merge_zip(self): + users = self.env['res.users'].search([]) + self.assertTrue(len(users) > 0) + py3o_report = self.env['py3o.report'] + _zip_results = self.py3o_report._zip_results + with mock.patch.object( + py3o_report.__class__, '_zip_results') as patched_zip_results: + patched_zip_results.side_effect = _zip_results + content, filetype = self.report.render(users.ids) + self.assertEqual(1, patched_zip_results.call_count) + self.assertEqual(filetype, 'zip') + + def test_reports_merge_pdf(self): + reports_path = [] + for i in range(0, 3): + result = tempfile.mktemp('.txt') + writer = PdfFileWriter() + writer.addPage(PageObject.createBlankPage(width=100, height=100)) + with open(result, 'wb') as fp: + writer.write(fp) + reports_path.append(result) + res = self.py3o_report._merge_pdf(reports_path) + self.assertTrue(res) def test_report_load_from_attachment(self): self.report.write({"attachment_use": True,