diff --git a/frappe/core/doctype/report/boilerplate/controller.js b/frappe/core/doctype/report/boilerplate/controller.js index b7a53df088..6aef67307e 100644 --- a/frappe/core/doctype/report/boilerplate/controller.js +++ b/frappe/core/doctype/report/boilerplate/controller.js @@ -2,7 +2,12 @@ // For license information, please see license.txt frappe.query_reports["{name}"] = {{ - "filters": [ - - ] + filters: [ + // {{ + // "fieldname": "my_filter", + // "label": __("My Filter"), + // "fieldtype": "Data", + // "reqd": 1, + // }}, + ], }}; diff --git a/frappe/core/doctype/report/boilerplate/controller.py b/frappe/core/doctype/report/boilerplate/controller.py index dd4339dd5f..53810436b2 100644 --- a/frappe/core/doctype/report/boilerplate/controller.py +++ b/frappe/core/doctype/report/boilerplate/controller.py @@ -2,8 +2,47 @@ # For license information, please see license.txt # import frappe +from frappe import _ -def execute(filters=None): - columns, data = [], [] +def execute(filters: dict | None = None): + """Return columns and data for the report. + + This is the main entry point for the report. It accepts the filters as a + dictionary and should return columns and data. It is called by the framework + every time the report is refreshed or a filter is updated. + """ + columns = get_columns() + data = get_data() + return columns, data + + +def get_columns() -> list[dict]: + """Return columns for the report. + + One field definition per column, just like a DocType field definition. + """ + return [ + {{ + "label": _("Column 1"), + "fieldname": "column_1", + "fieldtype": "Data", + }}, + {{ + "label": _("Column 2"), + "fieldname": "column_2", + "fieldtype": "Int", + }}, + ] + + +def get_data() -> list[list]: + """Return data for the report. + + The report data is a list of rows, with each row being a list of cell values. + """ + return [ + ["Row 1", 1], + ["Row 2", 2], + ] diff --git a/pyproject.toml b/pyproject.toml index 242a09f54d..bb58092aea 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -112,6 +112,9 @@ freezegun = "~=1.2.2" [tool.ruff] line-length = 110 target-version = "py310" +exclude = [ + "**/doctype/*/boilerplate/*.py" # boilerplate are template strings, not valid python +] [tool.ruff.lint] select = [