diff --git a/erpnext/accounts/doctype/account/account.py b/erpnext/accounts/doctype/account/account.py index d8d3881daf0..64d2798623b 100644 --- a/erpnext/accounts/doctype/account/account.py +++ b/erpnext/accounts/doctype/account/account.py @@ -223,9 +223,9 @@ class DocType: throw(_("Account ") + new +_(" does not exists")) val = list(webnotes.conn.get_value("Account", new_account, - ["group_or_ledger", "debit_or_credit", "is_pl_account"])) + ["group_or_ledger", "debit_or_credit", "is_pl_account", "company"])) - if val != [self.doc.group_or_ledger, self.doc.debit_or_credit, self.doc.is_pl_account]: + if val != [self.doc.group_or_ledger, self.doc.debit_or_credit, self.doc.is_pl_account, self.doc.company]: throw(_("""Merging is only possible if following \ properties are same in both records. Group or Ledger, Debit or Credit, Is PL Account""")) diff --git a/erpnext/patches/june_2013/p07_taxes_price_list_for_territory.py b/erpnext/patches/june_2013/p07_taxes_price_list_for_territory.py index 4a224e34f00..f5d7009d160 100644 --- a/erpnext/patches/june_2013/p07_taxes_price_list_for_territory.py +++ b/erpnext/patches/june_2013/p07_taxes_price_list_for_territory.py @@ -9,7 +9,7 @@ def execute(): webnotes.reload_doc("accounts", "doctype", "sales_taxes_and_charges_master") webnotes.reload_doc("accounts", "doctype", "shipping_rule") - from erpnext.setup.utils import get_root_of + from webnotes.utils.nestedset import get_root_of root_territory = get_root_of("Territory") for parenttype in ["Sales Taxes and Charges Master", "Price List", "Shipping Rule"]: diff --git a/erpnext/setup/doctype/item_group/test_item_group.py b/erpnext/setup/doctype/item_group/test_item_group.py index 04640b7e87c..0ad846d3558 100644 --- a/erpnext/setup/doctype/item_group/test_item_group.py +++ b/erpnext/setup/doctype/item_group/test_item_group.py @@ -1,6 +1,12 @@ # Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors # License: GNU General Public License v3. See license.txt +from __future__ import unicode_literals +import unittest +import webnotes +from webnotes.utils.nestedset import NestedSetRecursionError, NestedSetMultipleRootsError, \ + rebuild_tree, get_ancestors_of + test_records = [ [{ "doctype": "Item Group", @@ -14,4 +20,199 @@ test_records = [ "parent_item_group": "All Item Groups", "is_group": "No" }], -] \ No newline at end of file + [{ + "doctype": "Item Group", + "item_group_name": "_Test Item Group A", + "parent_item_group": "All Item Groups", + "is_group": "Yes" + }], + [{ + "doctype": "Item Group", + "item_group_name": "_Test Item Group B", + "parent_item_group": "All Item Groups", + "is_group": "Yes" + }], + [{ + "doctype": "Item Group", + "item_group_name": "_Test Item Group B - 1", + "parent_item_group": "_Test Item Group B", + "is_group": "Yes" + }], + [{ + "doctype": "Item Group", + "item_group_name": "_Test Item Group B - 2", + "parent_item_group": "_Test Item Group B", + "is_group": "Yes" + }], + [{ + "doctype": "Item Group", + "item_group_name": "_Test Item Group B - 3", + "parent_item_group": "_Test Item Group B", + "is_group": "No" + }], + [{ + "doctype": "Item Group", + "item_group_name": "_Test Item Group C", + "parent_item_group": "All Item Groups", + "is_group": "Yes" + }], + [{ + "doctype": "Item Group", + "item_group_name": "_Test Item Group C - 1", + "parent_item_group": "_Test Item Group C", + "is_group": "Yes" + }], + [{ + "doctype": "Item Group", + "item_group_name": "_Test Item Group C - 2", + "parent_item_group": "_Test Item Group C", + "is_group": "Yes" + }], + [{ + "doctype": "Item Group", + "item_group_name": "_Test Item Group D", + "parent_item_group": "All Item Groups", + "is_group": "Yes" + }], +] + +class TestItem(unittest.TestCase): + def test_basic_tree(self, records=None): + min_lft = 1 + max_rgt = webnotes.conn.sql("select max(rgt) from `tabItem Group`")[0][0] + + if not records: + records = test_records[2:] + + for item_group in records: + item_group = item_group[0] + lft, rgt, parent_item_group = webnotes.conn.get_value("Item Group", item_group["item_group_name"], + ["lft", "rgt", "parent_item_group"]) + + if parent_item_group: + parent_lft, parent_rgt = webnotes.conn.get_value("Item Group", parent_item_group, + ["lft", "rgt"]) + else: + # root + parent_lft = min_lft - 1 + parent_rgt = max_rgt + 1 + + self.assertTrue(lft) + self.assertTrue(rgt) + self.assertTrue(lft < rgt) + self.assertTrue(parent_lft < parent_rgt) + self.assertTrue(lft > parent_lft) + self.assertTrue(rgt < parent_rgt) + self.assertTrue(lft >= min_lft) + self.assertTrue(rgt <= max_rgt) + + children = webnotes.conn.sql("""select count(name) from `tabItem Group` + where lft>%s and rgt<%s""", (lft, rgt))[0][0] + self.assertTrue(rgt == (lft + 1 + (2 * children))) + + def test_recursion(self): + group_b = webnotes.bean("Item Group", "_Test Item Group B") + group_b.doc.parent_item_group = "_Test Item Group B - 3" + self.assertRaises(NestedSetRecursionError, group_b.save) + + def test_rebuild_tree(self): + rebuild_tree("Item Group", "parent_item_group") + self.test_basic_tree() + + def move_it_back(self): + group_b = webnotes.bean("Item Group", "_Test Item Group B") + group_b.doc.parent_item_group = "All Item Groups" + group_b.save() + self.test_basic_tree() + + def test_move_group_into_another(self): + previous_lft_rgt = self.get_lft_rgt(get_ancestors_of("Item Group", "_Test Item Group B")) + + # put B under C + group_b = webnotes.bean("Item Group", "_Test Item Group B") + group_b.doc.parent_item_group = "_Test Item Group C" + group_b.save() + self.test_basic_tree() + + # TODO check rgt of old parent and new parent + # check_ancestors_rgt(previous_lft_rgt, "_Test Item Group C", pass) + + self.move_it_back() + + def check_ancestors_rgt(self, previous_lft_rgt, new_parent, increment): + if new_parent in previous_lft_rgt: + pass + else: + pass + + def get_lft_rgt(self, item_groups): + item_groups = webnotes.conn.sql("""select name, lft, rgt from `tabItem Group` + where name in ({})""".format(", ".join(["%s"*len(item_groups)])), tuple(item_groups), as_dict=True) + + out = {} + for item_group in item_groups: + out[item_group.name] = item_group + + return out + + def test_move_group_into_root(self): + group_b = webnotes.bean("Item Group", "_Test Item Group B") + group_b.doc.parent_item_group = "" + self.assertRaises(NestedSetMultipleRootsError, group_b.save) + + # trick! works because it hasn't been rolled back :D + self.test_basic_tree() + + # TODO check rgt of old parent and new parent + + self.move_it_back() + + def test_move_leaf_into_another_group(self): + group_b_3 = webnotes.bean("Item Group", "_Test Item Group B - 3") + group_b_3.doc.parent_item_group = "_Test Item Group C" + group_b_3.save() + self.test_basic_tree() + + # TODO check rgt of old parent and new parent + + # move it back + group_b_3 = webnotes.bean("Item Group", "_Test Item Group B - 3") + group_b_3.doc.parent_item_group = "_Test Item Group B" + group_b_3.save() + self.test_basic_tree() + + def test_delete_leaf(self): + # for checking later + parent_item_group = webnotes.conn.get_value("Item Group", "_Test Item Group B - 3", "parent_item_group") + rgt = webnotes.conn.get_value("Item Group", parent_item_group, "rgt") + + webnotes.delete_doc("Item Group", "_Test Item Group B - 3") + records_to_test = test_records[2:] + del records_to_test[4] + self.test_basic_tree(records=records_to_test) + + # TODO rgt of all ancestors should reduce by 2 + new_rgt = webnotes.conn.get_value("Item Group", parent_item_group, "rgt") + self.assertEquals(new_rgt, rgt - 2) + + # insert it back + webnotes.bean(copy=test_records[6]).insert() + self.test_basic_tree() + + def test_delete_group(self): + # TODO cannot delete group with child, but can delete leaf + pass + + def test_merge_groups(self): + pass + + def test_merge_leaves(self): + pass + + def test_merge_leaf_into_group(self): + # should raise exception + pass + + def test_merge_group_into_leaf(self): + # should raise exception + pass \ No newline at end of file diff --git a/erpnext/setup/page/setup_wizard/setup_wizard.py b/erpnext/setup/page/setup_wizard/setup_wizard.py index 47e22dfc381..52c7f5c113d 100644 --- a/erpnext/setup/page/setup_wizard/setup_wizard.py +++ b/erpnext/setup/page/setup_wizard/setup_wizard.py @@ -344,7 +344,7 @@ def add_all_roles_to(name): def create_territories(): """create two default territories, one for home country and one named Rest of the World""" - from erpnext.setup.utils import get_root_of + from webnotes.utils.nestedset import get_root_of country = webnotes.conn.get_value("Control Panel", None, "country") root_territory = get_root_of("Territory") for name in (country, "Rest Of The World"):