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 = """

Backup Uploaded Successfully

Hi there, this is just to inform you + that your backup was successfully uploaded to Google Drive.

+ """ + else: + subject = "[Warning] Backup Upload Failed" + message = """

Backup Upload Failed

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") }}">
- -
-
+ + +
- -
- - {%= __("Print") %} - + + + + {%= __("Customize...") %} + + {%= __("Full Page") %} + + {%= __("PDF") %} +
diff --git a/frappe/public/js/integrations/gsuite.js b/frappe/public/js/integrations/gsuite.js deleted file mode 100644 index 53248a8f32..0000000000 --- a/frappe/public/js/integrations/gsuite.js +++ /dev/null @@ -1,15 +0,0 @@ -frappe.provide("frappe.integration_service"); - -frappe.integration_service.gsuite = { - create_gsuite_file: function(args, opts) { - return frappe.call({ - type:'POST', - method: 'frappe.integrations.doctype.gsuite_templates.gsuite_templates.create_gsuite_doc', - args: args, - callback: function(r) { - var attachment = r.message; - opts.callback && opts.callback(attachment, r); - } - }); - } -};