Merge branch 'master' of github.com:akhileshdarjee/erpnext
diff --git a/selling/doctype/lead/lead.py b/selling/doctype/lead/lead.py
index c336fe2..571cdfd 100644
--- a/selling/doctype/lead/lead.py
+++ b/selling/doctype/lead/lead.py
@@ -97,7 +97,6 @@
 		return webnotes.conn.get_value('Sales Email Settings',None,'email_id')
 
 	def on_trash(self):
-		webnotes.conn.sql("""delete from tabCommunication where lead=%s""",
-			self.doc.name)
+		webnotes.conn.sql("""update tabCommunication set lead=null where lead=%s""", self.doc.name)
 		webnotes.conn.sql("""update `tabSupport Ticket` set lead='' where lead=%s""",
 			self.doc.name)
diff --git a/setup/doctype/backup_manager/backup_googledrive.py b/setup/doctype/backup_manager/backup_googledrive.py
new file mode 100644
index 0000000..b1cb73a
--- /dev/null
+++ b/setup/doctype/backup_manager/backup_googledrive.py
@@ -0,0 +1,134 @@
+import httplib2
+import sys
+import os
+import mimetypes
+import webnotes
+import oauth2client.client
+from webnotes.utils import get_request_site_address, get_base_path
+from webnotes import _, msgprint
+from apiclient.discovery import build
+from apiclient.http import MediaFileUpload
+
+@webnotes.whitelist()
+def get_gdrive_authorize_url():
+	from conf import client_id, client_secret, oauth_scope, redirect_url
+	flow = get_gdrive_flow()
+	authorize_url = flow.step1_get_authorize_url()
+	return_address = get_request_site_address(True) \
+		+ "?cmd=setup.doctype.backup_manager.backup_googledrive.gdrive_callback"
+	return {
+		"authorize_url": authorize_url,
+	}
+
+@webnotes.whitelist(allow_guest=True)
+def gdrive_callback(verification_code = None):
+	flow = get_gdrive_flow()
+	if verification_code:
+		credentials = flow.step2_exchange(verification_code)
+		allowed = 1
+	http = httplib2.Http()
+	http = credentials.authorize(http)
+	final_credentials = credentials.to_json()
+	drive_service = build('drive', 'v2', http=http)
+	erpnext_folder_id = create_erpnext_folder(drive_service)
+	database_folder_id = create_folder('database', drive_service, erpnext_folder_id)
+	files_folder_id = create_folder('files', drive_service, erpnext_folder_id)
+	webnotes.msgprint(_("Google Drive Access Approved."))
+	webnotes.conn.set_value("Backup Manager", "Backup Manager", "gdrive_access_allowed", allowed)
+	webnotes.conn.set_value("Backup Manager", "Backup Manager", "database_folder_id", database_folder_id)
+	webnotes.conn.set_value("Backup Manager", "Backup Manager", "files_folder_id", files_folder_id)
+	webnotes.conn.set_value("Backup Manager", "Backup Manager", "gdrive_credentials", final_credentials)
+
+@webnotes.whitelist()
+def upload_files(name, mimetype, service, folder_id):
+	if not webnotes.conn:
+		webnotes.connect()
+	file_name = os.path.basename(name)
+	media_body = MediaFileUpload(name, mimetype=mimetype, resumable=True)
+	body = {
+		'title': file_name,
+		'description': 'Backup File',
+		'mimetype': mimetype,
+		'parents': [{
+			'kind': 'drive#filelink',
+			'id': folder_id
+		}]
+	}
+	request = service.files().insert(body=body, media_body=media_body)
+	response = None
+	while response is None:
+		status, response = request.next_chunk()
+
+def backup_to_gdrive():
+	from webnotes.utils.backups import new_backup
+	found_database = False
+	found_files = False
+	if not webnotes.conn:
+		webnotes.connect()
+	flow = get_gdrive_flow()
+	credentials_json = webnotes.conn.get_value("Backup Manager", None, "gdrive_credentials")
+	credentials = oauth2client.client.Credentials.new_from_json(credentials_json)
+	http = httplib2.Http()
+	http = credentials.authorize(http)
+	drive_service = build('drive', 'v2', http=http)
+
+	# upload database
+	backup = new_backup()
+	filename = os.path.basename(backup.backup_path_db)
+	# upload files to database folder
+	upload_files(filename, 'application/x-gzip', drive_service, webnotes.conn.get_value("Backup Manager", None, "database_folder_id"))
+	# upload files to files folder
+	path = os.path.join(get_base_path(),"public", "files")
+	for files in os.listdir(path):
+		filename = path + "/" + files
+		ext = filename.split('.')[-1]
+		size = os.path.getsize(filename)
+		if ext == 'gz' or ext == 'gzip':
+			mimetype = 'application/x-gzip'
+		else:
+			mimetype = mimetypes.types_map["." + ext]
+		#Compare Local File with Server File
+		param = {}
+	  	children = drive_service.children().list(folderId=webnotes.conn.get_value("Backup Manager", None, "files_folder_id"), **param).execute()
+	  	for child in children.get('items', []):
+			file = drive_service.files().get(fileId=child['id']).execute()
+			if files == file['title'] and size == int(file['fileSize']):
+				found_files = True
+				break
+		if not found_files:
+			upload_files(filename, mimetype, drive_service, webnotes.conn.get_value("Backup Manager", None, "files_folder_id"))
+
+def get_gdrive_flow():
+	from oauth2client.client import OAuth2WebServerFlow
+	try:
+		from conf import client_id, client_secret, oauth_scope, redirect_url
+	except ImportError, e:
+		webnotes.msgprint(_("Please set Google Drive access keys in") + " conf.py", 
+		raise_exception=True)
+	flow = OAuth2WebServerFlow(client_id, client_secret, oauth_scope, redirect_url)
+	return flow
+
+def create_erpnext_folder(service):
+	if not webnotes.conn:
+		webnotes.connect()
+	erpnext = {
+		'title': 'erpnext',
+		'mimeType': 'application/vnd.google-apps.folder'
+	}
+	erpnext = service.files().insert(body=erpnext).execute()
+	return erpnext['id']
+
+def create_folder(name, service, folder_id):
+	database = {
+		'title': name,
+		'mimeType': 'application/vnd.google-apps.folder',
+		'parents': [{
+	       	'kind': 'drive#fileLink',
+	       	'id': folder_id
+	    }]
+	}
+	database = service.files().insert(body=database).execute()
+	return database['id']
+
+if __name__=="__main__":
+	backup_to_gdrive()
\ No newline at end of file
diff --git a/setup/doctype/backup_manager/backup_manager.txt b/setup/doctype/backup_manager/backup_manager.txt
index bdb9c50..9a43f34 100644
--- a/setup/doctype/backup_manager/backup_manager.txt
+++ b/setup/doctype/backup_manager/backup_manager.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-03-15 11:06:59", 
   "docstatus": 0, 
-  "modified": "2013-03-15 16:10:05", 
+  "modified": "2013-03-15 17:27:33", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  },