diff --git a/frappe/api/utils.py b/frappe/api/utils.py index fcca8d43d7..e69de29bb2 100644 --- a/frappe/api/utils.py +++ b/frappe/api/utils.py @@ -1,66 +0,0 @@ -import json - -import frappe -from frappe.utils.data import sbool - - -def document_list(doctype: str): - if frappe.form_dict.get("fields"): - frappe.form_dict["fields"] = json.loads(frappe.form_dict["fields"]) - - # set limit of records for frappe.get_list - frappe.form_dict.setdefault( - "limit_page_length", - frappe.form_dict.limit or frappe.form_dict.limit_page_length or 20, - ) - - # convert strings to native types - only as_dict and debug accept bool - for param in ["as_dict", "debug"]: - param_val = frappe.form_dict.get(param) - if param_val is not None: - frappe.form_dict[param] = sbool(param_val) - - # evaluate frappe.get_list - return frappe.call(frappe.client.get_list, doctype, **frappe.form_dict) - - -def create_doc(doctype: str): - data = get_request_form_data() - data.pop("doctype", None) - return frappe.new_doc(doctype, **data).insert() - - -def update_doc(doctype: str, name: str): - data = get_request_form_data() - - doc = frappe.get_doc(doctype, name, for_update=True) - if "flags" in data: - del data["flags"] - - doc.update(data) - doc.save() - - # check for child table doctype - if doc.get("parenttype"): - frappe.get_doc(doc.parenttype, doc.parent).save() - - return doc - - -def delete_doc(doctype: str, name: str): - # TODO: child doc handling - frappe.delete_doc(doctype, name, ignore_missing=False) - frappe.response.http_status_code = 202 - return "ok" - - -def get_request_form_data(): - if frappe.form_dict.data is None: - data = frappe.safe_decode(frappe.request.get_data()) - else: - data = frappe.form_dict.data - - try: - return frappe.parse_json(data) - except ValueError: - return frappe.form_dict diff --git a/frappe/api/v1.py b/frappe/api/v1.py index 8aefd0f6f4..07aec5aee2 100644 --- a/frappe/api/v1.py +++ b/frappe/api/v1.py @@ -1,8 +1,30 @@ +import json + from werkzeug.routing import Rule import frappe from frappe import _ -from frappe.api.utils import create_doc, delete_doc, document_list, update_doc +from frappe.utils.data import sbool + + +def document_list(doctype: str): + if frappe.form_dict.get("fields"): + frappe.form_dict["fields"] = json.loads(frappe.form_dict["fields"]) + + # set limit of records for frappe.get_list + frappe.form_dict.setdefault( + "limit_page_length", + frappe.form_dict.limit or frappe.form_dict.limit_page_length or 20, + ) + + # convert strings to native types - only as_dict and debug accept bool + for param in ["as_dict", "debug"]: + param_val = frappe.form_dict.get(param) + if param_val is not None: + frappe.form_dict[param] = sbool(param_val) + + # evaluate frappe.get_list + return frappe.call(frappe.client.get_list, doctype, **frappe.form_dict) def handle_rpc_call(method: str): @@ -12,6 +34,36 @@ def handle_rpc_call(method: str): return frappe.handler.handle() +def create_doc(doctype: str): + data = get_request_form_data() + data.pop("doctype", None) + return frappe.new_doc(doctype, **data).insert() + + +def update_doc(doctype: str, name: str): + data = get_request_form_data() + + doc = frappe.get_doc(doctype, name, for_update=True) + if "flags" in data: + del data["flags"] + + doc.update(data) + doc.save() + + # check for child table doctype + if doc.get("parenttype"): + frappe.get_doc(doc.parenttype, doc.parent).save() + + return doc + + +def delete_doc(doctype: str, name: str): + # TODO: child doc handling + frappe.delete_doc(doctype, name, ignore_missing=False) + frappe.response.http_status_code = 202 + return "ok" + + def read_doc(doctype: str, name: str): # Backward compatiblity if "run_method" in frappe.form_dict: diff --git a/frappe/api/v2.py b/frappe/api/v2.py index b8dc192308..3089e139a1 100644 --- a/frappe/api/v2.py +++ b/frappe/api/v2.py @@ -1,8 +1,10 @@ +import json + from werkzeug.routing import Rule import frappe from frappe import _ -from frappe.api.utils import create_doc, delete_doc, document_list, update_doc +from frappe.utils.data import sbool def handle_rpc_call(method: str, doctype: str | None = None): @@ -27,6 +29,68 @@ def read_doc(doctype: str, name: str): return doc +def document_list(doctype: str): + if frappe.form_dict.get("fields"): + frappe.form_dict["fields"] = json.loads(frappe.form_dict["fields"]) + + # set limit of records for frappe.get_list + frappe.form_dict.setdefault( + "limit_page_length", + frappe.form_dict.limit or frappe.form_dict.limit_page_length or 20, + ) + + # convert strings to native types - only as_dict and debug accept bool + for param in ["as_dict", "debug"]: + param_val = frappe.form_dict.get(param) + if param_val is not None: + frappe.form_dict[param] = sbool(param_val) + + # evaluate frappe.get_list + return frappe.call(frappe.client.get_list, doctype, **frappe.form_dict) + + +def create_doc(doctype: str): + data = get_request_form_data() + data.pop("doctype", None) + return frappe.new_doc(doctype, **data).insert() + + +def update_doc(doctype: str, name: str): + data = get_request_form_data() + + doc = frappe.get_doc(doctype, name, for_update=True) + if "flags" in data: + del data["flags"] + + doc.update(data) + doc.save() + + # check for child table doctype + if doc.get("parenttype"): + frappe.get_doc(doc.parenttype, doc.parent).save() + + return doc + + +def delete_doc(doctype: str, name: str): + # TODO: child doc handling + frappe.delete_doc(doctype, name, ignore_missing=False) + frappe.response.http_status_code = 202 + return "ok" + + +def get_request_form_data(): + if frappe.form_dict.data is None: + data = frappe.safe_decode(frappe.request.get_data()) + else: + data = frappe.form_dict.data + + try: + return frappe.parse_json(data) + except ValueError: + return frappe.form_dict + + def execute_doc_method(doctype: str, name: str, method: str | None = None): method = method or frappe.form_dict.pop("run_method") doc = frappe.get_doc(doctype, name) @@ -45,9 +109,7 @@ url_rules = [ Rule("/method/", endpoint=handle_rpc_call), Rule("/method//", endpoint=handle_rpc_call), Rule("/resource/", methods=["GET"], endpoint=document_list), - # TODO: bulk insert with array Rule("/resource/", methods=["POST"], endpoint=create_doc), - # TODO: get_value Rule("/resource///", methods=["GET"], endpoint=read_doc), Rule("/resource///", methods=["PUT"], endpoint=update_doc), Rule("/resource///", methods=["DELETE"], endpoint=delete_doc),