From 34e13add4c6bb567063d0cc9b6ec5ccece5704e7 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Mon, 18 Mar 2013 11:14:25 +0530 Subject: [PATCH 1/3] on deletion of lead, delete communication --- selling/doctype/lead/lead.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/selling/doctype/lead/lead.py b/selling/doctype/lead/lead.py index c336fe2132..571cdfd516 100644 --- a/selling/doctype/lead/lead.py +++ b/selling/doctype/lead/lead.py @@ -97,7 +97,6 @@ class DocType(SellingController): 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) From 6f1dd26100647baacad14cd9503d0ffa952884ae Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Mon, 18 Mar 2013 11:14:25 +0530 Subject: [PATCH 2/3] on deletion of lead, delete communication reference --- selling/doctype/lead/lead.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/selling/doctype/lead/lead.py b/selling/doctype/lead/lead.py index c336fe2132..571cdfd516 100644 --- a/selling/doctype/lead/lead.py +++ b/selling/doctype/lead/lead.py @@ -97,7 +97,6 @@ class DocType(SellingController): 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) From b0f0e7a82f2f5e2ed765e17b16c5d9241c98755c Mon Sep 17 00:00:00 2001 From: Akhilesh Darjee Date: Mon, 18 Mar 2013 11:15:44 +0530 Subject: [PATCH 3/3] added backup_googledrive.py in backup_manager --- .../backup_manager/backup_googledrive.py | 134 ++++++++++++++++++ .../doctype/backup_manager/backup_manager.txt | 2 +- 2 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 setup/doctype/backup_manager/backup_googledrive.py diff --git a/setup/doctype/backup_manager/backup_googledrive.py b/setup/doctype/backup_manager/backup_googledrive.py new file mode 100644 index 0000000000..b1cb73a6d0 --- /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 bdb9c50605..9a43f34746 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" },