diff --git a/frappe/boot.py b/frappe/boot.py index 50888fcdd2..d0fa0f2c71 100644 --- a/frappe/boot.py +++ b/frappe/boot.py @@ -76,7 +76,6 @@ def get_bootinfo(): bootinfo.calendars = sorted(frappe.get_hooks("calendars")) bootinfo.treeviews = frappe.get_hooks("treeviews") or [] bootinfo.lang_dict = get_lang_dict() - bootinfo.gsuite_enabled = get_gsuite_status() bootinfo.success_action = get_success_action() bootinfo.update(get_email_accounts(user=frappe.session.user)) bootinfo.energy_points_enabled = is_energy_point_enabled() @@ -258,9 +257,6 @@ def get_unseen_notes(): (select user from `tabNote Seen By` nsb where nsb.parent=`tabNote`.name)''', (frappe.utils.now(), frappe.session.user), as_dict=True) -def get_gsuite_status(): - return (frappe.get_value('Gsuite Settings', None, 'enable') == '1') - def get_success_action(): return frappe.get_all("Success Action", fields=["*"]) diff --git a/frappe/config/integrations.py b/frappe/config/integrations.py index bbe3966b29..f41adc9ea4 100644 --- a/frappe/config/integrations.py +++ b/frappe/config/integrations.py @@ -42,6 +42,11 @@ def get_data(): "name": "S3 Backup Settings", "description": _("S3 Backup Settings"), }, + { + "type": "doctype", + "name": "Google Drive", + "description": _("Google Drive Backup."), + } ] }, { @@ -92,16 +97,6 @@ def get_data(): "name": "Google Settings", "description": _("Google API Settings."), }, - { - "type": "doctype", - "name": "GSuite Settings", - "description": _("Enter keys to enable integration with Google GSuite"), - }, - { - "type": "doctype", - "name": "GSuite Templates", - "description": _("Google GSuite Templates to integration with DocTypes"), - }, { "type": "doctype", "name": "Google Contacts", @@ -111,6 +106,11 @@ def get_data(): "type": "doctype", "name": "Google Calendar", "description": _("Google Calendar Integration."), + }, + { + "type": "doctype", + "name": "Google Drive", + "description": _("Google Drive Integration."), } ] } diff --git a/frappe/core/doctype/file/file.json b/frappe/core/doctype/file/file.json index 81606ad0f6..9bf7d03512 100644 --- a/frappe/core/doctype/file/file.json +++ b/frappe/core/doctype/file/file.json @@ -1,792 +1,226 @@ { - "allow_copy": 0, - "allow_guest_to_view": 0, - "allow_import": 1, - "allow_rename": 0, - "autoname": "", - "beta": 0, - "creation": "2012-12-12 11:19:22", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "editable_grid": 0, + "allow_import": 1, + "creation": "2012-12-12 11:19:22", + "doctype": "DocType", + "engine": "InnoDB", + "field_order": [ + "file_name", + "is_private", + "preview", + "preview_html", + "section_break_5", + "is_home_folder", + "is_attachments_folder", + "file_size", + "column_break_5", + "file_url", + "thumbnail_url", + "folder", + "is_folder", + "section_break_8", + "attached_to_doctype", + "column_break_10", + "attached_to_name", + "attached_to_field", + "lft", + "rgt", + "old_parent", + "content_hash", + "uploaded_to_dropbox", + "uploaded_to_google_drive" + ], "fields": [ { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "file_name", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 1, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "File Name", - "length": 0, - "no_copy": 0, - "oldfieldname": "file_name", - "oldfieldtype": "Data", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "file_name", + "fieldtype": "Data", + "in_global_search": 1, + "label": "File Name", + "oldfieldname": "file_name", + "oldfieldtype": "Data", + "read_only": 1 + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:!doc.is_folder", - "fieldname": "is_private", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Is Private", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "default": "0", + "depends_on": "eval:!doc.is_folder", + "fieldname": "is_private", + "fieldtype": "Check", + "label": "Is Private" + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "preview", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Preview", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "preview", + "fieldtype": "Section Break", + "label": "Preview" + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "preview_html", - "fieldtype": "HTML", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Preview HTML", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "preview_html", + "fieldtype": "HTML", + "label": "Preview HTML" + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "section_break_5", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "section_break_5", + "fieldtype": "Section Break" + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "", - "fieldname": "is_home_folder", - "fieldtype": "Check", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Is Home Folder", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "default": "0", + "fieldname": "is_home_folder", + "fieldtype": "Check", + "hidden": 1, + "label": "Is Home Folder" + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "is_attachments_folder", - "fieldtype": "Check", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Is Attachments Folder", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "default": "0", + "fieldname": "is_attachments_folder", + "fieldtype": "Check", + "hidden": 1, + "label": "Is Attachments Folder" + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "file_size", - "fieldtype": "Int", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "File Size", - "length": 20, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "file_size", + "fieldtype": "Int", + "in_list_view": 1, + "label": "File Size", + "length": 20, + "read_only": 1 + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_5", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "column_break_5", + "fieldtype": "Column Break" + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:!doc.is_folder", - "fieldname": "file_url", - "fieldtype": "Code", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "File URL", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "depends_on": "eval:!doc.is_folder", + "fieldname": "file_url", + "fieldtype": "Code", + "label": "File URL", + "read_only": 1 + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "thumbnail_url", - "fieldtype": "Small Text", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Thumbnail URL", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "thumbnail_url", + "fieldtype": "Small Text", + "label": "Thumbnail URL", + "read_only": 1 + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "folder", - "fieldtype": "Link", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Folder", - "length": 0, - "no_copy": 0, - "options": "File", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "folder", + "fieldtype": "Link", + "hidden": 1, + "label": "Folder", + "options": "File", + "read_only": 1 + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "is_folder", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Is Folder", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "default": "0", + "fieldname": "is_folder", + "fieldtype": "Check", + "label": "Is Folder", + "read_only": 1 + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:!doc.is_folder", - "fieldname": "section_break_8", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "depends_on": "eval:!doc.is_folder", + "fieldname": "section_break_8", + "fieldtype": "Section Break" + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "attached_to_doctype", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 1, - "label": "Attached To DocType", - "length": 0, - "no_copy": 0, - "options": "DocType", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 1, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "attached_to_doctype", + "fieldtype": "Link", + "in_standard_filter": 1, + "label": "Attached To DocType", + "options": "DocType", + "read_only": 1, + "search_index": 1 + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_10", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "column_break_10", + "fieldtype": "Column Break" + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "attached_to_name", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Attached To Name", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 1, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "attached_to_name", + "fieldtype": "Data", + "label": "Attached To Name", + "read_only": 1, + "search_index": 1 + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "attached_to_field", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Attached To Field", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "attached_to_field", + "fieldtype": "Data", + "label": "Attached To Field", + "read_only": 1 + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "lft", - "fieldtype": "Int", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "lft", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "lft", + "fieldtype": "Int", + "hidden": 1, + "label": "lft" + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "rgt", - "fieldtype": "Int", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "rgt", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "rgt", + "fieldtype": "Int", + "hidden": 1, + "label": "rgt" + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "old_parent", - "fieldtype": "Data", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "old_parent", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "old_parent", + "fieldtype": "Data", + "hidden": 1, + "label": "old_parent" + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "content_hash", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Content Hash", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "content_hash", + "fieldtype": "Data", + "label": "Content Hash", + "read_only": 1 + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "uploaded_to_dropbox", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Uploaded To Dropbox", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "default": "0", + "fieldname": "uploaded_to_dropbox", + "fieldtype": "Check", + "label": "Uploaded To Dropbox", + "read_only": 1 + }, + { + "default": "0", + "fieldname": "uploaded_to_google_drive", + "fieldtype": "Check", + "label": "Uploaded To Google Drive", + "read_only": 1 } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "icon": "fa fa-file", - "idx": 1, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "menu_index": 0, - "modified": "2018-10-01 05:22:50.819899", - "modified_by": "Administrator", - "module": "Core", - "name": "File", - "owner": "Administrator", + ], + "icon": "fa fa-file", + "idx": 1, + "modified": "2019-08-16 16:41:03.086023", + "modified_by": "Administrator", + "module": "Core", + "name": "File", + "owner": "Administrator", "permissions": [ { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 1, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "System Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "import": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1, "write": 1 - }, + }, { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 1, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "All", - "set_user_permissions": 0, - "share": 1, - "submit": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "All", + "share": 1, "write": 1 } - ], - "quick_entry": 0, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_order": "ASC", - "title_field": "file_name", - "track_changes": 1, - "track_seen": 0 + ], + "sort_field": "modified", + "sort_order": "ASC", + "title_field": "file_name", + "track_changes": 1 } \ No newline at end of file diff --git a/frappe/hooks.py b/frappe/hooks.py index 41f805f2b6..83ebabe6e0 100644 --- a/frappe/hooks.py +++ b/frappe/hooks.py @@ -179,7 +179,8 @@ scheduler_events = { ], "daily_long": [ "frappe.integrations.doctype.dropbox_settings.dropbox_settings.take_backups_daily", - "frappe.integrations.doctype.s3_backup_settings.s3_backup_settings.take_backups_daily" + "frappe.integrations.doctype.s3_backup_settings.s3_backup_settings.take_backups_daily", + "frappe.integrations.doctype.google_drive.google_drive.daily_backup" ], "weekly_long": [ "frappe.integrations.doctype.dropbox_settings.dropbox_settings.take_backups_weekly", @@ -187,7 +188,8 @@ scheduler_events = { "frappe.utils.change_log.check_for_update", "frappe.desk.doctype.route_history.route_history.flush_old_route_records", "frappe.desk.form.document_follow.send_weekly_updates", - "frappe.social.doctype.energy_point_log.energy_point_log.send_weekly_summary" + "frappe.social.doctype.energy_point_log.energy_point_log.send_weekly_summary", + "frappe.integrations.doctype.google_drive.google_drive.weekly_backup" ], "monthly": [ "frappe.email.doctype.auto_email_report.auto_email_report.send_monthly", diff --git a/frappe/integrations/doctype/google_calendar/google_calendar.py b/frappe/integrations/doctype/google_calendar/google_calendar.py index cc503db9f7..d6ba82ed5a 100644 --- a/frappe/integrations/doctype/google_calendar/google_calendar.py +++ b/frappe/integrations/doctype/google_calendar/google_calendar.py @@ -16,6 +16,7 @@ from frappe.utils import add_days, get_datetime, get_weekdays, now_datetime, add from dateutil import parser from datetime import datetime, timedelta from six.moves.urllib.parse import quote +from frappe.integrations.doctype.google_settings.google_settings import get_auth_url SCOPES = "https://www.googleapis.com/auth/calendar" @@ -81,7 +82,7 @@ class GoogleCalendar(Document): } try: - r = requests.post("https://www.googleapis.com/oauth2/v4/token", data=data).json() + r = requests.post(get_auth_url(), data=data).json() except requests.exceptions.HTTPError: button_label = frappe.bold(_("Allow Google Calendar Access")) frappe.throw(_("Something went wrong during the token generation. Click on {0} to generate a new one.").format(button_label)) @@ -111,7 +112,7 @@ def authorize_access(g_calendar, reauthorize=None): "redirect_uri": redirect_uri, "grant_type": "authorization_code" } - r = requests.post("https://www.googleapis.com/oauth2/v4/token", data=data).json() + r = requests.post(get_auth_url(), data=data).json() if "refresh_token" in r: frappe.db.set_value("Google Calendar", google_calendar.name, "refresh_token", r.get("refresh_token")) @@ -162,7 +163,7 @@ def get_google_calendar_object(g_calendar): credentials_dict = { "token": account.get_access_token(), "refresh_token": account.get_password(fieldname="refresh_token", raise_exception=False), - "token_uri": "https://www.googleapis.com/oauth2/v4/token", + "token_uri": get_auth_url(), "client_id": google_settings.client_id, "client_secret": google_settings.get_password(fieldname="client_secret", raise_exception=False), "scopes": "https://www.googleapis.com/auth/calendar/v3" diff --git a/frappe/integrations/doctype/google_contacts/google_contacts.py b/frappe/integrations/doctype/google_contacts/google_contacts.py index 6610173e3e..e7eaf928d1 100644 --- a/frappe/integrations/doctype/google_contacts/google_contacts.py +++ b/frappe/integrations/doctype/google_contacts/google_contacts.py @@ -8,6 +8,7 @@ import requests from frappe.model.document import Document from frappe import _ from frappe.utils import get_request_site_address +from frappe.integrations.doctype.google_settings.google_settings import get_auth_url SCOPES = "https://www.googleapis.com/auth/contacts" REQUEST = "https://people.googleapis.com/v1/people/me/connections" @@ -38,7 +39,7 @@ class GoogleContacts(Document): } try: - r = requests.post("https://www.googleapis.com/oauth2/v4/token", data=data).json() + r = requests.post(get_auth_url(), data=data).json() except requests.exceptions.HTTPError: button_label = frappe.bold(_('Allow Google Contacts Access')) frappe.throw(_("Something went wrong during the token generation. Click on {0} to generate a new one.").format(button_label)) @@ -69,7 +70,7 @@ def authorize_access(g_contact, reauthorize=None): "redirect_uri": redirect_uri, "grant_type": "authorization_code" } - r = requests.post("https://www.googleapis.com/oauth2/v4/token", data=data).json() + r = requests.post(get_auth_url(), data=data).json() if "refresh_token" in r: frappe.db.set_value("Google Contacts", google_contact.name, "refresh_token", r.get("refresh_token")) diff --git a/frappe/integrations/doctype/gsuite_settings/__init__.py b/frappe/integrations/doctype/google_drive/__init__.py similarity index 100% rename from frappe/integrations/doctype/gsuite_settings/__init__.py rename to frappe/integrations/doctype/google_drive/__init__.py diff --git a/frappe/integrations/doctype/google_drive/google_drive.js b/frappe/integrations/doctype/google_drive/google_drive.js new file mode 100644 index 0000000000..ec3323f89b --- /dev/null +++ b/frappe/integrations/doctype/google_drive/google_drive.js @@ -0,0 +1,62 @@ +// Copyright (c) 2019, Frappe Technologies and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Google Drive', { + refresh: function(frm) { + if (!frm.doc.enable) { + frm.dashboard.set_headline(__("To use Google Drive, enable Google Settings.")); + } + + frappe.realtime.on("upload_to_google_drive", (data) => { + if (data.progress) { + frm.dashboard.show_progress("Uploading to Google Drive", data.progress / data.total * 100, + __("{0}", [data.message])); + if (data.progress === data.total) { + frm.dashboard.hide_progress("Uploading to Google Drive"); + } + } + }); + + if (frm.doc.enable && frm.doc.refresh_token) { + let sync_button = frm.add_custom_button(__("Take Backup"), function () { + frappe.show_alert({ + indicator: "green", + message: __("Backing up to Google Drive.") + }); + frappe.call({ + method: "frappe.integrations.doctype.google_drive.google_drive.take_backup", + btn: sync_button + }).then((r) => { + frappe.msgprint(r.message); + }); + }); + } + + if (frm.doc.enable && frm.doc.backup_folder_name && !frm.doc.refresh_token) { + frm.dashboard.set_headline(__("Click on Authorize Google Drive Access to authorize Google Drive Access.")); + } + + if (frm.doc.enable && frm.doc.refresh_token && frm.doc.authorization_code) { + frm.page.set_indicator("Authorized", "green"); + } + }, + authorize_google_drive_access: function(frm) { + let reauthorize = 0; + if (frm.doc.authorization_code) { + reauthorize = 1; + } + + frappe.call({ + method: "frappe.integrations.doctype.google_drive.google_drive.authorize_access", + args: { + "reauthorize": reauthorize + }, + callback: function(r) { + if (!r.exc) { + frm.save(); + window.open(r.message.url); + } + } + }); + } +}); diff --git a/frappe/integrations/doctype/google_drive/google_drive.json b/frappe/integrations/doctype/google_drive/google_drive.json new file mode 100644 index 0000000000..7ea26dadc8 --- /dev/null +++ b/frappe/integrations/doctype/google_drive/google_drive.json @@ -0,0 +1,133 @@ +{ + "creation": "2019-08-13 17:24:05.470876", + "doctype": "DocType", + "engine": "InnoDB", + "field_order": [ + "enable", + "google_drive_section", + "backup_folder_name", + "frequency", + "email", + "send_email_for_successful_backup", + "file_backup", + "authorize_google_drive_access", + "column_break_5", + "backup_folder_id", + "last_backup_on", + "refresh_token", + "authorization_code" + ], + "fields": [ + { + "default": "0", + "fieldname": "enable", + "fieldtype": "Check", + "label": "Enable" + }, + { + "fieldname": "backup_folder_name", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Backup Folder Name", + "reqd": 1 + }, + { + "depends_on": "eval:!doc.__islocal", + "fieldname": "authorize_google_drive_access", + "fieldtype": "Button", + "label": "Authorize Google Drive Access" + }, + { + "fieldname": "column_break_5", + "fieldtype": "Column Break" + }, + { + "fieldname": "backup_folder_id", + "fieldtype": "Data", + "label": "Backup Folder ID", + "read_only": 1 + }, + { + "fieldname": "frequency", + "fieldtype": "Select", + "label": "Frequency", + "options": "\nDaily\nWeekly", + "reqd": 1 + }, + { + "fieldname": "refresh_token", + "fieldtype": "Data", + "hidden": 1, + "label": "Refresh Token" + }, + { + "fieldname": "authorization_code", + "fieldtype": "Data", + "hidden": 1, + "label": "Authorization Code" + }, + { + "fieldname": "last_backup_on", + "fieldtype": "Datetime", + "label": "Last Backup On", + "read_only": 1 + }, + { + "default": "0", + "description": "Note: By default emails for failed backups are sent.", + "fieldname": "send_email_for_successful_backup", + "fieldtype": "Check", + "label": "Send Email for Successful backup" + }, + { + "default": "0", + "fieldname": "file_backup", + "fieldtype": "Check", + "label": "File Backup" + }, + { + "depends_on": "enable", + "fieldname": "google_drive_section", + "fieldtype": "Section Break", + "label": "Google Drive" + }, + { + "fieldname": "email", + "fieldtype": "Data", + "label": "Send Notification To", + "options": "Email", + "reqd": 1 + } + ], + "issingle": 1, + "modified": "2019-08-21 17:33:28.516614", + "modified_by": "qwe@qwe.com", + "module": "Integrations", + "name": "Google Drive", + "owner": "Administrator", + "permissions": [ + { + "create": 1, + "delete": 1, + "email": 1, + "print": 1, + "read": 1, + "role": "System Manager", + "share": 1, + "write": 1 + }, + { + "create": 1, + "delete": 1, + "email": 1, + "print": 1, + "read": 1, + "role": "All", + "share": 1, + "write": 1 + } + ], + "sort_field": "modified", + "sort_order": "ASC", + "track_changes": 1 +} \ No newline at end of file diff --git a/frappe/integrations/doctype/google_drive/google_drive.py b/frappe/integrations/doctype/google_drive/google_drive.py new file mode 100644 index 0000000000..8078c702c0 --- /dev/null +++ b/frappe/integrations/doctype/google_drive/google_drive.py @@ -0,0 +1,255 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2019, Frappe Technologies and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +import requests +import googleapiclient.discovery +import google.oauth2.credentials +import os + +from frappe import _ +from googleapiclient.errors import HttpError +from frappe.model.document import Document +from frappe.utils import get_request_site_address +from frappe.utils.background_jobs import enqueue +from six.moves.urllib.parse import quote +from apiclient.http import MediaFileUpload +from frappe.utils import get_backups_path, get_bench_path +from frappe.utils.backups import new_backup +from frappe.integrations.doctype.google_settings.google_settings import get_auth_url + +SCOPES = "https://www.googleapis.com/auth/drive" + +class GoogleDrive(Document): + + def validate(self): + doc_before_save = self.get_doc_before_save() + if doc_before_save and doc_before_save.backup_folder_name != self.backup_folder_name: + self.backup_folder_id = '' + + def get_access_token(self): + google_settings = frappe.get_doc("Google Settings") + + if not google_settings.enable: + frappe.throw(_("Google Integration is disabled.")) + + if not self.refresh_token: + button_label = frappe.bold(_("Allow Google Drive Access")) + raise frappe.ValidationError(_("Click on {0} to generate Refresh Token.").format(button_label)) + + data = { + "client_id": google_settings.client_id, + "client_secret": google_settings.get_password(fieldname="client_secret", raise_exception=False), + "refresh_token": self.get_password(fieldname="refresh_token", raise_exception=False), + "grant_type": "refresh_token", + "scope": SCOPES + } + + try: + r = requests.post(get_auth_url(), data=data).json() + except requests.exceptions.HTTPError: + button_label = frappe.bold(_("Allow Google Drive Access")) + frappe.throw(_("Something went wrong during the token generation. Click on {0} to generate a new one.").format(button_label)) + + return r.get("access_token") + +@frappe.whitelist() +def authorize_access(reauthorize=None): + """ + If no Authorization code get it from Google and then request for Refresh Token. + Google Contact Name is set to flags to set_value after Authorization Code is obtained. + """ + + google_settings = frappe.get_doc("Google Settings") + google_drive = frappe.get_doc("Google Drive") + + redirect_uri = get_request_site_address(True) + "?cmd=frappe.integrations.doctype.google_drive.google_drive.google_callback" + + if not google_drive.authorization_code or reauthorize: + if reauthorize: + frappe.db.set_value("Google Drive", None, "backup_folder_id", "") + return get_authentication_url(client_id=google_settings.client_id, redirect_uri=redirect_uri) + else: + try: + data = { + "code": google_drive.authorization_code, + "client_id": google_settings.client_id, + "client_secret": google_settings.get_password(fieldname="client_secret", raise_exception=False), + "redirect_uri": redirect_uri, + "grant_type": "authorization_code" + } + r = requests.post(get_auth_url(), data=data).json() + + if "refresh_token" in r: + frappe.db.set_value("Google Drive", google_drive.name, "refresh_token", r.get("refresh_token")) + frappe.db.commit() + + frappe.local.response["type"] = "redirect" + frappe.local.response["location"] = "/desk#Form/{0}".format(quote("Google Drive")) + + frappe.msgprint(_("Google Drive has been configured.")) + except Exception as e: + frappe.throw(e) + +def get_authentication_url(client_id, redirect_uri): + return { + "url": "https://accounts.google.com/o/oauth2/v2/auth?access_type=offline&response_type=code&prompt=consent&client_id={}&include_granted_scopes=true&scope={}&redirect_uri={}".format(client_id, SCOPES, redirect_uri) + } + +@frappe.whitelist() +def google_callback(code=None): + """ + Authorization code is sent to callback as per the API configuration + """ + frappe.db.set_value("Google Drive", None, "authorization_code", code) + frappe.db.commit() + + authorize_access() + +def get_google_drive_object(): + """ + Returns an object of Google Drive. + """ + google_settings = frappe.get_doc("Google Settings") + account = frappe.get_doc("Google Drive") + + credentials_dict = { + "token": account.get_access_token(), + "refresh_token": account.get_password(fieldname="refresh_token", raise_exception=False), + "token_uri": get_auth_url(), + "client_id": google_settings.client_id, + "client_secret": google_settings.get_password(fieldname="client_secret", raise_exception=False), + "scopes": "https://www.googleapis.com/auth/drive/v3" + } + + credentials = google.oauth2.credentials.Credentials(**credentials_dict) + google_drive = googleapiclient.discovery.build("drive", "v3", credentials=credentials) + + return google_drive, account + +def check_for_folder_in_google_drive(): + """Checks if folder exists in Google Drive else create it.""" + def _create_folder_in_google_drive(google_drive, account): + file_metadata = { + "name": account.backup_folder_name, + "mimeType": "application/vnd.google-apps.folder" + } + + try: + folder = google_drive.files().create(body=file_metadata, fields="id").execute() + frappe.db.set_value("Google Drive", None, "backup_folder_id", folder.get("id")) + frappe.db.commit() + except HttpError as e: + frappe.throw(_("Google Drive - Could not create folder in Google Drive - Error Code {0}").format(e)) + + google_drive, account = get_google_drive_object() + + if account.backup_folder_id: + return + + backup_folder_exists = False + + try: + google_drive_folders = google_drive.files().list(q="mimeType='application/vnd.google-apps.folder'").execute() + except HttpError as e: + frappe.throw(_("Google Drive - Could not find folder in Google Drive - Error Code {0}").format(e)) + + for f in google_drive_folders.get("files"): + if f.get("name") == account.backup_folder_name: + frappe.db.set_value("Google Drive", None, "backup_folder_id", f.get("id")) + frappe.db.commit() + backup_folder_exists = True + break + + if not backup_folder_exists: + _create_folder_in_google_drive(google_drive, account) + +@frappe.whitelist() +def take_backup(): + """Enqueue longjob for taking backup to Google Drive""" + enqueue("frappe.integrations.doctype.google_drive.google_drive.upload_system_backup_to_google_drive", queue='long', timeout=1500) + frappe.msgprint(_("Queued for backup. It may take a few minutes to an hour.")) + +def upload_system_backup_to_google_drive(): + """ + Upload system backup to Google Drive + """ + # Get Google Drive Object + google_drive, account = get_google_drive_object() + + # Check if folder exists in Google Drive + check_for_folder_in_google_drive() + account.load_from_db() + + progress(1, "Backing up Data.") + backup = new_backup() + + fileurl_backup = os.path.basename(backup.backup_path_db) + fileurl_public_files = os.path.basename(backup.backup_path_files) + fileurl_private_files = os.path.basename(backup.backup_path_private_files) + + + for fileurl in [fileurl_backup, fileurl_public_files, fileurl_private_files]: + file_metadata = { + "name": fileurl, + "parents": [account.backup_folder_id] + } + + try: + media = MediaFileUpload(get_absolute_path(filename=fileurl), mimetype="application/gzip", resumable=True) + except IOError as e: + frappe.throw(_("Google Drive - Could not locate locate - {0}").format(e)) + + try: + progress(2, "Uploading backup to Google Drive.") + google_drive.files().create(body=file_metadata, media_body=media, fields="id").execute() + except HttpError as e: + send_email(success=False, error=e) + frappe.msgprint(_("Google Drive - Could not upload backup - Error {0}").format(e)) + + progress(3, "Uploading successful.") + frappe.db.set_value("Google Drive", None, "last_backup_on", frappe.utils.now_datetime()) + send_email(success=True) + return _("Google Drive Backup Successful.") + +def daily_backup(): + if frappe.db.get_single_value("Google Drive", "frequency") == "Daily": + upload_system_backup_to_google_drive() + +def weekly_backup(): + if frappe.db.get_single_value("Google Drive", "frequency") == "Weekly": + upload_system_backup_to_google_drive() + +def get_absolute_path(filename): + file_path = os.path.join(get_backups_path()[2:], filename) + return "{0}/sites/{1}".format(get_bench_path(), file_path) + +def progress(progress, message): + frappe.publish_realtime("upload_to_google_drive", dict(progress=progress, total=3, message=message), user=frappe.session.user) + +def send_email(success, error=None): + if success: + if not frappe.db.get_single_value("Google Drive", "send_email_for_successful_backup"): + return + + subject = "Backup Upload Successful" + message = """
Hi there, this is just to inform you + that your backup was successfully uploaded to Google Drive.
+ """ + else: + subject = "[Warning] Backup Upload Failed" + message = """Oops, your automated backup to Google Drive + failed.
+Error message:
+
{0}
+
+ Please contact your system manager for more information.
+ """.format(error) + + frappe.sendmail( + recipients=frappe.db.get_single_value("Google Drive", "email"), + subject=subject, + message=message + ) \ No newline at end of file diff --git a/frappe/integrations/doctype/google_calendar/test_google_calendar.py b/frappe/integrations/doctype/google_drive/test_google_drive.py similarity index 80% rename from frappe/integrations/doctype/google_calendar/test_google_calendar.py rename to frappe/integrations/doctype/google_drive/test_google_drive.py index 0fad81d7f5..f06e13572c 100644 --- a/frappe/integrations/doctype/google_calendar/test_google_calendar.py +++ b/frappe/integrations/doctype/google_drive/test_google_drive.py @@ -6,5 +6,5 @@ from __future__ import unicode_literals # import frappe import unittest -class TestGoogleCalendar(unittest.TestCase): +class TestGoogleDrive(unittest.TestCase): pass diff --git a/frappe/integrations/doctype/google_settings/google_settings.py b/frappe/integrations/doctype/google_settings/google_settings.py index 50713f187c..ecc975235a 100644 --- a/frappe/integrations/doctype/google_settings/google_settings.py +++ b/frappe/integrations/doctype/google_settings/google_settings.py @@ -7,4 +7,7 @@ from __future__ import unicode_literals from frappe.model.document import Document class GoogleSettings(Document): - pass \ No newline at end of file + pass + +def get_auth_url(): + return "https://www.googleapis.com/oauth2/v4/token" \ No newline at end of file diff --git a/frappe/integrations/doctype/gsuite_settings/gsuite_settings.js b/frappe/integrations/doctype/gsuite_settings/gsuite_settings.js deleted file mode 100644 index 71db53c5cc..0000000000 --- a/frappe/integrations/doctype/gsuite_settings/gsuite_settings.js +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) 2017, Frappe Technologies and contributors -// For license information, please see license.txt - -frappe.ui.form.on('GSuite Settings', { - refresh: function(frm) { - frm.clear_custom_buttons(); - }, - - allow_gsuite_access: function(frm) { - if (frm.doc.client_id && frm.doc.client_secret) { - frappe.call({ - method: "frappe.integrations.doctype.gsuite_settings.gsuite_settings.gsuite_callback", - callback: function(r) { - if(!r.exc) { - frm.save(); - window.open(r.message.url); - } - } - }); - } - else { - frappe.msgprint(__("Please enter values for GSuite Access Key and GSuite Access Secret")) - } - }, - run_script_test: function(frm) { - if (frm.doc.client_id && frm.doc.client_secret) { - frappe.call({ - method: "frappe.integrations.doctype.gsuite_settings.gsuite_settings.run_script_test", - callback: function(r) { - if(!r.exc) { - if (r.message == 'ping') { - frappe.msgprint(__('GSuite test executed with success. GSuite integration is correctly configured'),__('GSuite script test')); - } - } - } - }); - } - else { - frappe.msgprint(__("Please enter values for GSuite Access Key and GSuite Access Secret")); - } - } -}); diff --git a/frappe/integrations/doctype/gsuite_settings/gsuite_settings.json b/frappe/integrations/doctype/gsuite_settings/gsuite_settings.json deleted file mode 100644 index 65ed904c74..0000000000 --- a/frappe/integrations/doctype/gsuite_settings/gsuite_settings.json +++ /dev/null @@ -1,404 +0,0 @@ -{ - "allow_copy": 1, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "beta": 0, - "creation": "2017-04-21 16:57:30.264478", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "System", - "editable_grid": 1, - "engine": "InnoDB", - "fields": [ - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "enable", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Enable", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:doc.enable", - "fieldname": "google_credentials", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Google Credentials", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "", - "fieldname": "client_id", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Client ID", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "", - "fieldname": "client_secret", - "fieldtype": "Password", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Client Secret", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:(doc.client_secret && doc.client_id)", - "fieldname": "allow_gsuite_access", - "fieldtype": "Button", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Allow GSuite access", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 1, - "columns": 0, - "depends_on": "eval:doc.enable", - "fieldname": "google_apps_script", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Google Apps Script", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "https://script.google.com/macros/s/AKfycbxIFOx3301xwtF2IFPJ4pUQGqkNF3hBiBebppWkeKn6fKZRQvk/exec", - "depends_on": "", - "description": "If you aren't using own publish Google Apps Script webapp you can use the default https://script.google.com/macros/s/AKfycbxIFOx3301xwtF2IFPJ4pUQGqkNF3hBiBebppWkeKn6fKZRQvk/exec ", - "fieldname": "script_url", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Script URL", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "", - "description": "Copy and paste this code into and empty Code.gs in your project at script.google.com", - "fieldname": "script_code", - "fieldtype": "HTML", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Script Code", - "length": 0, - "no_copy": 0, - "options": "// ERPNEXT GSuite integration\n//\n\nfunction doGet(e){\n return ContentService.createTextOutput('ok');\n}\n\nfunction doPost(e) {\n var p = JSON.parse(e.postData.contents);\n\n switch(p.exec){\n case 'new':\n var url = createDoc(p);\n result = { 'url': url };\n break;\n case 'test':\n result = { 'test':'ping' , 'version':'1.0'}\n }\n return ContentService.createTextOutput(JSON.stringify(result)).setMimeType(ContentService.MimeType.JSON);\n}\n\nfunction replaceVars(body,p){\n for (key in p) {\n if (p.hasOwnProperty(key)) {\n if (p[key] != null) {\n body.replaceText('{{'+key+'}}', p[key]);\n }\n }\n } \n}\n\nfunction createDoc(p) {\n if(p.destination){\n var folder = DriveApp.getFolderById(p.destination);\n } else {\n var folder = DriveApp.getRootFolder();\n }\n var template = DriveApp.getFileById( p.template )\n var newfile = template.makeCopy( p.filename , folder );\n\n switch(newfile.getMimeType()){\n case MimeType.GOOGLE_DOCS:\n var body = DocumentApp.openById(newfile.getId()).getBody();\n replaceVars(body,p.vars);\n break;\n case MimeType.GOOGLE_SHEETS:\n //TBD\n case MimeType.GOOGLE_SLIDES:\n //TBD\n }\n return newfile.getUrl()\n}\n\n",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 1,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "depends_on": "eval:(doc.client_id && doc.client_secret && doc.authorization_code && doc.refresh_token && doc.script_url)",
- "fieldname": "run_script_test",
- "fieldtype": "Button",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Run Script Test",
- "length": 0,
- "no_copy": 1,
- "permlevel": 0,
- "precision": "",
- "print_hide": 1,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 1,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "refresh_token",
- "fieldtype": "Password",
- "hidden": 1,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "refresh_token",
- "length": 0,
- "no_copy": 1,
- "permlevel": 0,
- "precision": "",
- "print_hide": 1,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 1,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "authorization_code",
- "fieldtype": "Password",
- "hidden": 1,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Authorization Code",
- "length": 0,
- "no_copy": 1,
- "permlevel": 0,
- "precision": "",
- "print_hide": 1,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 1,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "unique": 0
- }
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "idx": 0,
- "image_view": 0,
- "in_create": 1,
- "is_submittable": 0,
- "issingle": 1,
- "istable": 0,
- "max_attachments": 0,
- "modified": "2017-10-20 16:11:47.757030",
- "modified_by": "Administrator",
- "module": "Integrations",
- "name": "GSuite Settings",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [
- {
- "amend": 0,
- "apply_user_permissions": 0,
- "cancel": 0,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 0,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 0,
- "role": "System Manager",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
- "write": 1
- }
- ],
- "quick_entry": 1,
- "read_only": 1,
- "read_only_onload": 0,
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 1,
- "track_seen": 0
-}
\ No newline at end of file
diff --git a/frappe/integrations/doctype/gsuite_settings/gsuite_settings.py b/frappe/integrations/doctype/gsuite_settings/gsuite_settings.py
deleted file mode 100644
index 4e88ad736c..0000000000
--- a/frappe/integrations/doctype/gsuite_settings/gsuite_settings.py
+++ /dev/null
@@ -1,87 +0,0 @@
- # Copyright (c) 2017, Frappe Technologies and contributors
-# -*- coding: utf-8 -*-
-# For license information, please see license.txt
-
-from __future__ import unicode_literals
-import frappe
-from frappe import _
-from frappe.model.document import Document
-from frappe.utils import get_request_site_address
-import requests
-from json import dumps
-from frappe.utils.response import json_handler
-
-SCOPES = 'https://www.googleapis.com/auth/drive'
-
-class GSuiteSettings(Document):
-
- def get_access_token(self):
- if not self.refresh_token:
- raise frappe.ValidationError(_("Google GSuite is not configured."))
- data = {
- 'client_id': self.client_id,
- 'client_secret': self.get_password(fieldname='client_secret',raise_exception=False),
- 'refresh_token': self.get_password(fieldname='refresh_token',raise_exception=False),
- 'grant_type': "refresh_token",
- 'scope': SCOPES
- }
- try:
- r = requests.post('https://www.googleapis.com/oauth2/v4/token', data=data).json()
- except requests.exceptions.HTTPError:
- frappe.throw(_("Something went wrong during the token generation. Please request again an authorization code."))
- return r.get('access_token')
-
-@frappe.whitelist()
-def gsuite_callback(code=None):
- doc = frappe.get_doc("GSuite Settings")
- if code is None:
- return {
- 'url': 'https://accounts.google.com/o/oauth2/v2/auth?access_type=offline&response_type=code&client_id={}&scope={}&redirect_uri={}?cmd=frappe.integrations.doctype.gsuite_settings.gsuite_settings.gsuite_callback'.format(doc.client_id, SCOPES, get_request_site_address(True))
- }
- else:
- try:
- data = {'code': code,
- 'client_id': doc.client_id,
- 'client_secret': doc.get_password(fieldname='client_secret',raise_exception=False),
- 'redirect_uri': get_request_site_address(True) + '?cmd=frappe.integrations.doctype.gsuite_settings.gsuite_settings.gsuite_callback',
- 'grant_type': 'authorization_code'}
- r = requests.post('https://www.googleapis.com/oauth2/v4/token', data=data).json()
- frappe.db.set_value("Gsuite Settings", None, "authorization_code", code)
- if 'refresh_token' in r:
- frappe.db.set_value("Gsuite Settings", None, "refresh_token", r['refresh_token'])
- frappe.db.commit()
- return
- except Exception as e:
- frappe.throw(e.message)
-
-def run_gsuite_script(option, filename = None, template_id = None, destination_id = None, json_data = None):
- gdoc = frappe.get_doc('GSuite Settings')
- if gdoc.script_url:
- data = {
- 'exec': option,
- 'filename': filename,
- 'template': template_id,
- 'destination': destination_id,
- 'vars' : json_data
- }
- headers = {'Authorization': 'Bearer {}'.format( gdoc.get_access_token() )}
-
- try:
- r = requests.post(gdoc.script_url, headers=headers, data=dumps(data, default=json_handler, separators=(',',':')))
- except Exception as e:
- frappe.throw(e.message)
-
- try:
- r = r.json()
- except:
- # if request doesn't return json show HTML ask permissions or to identify the error on google side
- frappe.throw(r.text)
-
- return r
- else:
- frappe.throw(_('Please set script URL on Gsuite Settings'))
-
-@frappe.whitelist()
-def run_script_test():
- r = run_gsuite_script('test')
- return r['test']
diff --git a/frappe/integrations/doctype/gsuite_templates/__init__.py b/frappe/integrations/doctype/gsuite_templates/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/frappe/integrations/doctype/gsuite_templates/gsuite_templates.js b/frappe/integrations/doctype/gsuite_templates/gsuite_templates.js
deleted file mode 100644
index ddaa740afd..0000000000
--- a/frappe/integrations/doctype/gsuite_templates/gsuite_templates.js
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright (c) 2017, Frappe Technologies and contributors
-// For license information, please see license.txt
-
-frappe.ui.form.on('GSuite Templates', {
- refresh: function(frm) {
- if (frm.is_new()) {
- // if doc is new, get all options immediately
- frm.trigger('set_available_docs');
- frm.trigger('set_available_folders');
- }
- },
- set_available_docs: function(frm) {
- frappe.call({
- // get documents from Google Drive
- method: 'frappe.integrations.doctype.gsuite_templates.gsuite_templates.get_gdrive_docs',
- callback: function(res) {
- // set available documents as options
- set_gsuite_template_options(frm, 'template_id', res);
- }
- });
- },
- set_available_folders: function(frm) {
- frappe.call({
- // get folders from Google Drive
- method: 'frappe.integrations.doctype.gsuite_templates.gsuite_templates.get_gdrive_folders',
- callback: function(res) {
- // set available folders as options
- set_gsuite_template_options(frm, 'destination_id', res);
- }
- });
- },
-});
-
-const set_gsuite_template_options = function(frm, field, data) {
- var options = [];
- (data.message || []).forEach(function(row){
- options.push({'value': row.id, 'label': row.name});
- });
- frm.set_df_property(field, 'options', options);
-};
-
diff --git a/frappe/integrations/doctype/gsuite_templates/gsuite_templates.json b/frappe/integrations/doctype/gsuite_templates/gsuite_templates.json
deleted file mode 100644
index e0e047a671..0000000000
--- a/frappe/integrations/doctype/gsuite_templates/gsuite_templates.json
+++ /dev/null
@@ -1,228 +0,0 @@
-{
- "allow_copy": 0,
- "allow_events_in_timeline": 0,
- "allow_guest_to_view": 0,
- "allow_import": 0,
- "allow_rename": 0,
- "autoname": "field:template_name",
- "beta": 0,
- "creation": "2017-04-24 09:53:41.813982",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "Setup",
- "editable_grid": 1,
- "engine": "InnoDB",
- "fields": [
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fetch_if_empty": 0,
- "fieldname": "template_name",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Template Name",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 1
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fetch_if_empty": 0,
- "fieldname": "related_doctype",
- "fieldtype": "Link",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Related DocType",
- "length": 0,
- "no_copy": 0,
- "options": "DocType",
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fetch_if_empty": 0,
- "fieldname": "template_id",
- "fieldtype": "Select",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Template ID",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 1,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "default": "New Document for {name} ",
- "fetch_if_empty": 0,
- "fieldname": "document_name",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 1,
- "in_standard_filter": 0,
- "label": "Document Name",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 1,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
- {
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fetch_if_empty": 0,
- "fieldname": "destination_id",
- "fieldtype": "Select",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Destination ID",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 1,
- "translatable": 0,
- "unique": 0
- }
- ],
- "has_web_view": 0,
- "hide_toolbar": 0,
- "idx": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 0,
- "istable": 0,
- "max_attachments": 0,
- "modified": "2019-04-14 00:13:49.999149",
- "modified_by": "Administrator",
- "module": "Integrations",
- "name": "GSuite Templates",
- "name_case": "",
- "owner": "Administrator",
- "permissions": [
- {
- "amend": 0,
- "cancel": 0,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "System Manager",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
- "write": 1
- }
- ],
- "quick_entry": 0,
- "read_only": 0,
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 1,
- "track_seen": 0,
- "track_views": 0
-}
\ No newline at end of file
diff --git a/frappe/integrations/doctype/gsuite_templates/gsuite_templates.py b/frappe/integrations/doctype/gsuite_templates/gsuite_templates.py
deleted file mode 100644
index 66028a13d4..0000000000
--- a/frappe/integrations/doctype/gsuite_templates/gsuite_templates.py
+++ /dev/null
@@ -1,93 +0,0 @@
-# -*- coding: utf-8 -*-
-# Copyright (c) 2017, Frappe Technologies and contributors
-# For license information, please see license.txt
-
-from __future__ import unicode_literals
-import requests
-import frappe
-from frappe import _
-from frappe.model.document import Document
-from frappe.integrations.doctype.gsuite_settings.gsuite_settings import run_gsuite_script
-
-class GSuiteTemplates(Document):
- pass
-
-@frappe.whitelist()
-def create_gsuite_doc(doctype, docname, gs_template=None):
- templ = frappe.get_doc('GSuite Templates', gs_template)
- doc = frappe.get_doc(doctype, docname)
-
- if not doc.has_permission("read"):
- raise frappe.PermissionError
-
- json_data = doc.as_dict()
- filename = templ.document_name.format(**json_data)
-
- response = run_gsuite_script('new', filename, templ.template_id, templ.destination_id, json_data)
-
- _file = frappe.get_doc({
- "doctype": "File",
- "file_url": response['url'],
- "file_name": filename,
- "attached_to_doctype": doctype,
- "attached_to_name": docname,
- "attached_to_field": True,
- "folder": "Home/Attachments"})
- _file.save()
-
- comment = frappe.get_doc(doctype, docname).add_comment("Attachment",
- _("added {0}").format("{file_name}{icon}".format(**{
- "icon": ' ' if _file.is_private else "",
- "file_url": _file.file_url.replace("#", "%23") if _file.file_name else _file.file_url,
- "file_name": _file.file_name or _file.file_url
- })))
-
- return {
- "name": _file.name,
- "file_name": _file.file_name,
- "file_url": _file.file_url,
- "is_private": _file.is_private,
- "comment": comment.as_dict() if comment else {}
- }
-
-@frappe.whitelist()
-def get_gdrive_docs():
- """ Return a list of Google Docs files in Google Drive """
- return get_gdrive_files('application/vnd.google-apps.document')
-
-@frappe.whitelist()
-def get_gdrive_folders():
- """ Return a list of folders in Google Drive """
- return get_gdrive_files('application/vnd.google-apps.folder')
-
-def get_gdrive_files(mime_type):
- """ Get a list of files of the specified mime_type from Google Drive
-
- returns [
- {
- "kind": "drive#file",
- "id": "sf_lk-U6lYhVvdgsdf98cvkbj87rl6piFtnLEN9oNsrg",
- "name": "My File Name",
- "mimeType": mime_type
- }
- ]
- """
- settings = frappe.get_single("GSuite Settings")
- token = settings.get_access_token()
- url = 'https://www.googleapis.com/drive/v3/files'
-
- params = {
- "q": "mimeType='{}'".format(mime_type)
- }
-
- headers = {
- 'Authorization': 'Bearer {}'.format(token),
- 'Accept': 'application/json'
- }
-
- try:
- response = requests.get(url, params=params, headers=headers)
- except requests.exceptions.RequestException as err:
- frappe.throw(err)
-
- return response.json().get('files')
diff --git a/frappe/integrations/doctype/gsuite_templates/test_gsuite_templates.py b/frappe/integrations/doctype/gsuite_templates/test_gsuite_templates.py
deleted file mode 100644
index aad8e9fae6..0000000000
--- a/frappe/integrations/doctype/gsuite_templates/test_gsuite_templates.py
+++ /dev/null
@@ -1,10 +0,0 @@
-# -*- coding: utf-8 -*-
-# Copyright (c) 2017, Frappe Technologies and Contributors
-# See license.txt
-from __future__ import unicode_literals
-
-import frappe
-import unittest
-
-class TestGSuiteTemplates(unittest.TestCase):
- pass
diff --git a/frappe/patches/v12_0/delete_gsuite_if_exists.py b/frappe/patches/v12_0/delete_gsuite_if_exists.py
new file mode 100644
index 0000000000..7379ac9cdf
--- /dev/null
+++ b/frappe/patches/v12_0/delete_gsuite_if_exists.py
@@ -0,0 +1,8 @@
+import frappe
+
+def execute():
+ '''
+ Remove GSuite Template and GSuite Settings
+ '''
+ frappe.delete_doc_if_exists("DocType", "GSuite Settings")
+ frappe.delete_doc_if_exists("DocType", "GSuite Templates")
\ No newline at end of file
diff --git a/frappe/public/build.json b/frappe/public/build.json
index c9050e6a5c..720b2fb2e3 100755
--- a/frappe/public/build.json
+++ b/frappe/public/build.json
@@ -187,7 +187,6 @@
"public/js/frappe/ui/upload.html",
"public/js/frappe/upload.js",
- "public/js/integrations/gsuite.js",
"public/js/frappe/ui/tree.js",
"public/js/frappe/views/container.js",
diff --git a/frappe/public/js/frappe/form/templates/print_layout.html b/frappe/public/js/frappe/form/templates/print_layout.html
index 5446ea6425..9bdba0d99d 100644
--- a/frappe/public/js/frappe/form/templates/print_layout.html
+++ b/frappe/public/js/frappe/form/templates/print_layout.html
@@ -7,33 +7,33 @@
placeholder="{{ __("Language") }}">