From 616bae1f84a2414b433ba7d07f32f0cd776a0fac Mon Sep 17 00:00:00 2001 From: diptanilsaha Date: Sat, 7 Mar 2026 02:44:50 +0530 Subject: [PATCH 01/10] refactor: type annotations for whitelisted methods --- .../doctype/asset_maintenance_log/asset_maintenance_log.py | 2 +- erpnext/selling/doctype/product_bundle/product_bundle.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/assets/doctype/asset_maintenance_log/asset_maintenance_log.py b/erpnext/assets/doctype/asset_maintenance_log/asset_maintenance_log.py index 140eb1af27e..51858139f35 100644 --- a/erpnext/assets/doctype/asset_maintenance_log/asset_maintenance_log.py +++ b/erpnext/assets/doctype/asset_maintenance_log/asset_maintenance_log.py @@ -90,7 +90,7 @@ def update_asset_maintenance_log_status(): @frappe.whitelist() @frappe.validate_and_sanitize_search_inputs -def get_maintenance_tasks(doctype, txt, searchfield, start, page_len, filters): +def get_maintenance_tasks(doctype: str, txt: str, searchfield: str, start: int, page_len: int, filters: dict): asset_maintenance_tasks = frappe.db.get_values( "Asset Maintenance Task", {"parent": filters.get("asset_maintenance")}, "maintenance_task" ) diff --git a/erpnext/selling/doctype/product_bundle/product_bundle.py b/erpnext/selling/doctype/product_bundle/product_bundle.py index 5c981244d10..af2db4c1c54 100644 --- a/erpnext/selling/doctype/product_bundle/product_bundle.py +++ b/erpnext/selling/doctype/product_bundle/product_bundle.py @@ -101,7 +101,7 @@ class ProductBundle(Document): @frappe.whitelist() @frappe.validate_and_sanitize_search_inputs -def get_new_item_code(doctype, txt, searchfield, start, page_len, filters): +def get_new_item_code(doctype: str, txt: str, searchfield: str, start: int, page_len: int, filters: dict): product_bundles = frappe.db.get_list("Product Bundle", {"disabled": 0}, pluck="name") if not searchfield or searchfield == "name": From 208112e7a9993e40ab37b5c07928103952771f57 Mon Sep 17 00:00:00 2001 From: diptanilsaha Date: Sat, 7 Mar 2026 11:44:16 +0530 Subject: [PATCH 02/10] refactor(payment_request): type annotations for whitelisted methods --- erpnext/accounts/doctype/payment_request/payment_request.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/payment_request/payment_request.py b/erpnext/accounts/doctype/payment_request/payment_request.py index c09391a8d41..1ba9cf1675d 100644 --- a/erpnext/accounts/doctype/payment_request/payment_request.py +++ b/erpnext/accounts/doctype/payment_request/payment_request.py @@ -1154,7 +1154,7 @@ def get_irequests_of_payment_request(doc: str | None = None) -> list: @frappe.whitelist() -def get_available_payment_schedules(reference_doctype, reference_name): +def get_available_payment_schedules(reference_doctype: str, reference_name: str): ref_doc = frappe.get_doc(reference_doctype, reference_name) if not hasattr(ref_doc, "payment_schedule") or not ref_doc.payment_schedule: From b4fb74c84d5d7eadc0c6d817a767eb905fb3e98d Mon Sep 17 00:00:00 2001 From: diptanilsaha Date: Sat, 7 Mar 2026 11:48:06 +0530 Subject: [PATCH 03/10] refactor(`asset`): added type annotations on `get_depreciation_rate` --- erpnext/assets/doctype/asset/asset.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/erpnext/assets/doctype/asset/asset.py b/erpnext/assets/doctype/asset/asset.py index 5edf87dc3f9..a9b45a79135 100644 --- a/erpnext/assets/doctype/asset/asset.py +++ b/erpnext/assets/doctype/asset/asset.py @@ -7,6 +7,7 @@ import math import frappe from frappe import _ +from frappe.model.document import Document from frappe.query_builder.functions import IfNull, Sum from frappe.utils import ( cint, @@ -986,7 +987,7 @@ class Asset(AccountsController): return False @frappe.whitelist() - def get_depreciation_rate(self, args, on_validate=False): + def get_depreciation_rate(self, args: str | dict | Document, on_validate: bool = False): if isinstance(args, str): args = json.loads(args) From 805fc807a98f8a1c19aa22795cbc6f3377162461 Mon Sep 17 00:00:00 2001 From: diptanilsaha Date: Sat, 7 Mar 2026 13:20:50 +0530 Subject: [PATCH 04/10] refactor(`work_order`): added type annotations on `cancel_stock_reservation_entries` --- erpnext/manufacturing/doctype/work_order/work_order.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/manufacturing/doctype/work_order/work_order.py b/erpnext/manufacturing/doctype/work_order/work_order.py index a4285753f62..5bde3e9ddfa 100644 --- a/erpnext/manufacturing/doctype/work_order/work_order.py +++ b/erpnext/manufacturing/doctype/work_order/work_order.py @@ -2130,7 +2130,7 @@ def make_stock_reservation_entries( @frappe.whitelist() -def cancel_stock_reservation_entries(doc, sre_list): +def cancel_stock_reservation_entries(doc: str | dict, sre_list: str | list): if isinstance(doc, str): doc = parse_json(doc) doc = frappe.get_doc("Work Order", doc.get("name")) From 11a6db32ae2e124b3c357fc6f24f8b7dd2e26efd Mon Sep 17 00:00:00 2001 From: diptanilsaha Date: Sat, 7 Mar 2026 13:30:36 +0530 Subject: [PATCH 05/10] refactor(`leaderboard`): type annotations for whitelisted methods --- erpnext/startup/leaderboard.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/erpnext/startup/leaderboard.py b/erpnext/startup/leaderboard.py index f5a5216b51d..22cf179d2c0 100644 --- a/erpnext/startup/leaderboard.py +++ b/erpnext/startup/leaderboard.py @@ -54,7 +54,7 @@ def get_leaderboards(): @frappe.whitelist() -def get_all_customers(date_range, company, field, limit=None): +def get_all_customers(date_range: str, company: str, field: str, limit: int | None = None): filters = [["docstatus", "=", "1"], ["company", "=", company]] from_date, to_date = parse_date_range(date_range) if field == "outstanding_amount": @@ -89,7 +89,7 @@ def get_all_customers(date_range, company, field, limit=None): @frappe.whitelist() -def get_all_items(date_range, company, field, limit=None): +def get_all_items(date_range: str, company: str, field: str, limit: int | None = None): if field in ("available_stock_qty", "available_stock_value"): sum_field = "actual_qty" if field == "available_stock_qty" else "stock_value" results = frappe.db.get_all( @@ -135,7 +135,7 @@ def get_all_items(date_range, company, field, limit=None): @frappe.whitelist() -def get_all_suppliers(date_range, company, field, limit=None): +def get_all_suppliers(date_range: str, company: str, field: str, limit: int | None = None): filters = [["docstatus", "=", "1"], ["company", "=", company]] from_date, to_date = parse_date_range(date_range) @@ -171,7 +171,7 @@ def get_all_suppliers(date_range, company, field, limit=None): @frappe.whitelist() -def get_all_sales_partner(date_range, company, field, limit=None): +def get_all_sales_partner(date_range: str, company: str, field: str, limit: int | None = None): if field == "total_sales_amount": select_field = "base_net_total" elif field == "total_commission": @@ -196,7 +196,7 @@ def get_all_sales_partner(date_range, company, field, limit=None): @frappe.whitelist() -def get_all_sales_person(date_range, company, field=None, limit=0): +def get_all_sales_person(date_range: str, company: str, field: str | None = None, limit: int | None = None): filters = [ ["docstatus", "=", "1"], ["company", "=", company], From 1f4d20413eb2fc73c3be4f6b035bf4c72875be14 Mon Sep 17 00:00:00 2001 From: diptanilsaha Date: Sat, 7 Mar 2026 13:41:11 +0530 Subject: [PATCH 06/10] refactor(`serial_no`): added missing type annotation on `auto_fetch_serial_number` --- erpnext/stock/doctype/serial_no/serial_no.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/stock/doctype/serial_no/serial_no.py b/erpnext/stock/doctype/serial_no/serial_no.py index 8a01b08575c..195ac39c758 100644 --- a/erpnext/stock/doctype/serial_no/serial_no.py +++ b/erpnext/stock/doctype/serial_no/serial_no.py @@ -191,7 +191,7 @@ def auto_fetch_serial_number( posting_date: str | None = None, batch_nos: str | list[str] | None = None, for_doctype: str | None = None, - exclude_sr_nos=None, + exclude_sr_nos: str | None = None, ) -> list[str]: filters = frappe._dict({"item_code": item_code, "warehouse": warehouse}) From 950bf682c3b54cb4dc82c97d711f82b5b8eb4968 Mon Sep 17 00:00:00 2001 From: diptanilsaha Date: Sat, 7 Mar 2026 14:20:46 +0530 Subject: [PATCH 07/10] refactor(support): type annotations for whitelisted methods --- erpnext/support/doctype/issue/issue.py | 2 +- .../service_level_agreement/service_level_agreement.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/erpnext/support/doctype/issue/issue.py b/erpnext/support/doctype/issue/issue.py index 89b666a077b..32aba988cce 100644 --- a/erpnext/support/doctype/issue/issue.py +++ b/erpnext/support/doctype/issue/issue.py @@ -118,7 +118,7 @@ class Issue(Document): communication.save() @frappe.whitelist() - def split_issue(self, subject, communication_id): + def split_issue(self, subject: str, communication_id: str): # Bug: Pressing enter doesn't send subject from copy import deepcopy diff --git a/erpnext/support/doctype/service_level_agreement/service_level_agreement.py b/erpnext/support/doctype/service_level_agreement/service_level_agreement.py index b39f1ce34a9..f0f8e24ec90 100644 --- a/erpnext/support/doctype/service_level_agreement/service_level_agreement.py +++ b/erpnext/support/doctype/service_level_agreement/service_level_agreement.py @@ -427,7 +427,7 @@ def get_customer_territory(customer): @frappe.whitelist() -def get_service_level_agreement_filters(doctype, name, customer=None): +def get_service_level_agreement_filters(doctype: str, name: str, customer: str | None = None): if not frappe.db.get_single_value("Support Settings", "track_service_level_agreement"): return @@ -780,7 +780,7 @@ def get_response_and_resolution_duration(doc): @frappe.whitelist() -def reset_service_level_agreement(doctype: str, docname: str, reason, user): +def reset_service_level_agreement(doctype: str, docname: str, reason: str, user: str): if not frappe.db.get_single_value("Support Settings", "allow_resetting_service_level_agreement"): frappe.throw(_("Allow Resetting Service Level Agreement from Support Settings.")) @@ -1034,7 +1034,7 @@ def get_tz(user): @frappe.whitelist() -def get_user_time(user, to_string=False): +def get_user_time(user: str, to_string: bool = False): return get_datetime_str(now_datetime(user)) if to_string else now_datetime(user) From decd9343ee9ac07bd30eb8ec67ffa8db1e470e94 Mon Sep 17 00:00:00 2001 From: diptanilsaha Date: Sat, 7 Mar 2026 14:23:16 +0530 Subject: [PATCH 08/10] refactor(`call_log`): type annotations for whitelisted methods --- erpnext/telephony/doctype/call_log/call_log.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/telephony/doctype/call_log/call_log.py b/erpnext/telephony/doctype/call_log/call_log.py index 0b5fd5dc368..e5a14f7fe09 100644 --- a/erpnext/telephony/doctype/call_log/call_log.py +++ b/erpnext/telephony/doctype/call_log/call_log.py @@ -126,7 +126,7 @@ class CallLog(Document): @frappe.whitelist() -def add_call_summary_and_call_type(call_log, summary, call_type): +def add_call_summary_and_call_type(call_log: str, summary: str, call_type: str): doc = frappe.get_doc("Call Log", call_log) doc.type_of_call = call_type doc.save() From b51c59d20d5c7f2505eef9747c78aaa596240345 Mon Sep 17 00:00:00 2001 From: diptanilsaha Date: Sat, 7 Mar 2026 14:36:07 +0530 Subject: [PATCH 09/10] refactor(templates): type annotations for whitelisted methods --- erpnext/templates/pages/projects.py | 4 ++-- erpnext/templates/pages/search_help.py | 2 +- erpnext/templates/utils.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/erpnext/templates/pages/projects.py b/erpnext/templates/pages/projects.py index 446437bbb32..46ad25ed6ed 100644 --- a/erpnext/templates/pages/projects.py +++ b/erpnext/templates/pages/projects.py @@ -65,7 +65,7 @@ def get_tasks(project, start=0, search=None, item_status=None): @frappe.whitelist() -def get_task_html(project, start=0, item_status=None): +def get_task_html(project: str, start: int = 0, item_status: str | None = None): return frappe.render_template( "erpnext/templates/includes/projects/project_tasks.html", { @@ -105,7 +105,7 @@ def get_timesheets(project, start=0, search=None): @frappe.whitelist() -def get_timesheet_html(project, start=0): +def get_timesheet_html(project: str, start: int = 0): return frappe.render_template( "erpnext/templates/includes/projects/project_timesheets.html", {"doc": {"timesheets": get_timesheets(project, start)}}, diff --git a/erpnext/templates/pages/search_help.py b/erpnext/templates/pages/search_help.py index 18a0a67d0c8..9f04be6a8ff 100644 --- a/erpnext/templates/pages/search_help.py +++ b/erpnext/templates/pages/search_help.py @@ -23,7 +23,7 @@ def get_context(context): @frappe.whitelist(allow_guest=True) -def get_help_results_sections(text): +def get_help_results_sections(text: str): out = [] settings = frappe.get_doc("Support Settings", "Support Settings") diff --git a/erpnext/templates/utils.py b/erpnext/templates/utils.py index 164a52f58c2..59656e0fd26 100644 --- a/erpnext/templates/utils.py +++ b/erpnext/templates/utils.py @@ -7,7 +7,7 @@ from frappe.utils import escape_html @frappe.whitelist(allow_guest=True) -def send_message(sender, message, subject="Website Query"): +def send_message(sender: str, message: str, subject: str = "Website Query"): from frappe.www.contact import send_message as website_send_message website_send_message(sender, message, subject) From 56345f435447fb5b385cf8a6f9eff17458d0f0c7 Mon Sep 17 00:00:00 2001 From: diptanilsaha Date: Sat, 7 Mar 2026 14:39:14 +0530 Subject: [PATCH 10/10] refactor(`book_appointment`): type annotations for whitelisted methods --- erpnext/www/book_appointment/index.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/www/book_appointment/index.py b/erpnext/www/book_appointment/index.py index 23425454c29..376e7afc14b 100644 --- a/erpnext/www/book_appointment/index.py +++ b/erpnext/www/book_appointment/index.py @@ -42,7 +42,7 @@ def get_timezones(): @frappe.whitelist(allow_guest=True) -def get_appointment_slots(date, timezone): +def get_appointment_slots(date: str, timezone: str): # Convert query to local timezones format_string = "%Y-%m-%d %H:%M:%S" query_start_time = datetime.datetime.strptime(date + " 00:00:00", format_string) @@ -92,7 +92,7 @@ def get_available_slots_between(query_start_time, query_end_time, settings): @frappe.whitelist(allow_guest=True) -def create_appointment(date, time, tz, contact): +def create_appointment(date: str, time: str, tz: str, contact: str): format_string = "%Y-%m-%d %H:%M:%S" scheduled_time = datetime.datetime.strptime(date + " " + time, format_string) # Strip tzinfo from datetime objects since it's handled by the doctype