Merge branch 'develop' of github.com:frappe/erpnext into develop
diff --git a/erpnext/config/accounts.py b/erpnext/config/accounts.py
index 7d56122..c435efb 100644
--- a/erpnext/config/accounts.py
+++ b/erpnext/config/accounts.py
@@ -30,6 +30,15 @@
 				"name": "Supplier",
 				"description": _("Supplier database.")
 			},
+			{
+				"type": "page",
+				"name": "Accounts Browser",
+				"icon": "icon-sitemap",
+				"label": _("Chart of Accounts"),
+				"route": "Accounts Browser/Account",
+				"description": _("Tree of finanial accounts."),
+				"doctype": "Account",
+			},
 		]
 	},
 	{
diff --git a/erpnext/home/doctype/feed/feed.json b/erpnext/home/doctype/feed/feed.json
index 755b8b8..1513661 100644
--- a/erpnext/home/doctype/feed/feed.json
+++ b/erpnext/home/doctype/feed/feed.json
@@ -1,61 +1,71 @@
 {
- "autoname": "hash",
- "creation": "2012-07-03 13:29:42.000000",
- "docstatus": 0,
- "doctype": "DocType",
+ "autoname": "hash", 
+ "creation": "2012-07-03 13:29:42", 
+ "docstatus": 0, 
+ "doctype": "DocType", 
  "fields": [
   {
-   "fieldname": "feed_type",
-   "fieldtype": "Select",
-   "label": "Feed Type",
+   "fieldname": "feed_type", 
+   "fieldtype": "Select", 
+   "in_list_view": 1, 
+   "label": "Feed Type", 
    "permlevel": 0
-  },
+  }, 
   {
-   "fieldname": "doc_type",
-   "fieldtype": "Data",
-   "label": "Doc Type",
+   "fieldname": "doc_type", 
+   "fieldtype": "Data", 
+   "in_list_view": 1, 
+   "label": "Doc Type", 
    "permlevel": 0
-  },
+  }, 
   {
-   "fieldname": "doc_name",
-   "fieldtype": "Data",
-   "label": "Doc Name",
+   "fieldname": "doc_name", 
+   "fieldtype": "Data", 
+   "in_list_view": 1, 
+   "label": "Doc Name", 
    "permlevel": 0
-  },
+  }, 
   {
-   "fieldname": "subject",
-   "fieldtype": "Data",
-   "label": "Subject",
+   "fieldname": "subject", 
+   "fieldtype": "Data", 
+   "in_list_view": 1, 
+   "label": "Subject", 
    "permlevel": 0
-  },
+  }, 
   {
-   "fieldname": "color",
-   "fieldtype": "Data",
-   "label": "Color",
+   "fieldname": "color", 
+   "fieldtype": "Data", 
+   "in_list_view": 1, 
+   "label": "Color", 
    "permlevel": 0
-  },
+  }, 
   {
-   "fieldname": "full_name",
-   "fieldtype": "Data",
-   "label": "Full Name",
+   "fieldname": "full_name", 
+   "fieldtype": "Data", 
+   "label": "Full Name", 
    "permlevel": 0
   }
- ],
- "icon": "icon-rss",
- "idx": 1,
- "modified": "2013-12-20 19:24:05.000000",
- "modified_by": "Administrator",
- "module": "Home",
- "name": "Feed",
- "owner": "Administrator",
+ ], 
+ "icon": "icon-rss", 
+ "idx": 1, 
+ "modified": "2014-05-02 08:27:23.936733", 
+ "modified_by": "Administrator", 
+ "module": "Home", 
+ "name": "Feed", 
+ "owner": "Administrator", 
  "permissions": [
   {
-   "email": 1,
-   "permlevel": 0,
-   "print": 1,
-   "read": 1,
-   "report": 1,
+   "email": 1, 
+   "permlevel": 0, 
+   "print": 1, 
+   "read": 1, 
+   "report": 1, 
    "role": "System Manager"
+  }, 
+  {
+   "permlevel": 0, 
+   "read": 1, 
+   "role": "All"
   }
  ]
-}
+}
\ No newline at end of file
diff --git a/erpnext/home/doctype/feed/feed.py b/erpnext/home/doctype/feed/feed.py
index 45d8ea1..40c05f8 100644
--- a/erpnext/home/doctype/feed/feed.py
+++ b/erpnext/home/doctype/feed/feed.py
@@ -3,15 +3,42 @@
 
 from __future__ import unicode_literals
 import frappe
-
+import frappe.defaults
 from frappe.model.document import Document
 
 class Feed(Document):
 	pass
-	
+
 def on_doctype_update():
-	if not frappe.db.sql("""show index from `tabFeed` 
+	if not frappe.db.sql("""show index from `tabFeed`
 		where Key_name="feed_doctype_docname_index" """):
 		frappe.db.commit()
-		frappe.db.sql("""alter table `tabFeed` 
-			add index feed_doctype_docname_index(doc_type, doc_name)""")
\ No newline at end of file
+		frappe.db.sql("""alter table `tabFeed`
+			add index feed_doctype_docname_index(doc_type, doc_name)""")
+
+def get_permission_query_conditions():
+	restrictions = frappe.defaults.get_restrictions()
+	can_read = frappe.user.get_can_read()
+
+	can_read_doctypes = ['"{}"'.format(doctype) for doctype in
+		list(set(can_read) - set(restrictions.keys()))]
+
+	if not can_read_doctypes:
+		return ""
+
+	conditions = ["tabFeed.doc_type in ({})".format(", ".join(can_read_doctypes))]
+
+	if restrictions:
+		can_read_docs = []
+		for doctype, names in restrictions.items():
+			for n in names:
+				can_read_docs.append('"{}|{}"'.format(doctype, n))
+
+		if can_read_docs:
+			conditions.append("concat_ws('|', tabFeed.doc_type, tabFeed.doc_name) in ({})".format(
+				", ".join(can_read_docs)))
+
+	return "(" + " or ".join(conditions) + ")"
+
+def has_permission(doc):
+	return frappe.has_permission(doc.doc_type, "read", doc.doc_name)
diff --git a/erpnext/hooks.py b/erpnext/hooks.py
index 5d5adc6..4dcfdb0 100644
--- a/erpnext/hooks.py
+++ b/erpnext/hooks.py
@@ -25,6 +25,15 @@
 
 standard_queries = "Customer:erpnext.selling.doctype.customer.customer.get_customer_list"
 
+permission_query_conditions = {
+		"Feed": "erpnext.home.doctype.feed.feed.get_permission_query_conditions",
+	}
+
+has_permission = {
+		"Feed": "erpnext.home.doctype.feed.feed.has_permission",
+	}
+
+
 doc_events = {
 	"*": {
 		"on_update": "erpnext.home.update_feed",
diff --git a/erpnext/setup/doctype/item_group/item_group.json b/erpnext/setup/doctype/item_group/item_group.json
index 592673e..8ab7262 100644
--- a/erpnext/setup/doctype/item_group/item_group.json
+++ b/erpnext/setup/doctype/item_group/item_group.json
@@ -3,7 +3,7 @@
  "allow_import": 1, 
  "allow_rename": 1, 
  "autoname": "field:item_group_name", 
- "creation": "2013-03-28 10:35:29.000000", 
+ "creation": "2013-03-28 10:35:29", 
  "description": "Item Classification", 
  "docstatus": 0, 
  "doctype": "DocType", 
@@ -12,6 +12,7 @@
   {
    "fieldname": "item_group_name", 
    "fieldtype": "Data", 
+   "in_list_view": 1, 
    "label": "Item Group Name", 
    "no_copy": 0, 
    "oldfieldname": "item_group_name", 
@@ -23,6 +24,7 @@
   {
    "fieldname": "page_name", 
    "fieldtype": "Data", 
+   "in_list_view": 1, 
    "label": "Page Name", 
    "permlevel": 0, 
    "read_only": 1
@@ -30,6 +32,7 @@
   {
    "fieldname": "cb0", 
    "fieldtype": "Column Break", 
+   "in_list_view": 1, 
    "permlevel": 0
   }, 
   {
@@ -37,6 +40,7 @@
    "fieldname": "parent_item_group", 
    "fieldtype": "Link", 
    "ignore_restrictions": 1, 
+   "in_list_view": 1, 
    "label": "Parent Item Group", 
    "no_copy": 0, 
    "oldfieldname": "parent_item_group", 
@@ -50,6 +54,7 @@
    "description": "Only leaf nodes are allowed in transaction", 
    "fieldname": "is_group", 
    "fieldtype": "Select", 
+   "in_list_view": 1, 
    "label": "Has Child Node", 
    "no_copy": 0, 
    "oldfieldname": "is_group", 
@@ -157,7 +162,7 @@
  "in_create": 1, 
  "issingle": 0, 
  "max_attachments": 3, 
- "modified": "2014-02-20 18:29:57.000000", 
+ "modified": "2014-05-04 00:06:26.075492", 
  "modified_by": "Administrator", 
  "module": "Setup", 
  "name": "Item Group", 
@@ -194,7 +199,7 @@
   {
    "cancel": 0, 
    "create": 1, 
-   "delete": 0, 
+   "delete": 1, 
    "email": 1, 
    "permlevel": 0, 
    "print": 1, 
diff --git a/erpnext/setup/page/setup_wizard/setup_wizard.js b/erpnext/setup/page/setup_wizard/setup_wizard.js
index a66cb79..b2af950 100644
--- a/erpnext/setup/page/setup_wizard/setup_wizard.js
+++ b/erpnext/setup/page/setup_wizard/setup_wizard.js
@@ -365,7 +365,7 @@
 		this.parent = $('<div class="setup-wizard-wrapper">').appendTo(this.parent);
 	},
 	get_message: function(html) {
-		return $(repl('<div class="panel panel-default">\
+		return $(repl('<div class="panel panel-default" data-state="setup-complete">\
 			<div class="panel-body" style="padding: 40px;">%(html)s</div>\
 		</div>', {html:html}))
 	},
@@ -430,7 +430,9 @@
 frappe.wiz.WizardSlide = Class.extend({
 	init: function(opts) {
 		$.extend(this, opts);
-		this.$wrapper = $("<div>").appendTo(this.wiz.parent);
+		this.$wrapper = $("<div>")
+			.appendTo(this.wiz.parent)
+			.attr("data-slide-id", this.id);
 	},
 	make: function() {
 		var me = this;
diff --git a/erpnext/setup/page/setup_wizard/setup_wizard.py b/erpnext/setup/page/setup_wizard/setup_wizard.py
index 36ef345..42c85d7 100644
--- a/erpnext/setup/page/setup_wizard/setup_wizard.py
+++ b/erpnext/setup/page/setup_wizard/setup_wizard.py
@@ -15,6 +15,7 @@
 
 @frappe.whitelist()
 def setup_account(args=None):
+
 	if frappe.db.sql("select name from tabCompany"):
 		frappe.throw(_("Setup Already Complete!!"))
 
@@ -260,16 +261,22 @@
 			# replace % in case someone also enters the % symbol
 			tax_rate = (args.get("tax_rate_" + str(i)) or "").replace("%", "")
 
-			frappe.get_doc({
-				"doctype":"Account",
-				"company": args.get("company_name"),
-				"parent_account": "Duties and Taxes - " + args.get("company_abbr"),
-				"account_name": args.get("tax_" + str(i)),
-				"group_or_ledger": "Ledger",
-				"report_type": "Balance Sheet",
-				"account_type": "Tax",
-				"tax_rate": flt(tax_rate) if tax_rate else None
-			}).insert()
+			try:
+				frappe.get_doc({
+					"doctype":"Account",
+					"company": args.get("company_name"),
+					"parent_account": "Duties and Taxes - " + args.get("company_abbr"),
+					"account_name": args.get("tax_" + str(i)),
+					"group_or_ledger": "Ledger",
+					"report_type": "Balance Sheet",
+					"account_type": "Tax",
+					"tax_rate": flt(tax_rate) if tax_rate else None
+				}).insert()
+			except frappe.NameError, e:
+				if e.args[2][0]==1062:
+					pass
+				else:
+					raise
 
 def create_items(args):
 	for i in xrange(1,6):
diff --git a/erpnext/stock/doctype/item/item.js b/erpnext/stock/doctype/item/item.js
index c4f0341..15c8793 100644
--- a/erpnext/stock/doctype/item/item.js
+++ b/erpnext/stock/doctype/item/item.js
@@ -184,6 +184,8 @@
 cur_frm.cscript.image = function() {
 	refresh_field("image_view");
 
+	if(!cur_frm.doc.image) return;
+
 	if(!cur_frm.doc.description_html)
 		cur_frm.cscript.add_image(cur_frm.doc);
 	else {
diff --git a/erpnext/stock/doctype/serial_no/serial_no.js b/erpnext/stock/doctype/serial_no/serial_no.js
index 10b20f9..bb131f3 100644
--- a/erpnext/stock/doctype/serial_no/serial_no.js
+++ b/erpnext/stock/doctype/serial_no/serial_no.js
@@ -13,4 +13,8 @@
 	cur_frm.set_query("item_code", function() {
 		return erpnext.queries.item({"is_stock_item": "Yes", "has_serial_no": "Yes"})
 	});
-}
+};
+
+frappe.ui.form.on("Serial No", "refresh", function(frm) {
+	frm.toggle_enable("item_code", frm.doc.__islocal);
+});
diff --git a/erpnext/stock/doctype/serial_no/serial_no.json b/erpnext/stock/doctype/serial_no/serial_no.json
index 7695578..ee7cea4 100644
--- a/erpnext/stock/doctype/serial_no/serial_no.json
+++ b/erpnext/stock/doctype/serial_no/serial_no.json
@@ -3,7 +3,7 @@
  "allow_import": 1, 
  "allow_rename": 1, 
  "autoname": "field:serial_no", 
- "creation": "2013-05-16 10:59:15.000000", 
+ "creation": "2013-05-16 10:59:15", 
  "description": "Distinct unit of an Item", 
  "docstatus": 0, 
  "doctype": "DocType", 
@@ -24,7 +24,7 @@
    "read_only": 0
   }, 
   {
-   "default": "In Store", 
+   "default": "Not Available", 
    "description": "Only Serial Nos with status \"Available\" can be delivered.", 
    "fieldname": "status", 
    "fieldtype": "Select", 
@@ -34,9 +34,9 @@
    "no_copy": 1, 
    "oldfieldname": "status", 
    "oldfieldtype": "Select", 
-   "options": "\nAvailable\nNot Available\nDelivered\nPurchase Returned\nSales Returned", 
+   "options": "Not Available\nAvailable\nDelivered\nPurchase Returned\nSales Returned", 
    "permlevel": 0, 
-   "read_only": 0, 
+   "read_only": 1, 
    "reqd": 1, 
    "search_index": 1
   }, 
@@ -418,7 +418,7 @@
  "icon": "icon-barcode", 
  "idx": 1, 
  "in_create": 0, 
- "modified": "2014-01-20 17:49:26.000000", 
+ "modified": "2014-05-04 00:47:20.443476", 
  "modified_by": "Administrator", 
  "module": "Stock", 
  "name": "Serial No", 
diff --git a/erpnext/stock/doctype/serial_no/serial_no.py b/erpnext/stock/doctype/serial_no/serial_no.py
index b7dc545..dbbc3ef 100644
--- a/erpnext/stock/doctype/serial_no/serial_no.py
+++ b/erpnext/stock/doctype/serial_no/serial_no.py
@@ -262,7 +262,7 @@
 				sr = frappe.get_doc("Serial No", serial_no)
 				sr.via_stock_ledger = True
 				sr.warehouse = sle.warehouse if sle.actual_qty > 0 else None
-				sr.save()
+				sr.save(ignore_permissions=True)
 			elif sle.actual_qty > 0:
 				make_serial_no(serial_no, sle)
 
@@ -277,6 +277,7 @@
 
 def make_serial_no(serial_no, sle):
 	sr = frappe.new_doc("Serial No")
+	sr.ignore_permissions = True
 	sr.serial_no = serial_no
 	sr.item_code = sle.item_code
 	sr.warehouse = None
diff --git a/erpnext/templates/utils.py b/erpnext/templates/utils.py
index 7ba4a9d..d3c93eb 100644
--- a/erpnext/templates/utils.py
+++ b/erpnext/templates/utils.py
@@ -7,8 +7,9 @@
 @frappe.whitelist(allow_guest=True)
 def send_message(subject="Website Query", message="", sender="", status="Open"):
 	from frappe.templates.pages.contact import send_message as website_send_message
+	res = website_send_message(subject, message, sender)
 
-	if not website_send_message(subject, message, sender):
+	if not res:
 		return
 
 	if subject=="Support":
@@ -21,3 +22,4 @@
 		add_sales_communication(subject or "Website Query", message, sender, sender,
 			mail=None, status=status)
 
+	return res
diff --git a/erpnext/tests/sel_tests.py b/erpnext/tests/sel_tests.py
index b1db9bb..8ff0b0e 100644
--- a/erpnext/tests/sel_tests.py
+++ b/erpnext/tests/sel_tests.py
@@ -14,11 +14,89 @@
 import frappe
 
 from frappe.utils import sel
+import time
 
 def start():
-	sel.start(verbose=True)
+	try:
+		run()
+	finally:
+		sel.close()
+
+def run():
+	def next_slide(idx, selector="next-btn"):
+		sel.find('[data-slide-id="{0}"] .{1}'.format(idx, selector))[0].click()
+		sel.wait_for_ajax()
+
+
+	sel.start(verbose=True, driver="Firefox")
+	sel.input_wait = 0.2
 	sel.login("#page-setup-wizard")
 
+	# slide 1
+	next_slide("0")
+
+	sel.set_field("first_name", "Test")
+	sel.set_field("last_name", "User")
+	sel.set_field("email", "test@erpnext.com")
+	sel.set_field("password", "test")
+
+	next_slide("1")
+
+	sel.set_select("country", "India")
+
+	next_slide("2")
+
+	sel.set_field("company_name", "Wind Power LLC")
+	sel.set_field("fy_start_date", "01-04-2014")
+	sel.set_field("company_tagline", "Wind Power For Everyone")
+
+	next_slide("3")
+	next_slide("4")
+
+	sel.set_field("tax_1", "VAT")
+	sel.set_field("tax_rate_1", "12.5")
+
+	sel.set_field("tax_2", "Service Tax")
+	sel.set_field("tax_rate_2", "10.36")
+
+	next_slide("5")
+
+	sel.set_field("customer_1", "Asian Junction")
+	sel.set_field("customer_contact_1", "January Vaclavik")
+	sel.set_field("customer_2", "Life Plan Counselling")
+	sel.set_field("customer_contact_2", "Jana Tobeolisa")
+	sel.set_field("customer_3", "Two Pesos")
+	sel.set_field("customer_contact_3", "Satomi Shigeki")
+	sel.set_field("customer_4", "Intelacard")
+	sel.set_field("customer_contact_4", "Hans Rasmussen")
+
+	next_slide("6")
+
+	sel.set_field("item_1", "Wind Turbine A")
+	sel.set_field("item_2", "Wind Turbine B")
+	sel.set_field("item_3", "Wind Turbine C")
+
+	next_slide("7")
+
+	sel.set_field("supplier_1", "Helios Air")
+	sel.set_field("supplier_contact_1", "Quimey Osorio")
+	sel.set_field("supplier_2", "Ks Merchandise")
+	sel.set_field("supplier_contact_2", "Edgarda Salcedo")
+	sel.set_field("supplier_3", "Eagle Hardware")
+	sel.set_field("supplier_contact_3", "Hafsteinn Bjarnarsonar")
+
+	next_slide("8")
+
+	sel.set_field("item_buy_1", "Bearing Pipe")
+	sel.set_field("item_buy_2", "Bearing Assembly")
+	sel.set_field("item_buy_3", "Base Plate")
+	sel.set_field("item_buy_4", "Coil")
+
+	next_slide("9", "complete-btn")
+
+	sel.wait('[data-state="setup-complete"]')
+
+	w = raw_input("quit?")
 
 # complete setup
 # new customer
diff --git a/erpnext/utilities/doctype/note/note_list.js b/erpnext/utilities/doctype/note/note_list.js
new file mode 100644
index 0000000..b188941
--- /dev/null
+++ b/erpnext/utilities/doctype/note/note_list.js
@@ -0,0 +1,5 @@
+frappe.listview_settings['Note'] = {
+	set_title_left: function() {
+		frappe.set_route();
+	}
+}