diff --git a/report_py3o/models/__init__.py b/report_py3o/models/__init__.py index 68f18d48b..a8e7b0a69 100644 --- a/report_py3o/models/__init__.py +++ b/report_py3o/models/__init__.py @@ -1,3 +1,3 @@ -from . import ir_report +from . import ir_actions_report_xml from . import py3o_template from . import py3o_server diff --git a/report_py3o/models/ir_report.py b/report_py3o/models/ir_actions_report_xml.py similarity index 82% rename from report_py3o/models/ir_report.py rename to report_py3o/models/ir_actions_report_xml.py index 0c77f0d4b..bf2629148 100644 --- a/report_py3o/models/ir_report.py +++ b/report_py3o/models/ir_actions_report_xml.py @@ -2,12 +2,12 @@ # Copyright 2013 XCG Consulting (http://odoo.consulting) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). import os -from openerp import api, fields, models, _ +import logging +from openerp import api, fields, models, SUPERUSER_ID, _ from openerp.report.interface import report_int from openerp.exceptions import ValidationError from openerp import addons from ..py3o_parser import Py3oParser -import logging logger = logging.getLogger(__name__) @@ -36,7 +36,7 @@ class IrActionsReportXml(models.Model): @api.constrains("py3o_is_local_fusion", "py3o_server_id", "py3o_filetype") def _check_py3o_server_id(self): - is_native = Formats().get_format(self.py3o_filetype) + is_native = Formats().get_format(self.py3o_filetype).native if ((not is_native or not self.py3o_is_local_fusion) and not self.py3o_server_id): raise ValidationError(_( @@ -97,23 +97,23 @@ class IrActionsReportXml(models.Model): if not isinstance(new_report, Py3oParser): new_report = None else: - cr.execute( - 'SELECT * ' - 'FROM ir_act_report_xml ' - 'WHERE report_name=%s AND report_type=%s', - (name, 'py3o') - ) - r = cr.dictfetchone() - if r: + report_data = self.search_read( + cr, SUPERUSER_ID, + [("report_name", "=", name), + ("report_type", "=", "py3o")], + ['parser', 'model', 'report_name', 'report_rml', 'header'], + limit=1) + if report_data: + report_data = report_data[0] kwargs = {} - if r['parser']: - kwargs['parser'] = getattr(addons, r['parser']) + if report_data['parser']: + kwargs['parser'] = getattr(addons, report_data['parser']) new_report = Py3oParser( - 'report.' + r['report_name'], - r['model'], - os.path.join('addons', r['report_rml'] or '/'), - header=r['header'], + 'report.' + report_data['report_name'], + report_data['model'], + os.path.join('addons', report_data['report_rml'] or '/'), + header=report_data['header'], register=False, **kwargs ) diff --git a/report_py3o/tests/test_report_py3o.py b/report_py3o/tests/test_report_py3o.py index ee0f594b2..ac58f59cd 100644 --- a/report_py3o/tests/test_report_py3o.py +++ b/report_py3o/tests/test_report_py3o.py @@ -2,17 +2,59 @@ # Copyright 2016 ACSONE SA/NV # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).). - import mock +import os +import pkg_resources + +from py3o.formats import Formats from openerp.tests.common import TransactionCase -import openerp.tests +from openerp.exceptions import ValidationError + +from ..py3o_parser import TemplateNotFound +from base64 import b64encode -@openerp.tests.common.at_install(False) -@openerp.tests.common.post_install(True) class TestReportPy3o(TransactionCase): + def test_no_local_fusion_without_fusion_server(self): + report = self.env.ref("report_py3o.res_users_report_py3o") + self.assertTrue(report.py3o_is_local_fusion) + with self.assertRaises(ValidationError) as e: + report.py3o_is_local_fusion = False + self.assertEqual( + e.exception.name, + "Can not use not native format in local fusion. " + "Please specify a Fusion Server") + + def test_no_native_format_without_fusion_server(self): + report = self.env.ref("report_py3o.res_users_report_py3o") + formats = Formats() + is_native = formats.get_format(report.py3o_filetype).native + self.assertTrue(is_native) + new_format = None + for name in formats.get_known_format_names(): + format = formats.get_format(name) + if not format.native: + new_format = name + break + self.assertTrue(new_format) + with self.assertRaises(ValidationError) as e: + report.py3o_filetype = new_format + self.assertEqual( + e.exception.name, + "Can not use not native format in local fusion. " + "Please specify a Fusion Server") + + def test_required_py3_filetype(self): + report = self.env.ref("report_py3o.res_users_report_py3o") + self.assertEqual(report.report_type, "py3o") + with self.assertRaises(ValidationError) as e: + report.py3o_filetype = False + self.assertEqual( + e.exception.name, + "Field 'Output Format' is required for Py3O report") + def test_reports(self): report = self.env.ref("report_py3o.res_users_report_py3o") with mock.patch('openerp.addons.report_py3o.py3o_parser.' @@ -37,3 +79,42 @@ class TestReportPy3o(TransactionCase): res = report.render_report( self.env.user.ids, report.report_name, {}) self.assertEqual(('test result', '.pdf'), res) + + 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 + # path + tmpl_name = report.py3o_template_fallback + flbk_filename = pkg_resources.resource_filename( + "openerp.addons.%s" % report.module, + tmpl_name) + self.assertTrue(os.path.exists(flbk_filename)) + res = report.render_report( + self.env.user.ids, report.report_name, {}) + self.assertTrue(res) + # The generation fails if the tempalte is not found + report.module = False + with self.assertRaises(TemplateNotFound), self.env.cr.savepoint(): + report.render_report( + self.env.user.ids, report.report_name, {}) + + # the template can also be provivided as an abspaath + report.py3o_template_fallback = flbk_filename + res = report.render_report( + self.env.user.ids, report.report_name, {}) + self.assertTrue(res) + + # the tempalte can also be provided as a binay field + report.py3o_template_fallback = False + + with open(flbk_filename) as tmpl_file: + tmpl_data = b64encode(tmpl_file.read()) + py3o_template = self.env['py3o.template'].create({ + 'name': 'test_template', + 'py3o_template_data': tmpl_data, + 'filetype': 'odt'}) + report.py3o_template_id = py3o_template + report.py3o_template_fallback = flbk_filename + res = report.render_report( + self.env.user.ids, report.report_name, {}) + self.assertTrue(res)