From bf57a1d79a85b01bd0de9b8adeba8af9ebef2967 Mon Sep 17 00:00:00 2001 From: Himanshu Date: Tue, 29 Oct 2019 15:22:38 +0530 Subject: [PATCH] Patch(Tags): Check if column exists (#8682) * fix: tags patch * fix: auto_commit_on_many_writes * fix: check if tag exists * fix: check if tag or tag link exists * fix: check if column exists * fix: set autocommit false * fix: use ignore in insert query for bulk insert * fix: add option to ignore duplicates --- frappe/database/database.py | 5 +++-- frappe/patches.txt | 1 + frappe/patches/v12_0/setup_tags.py | 19 +++++++++++-------- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/frappe/database/database.py b/frappe/database/database.py index 95096ed2d9..1e6a85236e 100644 --- a/frappe/database/database.py +++ b/frappe/database/database.py @@ -968,7 +968,7 @@ class Database(object): frappe.flags.touched_tables = set() frappe.flags.touched_tables.update(tables) - def bulk_insert(self, doctype, fields, values): + def bulk_insert(self, doctype, fields, values, ignore_duplicates=False): """ Insert multiple records at a time @@ -982,7 +982,8 @@ class Database(object): for idx, value in enumerate(values): insert_list.append(tuple(value)) if idx and (idx%10000 == 0 or idx < len(values)-1): - self.sql("""INSERT INTO `tab{doctype}` ({fields}) VALUES {values}""".format( + self.sql("""INSERT {ignore_duplicates} INTO `tab{doctype}` ({fields}) VALUES {values}""".format( + ignore_duplicates="IGNORE" if ignore_duplicates else "", doctype=doctype, fields=fields, values=", ".join(['%s'] * len(insert_list)) diff --git a/frappe/patches.txt b/frappe/patches.txt index 8321debf3a..621a2107df 100644 --- a/frappe/patches.txt +++ b/frappe/patches.txt @@ -254,3 +254,4 @@ frappe.patches.v12_0.delete_duplicate_indexes frappe.patches.v12_0.set_default_incoming_email_port frappe.patches.v12_0.update_global_search execute:frappe.reload_doc('desk', 'doctype', 'notification_settings') +frappe.patches.v12_0.setup_tags diff --git a/frappe/patches/v12_0/setup_tags.py b/frappe/patches/v12_0/setup_tags.py index cd50b0d505..d663cb2e0e 100644 --- a/frappe/patches/v12_0/setup_tags.py +++ b/frappe/patches/v12_0/setup_tags.py @@ -12,19 +12,22 @@ def execute(): time = frappe.utils.get_datetime() for doctype in frappe.get_list("DocType", filters={"istable": 0, "issingle": 0}): - for dt_tags in frappe.db.sql("select `name`, `_user_tags` from `tab{0}`".format(doctype.name), as_dict=True): - tags = dt_tags.get("_user_tags").split(",") if dt_tags.get("_user_tags") else None - if not tags: + if not frappe.db.count(doctype.name) or not frappe.db.has_column(doctype.name, "_user_tags"): + continue + + for _user_tags in frappe.db.sql("select `name`, `_user_tags` from `tab{0}`".format(doctype.name), as_dict=True): + if not _user_tags.get("_user_tags"): continue - for tag in tags: + for tag in _user_tags.get("_user_tags").split(",") if _user_tags.get("_user_tags") else []: if not tag: continue tag_list.append((tag.strip(), time, time, 'Administrator')) - tag_link_name = frappe.generate_hash(dt_tags.name + tag.strip() + doctype.name, 10), - tag_links.append((tag_link_name, doctype.name, dt_tags.name, tag.strip(), time, time, 'Administrator')) + tag_link_name = frappe.generate_hash(_user_tags.name + tag.strip() + doctype.name, 10) + tag_links.append((tag_link_name, doctype.name, _user_tags.name, tag.strip(), time, time, 'Administrator')) - frappe.db.bulk_insert("Tag", fields=["name", "creation", "modified", "modified_by"], values=set(tag_list)) - frappe.db.bulk_insert("Tag Link", fields=["name", "document_type", "document_name", "tag", "creation", "modified", "modified_by"], values=set(tag_links)) \ No newline at end of file + + frappe.db.bulk_insert("Tag", fields=["name", "creation", "modified", "modified_by"], values=set(tag_list), ignore_duplicates=True) + frappe.db.bulk_insert("Tag Link", fields=["name", "document_type", "document_name", "tag", "creation", "modified", "modified_by"], values=set(tag_links), ignore_duplicates=True)