From 45c04a85acac811b48e27bbf63868f48f719a3c7 Mon Sep 17 00:00:00 2001 From: Shllokkk Date: Fri, 3 Apr 2026 17:53:47 +0530 Subject: [PATCH 1/2] feat(report): add default_print_format link field to report doctype --- frappe/core/doctype/report/report.js | 11 +++++++++++ frappe/core/doctype/report/report.json | 11 +++++++++-- frappe/core/doctype/report/report.py | 6 ++++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/frappe/core/doctype/report/report.js b/frappe/core/doctype/report/report.js index 4f1c0092a1..525eac411b 100644 --- a/frappe/core/doctype/report/report.js +++ b/frappe/core/doctype/report/report.js @@ -55,6 +55,17 @@ frappe.ui.form.on("Report", { }, }; }); + + frm.set_query("default_print_format", () => { + return { + filters: { + print_format_for: "Report", + report: frm.doc.name, + print_format_type: "JS", + disabled: 0, + }, + }; + }); }, ref_doctype: function (frm) { diff --git a/frappe/core/doctype/report/report.json b/frappe/core/doctype/report/report.json index 519184d57b..ad8a758982 100644 --- a/frappe/core/doctype/report/report.json +++ b/frappe/core/doctype/report/report.json @@ -14,6 +14,7 @@ "column_break_4", "report_type", "letter_head", + "default_print_format", "add_total_row", "disabled", "prepared_report", @@ -99,7 +100,7 @@ "depends_on": "eval: doc.is_standard == \"No\"", "fieldname": "letter_head", "fieldtype": "Link", - "label": "Letter Head", + "label": "Default Letter Head", "options": "Letter Head" }, { @@ -202,12 +203,18 @@ "fieldname": "add_translate_data", "fieldtype": "Check", "label": "Add Translate Data" + }, + { + "fieldname": "default_print_format", + "fieldtype": "Link", + "label": "Default Print Format", + "options": "Print Format" } ], "idx": 1, "index_web_pages_for_search": 1, "links": [], - "modified": "2025-08-28 18:28:32.510719", + "modified": "2026-03-31 14:42:49.829920", "modified_by": "Administrator", "module": "Core", "name": "Report", diff --git a/frappe/core/doctype/report/report.py b/frappe/core/doctype/report/report.py index 1c08b3d533..50989d3f67 100644 --- a/frappe/core/doctype/report/report.py +++ b/frappe/core/doctype/report/report.py @@ -32,6 +32,7 @@ class Report(Document): add_total_row: DF.Check add_translate_data: DF.Check columns: DF.Table[ReportColumn] + default_print_format: DF.Link | None disabled: DF.Check filters: DF.Table[ReportFilter] is_standard: DF.Literal["No", "Yes"] @@ -82,6 +83,11 @@ class Report(Document): if self.report_type == "Report Builder": self.update_report_json() + if self.default_print_format: + report_name = frappe.db.get_value("Print Format", self.default_print_format, "report") + if not report_name or report_name != self.name: + frappe.throw(_("Print Format must belong to this report!")) + def before_insert(self): self.set_doctype_roles() From 820bc522011cb35de541a313d17402525fde32f1 Mon Sep 17 00:00:00 2001 From: Shllokkk Date: Fri, 3 Apr 2026 18:37:09 +0530 Subject: [PATCH 2/2] fix: minor bugs in the print settings dialog and populate default print format field for a report --- frappe/core/doctype/report/report.py | 23 +++++++++++++++---- frappe/public/js/frappe/form/print_utils.js | 10 ++++++-- .../js/frappe/views/reports/query_report.js | 4 +++- 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/frappe/core/doctype/report/report.py b/frappe/core/doctype/report/report.py index 50989d3f67..c99b697d04 100644 --- a/frappe/core/doctype/report/report.py +++ b/frappe/core/doctype/report/report.py @@ -83,10 +83,8 @@ class Report(Document): if self.report_type == "Report Builder": self.update_report_json() - if self.default_print_format: - report_name = frappe.db.get_value("Print Format", self.default_print_format, "report") - if not report_name or report_name != self.name: - frappe.throw(_("Print Format must belong to this report!")) + if self.default_print_format and self.has_value_changed("default_print_format"): + self.validate_default_print_format() def before_insert(self): self.set_doctype_roles() @@ -414,6 +412,23 @@ class Report(Document): return data + def validate_default_print_format(self): + pf = frappe.db.get_value( + "Print Format", + self.default_print_format, + ["report", "print_format_for", "print_format_type", "disabled"], + as_dict=True, + ) + + if ( + not pf + or pf.report != self.name + or pf.print_format_for != "Report" + or pf.print_format_type != "JS" + or pf.disabled + ): + frappe.throw(_("Selected Print Format is invalid for this Report.")) + @frappe.whitelist() def toggle_disable(self, disable: bool): if not self.has_permission("write"): diff --git a/frappe/public/js/frappe/form/print_utils.js b/frappe/public/js/frappe/form/print_utils.js index 7b77d3f6cd..24d4a06f72 100644 --- a/frappe/public/js/frappe/form/print_utils.js +++ b/frappe/public/js/frappe/form/print_utils.js @@ -4,7 +4,8 @@ frappe.ui.get_print_settings = function ( letter_head, pick_columns, has_filters = false, - title = null + title = null, + default_print_format = null ) { var print_settings = locals[":Print Settings"]["Print Settings"]; @@ -31,6 +32,10 @@ frappe.ui.get_print_settings = function ( fieldname: "print_format", label: __("Print Format"), options: "Print Format", + default: default_print_format, + description: __( + "If no Print Format is selected, the default template for this report will be used." + ), get_query: () => ({ filters: { print_format_for: "Report", @@ -43,7 +48,7 @@ frappe.ui.get_print_settings = function ( { fieldtype: "Check", fieldname: "with_letter_head", - label: __("With Letter head"), + label: __("With Letter Head"), }, { fieldtype: "Link", @@ -60,6 +65,7 @@ frappe.ui.get_print_settings = function ( label: __("Include filters"), fieldtype: "Check", fieldname: "include_filters", + depends_on: "eval: !doc.print_format", }); } diff --git a/frappe/public/js/frappe/views/reports/query_report.js b/frappe/public/js/frappe/views/reports/query_report.js index afb6eb8239..014bebcc64 100644 --- a/frappe/public/js/frappe/views/reports/query_report.js +++ b/frappe/public/js/frappe/views/reports/query_report.js @@ -1941,7 +1941,9 @@ frappe.views.QueryReport = class QueryReport extends frappe.views.BaseList { (print_settings) => this.print_report(print_settings), this.report_doc.letter_head, this.get_visible_columns(), - true + true, + null, + this.report_doc.default_print_format ); this.add_portrait_warning(dialog); },