From 36012487f9f1ef376e95eb293b67f5a02008e4c7 Mon Sep 17 00:00:00 2001 From: Sumit Bhanushali Date: Fri, 3 Oct 2025 15:31:53 +0530 Subject: [PATCH] fix: updated keys and link response to return full object instead of just title --- frappe/api/v1.py | 39 ++++++++++++++++++++++++++++----------- frappe/client.py | 12 +++--------- 2 files changed, 31 insertions(+), 20 deletions(-) diff --git a/frappe/api/v1.py b/frappe/api/v1.py index ef5f80e1c0..5f958be8e1 100644 --- a/frappe/api/v1.py +++ b/frappe/api/v1.py @@ -81,21 +81,38 @@ def read_doc(doctype: str, name: str): doc = frappe.get_doc(doctype, name) doc.check_permission("read") doc.apply_fieldlevel_read_permissions() + doc_dict = doc.as_dict() if frappe.form_dict.get("expand_links") and json.loads(frappe.form_dict["expand_links"]): - meta = frappe.get_meta(doctype) - link_titles = {} - link_fields = meta.get_link_fields() + meta.get_dynamic_link_fields() + get_values_for_link_and_dynamic_link_fields(doc_dict) + get_values_for_table_and_multiselect_fields(doc_dict) - if link_fields: - link_titles.update(get_title_values_for_link_and_dynamic_link_fields(doc, link_fields)) + return doc_dict - table_fields = meta.get_table_fields() - if table_fields: - link_titles.update(get_title_values_for_table_and_multiselect_fields(doc, table_fields)) - return doc.as_dict().update({"_link_titles": link_titles}) - else: - return doc.as_dict() +def get_values_for_link_and_dynamic_link_fields(doc_dict): + meta = frappe.get_meta(doc_dict.doctype) + link_fields = meta.get_link_fields() + meta.get_dynamic_link_fields() + + for field in link_fields: + if not (doc_fieldvalue := getattr(doc_dict, field.fieldname, None)): + continue + + doctype = field.options if field.fieldtype == "Link" else doc_dict.get(field.options) + + link_doc = frappe.get_doc(doctype, doc_fieldvalue) + doc_dict.update({"_expanded_" + field.fieldname: link_doc}) + + +def get_values_for_table_and_multiselect_fields(doc_dict): + meta = frappe.get_meta(doc_dict.doctype) + table_fields = meta.get_table_fields() + + for field in table_fields: + if not doc_dict.get(field.fieldname): + continue + + for value in doc_dict.get(field.fieldname): + value.update(get_values_for_link_and_dynamic_link_fields(value)) def execute_doc_method(doctype: str, name: str, method: str | None = None): diff --git a/frappe/client.py b/frappe/client.py index 090d28a21b..e6a78ab29e 100644 --- a/frappe/client.py +++ b/frappe/client.py @@ -96,18 +96,12 @@ def get_list( doctype_title_maps = {} for link_doctype, values in doctype_values.items(): - link_meta = frappe.get_meta(link_doctype) - if not link_meta.title_field or not link_meta.show_title_field_in_link: - continue - - title_field = link_meta.title_field - records = frappe.get_all( link_doctype, filters={"name": ["in", list(values)]}, - fields=["name", title_field], + fields=["*"], ) - doctype_title_maps[link_doctype] = {r["name"]: r[title_field] for r in records} + doctype_title_maps[link_doctype] = {r["name"]: r for r in records} for li in _list: for fieldname in expand: @@ -117,7 +111,7 @@ def get_list( val = li.get(fieldname) val_title = doctype_title_maps.get(link_doctype, {}).get(val) if val and val_title: - li["_" + fieldname + "_title"] = val_title + li["_expanded_" + fieldname] = val_title return _list