diff --git a/report_xml/controllers/report.py b/report_xml/controllers/report.py index 0064546c6..fb4860399 100644 --- a/report_xml/controllers/report.py +++ b/report_xml/controllers/report.py @@ -70,7 +70,7 @@ class ReportController(report.ReportController): report_name = safe_eval( report.print_report_name, {"object": obj, "time": time} ) - filename = f"{report_name}.xml" + filename = f"{report_name}.{report.xml_extension}" else: data = url_parse(url).decode_query(cls=dict) if "context" in data: @@ -80,7 +80,7 @@ class ReportController(report.ReportController): response = self.report_routes( reportname, converter="xml", context=context, **data ) - filename = filename or f"{report.name}.xml" + filename = filename or f"{report.name}.{report.xml_extension}" response.headers.add("Content-Disposition", content_disposition(filename)) return response except Exception as e: diff --git a/report_xml/models/ir_actions_report.py b/report_xml/models/ir_actions_report.py index f65a7555e..1c0550cb4 100644 --- a/report_xml/models/ir_actions_report.py +++ b/report_xml/models/ir_actions_report.py @@ -29,6 +29,10 @@ class IrActionsReport(models.Model): help='Add `` at the start of final report ' "file.", ) + xml_extension = fields.Char( + default="xml", + help="Extension for XML Reports, by default is `xml`", + ) @api.model def _render_qweb_xml(self, report_ref, res_ids, data=None): diff --git a/report_xml/tests/test_report_xml.py b/report_xml/tests/test_report_xml.py index d3b9e552a..b37899196 100644 --- a/report_xml/tests/test_report_xml.py +++ b/report_xml/tests/test_report_xml.py @@ -1,12 +1,15 @@ # Copyright 2017 Creu Blanca # License AGPL-3.0 or later (https://www.gnuorg/licenses/agpl). +import json + from lxml import etree +from odoo import http from odoo.tests import common -class TestXmlReport(common.TransactionCase): +class TestXmlReport(common.HttpCase): def test_xml(self): report_object = self.env["ir.actions.report"] report_name = "report_xml.demo_report_xml_view" @@ -17,3 +20,28 @@ class TestXmlReport(common.TransactionCase): result_tree = etree.fromstring(result_report[0]) el = result_tree.xpath("/root/user/name") self.assertEqual(el[0].text, docs.ensure_one().name) + + def test_xml_extension(self): + self.authenticate("admin", "admin") + report_object = self.env["ir.actions.report"] + report_name = "report_xml.demo_report_xml_view" + report = report_object._get_report(report_name) + # Test changing report to use ".svg" extension + report.write({"xml_extension": "svg"}) + filename = self.get_report_headers().headers.get("Content-Disposition") + self.assertTrue(".svg" in filename) + # Test changing report to use ".ffdata" extension + report.write({"xml_extension": "ffdata"}) + filename = self.get_report_headers().headers.get("Content-Disposition") + self.assertTrue(".ffdata" in filename) + + def get_report_headers(self): + return self.url_open( + url="/report/download", + data={ + "data": json.dumps( + ["/report/xml/report_xml.demo_report_xml_view/1", "qweb-xml"] + ), + "csrf_token": http.Request.csrf_token(self), + }, + ) diff --git a/report_xml/views/ir_actions_report_view.xml b/report_xml/views/ir_actions_report_view.xml index 325a14210..6839b7480 100644 --- a/report_xml/views/ir_actions_report_view.xml +++ b/report_xml/views/ir_actions_report_view.xml @@ -24,6 +24,7 @@ > +