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"
},