70 lines
2.4 KiB
Python
70 lines
2.4 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)
|