[minor] fixes after merge with master
diff --git a/accounts/doctype/sales_invoice/test_sales_invoice.py b/accounts/doctype/sales_invoice/test_sales_invoice.py
index dee098a..9f5b95c 100644
--- a/accounts/doctype/sales_invoice/test_sales_invoice.py
+++ b/accounts/doctype/sales_invoice/test_sales_invoice.py
@@ -641,8 +641,8 @@
 			
 			return new_si
 		
-		# if yearly, test 3 repetitions, else test 13 repetitions
-		count = 3 if no_of_months == 12 else 13
+		# if yearly, test 1 repetition, else test 5 repetitions
+		count = 1 if (no_of_months == 12) else 5
 		for i in xrange(count):
 			base_si = _test(i)
 			
@@ -653,7 +653,7 @@
 
 	def test_serialized(self):
 		from stock.doctype.stock_entry.test_stock_entry import make_serialized_item
-		from stock.doctype.stock_ledger_entry.stock_ledger_entry import get_serial_nos
+		from stock.doctype.serial_no.serial_no import get_serial_nos
 		
 		se = make_serialized_item()
 		serial_nos = get_serial_nos(se.doclist[1].serial_no)
@@ -674,7 +674,7 @@
 		return si
 			
 	def test_serialized_cancel(self):
-		from stock.doctype.stock_ledger_entry.stock_ledger_entry import get_serial_nos
+		from stock.doctype.serial_no.serial_no import get_serial_nos
 		si = self.test_serialized()
 		si.cancel()
 
@@ -686,7 +686,7 @@
 			"delivery_document_no"))
 
 	def test_serialize_status(self):
-		from stock.doctype.stock_ledger_entry.stock_ledger_entry import SerialNoStatusError, get_serial_nos
+		from stock.doctype.serial_no.serial_no import SerialNoStatusError, get_serial_nos
 		from stock.doctype.stock_entry.test_stock_entry import make_serialized_item
 		
 		se = make_serialized_item()
diff --git a/accounts/page/voucher_import_tool/voucher_import_tool.py b/accounts/page/voucher_import_tool/voucher_import_tool.py
index 9425afc..14e30be 100644
--- a/accounts/page/voucher_import_tool/voucher_import_tool.py
+++ b/accounts/page/voucher_import_tool/voucher_import_tool.py
@@ -64,10 +64,10 @@
 		
 		data, start_idx = get_data(rows, company_abbr, rows[0][0])
 	except Exception, e:
-		err_msg = webnotes.message_log and "<br>".join(webnotes.message_log) or cstr(e)
+		err_msg = webnotes.local.message_log and "<br>".join(webnotes.local.message_log) or cstr(e)
 		messages.append("""<p style='color: red'>%s</p>""" % (err_msg or "No message"))
 		webnotes.errprint(webnotes.getTraceback())
-		webnotes.message_log = []
+		webnotes.local.message_log = []
 		return messages
 		
 	return import_vouchers(common_values, data, start_idx, rows[0][0])
@@ -117,11 +117,11 @@
 			
 			d = data[i][0]
 			if import_type == "Voucher Import: Two Accounts" and flt(d.get("amount")) == 0:
-				webnotes.message_log = ["Amount not specified"]
+				webnotes.local.message_log = ["Amount not specified"]
 				raise Exception
 			elif import_type == "Voucher Import: Multiple Accounts" and \
 			 		(flt(d.get("total_debit")) == 0 or flt(d.get("total_credit")) == 0):
-				webnotes.message_log = ["Total Debit and Total Credit amount can not be zero"]
+				webnotes.local.message_log = ["Total Debit and Total Credit amount can not be zero"]
 				raise Exception
 			else:
 				d.posting_date = parse_date(d.posting_date)
@@ -174,7 +174,7 @@
 						details.append(detail)
 								
 				if not details:
-					webnotes.message_log = ["""No accounts found. 
+					webnotes.local.message_log = ["""No accounts found. 
 						If you entered accounts correctly, please check template once"""]
 					raise Exception
 					
@@ -193,12 +193,12 @@
 		webnotes.conn.commit()
 	except Exception, e:
 		webnotes.conn.rollback()
-		err_msg = webnotes.message_log and "<br>".join(webnotes.message_log) or cstr(e)
+		err_msg = webnotes.local.message_log and "<br>".join(webnotes.local.message_log) or cstr(e)
 		messages.append("""<p style='color: red'>[row #%s] %s failed: %s</p>"""
 			% ((start_idx + 1) + i, jv.name or "", err_msg or "No message"))
 		messages.append("<p style='color: red'>All transactions rolled back</p>")
 		webnotes.errprint(webnotes.getTraceback())
-		webnotes.message_log = []
+		webnotes.local.message_log = []
 			
 	return messages
 
diff --git a/buying/doctype/purchase_order/test_purchase_order.py b/buying/doctype/purchase_order/test_purchase_order.py
index cef5e4a..e9a9c34 100644
--- a/buying/doctype/purchase_order/test_purchase_order.py
+++ b/buying/doctype/purchase_order/test_purchase_order.py
@@ -98,12 +98,12 @@
 		self.assertEquals(len(po.doclist.get({"parentfield": "po_raw_material_details"})), 2)
 
 	def test_warehouse_company_validation(self):
-		from controllers.buying_controller import WrongWarehouseCompany
+		from stock.utils import InvalidWarehouseCompany
 		po = webnotes.bean(copy=test_records[0])
 		po.doc.company = "_Test Company 1"
 		po.doc.conversion_rate = 0.0167
-		self.assertRaises(WrongWarehouseCompany, po.insert)
-
+		self.assertRaises(InvalidWarehouseCompany, po.insert)
+		
 	def test_uom_integer_validation(self):
 		from utilities.transaction_base import UOMMustBeIntegerError
 		po = webnotes.bean(copy=test_records[0])
diff --git a/controllers/buying_controller.py b/controllers/buying_controller.py
index 2e55aee..c42eda5 100644
--- a/controllers/buying_controller.py
+++ b/controllers/buying_controller.py
@@ -11,8 +11,6 @@
 
 from controllers.stock_controller import StockController
 
-class WrongWarehouseCompany(Exception): pass
-
 class BuyingController(StockController):
 
 	def onload_post_render(self):
diff --git a/setup/doctype/backup_manager/backup_dropbox.py b/setup/doctype/backup_manager/backup_dropbox.py
index b4a8f66..3d3f428 100644
--- a/setup/doctype/backup_manager/backup_dropbox.py
+++ b/setup/doctype/backup_manager/backup_dropbox.py
@@ -61,8 +61,8 @@
 		allowed = 0
 		message = "Dropbox Access not approved."
 
-	webnotes.message_title = "Dropbox Approval"
-	webnotes.message = "<h3>%s</h3><p>Please close this window.</p>" % message
+	webnotes.local.message_title = "Dropbox Approval"
+	webnotes.local.message = "<h3>%s</h3><p>Please close this window.</p>" % message
 	
 	webnotes.conn.commit()
 	webnotes.response['type'] = 'page'
diff --git a/stock/doctype/delivery_note/test_delivery_note.py b/stock/doctype/delivery_note/test_delivery_note.py
index 7c52550..ca95a50 100644
--- a/stock/doctype/delivery_note/test_delivery_note.py
+++ b/stock/doctype/delivery_note/test_delivery_note.py
@@ -160,7 +160,7 @@
 		
 	def test_serialized(self):
 		from stock.doctype.stock_entry.test_stock_entry import make_serialized_item
-		from stock.doctype.stock_ledger_entry.stock_ledger_entry import get_serial_nos
+		from stock.doctype.serial_no.serial_no import get_serial_nos
 		
 		se = make_serialized_item()
 		serial_nos = get_serial_nos(se.doclist[1].serial_no)
@@ -180,7 +180,7 @@
 		return dn
 			
 	def test_serialized_cancel(self):
-		from stock.doctype.stock_ledger_entry.stock_ledger_entry import get_serial_nos
+		from stock.doctype.serial_no.serial_no import get_serial_nos
 		dn = self.test_serialized()
 		dn.cancel()
 
@@ -192,7 +192,7 @@
 			"delivery_document_no"))
 
 	def test_serialize_status(self):
-		from stock.doctype.stock_ledger_entry.stock_ledger_entry import SerialNoStatusError, get_serial_nos
+		from stock.doctype.serial_no.serial_no import SerialNoStatusError, get_serial_nos
 		from stock.doctype.stock_entry.test_stock_entry import make_serialized_item
 		
 		se = make_serialized_item()
diff --git a/stock/doctype/material_request/test_material_request.py b/stock/doctype/material_request/test_material_request.py
index 8ebad15..13fdd02 100644
--- a/stock/doctype/material_request/test_material_request.py
+++ b/stock/doctype/material_request/test_material_request.py
@@ -315,10 +315,10 @@
 		self.assertRaises(webnotes.MappingMismatchError, se.insert)
 		
 	def test_warehouse_company_validation(self):
-		from controllers.buying_controller import WrongWarehouseCompany
+		from stock.utils import InvalidWarehouseCompany
 		mr = webnotes.bean(copy=test_records[0])
 		mr.doc.company = "_Test Company 1"
-		self.assertRaises(WrongWarehouseCompany, mr.insert)
+		self.assertRaises(InvalidWarehouseCompany, mr.insert)
 
 test_dependencies = ["Currency Exchange"]
 test_records = [
diff --git a/stock/doctype/purchase_receipt/purchase_receipt.py b/stock/doctype/purchase_receipt/purchase_receipt.py
index 2dd450f..537d75d 100644
--- a/stock/doctype/purchase_receipt/purchase_receipt.py
+++ b/stock/doctype/purchase_receipt/purchase_receipt.py
@@ -242,7 +242,7 @@
 		self.update_stock()
 
 		from stock.doctype.serial_no.serial_no import update_serial_nos_after_submit
-		update_serial_nos_after_submit(self, "Purchase Receipt", "purchase_receipt_details")
+		update_serial_nos_after_submit(self, "purchase_receipt_details")
 
 		purchase_controller.update_last_purchase_rate(self, 1)
 		
diff --git a/stock/doctype/purchase_receipt/test_purchase_receipt.py b/stock/doctype/purchase_receipt/test_purchase_receipt.py
index 010c29b..613dfbc 100644
--- a/stock/doctype/purchase_receipt/test_purchase_receipt.py
+++ b/stock/doctype/purchase_receipt/test_purchase_receipt.py
@@ -104,6 +104,7 @@
 		pr.doclist[1].received_qty = 1
 		pr.insert()
 		pr.submit()
+		
 		self.assertEquals(webnotes.conn.get_value("Serial No", pr.doclist[1].serial_no, 
 			"supplier"), pr.doc.supplier)
 			
@@ -112,7 +113,7 @@
 	def test_serial_no_cancel(self):
 		pr = self.test_serial_no_supplier()
 		pr.cancel()
-
+		
 		self.assertFalse(webnotes.conn.get_value("Serial No", pr.doclist[1].serial_no, 
 			"warehouse"))
 			
diff --git a/stock/doctype/serial_no/serial_no.py b/stock/doctype/serial_no/serial_no.py
index 93836d6..61b2841 100644
--- a/stock/doctype/serial_no/serial_no.py
+++ b/stock/doctype/serial_no/serial_no.py
@@ -37,11 +37,8 @@
 		self.validate_warehouse()
 		self.validate_item()
 		
-		if self.via_stock_ledger:
-			self.set_status()
-			self.set_purchase_details()
-			self.set_sales_details()
-
+		self.on_stock_ledger_entry()
+		
 	def validate_amc_status(self):
 		"""
 			validate amc status
@@ -118,7 +115,7 @@
 			and ifnull(is_cancelled, 'No')='No' order by name asc limit 1""", 
 			("%%%s%%" % (self.doc.name+"\n"), "%%%s%%" % ("\n"+self.doc.name), self.doc.name, 
 				 self.doc.item_code), as_dict=1)
-
+		
 		if purchase_sle:
 			self.doc.purchase_document_type = purchase_sle[0].voucher_type
 			self.doc.purchase_document_no = purchase_sle[0].voucher_no
@@ -181,6 +178,12 @@
 				webnotes.conn.sql("""update `tab%s` set serial_no = %s 
 					where name=%s""" % (dt[0], '%s', '%s'),
 					('\n'.join(serial_nos), item[0]))
+					
+	def on_stock_ledger_entry(self):
+		if self.via_stock_ledger and not self.doc.fields.get("__islocal"):
+			self.set_status()
+			self.set_purchase_details()
+			self.set_sales_details()
 
 def process_serial_no(sle):
 	item_det = get_item_details(sle.item_code)
@@ -233,6 +236,14 @@
 				+ sle.item_code), SerialNoRequiredError)
 				
 def update_serial_nos(sle, item_det):
+	if not sle.serial_no and sle.actual_qty > 0 and item_det.serial_no_series:
+		from webnotes.model.doc import make_autoname
+		serial_nos = []
+		for i in xrange(cint(sle.actual_qty)):
+			serial_nos.append(make_autoname(item_det.serial_no_series))
+		
+		webnotes.conn.set(sle, "serial_no", "\n".join(serial_nos))
+	
 	if sle.serial_no:
 		serial_nos = get_serial_nos(sle.serial_no)
 		for serial_no in serial_nos:
@@ -243,12 +254,6 @@
 				sr.save()
 			elif sle.actual_qty > 0:
 				make_serial_no(serial_no, sle)
-	elif sle.actual_qty > 0 and item_det.serial_no_series:
-		from webnotes.model.doc import make_autoname
-		serial_nos = []
-		for i in xrange(cint(sle.actual_qty)):
-			serial_nos.append(make_serial_no(make_autoname(item_det.serial_no_series), sle))
-		sle.serial_no = "\n".join(serial_nos)
 
 def get_item_details(item_code):
 	return webnotes.conn.sql("""select name, has_batch_no, docstatus, 
@@ -270,13 +275,16 @@
 	webnotes.msgprint(_("Serial No created") + ": " + sr.doc.name)
 	return sr.doc.name
 	
-def update_serial_nos_after_submit(controller, parenttype, parentfield):
-	if not hasattr(webnotes, "new_stock_ledger_entries"):
-		return
+def update_serial_nos_after_submit(controller, parentfield):
+	stock_ledger_entries = webnotes.conn.sql("""select voucher_detail_no, serial_no
+		from `tabStock Ledger Entry` where voucher_type=%s and voucher_no=%s""", 
+		(controller.doc.doctype, controller.doc.name), as_dict=True)
 		
+	if not stock_ledger_entries: return
+	
 	for d in controller.doclist.get({"parentfield": parentfield}):
 		serial_no = None
-		for sle in webnotes.new_stock_ledger_entries:
+		for sle in stock_ledger_entries:
 			if sle.voucher_detail_no==d.name:
 				serial_no = sle.serial_no
 				break
diff --git a/stock/doctype/stock_entry/stock_entry.py b/stock/doctype/stock_entry/stock_entry.py
index 0117864..63cfd2b 100644
--- a/stock/doctype/stock_entry/stock_entry.py
+++ b/stock/doctype/stock_entry/stock_entry.py
@@ -53,7 +53,7 @@
 		self.update_stock_ledger()
 
 		from stock.doctype.serial_no.serial_no import update_serial_nos_after_submit
-		update_serial_nos_after_submit(self, "Stock Entry", "mtn_details")
+		update_serial_nos_after_submit(self, "mtn_details")
 		
 		self.update_production_order(1)
 		self.make_gl_entries()
diff --git a/stock/doctype/stock_entry/test_stock_entry.py b/stock/doctype/stock_entry/test_stock_entry.py
index b41a626..f01a83b 100644
--- a/stock/doctype/stock_entry/test_stock_entry.py
+++ b/stock/doctype/stock_entry/test_stock_entry.py
@@ -44,9 +44,10 @@
 
 	def test_warehouse_company_validation(self):
 		self._clear_stock_account_balance()
-		webnotes.session.user = "test2@example.com"
 		webnotes.bean("Profile", "test2@example.com").get_controller()\
 			.add_roles("Sales User", "Sales Manager", "Material User", "Material Manager")
+			
+		webnotes.session.user = "test2@example.com"
 
 		from stock.utils import InvalidWarehouseCompany
 		st1 = webnotes.bean(copy=test_records[0])
@@ -59,13 +60,13 @@
 	def test_warehouse_user(self):
 		from stock.utils import UserNotAllowedForWarehouse
 
-		webnotes.session.user = "test@example.com"
 		webnotes.bean("Profile", "test@example.com").get_controller()\
 			.add_roles("Sales User", "Sales Manager", "Material User", "Material Manager")
 
 		webnotes.bean("Profile", "test2@example.com").get_controller()\
 			.add_roles("Sales User", "Sales Manager", "Material User", "Material Manager")
-
+			
+		webnotes.session.user = "test@example.com"
 		st1 = webnotes.bean(copy=test_records[0])
 		st1.doc.company = "_Test Company 1"
 		st1.doclist[1].t_warehouse="_Test Warehouse 2 - _TC1"
diff --git a/stock/doctype/stock_ledger_entry/stock_ledger_entry.py b/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
index 8fef889..c7703ed 100644
--- a/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
+++ b/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
@@ -14,10 +14,6 @@
 
 	def validate(self):
 		from stock.utils import validate_warehouse_user, validate_warehouse_company
-		if not hasattr(webnotes, "new_stock_ledger_entries"):
-			webnotes.new_stock_ledger_entries = []
-			
-		webnotes.new_stock_ledger_entries.append(self.doc)
 		self.validate_mandatory()
 		self.validate_item()
 		validate_warehouse_user(self.doc.warehouse)
@@ -52,7 +48,7 @@
 					<b>%(item_code)s</b> at Warehouse <b>%(warehouse)s</b> \
 					as on %(posting_date)s %(posting_time)s""" % self.doc.fields)
 
-				sself.doc.fields.pop('batch_bal')
+				self.doc.fields.pop('batch_bal')
 
 	def validate_mandatory(self):
 		mandatory = ['warehouse','posting_date','voucher_type','voucher_no','actual_qty','company']
diff --git a/stock/utils.py b/stock/utils.py
index 1f50164..95b9bff 100644
--- a/stock/utils.py
+++ b/stock/utils.py
@@ -252,10 +252,10 @@
 
 def reorder_item():
 	""" Reorder item if stock reaches reorder level"""
-	if not hasattr(webnotes, "auto_indent"):
-		webnotes.auto_indent = cint(webnotes.conn.get_value('Stock Settings', None, 'auto_indent'))
+	if getattr(webnotes.local, "auto_indent", None) is None:
+		webnotes.local.auto_indent = cint(webnotes.conn.get_value('Stock Settings', None, 'auto_indent'))
 	
-	if webnotes.auto_indent:
+	if webnotes.local.auto_indent:
 		material_requests = {}
 		bin_list = webnotes.conn.sql("""select item_code, warehouse, projected_qty
 			from tabBin where ifnull(item_code, '') != '' and ifnull(warehouse, '') != ''
@@ -340,18 +340,18 @@
 				mr_list.append(mr_bean)
 
 			except:
-				if webnotes.message_log:
-					exceptions_list.append([] + webnotes.message_log)
-					webnotes.message_log = []
+				if webnotes.local.message_log:
+					exceptions_list.append([] + webnotes.local.message_log)
+					webnotes.local.message_log = []
 				else:
 					exceptions_list.append(webnotes.getTraceback())
 
 	if mr_list:
-		if not hasattr(webnotes, "reorder_email_notify"):
-			webnotes.reorder_email_notify = cint(webnotes.conn.get_value('Stock Settings', None, 
+		if getattr(webnotes.local, "reorder_email_notify", None) is None:
+			webnotes.local.reorder_email_notify = cint(webnotes.conn.get_value('Stock Settings', None, 
 				'reorder_email_notify'))
 			
-		if(webnotes.reorder_email_notify):
+		if(webnotes.local.reorder_email_notify):
 			send_email_notification(mr_list)
 
 	if exceptions_list: