Exemplo n.º 1
0
def delete_doc(doctype=None, name=None, force=0, ignore_doctypes=None, for_reload=False,
	ignore_permissions=False, flags=None, ignore_on_trash=False):
	"""
		Deletes a doc(dt, dn) and validates if it is not submitted and not linked in a live record
	"""
	if not ignore_doctypes: ignore_doctypes = []

	# get from form
	if not doctype:
		doctype = frappe.form_dict.get('dt')
		name = frappe.form_dict.get('dn')

	names = name
	if isinstance(name, basestring):
		names = [name]

	for name in names or []:

		# already deleted..?
		if not frappe.db.exists(doctype, name):
			return

		# delete attachments
		remove_all(doctype, name)

		# delete passwords
		delete_all_passwords_for(doctype, name)

		doc = None
		if doctype=="DocType":
			if for_reload:

				try:
					doc = frappe.get_doc(doctype, name)
				except frappe.DoesNotExistError:
					pass
				else:
					doc.run_method("before_reload")

			else:
				doc = frappe.get_doc(doctype, name)

				update_flags(doc, flags, ignore_permissions)
				check_permission_and_not_submitted(doc)

				frappe.db.sql("delete from `tabCustom Field` where dt = %s", name)
				frappe.db.sql("delete from `tabCustom Script` where dt = %s", name)
				frappe.db.sql("delete from `tabProperty Setter` where doc_type = %s", name)
				frappe.db.sql("delete from `tabReport` where ref_doctype=%s", name)

			delete_from_table(doctype, name, ignore_doctypes, None)

		else:
			doc = frappe.get_doc(doctype, name)

			if not for_reload:
				update_flags(doc, flags, ignore_permissions)
				check_permission_and_not_submitted(doc)

				if not ignore_on_trash:
					doc.run_method("on_trash")
					doc.run_method('on_change')

				dynamic_linked_doctypes = [df.parent for df in get_dynamic_link_map().get(doc.doctype, [])]
				if "ToDo" in dynamic_linked_doctypes:
					delete_linked_todos(doc)

				if "Communication" in dynamic_linked_doctypes:
					delete_linked_communications(doc)

				if "DocShare" in dynamic_linked_doctypes:
					delete_shared(doc)

				if "Email Unsubscribe" in dynamic_linked_doctypes:
					delete_email_subscribe(doc)

				# check if links exist
				if not force:
					check_if_doc_is_linked(doc)
					check_if_doc_is_dynamically_linked(doc)

			update_naming_series(doc)
			delete_from_table(doctype, name, ignore_doctypes, doc)
			doc.run_method("after_delete")

		if doc and not frappe.flags.in_patch:
			try:
				doc.notify_update()
				insert_feed(doc)
			except ImportError:
				pass

		# delete user_permissions
		frappe.defaults.clear_default(parenttype="User Permission", key=doctype, value=name)
Exemplo n.º 2
0
def delete_doc(doctype=None,
               name=None,
               force=0,
               ignore_doctypes=None,
               for_reload=False,
               ignore_permissions=False,
               flags=None,
               ignore_on_trash=False,
               ignore_missing=True):
    """
		Deletes a doc(dt, dn) and validates if it is not submitted and not linked in a live record
	"""
    if not ignore_doctypes: ignore_doctypes = []

    # get from form
    if not doctype:
        doctype = frappe.form_dict.get('dt')
        name = frappe.form_dict.get('dn')

    names = name
    if isinstance(name, string_types) or isinstance(name, integer_types):
        names = [name]

    for name in names or []:

        # already deleted..?
        if not frappe.db.exists(doctype, name):
            if not ignore_missing:
                raise frappe.DoesNotExistError
            else:
                return False

        # delete passwords
        delete_all_passwords_for(doctype, name)

        doc = None
        if doctype == "DocType":
            if for_reload:

                try:
                    doc = frappe.get_doc(doctype, name)
                except frappe.DoesNotExistError:
                    pass
                else:
                    doc.run_method("before_reload")

            else:
                doc = frappe.get_doc(doctype, name)

                update_flags(doc, flags, ignore_permissions)
                check_permission_and_not_submitted(doc)

                frappe.db.sql("delete from `tabCustom Field` where dt = %s",
                              name)
                frappe.db.sql("delete from `tabCustom Script` where dt = %s",
                              name)
                frappe.db.sql(
                    "delete from `tabProperty Setter` where doc_type = %s",
                    name)
                frappe.db.sql("delete from `tabReport` where ref_doctype=%s",
                              name)
                frappe.db.sql(
                    "delete from `tabCustom DocPerm` where parent=%s", name)
                frappe.db.sql("delete from `__global_search` where doctype=%s",
                              name)

            delete_from_table(doctype, name, ignore_doctypes, None)

            if not (for_reload or frappe.flags.in_migrate
                    or frappe.flags.in_install or frappe.flags.in_test):
                try:
                    delete_controllers(name, doc.module)
                except (FileNotFoundError, OSError):
                    # in case a doctype doesnt have any controller code
                    pass

        else:
            doc = frappe.get_doc(doctype, name)

            if not for_reload:
                update_flags(doc, flags, ignore_permissions)
                check_permission_and_not_submitted(doc)

                if not ignore_on_trash:
                    doc.run_method("on_trash")
                    doc.flags.in_delete = True
                    doc.run_method('on_change')

                # check if links exist
                if not force:
                    check_if_doc_is_linked(doc)
                    check_if_doc_is_dynamically_linked(doc)

            update_naming_series(doc)
            delete_from_table(doctype, name, ignore_doctypes, doc)
            doc.run_method("after_delete")

            # delete attachments
            remove_all(doctype, name, from_delete=True)

            if not for_reload:
                # Enqueued at the end, because it gets committed
                # All the linked docs should be checked beforehand
                frappe.enqueue(
                    'frappe.model.delete_doc.delete_dynamic_links',
                    doctype=doc.doctype,
                    name=doc.name,
                    is_async=False if frappe.flags.in_test else True)

        # delete global search entry
        delete_for_document(doc)
        # delete tag link entry
        delete_tags_for_document(doc)

        if doc and not for_reload:
            add_to_deleted_document(doc)
            if not frappe.flags.in_patch:
                try:
                    doc.notify_update()
                    insert_feed(doc)
                except ImportError:
                    pass

            # delete user_permissions
            frappe.defaults.clear_default(parenttype="User Permission",
                                          key=doctype,
                                          value=name)
Exemplo n.º 3
0
def delete_doc(doctype=None, name=None, force=0, ignore_doctypes=None, for_reload=False,
	ignore_permissions=False, flags=None, ignore_on_trash=False, ignore_missing=True):
	"""
		Deletes a doc(dt, dn) and validates if it is not submitted and not linked in a live record
	"""
	if not ignore_doctypes: ignore_doctypes = []

	# get from form
	if not doctype:
		doctype = frappe.form_dict.get('dt')
		name = frappe.form_dict.get('dn')

	names = name
	if isinstance(name, string_types):
		names = [name]

	for name in names or []:

		# already deleted..?
		if not frappe.db.exists(doctype, name):
			if not ignore_missing:
				raise frappe.DoesNotExistError
			else:
				return False

		# delete passwords
		delete_all_passwords_for(doctype, name)

		doc = None
		if doctype=="DocType":
			if for_reload:

				try:
					doc = frappe.get_doc(doctype, name)
				except frappe.DoesNotExistError:
					pass
				else:
					doc.run_method("before_reload")

			else:
				doc = frappe.get_doc(doctype, name)

				update_flags(doc, flags, ignore_permissions)
				check_permission_and_not_submitted(doc)

				frappe.db.sql("delete from `tabCustom Field` where dt = %s", name)
				frappe.db.sql("delete from `tabCustom Script` where dt = %s", name)
				frappe.db.sql("delete from `tabProperty Setter` where doc_type = %s", name)
				frappe.db.sql("delete from `tabReport` where ref_doctype=%s", name)
				frappe.db.sql("delete from `tabCustom DocPerm` where parent=%s", name)

			delete_from_table(doctype, name, ignore_doctypes, None)

		else:
			doc = frappe.get_doc(doctype, name)

			if not for_reload:
				update_flags(doc, flags, ignore_permissions)
				check_permission_and_not_submitted(doc)

				if not ignore_on_trash:
					doc.run_method("on_trash")
					doc.flags.in_delete = True
					doc.run_method('on_change')

				frappe.enqueue('frappe.model.delete_doc.delete_dynamic_links', doctype=doc.doctype, name=doc.name,
					async=False if frappe.flags.in_test else True)

				# check if links exist
				if not force:
					check_if_doc_is_linked(doc)
					check_if_doc_is_dynamically_linked(doc)

			update_naming_series(doc)
			delete_from_table(doctype, name, ignore_doctypes, doc)
			doc.run_method("after_delete")

			# delete attachments
			remove_all(doctype, name, from_delete=True)

		# delete global search entry
		delete_for_document(doc)

		if doc and not for_reload:
			add_to_deleted_document(doc)
			if not frappe.flags.in_patch:
				try:
					doc.notify_update()
					insert_feed(doc)
				except ImportError:
					pass

			# delete user_permissions
			frappe.defaults.clear_default(parenttype="User Permission", key=doctype, value=name)