fix: link between parent and child procedure

This commit is contained in:
s-aga-r 2023-11-04 11:23:15 +05:30
parent d4c0dbfacc
commit 05f24ede96

View File

@ -16,16 +16,13 @@ class QualityProcedure(NestedSet):
def on_update(self):
NestedSet.on_update(self)
self.set_parent()
self.remove_parent_from_old_child()
self.add_child_to_parent()
self.remove_child_from_old_parent()
def after_insert(self):
self.set_parent()
# add child to parent if missing
if self.parent_quality_procedure:
parent = frappe.get_doc("Quality Procedure", self.parent_quality_procedure)
if not [d for d in parent.processes if d.procedure == self.name]:
parent.append("processes", {"procedure": self.name, "process_description": self.name})
parent.save()
self.add_child_to_parent()
def on_trash(self):
# clear from child table (sub procedures)
@ -36,15 +33,6 @@ class QualityProcedure(NestedSet):
)
NestedSet.on_trash(self, allow_root_deletion=True)
def set_parent(self):
for process in self.processes:
# Set parent for only those children who don't have a parent
has_parent = frappe.db.get_value(
"Quality Procedure", process.procedure, "parent_quality_procedure"
)
if not has_parent and process.procedure:
frappe.db.set_value(self.doctype, process.procedure, "parent_quality_procedure", self.name)
def check_for_incorrect_child(self):
for process in self.processes:
if process.procedure:
@ -61,6 +49,48 @@ class QualityProcedure(NestedSet):
title=_("Invalid Child Procedure"),
)
def set_parent(self):
"""Set `Parent Procedure` in `Child Procedures`"""
for process in self.processes:
if process.procedure:
if not frappe.db.get_value("Quality Procedure", process.procedure, "parent_quality_procedure"):
frappe.db.set_value(
"Quality Procedure", process.procedure, "parent_quality_procedure", self.name
)
def remove_parent_from_old_child(self):
"""Remove `Parent Procedure` from `Old Child Procedures`"""
if old_doc := self.get_doc_before_save():
if old_child_procedures := set([d.procedure for d in old_doc.processes if d.procedure]):
current_child_procedures = set([d.procedure for d in self.processes if d.procedure])
if removed_child_procedures := list(old_child_procedures.difference(current_child_procedures)):
for child_procedure in removed_child_procedures:
frappe.db.set_value("Quality Procedure", child_procedure, "parent_quality_procedure", None)
def add_child_to_parent(self):
"""Add `Child Procedure` to `Parent Procedure`"""
if self.parent_quality_procedure:
parent = frappe.get_doc("Quality Procedure", self.parent_quality_procedure)
if not [d for d in parent.processes if d.procedure == self.name]:
parent.append("processes", {"procedure": self.name, "process_description": self.name})
parent.save()
def remove_child_from_old_parent(self):
"""Remove `Child Procedure` from `Old Parent Procedure`"""
if old_doc := self.get_doc_before_save():
if old_parent := old_doc.parent_quality_procedure:
if self.parent_quality_procedure != old_parent:
parent = frappe.get_doc("Quality Procedure", old_parent)
for process in parent.processes:
if process.procedure == self.name:
parent.remove(process)
parent.save()
@frappe.whitelist()
def get_children(doctype, parent=None, parent_quality_procedure=None, is_root=False):