* fix: link between parent and child procedure (cherry picked from commit 05f24ede96a30d194db9334a55706689f63462cb) * chore: add missing filters for `Parent Procedure` (cherry picked from commit 8fbd4cea5b374ddbd611f1c0ada26d9998d82b27) * test: add test case for Quality Procedure` (cherry picked from commit 30c6b83a103b262e7bd80601076fdb78a358c068) --------- Co-authored-by: s-aga-r <sagarsharma.s312@gmail.com>
This commit is contained in:
parent
e156564ea4
commit
a065f22a4c
@ -3,10 +3,10 @@
|
|||||||
|
|
||||||
frappe.ui.form.on('Quality Procedure', {
|
frappe.ui.form.on('Quality Procedure', {
|
||||||
refresh: function(frm) {
|
refresh: function(frm) {
|
||||||
frm.set_query("procedure","processes", (frm) =>{
|
frm.set_query('procedure', 'processes', (frm) =>{
|
||||||
return {
|
return {
|
||||||
filters: {
|
filters: {
|
||||||
name: ["not in", [frm.parent_quality_procedure, frm.name]]
|
name: ['not in', [frm.parent_quality_procedure, frm.name]]
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
@ -14,7 +14,8 @@ frappe.ui.form.on('Quality Procedure', {
|
|||||||
frm.set_query('parent_quality_procedure', function(){
|
frm.set_query('parent_quality_procedure', function(){
|
||||||
return {
|
return {
|
||||||
filters: {
|
filters: {
|
||||||
is_group: 1
|
is_group: 1,
|
||||||
|
name: ['!=', frm.doc.name]
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|||||||
@ -16,16 +16,13 @@ class QualityProcedure(NestedSet):
|
|||||||
def on_update(self):
|
def on_update(self):
|
||||||
NestedSet.on_update(self)
|
NestedSet.on_update(self)
|
||||||
self.set_parent()
|
self.set_parent()
|
||||||
|
self.remove_parent_from_old_child()
|
||||||
|
self.add_child_to_parent()
|
||||||
|
self.remove_child_from_old_parent()
|
||||||
|
|
||||||
def after_insert(self):
|
def after_insert(self):
|
||||||
self.set_parent()
|
self.set_parent()
|
||||||
|
self.add_child_to_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()
|
|
||||||
|
|
||||||
def on_trash(self):
|
def on_trash(self):
|
||||||
# clear from child table (sub procedures)
|
# clear from child table (sub procedures)
|
||||||
@ -36,15 +33,6 @@ class QualityProcedure(NestedSet):
|
|||||||
)
|
)
|
||||||
NestedSet.on_trash(self, allow_root_deletion=True)
|
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):
|
def check_for_incorrect_child(self):
|
||||||
for process in self.processes:
|
for process in self.processes:
|
||||||
if process.procedure:
|
if process.procedure:
|
||||||
@ -61,6 +49,48 @@ class QualityProcedure(NestedSet):
|
|||||||
title=_("Invalid Child Procedure"),
|
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()
|
@frappe.whitelist()
|
||||||
def get_children(doctype, parent=None, parent_quality_procedure=None, is_root=False):
|
def get_children(doctype, parent=None, parent_quality_procedure=None, is_root=False):
|
||||||
|
|||||||
@ -1,56 +1,107 @@
|
|||||||
# Copyright (c) 2018, Frappe and Contributors
|
# Copyright (c) 2018, Frappe and Contributors
|
||||||
# See license.txt
|
# See license.txt
|
||||||
|
|
||||||
import unittest
|
|
||||||
|
|
||||||
import frappe
|
import frappe
|
||||||
|
from frappe.tests.utils import FrappeTestCase
|
||||||
|
|
||||||
from .quality_procedure import add_node
|
from .quality_procedure import add_node
|
||||||
|
|
||||||
|
|
||||||
class TestQualityProcedure(unittest.TestCase):
|
class TestQualityProcedure(FrappeTestCase):
|
||||||
def test_add_node(self):
|
def test_add_node(self):
|
||||||
try:
|
procedure = create_procedure(
|
||||||
procedure = frappe.get_doc(
|
{
|
||||||
dict(
|
"quality_procedure_name": "Test Procedure 1",
|
||||||
doctype="Quality Procedure",
|
"is_group": 1,
|
||||||
quality_procedure_name="Test Procedure 1",
|
"processes": [dict(process_description="Test Step 1")],
|
||||||
processes=[dict(process_description="Test Step 1")],
|
}
|
||||||
)
|
|
||||||
).insert()
|
|
||||||
|
|
||||||
frappe.local.form_dict = frappe._dict(
|
|
||||||
doctype="Quality Procedure",
|
|
||||||
quality_procedure_name="Test Child 1",
|
|
||||||
parent_quality_procedure=procedure.name,
|
|
||||||
cmd="test",
|
|
||||||
is_root="false",
|
|
||||||
)
|
|
||||||
node = add_node()
|
|
||||||
|
|
||||||
procedure.reload()
|
|
||||||
|
|
||||||
self.assertEqual(procedure.is_group, 1)
|
|
||||||
|
|
||||||
# child row created
|
|
||||||
self.assertTrue([d for d in procedure.processes if d.procedure == node.name])
|
|
||||||
|
|
||||||
node.delete()
|
|
||||||
procedure.reload()
|
|
||||||
|
|
||||||
# child unset
|
|
||||||
self.assertFalse([d for d in procedure.processes if d.name == node.name])
|
|
||||||
|
|
||||||
finally:
|
|
||||||
procedure.delete()
|
|
||||||
|
|
||||||
|
|
||||||
def create_procedure():
|
|
||||||
return frappe.get_doc(
|
|
||||||
dict(
|
|
||||||
doctype="Quality Procedure",
|
|
||||||
quality_procedure_name="Test Procedure 1",
|
|
||||||
is_group=1,
|
|
||||||
processes=[dict(process_description="Test Step 1")],
|
|
||||||
)
|
)
|
||||||
).insert()
|
|
||||||
|
frappe.local.form_dict = frappe._dict(
|
||||||
|
doctype="Quality Procedure",
|
||||||
|
quality_procedure_name="Test Child 1",
|
||||||
|
parent_quality_procedure=procedure.name,
|
||||||
|
cmd="test",
|
||||||
|
is_root="false",
|
||||||
|
)
|
||||||
|
node = add_node()
|
||||||
|
|
||||||
|
procedure.reload()
|
||||||
|
|
||||||
|
self.assertEqual(procedure.is_group, 1)
|
||||||
|
|
||||||
|
# child row created
|
||||||
|
self.assertTrue([d for d in procedure.processes if d.procedure == node.name])
|
||||||
|
|
||||||
|
node.delete()
|
||||||
|
procedure.reload()
|
||||||
|
|
||||||
|
# child unset
|
||||||
|
self.assertFalse([d for d in procedure.processes if d.name == node.name])
|
||||||
|
|
||||||
|
def test_remove_parent_from_old_child(self):
|
||||||
|
child_qp = create_procedure(
|
||||||
|
{
|
||||||
|
"quality_procedure_name": "Test Child 1",
|
||||||
|
"is_group": 0,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
group_qp = create_procedure(
|
||||||
|
{
|
||||||
|
"quality_procedure_name": "Test Group",
|
||||||
|
"is_group": 1,
|
||||||
|
"processes": [dict(procedure=child_qp.name)],
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
child_qp.reload()
|
||||||
|
self.assertEqual(child_qp.parent_quality_procedure, group_qp.name)
|
||||||
|
|
||||||
|
group_qp.reload()
|
||||||
|
del group_qp.processes[0]
|
||||||
|
group_qp.save()
|
||||||
|
|
||||||
|
child_qp.reload()
|
||||||
|
self.assertEqual(child_qp.parent_quality_procedure, None)
|
||||||
|
|
||||||
|
def remove_child_from_old_parent(self):
|
||||||
|
child_qp = create_procedure(
|
||||||
|
{
|
||||||
|
"quality_procedure_name": "Test Child 1",
|
||||||
|
"is_group": 0,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
group_qp = create_procedure(
|
||||||
|
{
|
||||||
|
"quality_procedure_name": "Test Group",
|
||||||
|
"is_group": 1,
|
||||||
|
"processes": [dict(procedure=child_qp.name)],
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
group_qp.reload()
|
||||||
|
self.assertTrue([d for d in group_qp.processes if d.procedure == child_qp.name])
|
||||||
|
|
||||||
|
child_qp.reload()
|
||||||
|
self.assertEqual(child_qp.parent_quality_procedure, group_qp.name)
|
||||||
|
|
||||||
|
child_qp.parent_quality_procedure = None
|
||||||
|
child_qp.save()
|
||||||
|
|
||||||
|
group_qp.reload()
|
||||||
|
self.assertFalse([d for d in group_qp.processes if d.procedure == child_qp.name])
|
||||||
|
|
||||||
|
|
||||||
|
def create_procedure(kwargs=None):
|
||||||
|
kwargs = frappe._dict(kwargs or {})
|
||||||
|
|
||||||
|
doc = frappe.new_doc("Quality Procedure")
|
||||||
|
doc.quality_procedure_name = kwargs.quality_procedure_name or "_Test Procedure"
|
||||||
|
doc.is_group = kwargs.is_group or 0
|
||||||
|
|
||||||
|
for process in kwargs.processes or []:
|
||||||
|
doc.append("processes", process)
|
||||||
|
|
||||||
|
doc.insert()
|
||||||
|
|
||||||
|
return doc
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user