diff --git a/frappe/core/doctype/report/report.py b/frappe/core/doctype/report/report.py index 828a28a075..1c08b3d533 100644 --- a/frappe/core/doctype/report/report.py +++ b/frappe/core/doctype/report/report.py @@ -106,6 +106,13 @@ class Report(Document): delete_custom_role("report", self.name) + def clear_cache(self): + self.update_report_cache() + return super().clear_cache() + + def update_report_cache(self): + frappe.cache.delete_key("bootinfo") + def delete_report_folder(self): from frappe.modules.export_file import delete_folder diff --git a/frappe/core/doctype/report/test_report.py b/frappe/core/doctype/report/test_report.py index ba9382ef8e..1ed50d0c04 100644 --- a/frappe/core/doctype/report/test_report.py +++ b/frappe/core/doctype/report/test_report.py @@ -406,3 +406,32 @@ result = [ self.assertEqual(result[-1][0], "Total") self.assertEqual(result[-1][1], 200) self.assertEqual(result[-1][2], 150.50) + + def test_report_cache_invalidation(self): + import frappe.sessions + from frappe.utils import set_request + + frappe.set_user("test@example.com") + set_request(method="GET", path="/app") + + try: + frappe.sessions.get() + + report_name = _save_report( + "Test Cache Invalidation Report", + "User", + json.dumps([{"fieldname": "email", "fieldtype": "Data", "label": "Email"}]), + ) + + cached_bootinfo = frappe.sessions.get() + self.assertIn(report_name, cached_bootinfo["user"]["all_reports"]) + + doc = frappe.get_doc("Report", report_name) + delete_report(doc.name) + + cached_bootinfo = frappe.sessions.get() + self.assertNotIn(report_name, cached_bootinfo["user"]["all_reports"]) + + finally: + frappe.local.request = None + frappe.set_user("Administrator")