From a354ee00705f0223e4231719ed0f896eb45ef08d Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Tue, 1 Jul 2014 18:00:35 +0530 Subject: [PATCH 1/4] fix for todo delete and tags --- frappe/core/doctype/todo/todo.py | 4 ++++ frappe/widgets/tags.py | 26 +++++++++++++------------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/frappe/core/doctype/todo/todo.py b/frappe/core/doctype/todo/todo.py index 650903b619..8128031128 100644 --- a/frappe/core/doctype/todo/todo.py +++ b/frappe/core/doctype/todo/todo.py @@ -31,6 +31,10 @@ class ToDo(Document): description = self.description) }).insert(ignore_permissions=True) + def on_trash(self): + # remove dynamic links + self.db_set("reference_type", None) + self.db_set("reference_name", None) # NOTE: todo is viewable if either owner or assigned_to or System Manager in roles diff --git a/frappe/widgets/tags.py b/frappe/widgets/tags.py index 7b0d438d26..1906eb0f82 100644 --- a/frappe/widgets/tags.py +++ b/frappe/widgets/tags.py @@ -1,5 +1,5 @@ # Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors -# MIT License. See license.txt +# MIT License. See license.txt from __future__ import unicode_literals """ @@ -33,17 +33,17 @@ def check_user_tags(dt): except Exception, e: if e.args[0] == 1054: DocTags(dt).setup() - + @frappe.whitelist() def add_tag(): "adds a new tag to a record, and creates the Tag master" - + f = frappe.local.form_dict tag, color = f.get('tag'), f.get('color') dt, dn = f.get('dt'), f.get('dn') - + DocTags(dt).add(dn, tag) - + return tag @frappe.whitelist() @@ -51,23 +51,23 @@ def remove_tag(): "removes tag from the record" f = frappe.local.form_dict tag, dt, dn = f.get('tag'), f.get('dt'), f.get('dn') - + DocTags(dt).remove(dn, tag) - + class DocTags: """Tags for a particular doctype""" def __init__(self, dt): self.dt = dt - + def get_tag_fields(self): """returns tag_fields property""" return frappe.db.get_value('DocType', self.dt, 'tag_fields') - + def get_tags(self, dn): """returns tag for a particular item""" - return frappe.db.get_value(self.dt, dn, '_user_tags', ignore=1) or '' + return (frappe.db.get_value(self.dt, dn, '_user_tags', ignore=1) or '').strip() def add(self, dn, tag): """add a new user tag""" @@ -97,15 +97,15 @@ class DocTags: frappe.db.sql("update `tab%s` set _user_tags=%s where name=%s" % \ (self.dt,'%s','%s'), (tags , dn)) except Exception, e: - if e.args[0]==1054: + if e.args[0]==1054: if not tags: # no tags, nothing to do return - + self.setup() self.update(dn, tl) else: raise - + def setup(self): """adds the _user_tags column if not exists""" from frappe.model.db_schema import add_column From b0f0bab7fac1b45141c29d26baeeeb2995635265 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Tue, 1 Jul 2014 18:28:22 +0530 Subject: [PATCH 2/4] fix todo --- frappe/core/doctype/todo/todo.py | 5 --- frappe/model/delete_doc.py | 73 ++++++++++++++++++-------------- 2 files changed, 41 insertions(+), 37 deletions(-) diff --git a/frappe/core/doctype/todo/todo.py b/frappe/core/doctype/todo/todo.py index 8128031128..4d232546e9 100644 --- a/frappe/core/doctype/todo/todo.py +++ b/frappe/core/doctype/todo/todo.py @@ -31,11 +31,6 @@ class ToDo(Document): description = self.description) }).insert(ignore_permissions=True) - def on_trash(self): - # remove dynamic links - self.db_set("reference_type", None) - self.db_set("reference_name", None) - # NOTE: todo is viewable if either owner or assigned_to or System Manager in roles def get_permission_query_conditions(user): diff --git a/frappe/model/delete_doc.py b/frappe/model/delete_doc.py index 86214cb3fb..d4a6ba7132 100644 --- a/frappe/model/delete_doc.py +++ b/frappe/model/delete_doc.py @@ -21,49 +21,54 @@ def delete_doc(doctype=None, name=None, force=0, ignore_doctypes=None, for_reloa doctype = frappe.form_dict.get('dt') name = frappe.form_dict.get('dn') - if not doctype: - frappe.msgprint(_('Nothing to delete'), raise_exception =1) + names = name + if isinstance(name, basestring): + names = [name] - # already deleted..? - if not frappe.db.exists(doctype, name): - return + for name in names: - # delete attachments - remove_all(doctype, name) + # already deleted..? + if not frappe.db.exists(doctype, name): + return - if doctype=="DocType": - if for_reload: + # delete attachments + remove_all(doctype, name) + + if doctype=="DocType": + if for_reload: + + try: + doc = frappe.get_doc(doctype, name) + except frappe.DoesNotExistError: + pass + else: + doc.run_method("before_reload") - try: - doc = frappe.get_doc(doctype, name) - except frappe.DoesNotExistError: - pass else: - doc.run_method("before_reload") + 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: - 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) + doc = frappe.get_doc(doctype, name) - delete_from_table(doctype, name, ignore_doctypes, None) + if not for_reload: + check_permission_and_not_submitted(doc, ignore_permissions) + doc.run_method("on_trash") - else: - doc = frappe.get_doc(doctype, name) + delete_linked_todos(doc) + # check if links exist + if not force: + check_if_doc_is_linked(doc) + check_if_doc_is_dynamically_linked(doc) - if not for_reload: - check_permission_and_not_submitted(doc, ignore_permissions) - doc.run_method("on_trash") - # check if links exist - if not force: - check_if_doc_is_linked(doc) - check_if_doc_is_dynamically_linked(doc) + delete_from_table(doctype, name, ignore_doctypes, doc) - delete_from_table(doctype, name, ignore_doctypes, doc) - - # delete user_permissions - frappe.defaults.clear_default(parenttype="User Permission", key=doctype, value=name) + # delete user_permissions + frappe.defaults.clear_default(parenttype="User Permission", key=doctype, value=name) return 'okay' @@ -135,3 +140,7 @@ def check_if_doc_is_dynamically_linked(doc): {options}=%s and {fieldname}=%s""".format(**df), (doc.doctype, doc.name)): frappe.throw(_("Cannot delete or cancel because {0} {1} is linked with {2} {3}").format(doc.doctype, doc.name, df.parent, name), frappe.LinkExistsError) + +def delete_linked_todos(doc): + delete_doc("ToDo", frappe.db.sql_list("""select name from `tabToDo` + where reference_type=%s and reference_name=%s""", (doc.doctype, doc.name))) From 9f8e313c9ba70fbbb67fe59820fbad8515cae8e5 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Tue, 1 Jul 2014 18:37:54 +0530 Subject: [PATCH 3/4] fix delete_doc --- frappe/__init__.py | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/frappe/__init__.py b/frappe/__init__.py index 4235605026..a83bd48042 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -347,15 +347,7 @@ def get_meta(doctype, cached=True): def delete_doc(doctype=None, name=None, force=0, ignore_doctypes=None, for_reload=False, ignore_permissions=False): import frappe.model.delete_doc - - if not ignore_doctypes: - ignore_doctypes = [] - - if isinstance(name, list): - for n in name: - frappe.model.delete_doc.delete_doc(doctype, n, force, ignore_doctypes, for_reload, ignore_permissions) - else: - frappe.model.delete_doc.delete_doc(doctype, name, force, ignore_doctypes, for_reload, ignore_permissions) + frappe.model.delete_doc.delete_doc(doctype, name, force, ignore_doctypes, for_reload, ignore_permissions) def delete_doc_if_exists(doctype, name): if db.exists(doctype, name): From dc52a9becd9137b0ee6a836ede23f8d981fb84ef Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Tue, 1 Jul 2014 18:40:42 +0530 Subject: [PATCH 4/4] delete_doc None fix --- frappe/model/delete_doc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/model/delete_doc.py b/frappe/model/delete_doc.py index d4a6ba7132..ebdfceb3f5 100644 --- a/frappe/model/delete_doc.py +++ b/frappe/model/delete_doc.py @@ -25,7 +25,7 @@ def delete_doc(doctype=None, name=None, force=0, ignore_doctypes=None, for_reloa if isinstance(name, basestring): names = [name] - for name in names: + for name in names or []: # already deleted..? if not frappe.db.exists(doctype, name):