Skip to content

Commit 3d2aee1

Browse files
committed
fix(project): handle UUID temp names and tree filters
1 parent 35d8cab commit 3d2aee1

3 files changed

Lines changed: 39 additions & 9 deletions

File tree

time_tracking/time_tracking/doctype/time_booking/time_booking.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,15 @@
2020

2121

2222
class TimeBooking(Document):
23-
def autoname(self):
24-
if self.name:
23+
def before_naming(self):
24+
if not self.name:
2525
return
26-
# Use UUID without hyphens for stable external references (e.g. imports).
27-
self.name = uuid.uuid4().hex
26+
try:
27+
uuid.UUID(str(self.name))
28+
except (TypeError, ValueError, AttributeError):
29+
# Desk creates temporary names like `new-time-booking-...`.
30+
# For UUID doctypes, these must be cleared so Frappe can assign a real UUID.
31+
self.name = None
2832

2933
def before_insert(self):
3034
self._set_booking_code()

time_tracking/time_tracking/doctype/time_tracking_project/test_time_tracking_project.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import frappe
22
from frappe.tests.utils import FrappeTestCase
33
from frappe.utils import today
4+
from uuid import UUID
45

56

67
class TestTimeTrackingProject(FrappeTestCase):
@@ -29,3 +30,17 @@ def test_project_name_duplicate_fails(self):
2930

3031
with self.assertRaises(Exception):
3132
self._make_project(child_name, parent=parent.name)
33+
34+
def test_temporary_frontend_name_is_replaced_with_uuid(self):
35+
doc = frappe.get_doc(
36+
{
37+
"doctype": "Time Tracking Project",
38+
"name": "new-time-tracking-project-gsdzaapdej",
39+
"project_name": self._unique("UI Project"),
40+
}
41+
)
42+
doc.insert(ignore_permissions=True)
43+
44+
self.assertNotEqual(doc.name, "new-time-tracking-project-gsdzaapdej")
45+
self.assertFalse(doc.name.startswith("new-time-tracking-project-"))
46+
UUID(doc.name)

time_tracking/time_tracking/doctype/time_tracking_project/time_tracking_project.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,15 @@ def _is_admin(user=None):
2929

3030

3131
class TimeTrackingProject(Document):
32-
def autoname(self):
33-
if self.name:
32+
def before_naming(self):
33+
if not self.name:
3434
return
35-
# Use UUID without hyphens for stable external references (e.g. imports).
36-
self.name = uuid.uuid4().hex
35+
try:
36+
uuid.UUID(str(self.name))
37+
except (TypeError, ValueError, AttributeError):
38+
# Desk creates temporary names like `new-time-tracking-project-...`.
39+
# For UUID doctypes, these must be cleared so Frappe can assign a real UUID.
40+
self.name = None
3741

3842
def validate(self):
3943
self._ensure_project_status()
@@ -450,7 +454,13 @@ def recalculate_all_project_metrics():
450454
@frappe.whitelist()
451455
def get_project_tree_nodes(doctype, parent="", **filters):
452456
parent_field = "parent_" + frappe.scrub(doctype)
453-
tree_filters = [[f"ifnull(`{parent_field}`,'')", "=", parent], ["docstatus", "<", 2]]
457+
tree_filters = [["docstatus", "<", 2]]
458+
or_filters = None
459+
460+
if parent:
461+
tree_filters.append([parent_field, "=", parent])
462+
else:
463+
or_filters = [[parent_field, "is", "not set"], [parent_field, "=", ""]]
454464

455465
rows = frappe.get_list(
456466
doctype,
@@ -469,6 +479,7 @@ def get_project_tree_nodes(doctype, parent="", **filters):
469479
"total_budget_amount",
470480
],
471481
filters=tree_filters,
482+
or_filters=or_filters,
472483
order_by="name",
473484
)
474485

0 commit comments

Comments
 (0)