From 5b6f05442e921ab1f5c2de188339a9f16efaa579 Mon Sep 17 00:00:00 2001
From: barredterra <14891507+barredterra@users.noreply.github.com>
Date: Thu, 1 Feb 2024 18:15:46 +0100
Subject: [PATCH 1/4] fix: translate label in link to form
When a single doctype is passed to `get_link_to_form`, use the translated doctype as the label.
---
frappe/utils/data.py | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/frappe/utils/data.py b/frappe/utils/data.py
index c1026b7807..b02126d463 100644
--- a/frappe/utils/data.py
+++ b/frappe/utils/data.py
@@ -1842,8 +1842,10 @@ def get_link_to_form(doctype: str, name: str, label: str | None = None) -> str:
e.g. get_link_to_form("Sales Invoice", "INV-0001", "Link Label") returns:
'Link Label'.
"""
+ from frappe import _
+
if not label:
- label = name
+ label = _(doctype) if doctype == name else name
return f"""{label}"""
From 9e851aa0cccf6a8f2738bc586a94b764249fe15e Mon Sep 17 00:00:00 2001
From: barredterra <14891507+barredterra@users.noreply.github.com>
Date: Thu, 1 Feb 2024 18:16:05 +0100
Subject: [PATCH 2/4] fix: allow name to be missing
for single doctypes
---
frappe/utils/data.py | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/frappe/utils/data.py b/frappe/utils/data.py
index b02126d463..9d9e0e345f 100644
--- a/frappe/utils/data.py
+++ b/frappe/utils/data.py
@@ -1836,7 +1836,7 @@ def get_host_name() -> str:
return get_url().rsplit("//", 1)[-1]
-def get_link_to_form(doctype: str, name: str, label: str | None = None) -> str:
+def get_link_to_form(doctype: str, name: str | None = None, label: str | None = None) -> str:
"""Return the HTML link to the given document's form view.
e.g. get_link_to_form("Sales Invoice", "INV-0001", "Link Label") returns:
@@ -1844,6 +1844,9 @@ def get_link_to_form(doctype: str, name: str, label: str | None = None) -> str:
"""
from frappe import _
+ if not name:
+ name = doctype
+
if not label:
label = _(doctype) if doctype == name else name
From c282103867c0c75c67a6d5276336faea17d5a6bf Mon Sep 17 00:00:00 2001
From: barredterra <14891507+barredterra@users.noreply.github.com>
Date: Tue, 6 Feb 2024 12:49:31 +0100
Subject: [PATCH 3/4] fix: make get_url_to_form accept single doctype
---
frappe/utils/data.py | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
diff --git a/frappe/utils/data.py b/frappe/utils/data.py
index 9d9e0e345f..3b9270c8cc 100644
--- a/frappe/utils/data.py
+++ b/frappe/utils/data.py
@@ -1844,11 +1844,8 @@ def get_link_to_form(doctype: str, name: str | None = None, label: str | None =
"""
from frappe import _
- if not name:
- name = doctype
-
if not label:
- label = _(doctype) if doctype == name else name
+ label = name or _(doctype)
return f"""{label}"""
@@ -1895,13 +1892,18 @@ def get_absolute_url(doctype: str, name: str) -> str:
return f"/app/{quoted(slug(doctype))}/{quoted(name)}"
-def get_url_to_form(doctype: str, name: str) -> str:
+def get_url_to_form(doctype: str, name: str | None = None) -> str:
"""Return the absolute URL for the form view of the given document in the desk.
e.g. when doctype="Sales Invoice" and your site URL is "https://frappe.io",
returns 'https://frappe.io/app/sales-invoice/INV-00001'
"""
- return get_url(uri=f"/app/{quoted(slug(doctype))}/{quoted(name)}")
+ if not name:
+ uri = f"/app/{quoted(slug(doctype))}"
+ else:
+ uri = f"/app/{quoted(slug(doctype))}/{quoted(name)}"
+
+ return get_url(uri=uri)
def get_url_to_list(doctype: str) -> str:
From 0184aa78233c16fec3ec1dba290a1afa7f5d12e4 Mon Sep 17 00:00:00 2001
From: barredterra <14891507+barredterra@users.noreply.github.com>
Date: Tue, 6 Feb 2024 12:50:01 +0100
Subject: [PATCH 4/4] test: get_url_to_form
---
frappe/tests/test_utils.py | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/frappe/tests/test_utils.py b/frappe/tests/test_utils.py
index c32dddd3b4..4c10f19bba 100644
--- a/frappe/tests/test_utils.py
+++ b/frappe/tests/test_utils.py
@@ -59,6 +59,7 @@ from frappe.utils.data import (
get_time,
get_timedelta,
get_timespan_date_range,
+ get_url_to_form,
get_year_ending,
getdate,
now_datetime,
@@ -982,6 +983,10 @@ class TestMiscUtils(FrappeTestCase):
self.assertIn("frappe", installed_apps)
self.assertGreaterEqual(len(info["users"]), 1)
+ def test_get_url_to_form(self):
+ self.assertTrue(get_url_to_form("System Settings").endswith("/app/system-settings"))
+ self.assertTrue(get_url_to_form("User", "Test User").endswith("/app/user/Test%20User"))
+
def test_safe_json_load(self):
self.assertEqual(safe_json_loads("{}"), {})
self.assertEqual(safe_json_loads("{ /}"), "{ /}")