refactor: parse native JSON request args in selling/doctype/sales_order/mapper.py

Use frappe.parse_json instead of json.loads so the whitelisted endpoints
accept native JSON types (list/dict/bool) in addition to JSON strings.
This commit is contained in:
Mihir Kandoi
2026-06-24 20:37:34 +05:30
parent bf30b58d02
commit 517f97ff73

View File

@@ -430,8 +430,7 @@ def make_sales_invoice(
): ):
if args is None: if args is None:
args = {} args = {}
if isinstance(args, str): args = frappe.parse_json(args)
args = json.loads(args)
# 0 qty is accepted, as the qty is uncertain for some items # 0 qty is accepted, as the qty is uncertain for some items
has_unit_price_items = frappe.db.get_value("Sales Order", source_name, "has_unit_price_items") has_unit_price_items = frappe.db.get_value("Sales Order", source_name, "has_unit_price_items")
@@ -675,8 +674,7 @@ def make_purchase_order(
if not selected_items: if not selected_items:
return return
if isinstance(selected_items, str): selected_items = frappe.parse_json(selected_items)
selected_items = json.loads(selected_items)
def set_missing_values(source, target): def set_missing_values(source, target):
target.supplier = supplier target.supplier = supplier
@@ -843,9 +841,9 @@ def set_delivery_date(items: list, sales_order: str) -> None:
@frappe.whitelist() @frappe.whitelist()
def make_work_orders(items: str, sales_order: str, company: str, project: str | None = None): def make_work_orders(items: str | dict, sales_order: str, company: str, project: str | None = None):
"""Make Work Orders against the given Sales Order for the given `items`""" """Make Work Orders against the given Sales Order for the given `items`"""
items = json.loads(items).get("items") items = frappe.parse_json(items).get("items")
out = [] out = []
for i in items: for i in items:
@@ -912,8 +910,7 @@ def make_raw_material_request(
if not frappe.has_permission("Sales Order", "write"): if not frappe.has_permission("Sales Order", "write"):
frappe.throw(_("Not permitted"), frappe.PermissionError) frappe.throw(_("Not permitted"), frappe.PermissionError)
if isinstance(items, str): items = frappe._dict(frappe.parse_json(items))
items = frappe._dict(json.loads(items))
for item in items.get("items"): for item in items.get("items"):
item["include_exploded_items"] = items.get("include_exploded_items") item["include_exploded_items"] = items.get("include_exploded_items")
@@ -1089,7 +1086,7 @@ def get_mapped_subcontracting_inward_order(
target_doc.populate_items_table() target_doc.populate_items_table()
if target_doc and isinstance(target_doc, str): if target_doc and isinstance(target_doc, str):
target_doc = json.loads(target_doc) target_doc = frappe.parse_json(target_doc)
for key in ["service_items", "items", "received_items"]: for key in ["service_items", "items", "received_items"]:
if key in target_doc: if key in target_doc:
del target_doc[key] del target_doc[key]