diff --git a/report_xml/README.rst b/report_xml/README.rst index c668ad4f..a1c07f16 100644 --- a/report_xml/README.rst +++ b/report_xml/README.rst @@ -1,5 +1,5 @@ .. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg - :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :target: https://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 =========== @@ -84,11 +84,4 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -To contribute to this module, please visit http://odoo-community.org. - - -.. _custom report: https://www.odoo.com/documentation/8.0/reference/reports.html#custom-reports -.. _instructions to create reports: https://www.odoo.com/documentation/8.0/reference/reports.html -.. _reporting-engine: https://github.com/OCA/reporting-engine -.. _sample module: https://github.com/OCA/reporting-engine/tree/8.0/report_xml_sample -.. _lxml: http://lxml.de/ +To contribute to this module, please visit https://odoo-community.org. diff --git a/report_xml/__init__.py b/report_xml/__init__.py index 43f32976..71839ba3 100644 --- a/report_xml/__init__.py +++ b/report_xml/__init__.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +# License AGPL-3.0 or later (https://www.gnuorg/licenses/agpl.html). from . import controllers from . import models diff --git a/report_xml/__manifest__.py b/report_xml/__manifest__.py index 3af20cb7..a8f1c2b3 100644 --- a/report_xml/__manifest__.py +++ b/report_xml/__manifest__.py @@ -1,10 +1,10 @@ # -*- coding: utf-8 -*- # Copyright (C) 2014-2015 Grupo ESOC -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +# License AGPL-3.0 or later (https://www.gnuorg/licenses/agpl.html). { "name": "XML Reports", - "version": "10.0.1.0.0", + "version": "11.0.1.0.0", "category": "Reporting", "website": "https://github.com/OCA/reporting-engine", "author": "Grupo ESOC IngenierĂ­a de Servicios, " @@ -14,10 +14,11 @@ "application": False, "summary": "Allow to generate XML reports", "depends": [ - "report", + "web", ], "data": [ "views/report_xml_templates.xml", + "views/webclient_templates.xml", ], "demo": [ "demo/report.xml", diff --git a/report_xml/controllers/__init__.py b/report_xml/controllers/__init__.py index 230ef7d3..400bef38 100644 --- a/report_xml/controllers/__init__.py +++ b/report_xml/controllers/__init__.py @@ -1,4 +1,4 @@ # -*- coding: utf-8 -*- -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +# License AGPL-3.0 or later (https://www.gnuorg/licenses/agpl.html). from . import main diff --git a/report_xml/controllers/main.py b/report_xml/controllers/main.py index 1c73ea62..32fc55fc 100644 --- a/report_xml/controllers/main.py +++ b/report_xml/controllers/main.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- # Copyright (C) 2014-2015 Grupo ESOC -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +# License AGPL-3.0 or later (https://www.gnuorg/licenses/agpl.html). -from odoo.addons.report.controllers import main as report +from odoo.addons.web.controllers import main as report from odoo.http import route @@ -19,8 +19,9 @@ class ReportController(report.ReportController): # XML header must be before any spaces, and it is a common error, # so let's fix that here and make developers happier response.data = response.data.strip() - - # XML files should be downloaded response.headers.set("Content-Type", "text/xml") - + response.headers.set('Content-length', len(response.data)) + response.headers.set( + 'Content-Disposition', + 'attachment; filename="'+reportname+".xml") return response diff --git a/report_xml/demo/report.xml b/report_xml/demo/report.xml index cd8c7b12..e259171e 100644 --- a/report_xml/demo/report.xml +++ b/report_xml/demo/report.xml @@ -11,11 +11,12 @@ - diff --git a/report_xml/models/__init__.py b/report_xml/models/__init__.py index e8588766..c5675429 100644 --- a/report_xml/models/__init__.py +++ b/report_xml/models/__init__.py @@ -1,5 +1,4 @@ # -*- coding: utf-8 -*- -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +# License AGPL-3.0 or later (https://www.gnuorg/licenses/agpl.html). from . import report_action -from . import report_generator diff --git a/report_xml/models/report_action.py b/report_xml/models/report_action.py index f6e4f3ce..573163f9 100644 --- a/report_xml/models/report_action.py +++ b/report_xml/models/report_action.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # Copyright (C) 2014-2015 Grupo ESOC -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +# License AGPL-3.0 or later (https://www.gnuorg/licenses/agpl.html). import logging @@ -11,39 +11,30 @@ _logger = logging.getLogger(__name__) class ReportAction(models.Model): - _inherit = "ir.actions.report.xml" + _inherit = "ir.actions.report" report_type = fields.Selection(selection_add=[("qweb-xml", "XML")]) - def _lookup_report(self, name): - """Enable ``qweb-xml`` report lookup.""" - try: - return super(ReportAction, self)._lookup_report(name) - except Exception as ex: - # Somebody thought it was a good idea to use standard exceptions - if "qweb-xml" not in ex.message: - raise ex - else: - self._cr.execute( - "SELECT * FROM ir_act_report_xml WHERE report_name=%s", - (name,)) - return self._cr.dictfetchone()["report_name"] + @api.model + def _get_report_from_name(self, report_name): + res = super(ReportAction, self)._get_report_from_name(report_name) + if res: + return res + report_obj = self.env['ir.actions.report'] + qwebtypes = ['qweb-xml'] + conditions = [('report_type', 'in', qwebtypes), + ('report_name', '=', report_name)] + context = self.env['res.users'].context_get() + return report_obj.with_context(context).search(conditions, limit=1) @api.model - def render_report(self, res_ids, name, data): - """Special handling for ``qweb-xml`` reports.""" - xml_report = self.search([('report_name', '=', name), - ('report_type', '=', 'qweb-xml')], limit=1) - if xml_report: - xml_report = xml_report.ensure_one() - result = self.env["report"].get_html(res_ids, - xml_report.report_name, - data=data) - return ( - etree.tostring( - etree.fromstring(result.strip()), - encoding='UTF-8', xml_declaration=True, pretty_print=True - ), "xml") - else: - return super(ReportAction, self).render_report( - res_ids, name, data) + def render_qweb_xml(self, docids, data): + result = self.render_qweb_html(docids, data=data) + return etree.tostring( + etree.fromstring( + str(result[0], 'UTF-8').lstrip('\n').lstrip().encode('UTF-8') + ), + encoding='UTF-8', + xml_declaration=True, + pretty_print=True + ), "xml" diff --git a/report_xml/models/report_generator.py b/report_xml/models/report_generator.py deleted file mode 100644 index af2d9145..00000000 --- a/report_xml/models/report_generator.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (C) 2014-2015 Grupo ESOC -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). - -import logging - -from odoo import api, models - -_logger = logging.getLogger(__name__) - - -class ReportGenerator(models.Model): - _inherit = "report" - - @api.model - def _get_report_from_name(self, report_name): - res = super(ReportGenerator, self)._get_report_from_name(report_name) - if res: - return res - report_obj = self.env['ir.actions.report.xml'] - qwebtypes = ['qweb-xml'] - conditions = [('report_type', 'in', qwebtypes), - ('report_name', '=', report_name)] - context = self.env['res.users'].context_get() - return report_obj.with_context(context).search(conditions, limit=1) diff --git a/report_xml/static/src/js/report/qwebactionmanager.js b/report_xml/static/src/js/report/qwebactionmanager.js new file mode 100644 index 00000000..01dda4c3 --- /dev/null +++ b/report_xml/static/src/js/report/qwebactionmanager.js @@ -0,0 +1,41 @@ +odoo.define('report_xml.report', function(require){ +'use strict'; + +var ActionManager= require('web.ActionManager'); +var crash_manager = require('web.crash_manager'); +var framework = require('web.framework'); + +ActionManager.include({ + ir_actions_report: function (action, options){ + var self = this; + action = _.clone(action); + if (action.report_type === 'qweb-xml') { + framework.blockUI() + var report_xml_url = 'report/xml/' + action.report_name; + if(action.context.active_ids){ + report_xml_url += '/' + action.context.active_ids.join(','); + } + else{ + report_xml_url += '?options=' + encodeURIComponent(JSON.stringify(action.data)); + report_xml_url += '&context=' + encodeURIComponent(JSON.stringify(action.context)); + } + self.getSession().get_file({ + url: report_xml_url, + data: {data: JSON.stringify([ + report_xml_url, + action.report_type, + ])}, + error: crash_manager.rpc_error.bind(crash_manager), + success: function (){ + if(action && options && !action.dialog){ + options.on_close(); + } + }, + }); + framework.unblockUI(); + return + } + return self._super(action, options); + } +}); +}); \ No newline at end of file diff --git a/report_xml/tests/__init__.py b/report_xml/tests/__init__.py index 61e68940..c89ef056 100644 --- a/report_xml/tests/__init__.py +++ b/report_xml/tests/__init__.py @@ -1,4 +1,4 @@ # -*- coding: utf-8 -*- -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +# License AGPL-3.0 or later (https://www.gnuorg/licenses/agpl.html). from . import test_report_xml diff --git a/report_xml/tests/test_report_xml.py b/report_xml/tests/test_report_xml.py index 7880eb90..8bc8592f 100644 --- a/report_xml/tests/test_report_xml.py +++ b/report_xml/tests/test_report_xml.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # Copyright 2017 Creu Blanca -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +# License AGPL-3.0 or later (https://www.gnuorg/licenses/agpl). from lxml import etree from odoo.tests import common @@ -8,17 +8,12 @@ from odoo.tests import common class TestXmlReport(common.TransactionCase): def test_xml(self): - report_object = self.env['ir.actions.report.xml'] + report_object = self.env['ir.actions.report'] report_name = 'report_xml.demo_report_xml_view' - self.assertEqual( - report_name, report_object._lookup_report(report_name)) + report = report_object._get_report_from_name(report_name) docs = self.env['res.company'].search([], limit=1) - rep = report_object.render_report( - docs.ids, report_name, {} - ) + self.assertEqual(report.report_type, 'qweb-xml') + rep = report.render(docs.ids, {}) root = etree.fromstring(rep[0]) el = root.xpath('/root/user/name') - self.assertEqual( - el[0].text, - docs.ensure_one().name - ) + self.assertEqual(el[0].text, docs.ensure_one().name) diff --git a/report_xml/views/report_xml_templates.xml b/report_xml/views/report_xml_templates.xml index ef5aabfa..0d38a56e 100644 --- a/report_xml/views/report_xml_templates.xml +++ b/report_xml/views/report_xml_templates.xml @@ -1,9 +1,9 @@ - + diff --git a/report_xml/views/webclient_templates.xml b/report_xml/views/webclient_templates.xml new file mode 100644 index 00000000..7af6bbf1 --- /dev/null +++ b/report_xml/views/webclient_templates.xml @@ -0,0 +1,9 @@ + + +