mirror of
https://github.com/OCA/reporting-engine.git
synced 2025-02-16 16:30:38 +02:00
Before this commit, when exception is raised while generating report, on browser window instead of python traceback nothing was shown on production environment or werkzeug's "Console locked" message on development environment.
57 lines
2.5 KiB
Python
57 lines
2.5 KiB
Python
# Copyright (C) 2017 Creu Blanca
|
|
# License AGPL-3.0 or later (https://www.gnuorg/licenses/agpl.html).
|
|
|
|
import json
|
|
|
|
from odoo.http import content_disposition, request, route, serialize_exception
|
|
from odoo.tools import html_escape
|
|
from odoo.tools.safe_eval import safe_eval
|
|
|
|
from odoo.addons.web.controllers import main as report
|
|
|
|
|
|
class ReportController(report.ReportController):
|
|
@route()
|
|
def report_routes(self, reportname, docids=None, converter=None, **data):
|
|
if converter == "xlsx":
|
|
return self._report_routes_xlsx(reportname, docids, converter, **data)
|
|
return super(ReportController, self).report_routes(
|
|
reportname, docids, converter, **data
|
|
)
|
|
|
|
def _report_routes_xlsx(self, reportname, docids=None, converter=None, **data):
|
|
try:
|
|
report = request.env["ir.actions.report"]._get_report_from_name(reportname)
|
|
context = dict(request.env.context)
|
|
if docids:
|
|
docids = [int(i) for i in docids.split(",")]
|
|
if data.get("options"):
|
|
data.update(json.loads(data.pop("options")))
|
|
if data.get("context"):
|
|
# Ignore 'lang' here, because the context in data is the one
|
|
# from the webclient *but* if the user explicitely wants to
|
|
# change the lang, this mechanism overwrites it.
|
|
data["context"] = json.loads(data["context"])
|
|
if data["context"].get("lang"):
|
|
del data["context"]["lang"]
|
|
context.update(data["context"])
|
|
xlsx = report.with_context(context)._render_xlsx(docids, data=data)[0]
|
|
report_name = report.report_file
|
|
if report.print_report_name and not len(docids) > 1:
|
|
obj = request.env[report.model].browse(docids[0])
|
|
report_name = safe_eval(report.print_report_name, {"object": obj})
|
|
xlsxhttpheaders = [
|
|
(
|
|
"Content-Type",
|
|
"application/vnd.openxmlformats-"
|
|
"officedocument.spreadsheetml.sheet",
|
|
),
|
|
("Content-Length", len(xlsx)),
|
|
("Content-Disposition", content_disposition(report_name + ".xlsx")),
|
|
]
|
|
return request.make_response(xlsx, headers=xlsxhttpheaders)
|
|
except Exception as e:
|
|
se = serialize_exception(e)
|
|
error = {"code": 200, "message": "Odoo Server Error", "data": se}
|
|
return request.make_response(html_escape(json.dumps(error)))
|