Browse Source

Merge pull request #100 from acsone/10.0-fix_report_py3o_save_attachment-lmi

[FIX] report_py3o: fix exception when report must be saved as attache…
pull/120/head
Eric @ Elico Corp 7 years ago
committed by GitHub
parent
commit
edd5b04ee0
  1. 4
      report_py3o/README.rst
  2. 4
      report_py3o/__manifest__.py
  3. 1
      report_py3o/models/__init__.py
  4. 16
      report_py3o/models/py3o_report.py
  5. 25
      report_py3o/models/report.py
  6. 29
      report_py3o/tests/test_report_py3o.py

4
report_py3o/README.rst

@ -207,7 +207,9 @@ Contributors
------------
* Florent Aide (`XCG Consulting <http://odoo.consulting/>`_)
* Laurent Mignon (Acsone)
* Laurent Mignon <laurent.mignon@acsone.eu>,
* Alexis de Lattre <alexis.delattre@akretion.com>,
Maintainer
----------

4
report_py3o/__manifest__.py

@ -8,7 +8,9 @@
'version': '10.0.1.0.0',
'category': 'Reporting',
'license': 'AGPL-3',
'author': 'XCG Consulting,Odoo Community Association (OCA)',
'author': 'XCG Consulting,'
'ACSONE SA/NV,'
'Odoo Community Association (OCA)',
'website': 'http://odoo.consulting/',
'depends': ['report'],
'external_dependencies': {

1
report_py3o/models/__init__.py

@ -1,4 +1,5 @@
from . import ir_actions_report_xml
from . import py3o_template
from . import py3o_server
from . import report
from . import py3o_report

16
report_py3o/models/py3o_report.py

@ -172,20 +172,6 @@ class Py3oReport(models.TransientModel):
self._extend_parser_context(context_instance, report_xml)
return context_instance.localcontext
@api.model
def _get_report_from_name(self, report_name):
"""Get the first record of ir.actions.report.xml having the
``report_name`` as value for the field report_name.
"""
res = super(Py3oReport, self)._get_report_from_name(report_name)
if res:
return res
# maybe a py3o reprot
report_obj = self.env['ir.actions.report.xml']
return report_obj.search(
[('report_type', '=', 'py3o'),
('report_name', '=', report_name)])
@api.model
def _postprocess_report(self, report_path, res_id, save_in_attachment):
if save_in_attachment.get(res_id):
@ -321,7 +307,7 @@ class Py3oReport(models.TransientModel):
model_instances = self.env[self.ir_actions_report_xml_id.model].browse(
res_ids)
save_in_attachment = self._check_attachment_use(
model_instances, self.ir_actions_report_xml_id) or {}
res_ids, self.ir_actions_report_xml_id) or {}
reports_path = []
for model_instance in model_instances:
reports_path.append(

25
report_py3o/models/report.py

@ -0,0 +1,25 @@
# -*- coding: utf-8 -*-
# Copyright 2017 Akretion (http://www.akretion.com/)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import api, models
class Report(models.Model):
_inherit = 'report'
@api.model
def _get_report_from_name(self, report_name):
"""Get the first record of ir.actions.report.xml having the
``report_name`` as value for the field report_name.
"""
res = super(Report, self)._get_report_from_name(report_name)
if res:
return res
# maybe a py3o report
report_obj = self.env['ir.actions.report.xml']
context = self.env['res.users'].context_get()
return report_obj.with_context(context).search(
[('report_type', '=', 'py3o'),
('report_name', '=', report_name)], limit=1)

29
report_py3o/tests/test_report_py3o.py

@ -2,6 +2,7 @@
# Copyright 2016 ACSONE SA/NV
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).).
from base64 import b64decode
import mock
import os
import pkg_resources
@ -88,6 +89,34 @@ class TestReportPy3o(TransactionCase):
self.env.user.ids, report.report_name, {})
self.assertEqual(('test result', 'pdf'), res)
def test_report_post_process(self):
"""
By default the post_process method is in charge to save the
generated report into an ir.attachment if requested.
"""
report = self.env.ref("report_py3o.res_users_report_py3o")
report.attachment = "object.name + '.txt'"
py3o_server = self.env['py3o.server'].create({"url": "http://dummy"})
# check the call to the fusion server
report.write({"py3o_filetype": "pdf",
"py3o_server_id": py3o_server.id})
ir_attachment = self.env['ir.attachment']
attachements = ir_attachment.search([(1, '=', 1)])
with mock.patch('requests.post') as patched_post:
magick_response = mock.MagicMock()
magick_response.status_code = 200
patched_post.return_value = magick_response
magick_response.iter_content.return_value = "test result"
res = report.render_report(
self.env.user.ids, report.report_name, {})
self.assertEqual(('test result', 'pdf'), res)
attachements = ir_attachment.search([(1, '=', 1)]) - attachements
self.assertEqual(1, len(attachements.ids))
self.assertEqual(self.env.user.name + '.txt', attachements.name)
self.assertEqual(self.env.user._name, attachements.res_model)
self.assertEqual(self.env.user.id, attachements.res_id)
self.assertEqual('test result', b64decode(attachements.datas))
def test_report_template_configs(self):
report = self.env.ref("report_py3o.res_users_report_py3o")
# the demo template is specified with a relative path in in the module

Loading…
Cancel
Save