From dfbcdeb8a0160557bd78b50a120f0c7db991b886 Mon Sep 17 00:00:00 2001 From: Saurabh Date: Tue, 24 May 2016 07:49:00 +0530 Subject: [PATCH] [enhancement] warehouse tree structure --- erpnext/patches.txt | 1 + .../v7_0/create_warehouse_nestedset.py | 18 ++ .../stock/doctype/warehouse/warehouse.json | 156 +++++++++++++++++- erpnext/stock/doctype/warehouse/warehouse.py | 12 +- 4 files changed, 182 insertions(+), 5 deletions(-) create mode 100644 erpnext/patches/v7_0/create_warehouse_nestedset.py diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 2493643e66..eda2c70ebb 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -273,3 +273,4 @@ execute:frappe.rename_doc("DocType", "Payments", "Sales Invoice Payment", force= erpnext.patches.v7_0.update_mins_to_first_response erpnext.patches.v6_20x.repost_valuation_rate_for_negative_inventory erpnext.patches.v7_0.re_route +erpnext.patches.v7_0.create_warehouse_nestedset diff --git a/erpnext/patches/v7_0/create_warehouse_nestedset.py b/erpnext/patches/v7_0/create_warehouse_nestedset.py new file mode 100644 index 0000000000..0d8d42e244 --- /dev/null +++ b/erpnext/patches/v7_0/create_warehouse_nestedset.py @@ -0,0 +1,18 @@ +import frappe +from frappe import _ + +def execute(): + if not frappe.db.exists("Warehouse", {"warehouse_name": _("All Warehouses")}): + parent_warehouse = frappe.get_doc({ + "doctype": "Warehouse", + "warehouse_name": _("All Warehouses"), + "is_group": "Yes" + }).insert(ignore_permissions=True) + + for warehouse in frappe.db.sql_list("""select name from tabWarehouse + where name != %s order by name asc""", "All Warehouses - SI"): + print warehouse + warehouse = frappe.get_doc("Warehouse", warehouse) + warehouse.is_group = "No" + warehouse.parent_warehouse = parent_warehouse.name + warehouse.save(ignore_permissions=True) \ No newline at end of file diff --git a/erpnext/stock/doctype/warehouse/warehouse.json b/erpnext/stock/doctype/warehouse/warehouse.json index 4e9dd07df4..6b60c635d4 100644 --- a/erpnext/stock/doctype/warehouse/warehouse.json +++ b/erpnext/stock/doctype/warehouse/warehouse.json @@ -2,6 +2,7 @@ "allow_copy": 0, "allow_import": 1, "allow_rename": 1, + "beta": 0, "creation": "2013-03-07 18:50:32", "custom": 0, "description": "A logical Warehouse against which stock entries are made.", @@ -420,6 +421,159 @@ "search_index": 0, "set_only_once": 0, "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "tree_details", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Tree Details", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "parent_warehouse", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 1, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Parent Warehouse", + "length": 0, + "no_copy": 0, + "options": "Warehouse", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 1, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "is_group", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 1, + "label": "Has Child Node", + "length": 0, + "no_copy": 0, + "options": "\nYes\nNo", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "lft", + "fieldtype": "Int", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "lft", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "rgt", + "fieldtype": "Int", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "rgt", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "old_parent", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Old Parent", + "length": 0, + "no_copy": 0, + "options": "Warehouse", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 } ], "hide_heading": 0, @@ -432,7 +586,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2016-04-18 05:44:24.837579", + "modified": "2016-05-23 21:25:21.396188", "modified_by": "Administrator", "module": "Stock", "name": "Warehouse", diff --git a/erpnext/stock/doctype/warehouse/warehouse.py b/erpnext/stock/doctype/warehouse/warehouse.py index 901b229cb8..d28a3c4a29 100644 --- a/erpnext/stock/doctype/warehouse/warehouse.py +++ b/erpnext/stock/doctype/warehouse/warehouse.py @@ -5,10 +5,11 @@ from __future__ import unicode_literals import frappe from frappe.utils import cint, validate_email_add from frappe import throw, msgprint, _ +from frappe.utils.nestedset import NestedSet -from frappe.model.document import Document - -class Warehouse(Document): +class Warehouse(NestedSet): + nsm_parent_field = 'parent_warehouse' + def autoname(self): suffix = " - " + frappe.db.get_value("Company", self.company, "abbr") if not self.warehouse_name.endswith(suffix): @@ -45,6 +46,7 @@ class Warehouse(Document): def on_update(self): self.create_account_head() + self.update_nsm_model() def create_account_head(self): if cint(frappe.defaults.get_global_default("auto_accounting_for_stock")): @@ -81,7 +83,9 @@ class Warehouse(Document): elif frappe.db.get_value("Account", self.create_account_under, "company") != self.company: frappe.throw(_("Warehouse {0}: Parent account {1} does not bolong to the company {2}") .format(self.name, self.create_account_under, self.company)) - + + def update_nsm_model(self): + frappe.utils.nestedset.update_nsm(self) def on_trash(self): # delete bin