From 4a5f8dd23dc6bab008b51dbd0ed595aabbe757f6 Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Mon, 10 May 2021 12:19:41 +0200 Subject: [PATCH 1/5] fix: ignore lft and rgt when migrating a tree doctype --- frappe/modules/import_file.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/frappe/modules/import_file.py b/frappe/modules/import_file.py index 5970eae5ca..6d589c4752 100644 --- a/frappe/modules/import_file.py +++ b/frappe/modules/import_file.py @@ -107,6 +107,10 @@ def import_doc(docdict, force=False, data_import=False, pre_process=None, doc = frappe.get_doc(docdict) + if doc.meta.is_tree: + doc.lft = None + doc.rgt = None + doc.run_method("before_import") doc.flags.ignore_version = ignore_version From cb21e9de84d766bd3e37b4c9bc5f4d88b764808e Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Mon, 10 May 2021 12:39:00 +0200 Subject: [PATCH 2/5] fix: 'Meta' object has no attribute 'is_tree' --- frappe/modules/import_file.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/modules/import_file.py b/frappe/modules/import_file.py index 6d589c4752..05c019cbd8 100644 --- a/frappe/modules/import_file.py +++ b/frappe/modules/import_file.py @@ -107,7 +107,7 @@ def import_doc(docdict, force=False, data_import=False, pre_process=None, doc = frappe.get_doc(docdict) - if doc.meta.is_tree: + if hasattr(doc.meta, 'is_tree') and getattr(doc.meta, 'is_tree'): doc.lft = None doc.rgt = None From aa06b63eb6da160175d54468cfcacdd8ab35be0d Mon Sep 17 00:00:00 2001 From: Raffael Meyer <14891507+barredterra@users.noreply.github.com> Date: Wed, 12 May 2021 20:54:06 +0200 Subject: [PATCH 3/5] refactor: getattr Co-authored-by: gavin --- frappe/modules/import_file.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/modules/import_file.py b/frappe/modules/import_file.py index 05c019cbd8..4cef95e758 100644 --- a/frappe/modules/import_file.py +++ b/frappe/modules/import_file.py @@ -107,7 +107,7 @@ def import_doc(docdict, force=False, data_import=False, pre_process=None, doc = frappe.get_doc(docdict) - if hasattr(doc.meta, 'is_tree') and getattr(doc.meta, 'is_tree'): + if getattr(doc.meta, 'is_tree', None): doc.lft = None doc.rgt = None From 52d78ab495f429f6aad6e1f9b67b41fb2ae3cdbe Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Thu, 13 May 2021 15:39:18 +0200 Subject: [PATCH 4/5] fix: don't export "lft" and "rgt" fields --- frappe/core/doctype/data_import/data_import.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/core/doctype/data_import/data_import.py b/frappe/core/doctype/data_import/data_import.py index 1c56f54303..8a95e58709 100644 --- a/frappe/core/doctype/data_import/data_import.py +++ b/frappe/core/doctype/data_import/data_import.py @@ -211,7 +211,7 @@ def export_json( doctype, path, filters=None, or_filters=None, name=None, order_by="creation asc" ): def post_process(out): - del_keys = ("modified_by", "creation", "owner", "idx") + del_keys = ("modified_by", "creation", "owner", "idx", "lft", "rgt") for doc in out: for key in del_keys: if key in doc: From 3632a322726adafc8c1cdfe08c8cb8acc2822450 Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Thu, 13 May 2021 15:59:39 +0200 Subject: [PATCH 5/5] fix: print warning and add comments --- frappe/core/doctype/data_import/data_import.py | 5 +++++ frappe/modules/import_file.py | 7 ++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/frappe/core/doctype/data_import/data_import.py b/frappe/core/doctype/data_import/data_import.py index 8a95e58709..7e8374a0a2 100644 --- a/frappe/core/doctype/data_import/data_import.py +++ b/frappe/core/doctype/data_import/data_import.py @@ -211,6 +211,11 @@ def export_json( doctype, path, filters=None, or_filters=None, name=None, order_by="creation asc" ): def post_process(out): + # Note on Tree DocTypes: + # The tree structure is maintained in the database via the fields "lft" + # and "rgt". They are automatically set and kept up-to-date. Importing + # them would destroy any existing tree structure. For this reason they + # are not exported as well. del_keys = ("modified_by", "creation", "owner", "idx", "lft", "rgt") for doc in out: for key in del_keys: diff --git a/frappe/modules/import_file.py b/frappe/modules/import_file.py index 4cef95e758..fdfd00404c 100644 --- a/frappe/modules/import_file.py +++ b/frappe/modules/import_file.py @@ -107,7 +107,12 @@ def import_doc(docdict, force=False, data_import=False, pre_process=None, doc = frappe.get_doc(docdict) - if getattr(doc.meta, 'is_tree', None): + # Note on Tree DocTypes: + # The tree structure is maintained in the database via the fields "lft" and + # "rgt". They are automatically set and kept up-to-date. Importing them + # would destroy any existing tree structure. + if getattr(doc.meta, 'is_tree', None) and any([doc.lft, doc.rgt]): + print('Ignoring values of `lft` and `rgt` for {} "{}"'.format(doc.doctype, doc.name)) doc.lft = None doc.rgt = None