From 6aaca38ce3c71db113d41c72f1372e4d2259f4fe Mon Sep 17 00:00:00 2001 From: diptanilsaha Date: Sat, 28 Feb 2026 03:21:11 +0530 Subject: [PATCH] refactor(setup): type annotataions for whitelisted methods --- erpnext/setup/doctype/company/company.py | 18 +++++++++++------- erpnext/setup/doctype/department/department.py | 8 +++++++- .../setup/doctype/email_digest/email_digest.py | 2 +- erpnext/setup/doctype/employee/employee.py | 12 +++++++++--- .../setup/doctype/holiday_list/holiday_list.py | 4 ++-- erpnext/setup/doctype/party_type/party_type.py | 2 +- .../terms_and_conditions.py | 2 +- .../transaction_deletion_record.py | 10 ++++++---- erpnext/setup/utils.py | 9 +++++++-- 9 files changed, 45 insertions(+), 22 deletions(-) diff --git a/erpnext/setup/doctype/company/company.py b/erpnext/setup/doctype/company/company.py index 60bb64f46d5..ac982393a23 100644 --- a/erpnext/setup/doctype/company/company.py +++ b/erpnext/setup/doctype/company/company.py @@ -3,6 +3,7 @@ import json +from typing import Literal import frappe import frappe.defaults @@ -938,7 +939,7 @@ def cache_companies_monthly_sales_history(): @frappe.whitelist() -def get_children(doctype, parent=None, company=None, is_root=False): +def get_children(doctype: str, parent: str | None = None, company: str | None = None, is_root: bool = False): if parent is None or parent == "All Companies": parent = "" @@ -1045,10 +1046,11 @@ def get_timeline_data(doctype, name): @frappe.whitelist() -def get_default_company_address(name, sort_key="is_primary_address", existing_address=None): - if sort_key not in ["is_shipping_address", "is_primary_address"]: - return None - +def get_default_company_address( + name: str, + sort_key: Literal["is_shipping_address", "is_primary_address"] = "is_primary_address", + existing_address: str | None = None, +): out = frappe.db.sql( """ SELECT addr.name, addr.{} @@ -1072,7 +1074,9 @@ def get_default_company_address(name, sort_key="is_primary_address", existing_ad @frappe.whitelist() -def get_billing_shipping_address(name, billing_address=None, shipping_address=None): +def get_billing_shipping_address( + name: str, billing_address: str | None = None, shipping_address: str | None = None +): primary_address = get_default_company_address(name, "is_primary_address", billing_address) shipping_address = get_default_company_address(name, "is_shipping_address", shipping_address) @@ -1080,7 +1084,7 @@ def get_billing_shipping_address(name, billing_address=None, shipping_address=No @frappe.whitelist() -def create_transaction_deletion_request(company): +def create_transaction_deletion_request(company: str): frappe.only_for("System Manager") from erpnext.setup.doctype.transaction_deletion_record.transaction_deletion_record import ( diff --git a/erpnext/setup/doctype/department/department.py b/erpnext/setup/doctype/department/department.py index 648bc95c886..71cf6e96743 100644 --- a/erpnext/setup/doctype/department/department.py +++ b/erpnext/setup/doctype/department/department.py @@ -70,7 +70,13 @@ def get_abbreviated_name(name, company): @frappe.whitelist() -def get_children(doctype, parent=None, company=None, is_root=False, include_disabled=False): +def get_children( + doctype: str, + parent: str | None = None, + company: str | None = None, + is_root: bool = False, + include_disabled: str | dict | None = None, +): if isinstance(include_disabled, str): include_disabled = json.loads(include_disabled) fields = ["name as value", "is_group as expandable"] diff --git a/erpnext/setup/doctype/email_digest/email_digest.py b/erpnext/setup/doctype/email_digest/email_digest.py index 7f087768fe7..9d68e629d15 100644 --- a/erpnext/setup/doctype/email_digest/email_digest.py +++ b/erpnext/setup/doctype/email_digest/email_digest.py @@ -900,7 +900,7 @@ def send(): @frappe.whitelist() -def get_digest_msg(name): +def get_digest_msg(name: str): return frappe.get_doc("Email Digest", name).get_msg_html() diff --git a/erpnext/setup/doctype/employee/employee.py b/erpnext/setup/doctype/employee/employee.py index 9b4759b360a..0e7203d35cd 100755 --- a/erpnext/setup/doctype/employee/employee.py +++ b/erpnext/setup/doctype/employee/employee.py @@ -304,7 +304,7 @@ def is_holiday(employee, date=None, raise_exception=True, only_non_weekly=False, @frappe.whitelist() -def deactivate_sales_person(status=None, employee=None): +def deactivate_sales_person(status: str | None = None, employee: str | None = None): if status == "Left": sales_person = frappe.db.get_value("Sales Person", {"Employee": employee}) if sales_person: @@ -312,7 +312,7 @@ def deactivate_sales_person(status=None, employee=None): @frappe.whitelist() -def create_user(employee, user=None, email=None): +def create_user(employee: str, email: str | None = None): emp = frappe.get_doc("Employee", employee) employee_name = emp.employee_name.split(" ") @@ -384,7 +384,13 @@ def get_employee_emails(employee_list): @frappe.whitelist() -def get_children(doctype, parent=None, company=None, is_root=False, is_tree=False): +def get_children( + doctype: str, + parent: str | None = None, + company: str | None = None, + is_root: bool = False, + is_tree: bool = False, +): filters = [["status", "=", "Active"]] if company and company != "All Companies": filters.append(["company", "=", company]) diff --git a/erpnext/setup/doctype/holiday_list/holiday_list.py b/erpnext/setup/doctype/holiday_list/holiday_list.py index 74be12fd4a9..26b5631b1f3 100644 --- a/erpnext/setup/doctype/holiday_list/holiday_list.py +++ b/erpnext/setup/doctype/holiday_list/holiday_list.py @@ -8,7 +8,7 @@ from datetime import date import frappe from frappe import _, throw from frappe.model.document import Document -from frappe.utils import formatdate, getdate, today +from frappe.utils import DateTimeLikeObject, formatdate, getdate, today class OverlapError(frappe.ValidationError): @@ -168,7 +168,7 @@ class HolidayList(Document): @frappe.whitelist() -def get_events(start, end, filters=None): +def get_events(start: DateTimeLikeObject, end: DateTimeLikeObject, filters: str | dict | None = None): """Returns events for Gantt / Calendar view rendering. :param start: Start date-time. diff --git a/erpnext/setup/doctype/party_type/party_type.py b/erpnext/setup/doctype/party_type/party_type.py index 6730d1cbdce..334e45e865b 100644 --- a/erpnext/setup/doctype/party_type/party_type.py +++ b/erpnext/setup/doctype/party_type/party_type.py @@ -24,7 +24,7 @@ class PartyType(Document): @frappe.whitelist() @frappe.validate_and_sanitize_search_inputs -def get_party_type(doctype, txt, searchfield, start, page_len, filters): +def get_party_type(doctype: str, txt: str, searchfield: str, start: int, page_len: int, filters: dict): cond = "" account_type = None diff --git a/erpnext/setup/doctype/terms_and_conditions/terms_and_conditions.py b/erpnext/setup/doctype/terms_and_conditions/terms_and_conditions.py index 40c905b161c..7af36b8924d 100644 --- a/erpnext/setup/doctype/terms_and_conditions/terms_and_conditions.py +++ b/erpnext/setup/doctype/terms_and_conditions/terms_and_conditions.py @@ -35,7 +35,7 @@ class TermsandConditions(Document): @frappe.whitelist() -def get_terms_and_conditions(template_name, doc): +def get_terms_and_conditions(template_name: str, doc: str | dict): if isinstance(doc, str): doc = json.loads(doc) diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py index a76c37e2fee..9f68967392a 100644 --- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py +++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py @@ -75,7 +75,7 @@ def get_protected_doctypes(): @frappe.whitelist() -def get_company_link_fields(doctype_name): +def get_company_link_fields(doctype_name: str): """Get all Company Link field names for a DocType (whitelisted for frontend autocomplete) Args: @@ -428,7 +428,9 @@ class TransactionDeletionRecord(Document): return {"count": len(self.doctypes_to_delete)} @frappe.whitelist() - def populate_doctype_details(self, doctype_name, company=None, company_field=None): + def populate_doctype_details( + self, doctype_name: str, company: str | None = None, company_field: str | None = None + ): """Get child DocTypes and document count for specified DocType Args: @@ -1035,7 +1037,7 @@ def get_doctypes_to_be_ignored(): @frappe.whitelist() -def export_to_delete_template(name): +def export_to_delete_template(name: str): """Export To Delete list as CSV via URL access""" frappe.only_for("System Manager") doc = frappe.get_doc("Transaction Deletion Record", name) @@ -1044,7 +1046,7 @@ def export_to_delete_template(name): @frappe.whitelist() -def process_import_template(transaction_deletion_record_name, file_url): +def process_import_template(transaction_deletion_record_name: str, file_url: str): """Import CSV template and populate To Delete list""" import os diff --git a/erpnext/setup/utils.py b/erpnext/setup/utils.py index 14ef5ab89e0..688e642be80 100644 --- a/erpnext/setup/utils.py +++ b/erpnext/setup/utils.py @@ -4,7 +4,7 @@ import frappe from frappe import _ from frappe.utils import add_days, flt, get_datetime_str, nowdate -from frappe.utils.data import now_datetime +from frappe.utils.data import DateTimeLikeObject, now_datetime from frappe.utils.nestedset import get_root_of from erpnext import get_default_company @@ -92,7 +92,12 @@ def get_pegged_rate(pegged_map, from_currency, to_currency, transaction_date=Non @frappe.whitelist() -def get_exchange_rate(from_currency, to_currency, transaction_date=None, args=None): +def get_exchange_rate( + from_currency: str, + to_currency: str, + transaction_date: DateTimeLikeObject | None = None, + args: str | None = None, +): if not (from_currency and to_currency): # manqala 19/09/2016: Should this be an empty return or should it throw and exception? return