[lead] [address] store lead address in Address doctype, with link field=lead
diff --git a/utilities/doctype/address/address.py b/utilities/doctype/address/address.py
index cfcbea5..c475da1 100644
--- a/utilities/doctype/address/address.py
+++ b/utilities/doctype/address/address.py
@@ -27,7 +27,7 @@
 
 	def autoname(self):
 		if not self.doc.address_title:
-			self.doc.address_title = self.doc.customer or self.doc.supplier or self.doc.sales_partner
+			self.doc.address_title = self.doc.customer or self.doc.supplier or self.doc.sales_partner or self.doc.lead
 			
 		if self.doc.address_title:
 			self.doc.name = cstr(self.doc.address_title).strip() + "-" + cstr(self.doc.address_type).strip()
@@ -35,40 +35,32 @@
 		else:
 			webnotes.msgprint("""Address Title is mandatory.""", raise_exception=True)
 		
-
 	def validate(self):
 		self.validate_primary_address()
 		self.validate_shipping_address()
 	
 	def validate_primary_address(self):
 		"""Validate that there can only be one primary address for particular customer, supplier"""
-		sql = webnotes.conn.sql
 		if self.doc.is_primary_address == 1:
-			if self.doc.customer: 
-				sql("update tabAddress set is_primary_address=0 where customer = '%s'" % (self.doc.customer))
-			elif self.doc.supplier:
-				sql("update tabAddress set is_primary_address=0 where supplier = '%s'" % (self.doc.supplier))
-			elif self.doc.sales_partner:
-				sql("update tabAddress set is_primary_address=0 where sales_partner = '%s'" % (self.doc.sales_partner))
-		elif not self.doc.is_shipping_address:
-			if self.doc.customer: 
-				if not sql("select name from tabAddress where is_primary_address=1 and customer = '%s'" % (self.doc.customer)):
-					self.doc.is_primary_address = 1
-			elif self.doc.supplier:
-				if not sql("select name from tabAddress where is_primary_address=1 and supplier = '%s'" % (self.doc.supplier)):
-					self.doc.is_primary_address = 1
-			elif self.doc.sales_partner:
-				if not sql("select name from tabAddress where is_primary_address=1 and sales_partner = '%s'" % (self.doc.sales_partner)):
-					self.doc.is_primary_address = 1
-
+			self._unset_other("is_primary_address")
+			
+		elif self.doc.is_shipping_address != 1:
+			for fieldname in ["customer", "supplier", "sales_partner", "lead"]:
+				if self.doc.fields.get(fieldname):
+					if not webnotes.conn.sql("""select name from `tabAddress` where is_primary_address=1
+						and `%s`=%s and name!=%s""" % (fieldname, "%s", "%s"), 
+						(self.doc.fields[fieldname], self.doc.name)):
+							self.doc.is_primary_address = 1
+					break
 				
 	def validate_shipping_address(self):
 		"""Validate that there can only be one shipping address for particular customer, supplier"""
-		sql = webnotes.conn.sql
 		if self.doc.is_shipping_address == 1:
-			if self.doc.customer: 
-				sql("update tabAddress set is_shipping_address=0 where customer = '%s'" % (self.doc.customer))
-			elif self.doc.supplier:
-				sql("update tabAddress set is_shipping_address=0 where supplier = '%s'" % (self.doc.supplier))			
-			elif self.doc.sales_partner:
-				sql("update tabAddress set is_shipping_address=0 where sales_partner = '%s'" % (self.doc.sales_partner))			
+			self._unset_other("is_shipping_address")
+			
+	def _unset_other(self, is_address_type):
+		for fieldname in ["customer", "supplier", "sales_partner", "lead"]:
+			if self.doc.fields.get(fieldname):
+				webnotes.conn.sql("""update `tabAddress` set `%s`=0 where `%s`=%s and name!=%s""" %
+					(is_address_type, fieldname, "%s", "%s"), (self.doc.fields[fieldname], self.doc.name))
+				break
\ No newline at end of file
diff --git a/utilities/doctype/address/address.txt b/utilities/doctype/address/address.txt
index 757beb9..ed39c75 100644
--- a/utilities/doctype/address/address.txt
+++ b/utilities/doctype/address/address.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-01-10 16:34:32", 
   "docstatus": 0, 
-  "modified": "2013-01-29 13:24:45", 
+  "modified": "2013-06-28 17:06:32", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -46,11 +46,11 @@
   "label": "Address Details"
  }, 
  {
-  "description": "e.g. Office, Billing, Shipping", 
   "doctype": "DocField", 
   "fieldname": "address_type", 
-  "fieldtype": "Data", 
+  "fieldtype": "Select", 
   "label": "Address Type", 
+  "options": "Billing\nShipping\nOffice\nPersonal\nPlant\nPostal\nShop\nSubsidiary\nWarehouse\nOther", 
   "reqd": 1
  }, 
  {
@@ -145,7 +145,7 @@
   "doctype": "DocField", 
   "fieldname": "is_primary_address", 
   "fieldtype": "Check", 
-  "label": "Is Primary Address"
+  "label": "Preferred Billing Address"
  }, 
  {
   "default": "0", 
@@ -154,7 +154,7 @@
   "fieldname": "is_shipping_address", 
   "fieldtype": "Check", 
   "in_list_view": 1, 
-  "label": "Is Shipping Address"
+  "label": "Preferred Shipping Address"
  }, 
  {
   "doctype": "DocField", 
@@ -208,6 +208,27 @@
   "options": "Sales Partner"
  }, 
  {
+  "doctype": "DocField", 
+  "fieldname": "column_break_22", 
+  "fieldtype": "Column Break"
+ }, 
+ {
+  "depends_on": "eval:!doc.supplier && !doc.sales_partner", 
+  "doctype": "DocField", 
+  "fieldname": "lead", 
+  "fieldtype": "Link", 
+  "label": "Lead", 
+  "options": "Lead"
+ }, 
+ {
+  "depends_on": "eval:!doc.supplier && !doc.sales_partner", 
+  "doctype": "DocField", 
+  "fieldname": "lead_name", 
+  "fieldtype": "Data", 
+  "label": "Lead Name", 
+  "read_only": 1
+ }, 
+ {
   "doctype": "DocPerm", 
   "role": "Sales User"
  }, 
diff --git a/utilities/transaction_base.py b/utilities/transaction_base.py
index c86a50e..2def0ea 100644
--- a/utilities/transaction_base.py
+++ b/utilities/transaction_base.py
@@ -170,21 +170,30 @@
 		
 	# Get Lead Details
 	# -----------------------
-	def get_lead_details(self, name):		
-		details = webnotes.conn.sql("select name, lead_name, address_line1, address_line2, city, country, state, pincode, territory, phone, mobile_no, email_id, company_name from `tabLead` where name = '%s'" %(name), as_dict = 1)		
-		
-		extract = lambda x: details and details[0] and details[0].get(x,'') or ''
-		address_fields = [('','address_line1'),('\n','address_line2'),('\n','city'),(' ','pincode'),('\n','state'),('\n','country'),('\nPhone: ','contact_no')]
-		address_display = ''.join([a[0]+extract(a[1]) for a in address_fields if extract(a[1])])
-		if address_display.startswith('\n'): address_display = address_display[1:]
+	def get_lead_details(self, name):
+		details = webnotes.conn.sql("""select name, lead_name, address_line1, address_line2, city, country, state, pincode
+			from `tabAddress` where lead=%s""", name, as_dict=True)
+		lead = webnotes.conn.get_value("Lead", name, 
+			["territory", "phone", "mobile_no", "email_id", "company_name", "lead_name"], as_dict=True) or {}
+
+		address_display = ""
+		if details:
+			details = details[0]
+			for separator, fieldname in (('','address_line1'), ('\n','address_line2'), ('\n','city'), 
+				(' ','pincode'), ('\n','state'), ('\n','country'), ('\nPhone: ', 'phone')):
+					if details.get(fieldname):
+						address_display += separator + details.get(fieldname)
+
+		if address_display.startswith('\n'):
+			address_display = address_display[1:]
 		
 		ret = {
-			'contact_display' : extract('lead_name'),
+			'contact_display' : lead.get('lead_name'),
 			'address_display' : address_display,
-			'territory' : extract('territory'),
-			'contact_mobile' : extract('mobile_no'),
-			'contact_email' : extract('email_id'),
-			'customer_name' : extract('company_name') or extract('lead_name')
+			'territory' : lead.get('territory'),
+			'contact_mobile' : lead.get('mobile_no'),
+			'contact_email' : lead.get('email_id'),
+			'customer_name' : lead.get('company_name') or lead.get('lead_name')
 		}
 		return ret