73 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # Copyright (c) 2019, Frappe and Contributors
 | |
| # License: GNU General Public License v3. See license.txt
 | |
| 
 | |
| 
 | |
| import frappe
 | |
| from frappe.utils import getdate
 | |
| 
 | |
| 
 | |
| def execute():
 | |
| 	frappe.reload_doc("setup", "doctype", "transaction_deletion_record")
 | |
| 
 | |
| 	if has_deleted_company_transactions():
 | |
| 		child_doctypes = get_child_doctypes_whose_parent_doctypes_were_affected()
 | |
| 
 | |
| 		for doctype in child_doctypes:
 | |
| 			docs = frappe.get_all(doctype, fields=["name", "parent", "parenttype", "creation"])
 | |
| 
 | |
| 			for doc in docs:
 | |
| 				if not frappe.db.exists(doc["parenttype"], doc["parent"]):
 | |
| 					frappe.db.delete(doctype, {"name": doc["name"]})
 | |
| 
 | |
| 				elif check_for_new_doc_with_same_name_as_deleted_parent(doc):
 | |
| 					frappe.db.delete(doctype, {"name": doc["name"]})
 | |
| 
 | |
| 
 | |
| def has_deleted_company_transactions():
 | |
| 	return frappe.get_all("Transaction Deletion Record")
 | |
| 
 | |
| 
 | |
| def get_child_doctypes_whose_parent_doctypes_were_affected():
 | |
| 	parent_doctypes = get_affected_doctypes()
 | |
| 	child_doctypes = frappe.get_all(
 | |
| 		"DocField", filters={"fieldtype": "Table", "parent": ["in", parent_doctypes]}, pluck="options"
 | |
| 	)
 | |
| 
 | |
| 	return child_doctypes
 | |
| 
 | |
| 
 | |
| def get_affected_doctypes():
 | |
| 	affected_doctypes = []
 | |
| 	tdr_docs = frappe.get_all("Transaction Deletion Record", pluck="name")
 | |
| 
 | |
| 	for tdr in tdr_docs:
 | |
| 		tdr_doc = frappe.get_doc("Transaction Deletion Record", tdr)
 | |
| 
 | |
| 		for doctype in tdr_doc.doctypes:
 | |
| 			if is_not_child_table(doctype.doctype_name):
 | |
| 				affected_doctypes.append(doctype.doctype_name)
 | |
| 
 | |
| 	affected_doctypes = remove_duplicate_items(affected_doctypes)
 | |
| 	return affected_doctypes
 | |
| 
 | |
| 
 | |
| def is_not_child_table(doctype):
 | |
| 	return not bool(frappe.get_value("DocType", doctype, "istable"))
 | |
| 
 | |
| 
 | |
| def remove_duplicate_items(affected_doctypes):
 | |
| 	return list(set(affected_doctypes))
 | |
| 
 | |
| 
 | |
| def check_for_new_doc_with_same_name_as_deleted_parent(doc):
 | |
| 	"""
 | |
| 	Compares creation times of parent and child docs.
 | |
| 	Since Transaction Deletion Record resets the naming series after deletion,
 | |
| 	it allows the creation of new docs with the same names as the deleted ones.
 | |
| 	"""
 | |
| 
 | |
| 	parent_creation_time = frappe.db.get_value(doc["parenttype"], doc["parent"], "creation")
 | |
| 	child_creation_time = doc["creation"]
 | |
| 
 | |
| 	return getdate(parent_creation_time) > getdate(child_creation_time)
 |