Odoo18-Base/odoo/addons/base/tests/test_reports.py
2025-03-10 11:12:23 +07:00

138 lines
6.1 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import logging
import odoo
import odoo.tests
_logger = logging.getLogger(__name__)
@odoo.tests.tagged('post_install', '-at_install', 'post_install_l10n')
class TestReports(odoo.tests.TransactionCase):
def test_reports(self):
invoice_domain = [('move_type', 'in', ('out_invoice', 'out_refund', 'out_receipt', 'in_invoice', 'in_refund', 'in_receipt'))]
specific_model_domains = {
'account.report_original_vendor_bill': [('move_type', 'in', ('in_invoice', 'in_receipt'))],
'account.report_invoice_with_payments': invoice_domain,
'account.report_invoice': invoice_domain,
'l10n_th.report_commercial_invoice': invoice_domain,
}
Report = self.env['ir.actions.report']
for report in Report.search([('report_type', 'like', 'qweb')]):
report_model = 'report.%s' % report.report_name
try:
self.env[report_model]
except KeyError:
# Only test the generic reports here
_logger.info("testing report %s", report.report_name)
report_model_domain = specific_model_domains.get(report.report_name, [])
report_records = self.env[report.model].search(report_model_domain, limit=10)
if not report_records:
_logger.info("no record found skipping report %s", report.report_name)
# Test report generation
if not report.multi:
for record in report_records:
Report._render_qweb_html(report.id, record.ids)
else:
Report._render_qweb_html(report.id, report_records.ids)
else:
continue
@odoo.tests.tagged('post_install', '-at_install')
class TestAggregatePdfReports(odoo.tests.HttpCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.partners = cls.env["res.partner"].create([{
"name": "Rodion Romanovich Raskolnikov"
}, {
"name": "Dmitri Prokofich Razumikhin"
}, {
"name": "Porfiry Petrovich"
}])
cls.env["ir.actions.report"].create({
"name": "test report",
"report_name": "base.test_report",
"model": "res.partner",
})
def test_aggregate_report_with_some_resources_reloaded_from_attachment(self):
"""
Test for opw-3827700, which caused reports generated for multiple records to fail if there was a record in
the middle that had an attachment, and 'Reload from attachment' was enabled for the report. The misbehavior was
caused by an indexing issue.
"""
self.env["ir.ui.view"].create({
"type": "qweb",
"name": "base.test_report",
"key": "base.test_report",
"arch": """
<main>
<div t-foreach="docs" t-as="user">
<div class="article" data-oe-model="res.partner" t-att-data-oe-id="user.id">
<span t-esc="user.display_name"/>
</div>
</div>
</main>
"""
})
self.assert_report_creation("base.test_report", self.partners, self.partners[1])
def test_aggregate_report_with_some_resources_reloaded_from_attachment_with_multiple_page_report(self):
"""
Same as @test_report_with_some_resources_reloaded_from_attachment, but tests the behavior for reports that
span multiple pages per record.
"""
self.env["ir.ui.view"].create({
"type": "qweb",
"name": "base.test_report",
"key": "base.test_report",
"arch": """
<main>
<div t-foreach="docs" t-as="user">
<div class="article" data-oe-model="res.partner" t-att-data-oe-id="user.id" >
<!-- This headline helps report generation to split pdfs per record after it generates
the report in bulk by creating an outline. -->
<h1>Name</h1>
<!-- Make this a multipage report. -->
<div t-foreach="range(100)" t-as="i">
<span t-esc="i"/> - <span t-esc="user.display_name"/>
</div>
</div>
</div>
</main>
"""
})
self.assert_report_creation("base.test_report", self.partners, self.partners[1])
def assert_report_creation(self, report_ref, records, record_to_report):
self.assertIn(record_to_report, records, "Record to report must be in records list")
reports = self.env['ir.actions.report'].with_context(force_report_rendering=True)
# Make sure attachments are created.
report = reports._get_report(report_ref)
if not report.attachment:
report.attachment = "object.name + '.pdf'"
report.attachment_use = True
# Generate report for chosen record to create an attachment.
record_report, content_type = reports._render_qweb_pdf(report_ref, res_ids=record_to_report.id)
self.assertEqual(content_type, "pdf", "Report is not a PDF")
self.assertTrue(record_report, "PDF not generated")
# Make sure the attachment is created.
report = reports._get_report(report_ref)
self.assertTrue(report.retrieve_attachment(record_to_report), "Attachment not generated")
aggregate_report_content, content_type = reports._render_qweb_pdf(report_ref, res_ids=records.ids)
self.assertEqual(content_type, "pdf", "Report is not a PDF")
self.assertTrue(aggregate_report_content, "PDF not generated")
for record in records:
self.assertTrue(report.retrieve_attachment(record), "Attachment not generated")