commit
20940bc30f
|
@ -1,3 +1,3 @@
|
||||||
from . import ir_report
|
from . import ir_actions_report_xml
|
||||||
from . import py3o_template
|
from . import py3o_template
|
||||||
from . import py3o_server
|
from . import py3o_server
|
||||||
|
|
|
@ -2,12 +2,12 @@
|
||||||
# Copyright 2013 XCG Consulting (http://odoo.consulting)
|
# Copyright 2013 XCG Consulting (http://odoo.consulting)
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
import os
|
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.report.interface import report_int
|
||||||
from openerp.exceptions import ValidationError
|
from openerp.exceptions import ValidationError
|
||||||
from openerp import addons
|
from openerp import addons
|
||||||
from ..py3o_parser import Py3oParser
|
from ..py3o_parser import Py3oParser
|
||||||
import logging
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -36,7 +36,7 @@ class IrActionsReportXml(models.Model):
|
||||||
@api.constrains("py3o_is_local_fusion", "py3o_server_id",
|
@api.constrains("py3o_is_local_fusion", "py3o_server_id",
|
||||||
"py3o_filetype")
|
"py3o_filetype")
|
||||||
def _check_py3o_server_id(self):
|
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
|
if ((not is_native or not self.py3o_is_local_fusion) and
|
||||||
not self.py3o_server_id):
|
not self.py3o_server_id):
|
||||||
raise ValidationError(_(
|
raise ValidationError(_(
|
||||||
|
@ -97,23 +97,23 @@ class IrActionsReportXml(models.Model):
|
||||||
if not isinstance(new_report, Py3oParser):
|
if not isinstance(new_report, Py3oParser):
|
||||||
new_report = None
|
new_report = None
|
||||||
else:
|
else:
|
||||||
cr.execute(
|
report_data = self.search_read(
|
||||||
'SELECT * '
|
cr, SUPERUSER_ID,
|
||||||
'FROM ir_act_report_xml '
|
[("report_name", "=", name),
|
||||||
'WHERE report_name=%s AND report_type=%s',
|
("report_type", "=", "py3o")],
|
||||||
(name, 'py3o')
|
['parser', 'model', 'report_name', 'report_rml', 'header'],
|
||||||
)
|
limit=1)
|
||||||
r = cr.dictfetchone()
|
if report_data:
|
||||||
if r:
|
report_data = report_data[0]
|
||||||
kwargs = {}
|
kwargs = {}
|
||||||
if r['parser']:
|
if report_data['parser']:
|
||||||
kwargs['parser'] = getattr(addons, r['parser'])
|
kwargs['parser'] = getattr(addons, report_data['parser'])
|
||||||
|
|
||||||
new_report = Py3oParser(
|
new_report = Py3oParser(
|
||||||
'report.' + r['report_name'],
|
'report.' + report_data['report_name'],
|
||||||
r['model'],
|
report_data['model'],
|
||||||
os.path.join('addons', r['report_rml'] or '/'),
|
os.path.join('addons', report_data['report_rml'] or '/'),
|
||||||
header=r['header'],
|
header=report_data['header'],
|
||||||
register=False,
|
register=False,
|
||||||
**kwargs
|
**kwargs
|
||||||
)
|
)
|
|
@ -2,17 +2,59 @@
|
||||||
# Copyright 2016 ACSONE SA/NV
|
# Copyright 2016 ACSONE SA/NV
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).).
|
||||||
|
|
||||||
|
|
||||||
import mock
|
import mock
|
||||||
|
import os
|
||||||
|
import pkg_resources
|
||||||
|
|
||||||
|
from py3o.formats import Formats
|
||||||
|
|
||||||
from openerp.tests.common import TransactionCase
|
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):
|
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):
|
def test_reports(self):
|
||||||
report = self.env.ref("report_py3o.res_users_report_py3o")
|
report = self.env.ref("report_py3o.res_users_report_py3o")
|
||||||
with mock.patch('openerp.addons.report_py3o.py3o_parser.'
|
with mock.patch('openerp.addons.report_py3o.py3o_parser.'
|
||||||
|
@ -37,3 +79,42 @@ class TestReportPy3o(TransactionCase):
|
||||||
res = report.render_report(
|
res = report.render_report(
|
||||||
self.env.user.ids, report.report_name, {})
|
self.env.user.ids, report.report_name, {})
|
||||||
self.assertEqual(('test result', '.pdf'), res)
|
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)
|
||||||
|
|
Loading…
Reference in New Issue