Merge PR #773 into 16.0

Signed-off-by thomaspaulb
pull/780/head
OCA-git-bot 2023-07-14 16:29:34 +00:00
commit fbb9ab4cb3
2 changed files with 64 additions and 1 deletions

View File

@ -4,6 +4,7 @@
import json import json
import logging import logging
from werkzeug.exceptions import InternalServerError
from werkzeug.urls import url_decode from werkzeug.urls import url_decode
from odoo.http import ( from odoo.http import (
@ -54,6 +55,7 @@ class ReportController(report.ReportController):
def report_download(self, data, context=None): def report_download(self, data, context=None):
requestcontent = json.loads(data) requestcontent = json.loads(data)
url, report_type = requestcontent[0], requestcontent[1] url, report_type = requestcontent[0], requestcontent[1]
reportname = ""
try: try:
if report_type == "csv": if report_type == "csv":
reportname = url.split("/report/csv/")[1].split("?")[0] reportname = url.split("/report/csv/")[1].split("?")[0]
@ -102,4 +104,5 @@ class ReportController(report.ReportController):
_logger.exception("Error while generating report %s", reportname) _logger.exception("Error while generating report %s", reportname)
se = _serialize_exception(e) se = _serialize_exception(e)
error = {"code": 200, "message": "Odoo Server Error", "data": se} error = {"code": 200, "message": "Odoo Server Error", "data": se}
return request.make_response(html_escape(json.dumps(error))) res = request.make_response(html_escape(json.dumps(error)))
raise InternalServerError(response=res) from e

View File

@ -1,9 +1,15 @@
# Copyright 2019 Creu Blanca # Copyright 2019 Creu Blanca
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
import json
import logging import logging
from io import StringIO from io import StringIO
from unittest import mock
from odoo import http
from odoo.tests import common from odoo.tests import common
from odoo.tools import mute_logger
from odoo.addons.web.controllers.report import ReportController
_logger = logging.getLogger(__name__) _logger = logging.getLogger(__name__)
try: try:
@ -12,6 +18,14 @@ except ImportError:
_logger.debug("Can not import csv.") _logger.debug("Can not import csv.")
class TestCsvException(Exception):
def __init__(self, message):
"""
:param message: exception message and frontend modal content
"""
super().__init__(message)
class TestReport(common.TransactionCase): class TestReport(common.TransactionCase):
def setUp(self): def setUp(self):
super().setUp() super().setUp()
@ -55,3 +69,49 @@ class TestReport(common.TransactionCase):
# Typical call from render # Typical call from render
objs = self.csv_report._get_objs_for_report(self.docs.ids, {}) objs = self.csv_report._get_objs_for_report(self.docs.ids, {})
self.assertEqual(objs, self.docs) self.assertEqual(objs, self.docs)
class TestCsvReport(common.HttpCase):
"""
Some tests calling controller
"""
def setUp(self):
super().setUp()
self.report_object = self.env["ir.actions.report"]
self.csv_report = self.env["report.report_csv.abstract"].with_context(
active_model="res.partner"
)
self.report_name = "report_csv.partner_csv"
self.report = self.report_object._get_report_from_name(self.report_name)
self.docs = self.env["res.company"].search([], limit=1).partner_id
self.session = self.authenticate("admin", "admin")
def test_csv(self):
filename = self.get_report_headers().headers.get("Content-Disposition")
self.assertTrue(".csv" in filename)
@mute_logger("odoo.addons.web.controllers.report")
def test_pdf_error(self):
with mock.patch.object(
ReportController, "report_routes"
) as route_patch, self.assertLogs(
"odoo.addons.report_csv.controllers.main", level=logging.ERROR
) as cm:
route_patch.side_effect = TestCsvException("Test")
self.get_report_headers(
suffix="/report/pdf/test/10", f_type="qweb-pdf"
).headers.get("Content-Disposition")
[msg] = cm.output
self.assertIn("Error while generating report", msg)
def get_report_headers(
self, suffix="/report/csv/report_csv.partner_csv/1", f_type="csv"
):
return self.url_open(
url="/report/download",
data={
"data": json.dumps([suffix, f_type]),
"csrf_token": http.Request.csrf_token(self),
},
)