From 77018fc9d6ab714a3e5be292386c2077c3537ebc Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Mon, 10 Aug 2020 11:07:51 +0530 Subject: [PATCH] fix(cleanup): cleanup layout of doctype, user, role, add home_page to Portal Settings, Role --- frappe/auth.py | 13 +- frappe/core/doctype/doctype/doctype.json | 84 +++++- frappe/core/doctype/module_def/module_def.js | 4 +- .../core/doctype/module_def/module_def.json | 236 +++++---------- frappe/core/doctype/module_def/module_def.py | 10 +- frappe/core/doctype/role/role.json | 280 +++++------------ .../doctype/server_script/server_script.js | 45 ++- .../doctype/server_script/server_script.json | 15 +- frappe/core/doctype/user/user.json | 67 ++++- .../onboarding_step/onboarding_step.json | 2 +- .../generate_theme_files_in_public_folder.py | 7 +- frappe/public/less/page.less | 4 +- frappe/utils/boilerplate.py | 5 +- .../portal_settings/portal_settings.json | 282 ++++-------------- .../portal_settings/test_portal_settings.py | 10 + frappe/website/doctype/web_form/web_form.json | 4 +- frappe/website/doctype/web_page/web_page.json | 4 +- .../website_settings/website_settings.json | 10 +- frappe/website/utils.py | 52 +++- frappe/www/login.py | 6 +- 20 files changed, 507 insertions(+), 633 deletions(-) create mode 100644 frappe/website/doctype/portal_settings/test_portal_settings.py diff --git a/frappe/auth.py b/frappe/auth.py index 7902469c14..6d51629c58 100644 --- a/frappe/auth.py +++ b/frappe/auth.py @@ -18,6 +18,7 @@ from frappe.utils.password import check_password, delete_login_failed_cache from frappe.core.doctype.activity_log.activity_log import add_authentication_log from frappe.twofactor import (should_run_2fa, authenticate_for_2factor, confirm_otp_token, get_cached_user_pass) +from frappe.website.utils import get_home_page from six.moves.urllib.parse import quote @@ -167,7 +168,7 @@ class LoginManager: frappe.local.cookie_manager.set_cookie("system_user", "no") if not resume: frappe.local.response["message"] = "No App" - frappe.local.response["home_page"] = get_website_user_home_page(self.user) + frappe.local.response["home_page"] = '/' + get_home_page() else: frappe.local.cookie_manager.set_cookie("system_user", "yes") if not resume: @@ -382,16 +383,6 @@ def clear_cookies(): frappe.session.sid = "" frappe.local.cookie_manager.delete_cookie(["full_name", "user_id", "sid", "user_image", "system_user"]) -def get_website_user_home_page(user): - home_page_method = frappe.get_hooks('get_website_user_home_page') - if home_page_method: - home_page = frappe.get_attr(home_page_method[-1])(user) - return '/' + home_page.strip('/') - elif frappe.get_hooks('website_user_home_page'): - return '/' + frappe.get_hooks('website_user_home_page')[-1].strip('/') - else: - return '/me' - def get_last_tried_login_data(user, get_last_login=False): locked_account_time = frappe.cache().hget('locked_account_time', user) if get_last_login and locked_account_time: diff --git a/frappe/core/doctype/doctype/doctype.json b/frappe/core/doctype/doctype/doctype.json index 698289140e..b890f743cc 100644 --- a/frappe/core/doctype/doctype/doctype.json +++ b/frappe/core/doctype/doctype/doctype.json @@ -473,6 +473,8 @@ "label": "Documentation Link" }, { + "collapsible": 1, + "collapsible_depends_on": "actions", "fieldname": "actions_section", "fieldtype": "Section Break", "label": "Actions" @@ -484,6 +486,8 @@ "options": "DocType Action" }, { + "collapsible": 1, + "collapsible_depends_on": "links", "fieldname": "links_section", "fieldtype": "Section Break", "label": "Links Section" @@ -528,8 +532,84 @@ ], "icon": "fa fa-bolt", "idx": 6, - "links": [], - "modified": "2020-07-21 16:20:57.028802", + "links": [ + { + "group": "Views", + "link_doctype": "Report", + "link_fieldname": "ref_doctype" + }, + { + "group": "Workflow", + "link_doctype": "Workflow", + "link_fieldname": "document_type" + }, + { + "group": "Workflow", + "link_doctype": "Notification", + "link_fieldname": "document_type" + }, + { + "group": "Customization", + "link_doctype": "Custom Field", + "link_fieldname": "dt" + }, + { + "group": "Customization", + "link_doctype": "Custom Script", + "link_fieldname": "dt" + }, + { + "group": "Customization", + "link_doctype": "Server Script", + "link_fieldname": "reference_doctype" + }, + { + "group": "Workflow", + "link_doctype": "Webhook", + "link_fieldname": "webhook_doctype" + }, + { + "group": "Views", + "link_doctype": "Print Format", + "link_fieldname": "doc_type" + }, + { + "group": "Views", + "link_doctype": "Web Form", + "link_fieldname": "doc_type" + }, + { + "group": "Views", + "link_doctype": "Calendar View", + "link_fieldname": "reference_doctype" + }, + { + "group": "Views", + "link_doctype": "Kanban Board", + "link_fieldname": "reference_doctype" + }, + { + "group": "Workflow", + "link_doctype": "Onboarding Step", + "link_fieldname": "reference_document" + }, + { + "group": "Rules", + "link_doctype": "Auto Repeat", + "link_fieldname": "reference_doctype" + }, + { + "group": "Rules", + "link_doctype": "Assignment Rule", + "link_fieldname": "document_type" + }, + { + "group": "Rules", + "link_doctype": "Energy Point Rule", + "link_fieldname": "reference_doctype" + } + ], + "modified": "2020-08-06 12:59:32.369093", "modified_by": "Administrator", "module": "Core", "name": "DocType", diff --git a/frappe/core/doctype/module_def/module_def.js b/frappe/core/doctype/module_def/module_def.js index 5bb8db6d5c..c7a6cf85f9 100644 --- a/frappe/core/doctype/module_def/module_def.js +++ b/frappe/core/doctype/module_def/module_def.js @@ -3,6 +3,8 @@ frappe.ui.form.on('Module Def', { refresh: function(frm) { - + frappe.xcall('frappe.core.doctype.module_def.module_def.get_installed_apps').then(r => { + frm.set_df_property('app_name', 'options', JSON.parse(r)); + }); } }); diff --git a/frappe/core/doctype/module_def/module_def.json b/frappe/core/doctype/module_def/module_def.json index 4ff7a40877..b841eb1f0b 100644 --- a/frappe/core/doctype/module_def/module_def.json +++ b/frappe/core/doctype/module_def/module_def.json @@ -1,172 +1,88 @@ { - "allow_copy": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 1, - "autoname": "field:module_name", - "beta": 0, - "creation": "2013-01-10 16:34:03", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "editable_grid": 0, - "engine": "InnoDB", + "actions": [], + "allow_rename": 1, + "autoname": "field:module_name", + "creation": "2013-01-10 16:34:03", + "doctype": "DocType", + "engine": "InnoDB", + "field_order": [ + "module_name", + "custom", + "app_name", + "restrict_to_domain" + ], "fields": [ { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "module_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": "Module Name", - "length": 0, - "no_copy": 0, - "oldfieldname": "module_name", - "oldfieldtype": "Data", - "permlevel": 0, - "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, - "unique": 0 - }, + "fieldname": "module_name", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Module Name", + "oldfieldname": "module_name", + "oldfieldtype": "Data", + "reqd": 1, + "unique": 1 + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "app_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": 1, - "label": "App Name", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "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, - "unique": 0 - }, + "fieldname": "app_name", + "fieldtype": "Select", + "in_list_view": 1, + "in_standard_filter": 1, + "label": "App Name", + "reqd": 1 + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "restrict_to_domain", - "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": "Restrict To Domain", - "length": 0, - "no_copy": 0, - "options": "Domain", - "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 + "fieldname": "restrict_to_domain", + "fieldtype": "Link", + "label": "Restrict To Domain", + "options": "Domain" + }, + { + "default": "0", + "fieldname": "custom", + "fieldtype": "Check", + "label": "Custom" } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "icon": "fa fa-sitemap", - "idx": 1, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "modified": "2017-07-13 03:05:28.213656", - "modified_by": "Administrator", - "module": "Core", - "name": "Module Def", - "owner": "Administrator", + ], + "icon": "fa fa-sitemap", + "idx": 1, + "links": [ + { + "link_doctype": "DocType", + "link_fieldname": "module" + }, + { + "link_doctype": "Desk Page", + "link_fieldname": "module" + } + ], + "modified": "2020-08-06 12:39:30.740379", + "modified_by": "Administrator", + "module": "Core", + "name": "Module Def", + "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": 1, - "role": "Administrator", - "set_user_permissions": 0, - "share": 1, - "submit": 0, + "create": 1, + "delete": 1, + "email": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Administrator", + "share": 1, "write": 1 - }, + }, { - "amend": 0, - "apply_user_permissions": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 0, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 0, - "read": 1, - "report": 0, - "role": "System Manager", - "set_user_permissions": 0, - "share": 0, - "submit": 0, - "write": 0 + "create": 1, + "delete": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "write": 1 } - ], - "quick_entry": 1, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 1, - "sort_order": "ASC", - "track_changes": 1, - "track_seen": 0 + ], + "show_name_in_global_search": 1, + "sort_field": "modified", + "sort_order": "ASC", + "track_changes": 1 } \ No newline at end of file diff --git a/frappe/core/doctype/module_def/module_def.py b/frappe/core/doctype/module_def/module_def.py index 755cb86dbe..930c46e60b 100644 --- a/frappe/core/doctype/module_def/module_def.py +++ b/frappe/core/doctype/module_def/module_def.py @@ -2,7 +2,7 @@ # MIT License. See license.txt from __future__ import unicode_literals -import frappe, os +import frappe, os, json from frappe.model.document import Document @@ -11,7 +11,7 @@ class ModuleDef(Document): """If in `developer_mode`, create folder for module and add in `modules.txt` of app if missing.""" frappe.clear_cache() - if frappe.conf.get("developer_mode"): + if not self.custom and frappe.conf.get("developer_mode"): self.create_modules_folder() self.add_to_modules_txt() @@ -43,7 +43,7 @@ class ModuleDef(Document): def on_trash(self): """Delete module name from modules.txt""" - if frappe.flags.in_uninstall: + if frappe.flags.in_uninstall or self.custom: return modules = None @@ -60,3 +60,7 @@ class ModuleDef(Document): frappe.clear_cache() frappe.setup_module_map() + +@frappe.whitelist() +def get_installed_apps(): + return json.dumps(frappe.get_installed_apps()) \ No newline at end of file diff --git a/frappe/core/doctype/role/role.json b/frappe/core/doctype/role/role.json index 1eebb71a36..0ad15ba10b 100644 --- a/frappe/core/doctype/role/role.json +++ b/frappe/core/doctype/role/role.json @@ -1,216 +1,90 @@ { - "allow_copy": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 1, - "autoname": "field:role_name", - "beta": 0, - "creation": "2013-01-08 15:50:01", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "Document", - "editable_grid": 0, + "actions": [], + "allow_rename": 1, + "autoname": "field:role_name", + "creation": "2013-01-08 15:50:01", + "doctype": "DocType", + "document_type": "Document", + "engine": "InnoDB", + "field_order": [ + "role_name", + "home_page", + "restrict_to_domain", + "column_break_4", + "disabled", + "desk_access", + "two_factor_auth" + ], "fields": [ { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "role_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": "Role Name", - "length": 0, - "no_copy": 0, - "oldfieldname": "role_name", - "oldfieldtype": "Data", - "permlevel": 0, - "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, - "unique": 0 - }, + "fieldname": "role_name", + "fieldtype": "Data", + "label": "Role Name", + "oldfieldname": "role_name", + "oldfieldtype": "Data", + "reqd": 1, + "unique": 1 + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "If disabled, this role will be removed from all users.", - "fieldname": "disabled", - "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": "Disabled", - "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 - }, + "default": "0", + "description": "If disabled, this role will be removed from all users.", + "fieldname": "disabled", + "fieldtype": "Check", + "label": "Disabled" + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "1", - "fieldname": "desk_access", - "fieldtype": "Check", - "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": "Desk 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 - }, + "default": "1", + "fieldname": "desk_access", + "fieldtype": "Check", + "in_list_view": 1, + "label": "Desk Access" + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "0", - "fieldname": "two_factor_auth", - "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": "Two Factor Authentication", - "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 - }, + "default": "0", + "fieldname": "two_factor_auth", + "fieldtype": "Check", + "label": "Two Factor Authentication" + }, { - "allow_bulk_edit": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "restrict_to_domain", - "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": "Restrict To Domain", - "length": 0, - "no_copy": 0, - "options": "Domain", - "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 + "fieldname": "restrict_to_domain", + "fieldtype": "Link", + "label": "Restrict To Domain", + "options": "Domain" + }, + { + "description": "Route: Example \"/desk\"", + "fieldname": "home_page", + "fieldtype": "Data", + "label": "Home Page" + }, + { + "fieldname": "column_break_4", + "fieldtype": "Column Break" } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "icon": "fa fa-bookmark", - "idx": 1, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "modified": "2017-07-06 12:42:57.097914", - "modified_by": "Administrator", - "module": "Core", - "name": "Role", - "owner": "Administrator", + ], + "icon": "fa fa-bookmark", + "idx": 1, + "links": [], + "modified": "2020-08-06 15:42:59.036960", + "modified_by": "Administrator", + "module": "Core", + "name": "Role", + "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": 1, - "role": "System Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 0, + "create": 1, + "delete": 1, + "email": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1, "write": 1 } - ], - "quick_entry": 1, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_order": "ASC", - "track_changes": 1, - "track_seen": 0 + ], + "quick_entry": 1, + "sort_field": "modified", + "sort_order": "ASC", + "track_changes": 1 } \ No newline at end of file diff --git a/frappe/core/doctype/server_script/server_script.js b/frappe/core/doctype/server_script/server_script.js index d7f4c3e536..78ef2d0509 100644 --- a/frappe/core/doctype/server_script/server_script.js +++ b/frappe/core/doctype/server_script/server_script.js @@ -2,8 +2,11 @@ // For license information, please see license.txt frappe.ui.form.on('Server Script', { + setup: function(frm) { + frm.trigger('setup_help'); + }, refresh: function(frm) { - if(frm.doc.script_type === 'Scheduler Event' && !frm.doc.disabled){ + if (frm.doc.script_type === 'Scheduler Event' && !frm.doc.disabled) { frm.add_custom_button('Schedule Script', function() { var d = new frappe.ui.Dialog({ title: "Schedule Script Execution", @@ -33,14 +36,50 @@ frappe.ui.form.on('Server Script', { } }, - schedule_script(frm, data){ + schedule_script(frm, data) { frm.call({ method: "frappe.core.doctype.server_script.server_script.setup_scheduler_events", args: { 'script_name': frm.doc.name, 'frequency': data.event_type } - }) + }); + }, + + setup_help(frm) { + frm.get_field('help_html').html(` +

Examples

+

DocType Event

+

+# set property
+if "test" in doc.description:
+    doc.status = 'Closed'
+
+
+# validate
+if "validate" in doc.description:
+    raise frappe.ValidationError
+
+# auto create another document
+if doc.allocted_to:
+    frappe.get_doc(dict(
+        doctype = 'ToDo'
+        owner = doc.allocated_to,
+        description = doc.subject
+    )).insert()
+
+
+ +

API Call

+

+# respond to API
+
+if frappe.form_dict.message == "ping":
+	frappe.response['message'] = "pong"
+else:
+	frappe.response['message'] = "ok"
+
+`); } }); diff --git a/frappe/core/doctype/server_script/server_script.json b/frappe/core/doctype/server_script/server_script.json index bef3dfc60c..3ed4076430 100644 --- a/frappe/core/doctype/server_script/server_script.json +++ b/frappe/core/doctype/server_script/server_script.json @@ -14,7 +14,9 @@ "api_method", "allow_guest", "section_break_8", - "script" + "script", + "help_section", + "help_html" ], "fields": [ { @@ -72,10 +74,19 @@ { "fieldname": "section_break_8", "fieldtype": "Section Break" + }, + { + "fieldname": "help_section", + "fieldtype": "Section Break", + "label": "Help" + }, + { + "fieldname": "help_html", + "fieldtype": "HTML" } ], "links": [], - "modified": "2020-04-06 11:24:38.161555", + "modified": "2020-08-07 13:13:02.483963", "modified_by": "Administrator", "module": "Core", "name": "Server Script", diff --git a/frappe/core/doctype/user/user.json b/frappe/core/doctype/user/user.json index 7ed14e094c..9e6781ba64 100644 --- a/frappe/core/doctype/user/user.json +++ b/frappe/core/doctype/user/user.json @@ -588,9 +588,70 @@ "icon": "fa fa-user", "idx": 413, "image_field": "user_image", - "links": [], + "links": [ + { + "group": "Profile", + "link_doctype": "Contact", + "link_fieldname": "user" + }, + { + "group": "Profile", + "link_doctype": "Chat Profile", + "link_fieldname": "user" + }, + { + "group": "Profile", + "link_doctype": "Blogger", + "link_fieldname": "user" + }, + { + "group": "Logs", + "link_doctype": "Access Log", + "link_fieldname": "user" + }, + { + "group": "Logs", + "link_doctype": "Activity Log", + "link_fieldname": "user" + }, + { + "group": "Logs", + "link_doctype": "Energy Point Log", + "link_fieldname": "user" + }, + { + "group": "Logs", + "link_doctype": "Route History", + "link_fieldname": "user" + }, + { + "group": "Settings", + "link_doctype": "User Permission", + "link_fieldname": "user" + }, + { + "group": "Settings", + "link_doctype": "Assignment Rule", + "link_fieldname": "user" + }, + { + "group": "Settings", + "link_doctype": "Document Follow", + "link_fieldname": "user" + }, + { + "group": "Activity", + "link_doctype": "Communication", + "link_fieldname": "user" + }, + { + "group": "Activity", + "link_doctype": "ToDo", + "link_fieldname": "owner" + } + ], "max_attachments": 5, - "modified": "2020-04-08 12:27:36.716490", + "modified": "2020-08-06 19:48:49.677800", "modified_by": "Administrator", "module": "Core", "name": "User", @@ -606,13 +667,13 @@ "read": 1, "report": 1, "role": "System Manager", + "set_user_permissions": 1, "share": 1, "write": 1 }, { "permlevel": 1, "read": 1, - "report": 1, "role": "System Manager", "write": 1 } diff --git a/frappe/desk/doctype/onboarding_step/onboarding_step.json b/frappe/desk/doctype/onboarding_step/onboarding_step.json index 365a1c7d21..79d659b1ed 100644 --- a/frappe/desk/doctype/onboarding_step/onboarding_step.json +++ b/frappe/desk/doctype/onboarding_step/onboarding_step.json @@ -184,7 +184,7 @@ } ], "links": [], - "modified": "2020-05-18 19:42:30.435604", + "modified": "2020-08-06 12:55:20.377679", "modified_by": "Administrator", "module": "Desk", "name": "Onboarding Step", diff --git a/frappe/patches/v13_0/generate_theme_files_in_public_folder.py b/frappe/patches/v13_0/generate_theme_files_in_public_folder.py index c5a64780cd..b2021d2b52 100644 --- a/frappe/patches/v13_0/generate_theme_files_in_public_folder.py +++ b/frappe/patches/v13_0/generate_theme_files_in_public_folder.py @@ -11,5 +11,8 @@ def execute(): ) for theme in themes: doc = frappe.get_doc("Website Theme", theme.name) - doc.generate_bootstrap_theme() - doc.save() + try: + doc.generate_bootstrap_theme() + doc.save() + except: + pass diff --git a/frappe/public/less/page.less b/frappe/public/less/page.less index 2b4fb7f495..77d12688a4 100644 --- a/frappe/public/less/page.less +++ b/frappe/public/less/page.less @@ -20,7 +20,7 @@ .sub-heading { display: inline-block; margin-right: 10px; - max-width: 50%; + max-width: 40%; vertical-align: middle; overflow: visible; } @@ -83,7 +83,7 @@ padding-bottom: 17px; .sub-heading { - max-width: 50%; + max-width: 40%; overflow: hidden; } } diff --git a/frappe/utils/boilerplate.py b/frappe/utils/boilerplate.py index 7dfa2ca1b0..675ceb3f57 100755 --- a/frappe/utils/boilerplate.py +++ b/frappe/utils/boilerplate.py @@ -173,7 +173,7 @@ app_license = "{app_license}" # Home Pages # ---------- -# application home page (will override Website Settings) +# application home page (will not override Website Settings) # home_page = "login" # website user home page (by Role) @@ -181,9 +181,6 @@ app_license = "{app_license}" # "Role": "home_page" # }} -# Website user home page (by function) -# get_website_user_home_page = "{app_name}.utils.get_home_page" - # Generators # ---------- diff --git a/frappe/website/doctype/portal_settings/portal_settings.json b/frappe/website/doctype/portal_settings/portal_settings.json index 81b2a94c08..48321d0512 100644 --- a/frappe/website/doctype/portal_settings/portal_settings.json +++ b/frappe/website/doctype/portal_settings/portal_settings.json @@ -1,231 +1,79 @@ { - "allow_copy": 0, - "allow_import": 0, - "allow_rename": 0, - "beta": 0, - "creation": "2016-03-30 01:40:20.001775", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 0, + "actions": [], + "creation": "2016-03-30 01:40:20.001775", + "doctype": "DocType", + "engine": "InnoDB", + "field_order": [ + "default_role", + "default_portal_home", + "standard_menu_items", + "hide_standard_menu", + "menu", + "custom_sidebar_menu", + "custom_menu" + ], "fields": [ { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "default_role", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Default Role at Time of Signup", - "length": 0, - "no_copy": 0, - "options": "Role", - "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 - }, + "fieldname": "default_role", + "fieldtype": "Link", + "label": "Default Role at Time of Signup", + "options": "Role" + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "standard_menu_items", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Standard Sidebar Menu", - "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 - }, + "fieldname": "standard_menu_items", + "fieldtype": "Section Break", + "label": "Standard Sidebar Menu" + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "hide_standard_menu", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Hide Standard Menu", - "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 - }, + "default": "0", + "fieldname": "hide_standard_menu", + "fieldtype": "Check", + "label": "Hide Standard Menu" + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "menu", - "fieldtype": "Table", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Portal Menu", - "length": 0, - "no_copy": 0, - "options": "Portal Menu Item", - "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 - }, + "fieldname": "menu", + "fieldtype": "Table", + "label": "Portal Menu", + "options": "Portal Menu Item" + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "custom_sidebar_menu", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Custom Sidebar Menu", - "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 - }, + "fieldname": "custom_sidebar_menu", + "fieldtype": "Section Break", + "label": "Custom Sidebar Menu" + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "custom_menu", - "fieldtype": "Table", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Custom Menu Items", - "length": 0, - "no_copy": 0, - "options": "Portal Menu Item", - "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 + "fieldname": "custom_menu", + "fieldtype": "Table", + "label": "Custom Menu Items", + "options": "Portal Menu Item" + }, + { + "description": "Example: \"/desk\"", + "fieldname": "default_portal_home", + "fieldtype": "Data", + "label": "Default Portal Home" } - ], - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - - "is_submittable": 0, - "issingle": 1, - "istable": 0, - "max_attachments": 0, - "modified": "2016-12-29 14:40:31.476181", - "modified_by": "Administrator", - "module": "Website", - "name": "Portal Settings", - "name_case": "", - "owner": "Administrator", + ], + "issingle": 1, + "links": [], + "modified": "2020-08-06 15:43:36.387050", + "modified_by": "Administrator", + "module": "Website", + "name": "Portal Settings", + "owner": "Administrator", "permissions": [ { - "amend": 0, - "apply_user_permissions": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "is_custom": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 0, - "role": "Website Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 0, + "create": 1, + "delete": 1, + "email": 1, + "print": 1, + "read": 1, + "role": "Website Manager", + "share": 1, "write": 1 } - ], - "quick_entry": 0, - "read_only": 0, - "read_only_onload": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 1, - "track_seen": 0 + ], + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1 } \ No newline at end of file diff --git a/frappe/website/doctype/portal_settings/test_portal_settings.py b/frappe/website/doctype/portal_settings/test_portal_settings.py new file mode 100644 index 0000000000..3dd4aa0c35 --- /dev/null +++ b/frappe/website/doctype/portal_settings/test_portal_settings.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2020, Frappe Technologies and Contributors +# See license.txt +from __future__ import unicode_literals + +# import frappe +import unittest + +class TestPortalSettings(unittest.TestCase): + pass diff --git a/frappe/website/doctype/web_form/web_form.json b/frappe/website/doctype/web_form/web_form.json index da5f8bee83..77dbbb9734 100644 --- a/frappe/website/doctype/web_form/web_form.json +++ b/frappe/website/doctype/web_form/web_form.json @@ -203,6 +203,7 @@ }, { "collapsible": 1, + "collapsible_depends_on": "client_script", "fieldname": "client_script_section", "fieldtype": "Section Break", "label": "Client Script" @@ -344,6 +345,7 @@ }, { "collapsible": 1, + "collapsible_depends_on": "custom_css", "fieldname": "custom_css_section", "fieldtype": "Section Break", "label": "Custom CSS" @@ -359,7 +361,7 @@ "icon": "icon-edit", "is_published_field": "published", "links": [], - "modified": "2020-07-21 16:25:37.028459", + "modified": "2020-08-07 13:12:03.945686", "modified_by": "Administrator", "module": "Website", "name": "Web Form", diff --git a/frappe/website/doctype/web_page/web_page.json b/frappe/website/doctype/web_page/web_page.json index 8f03237363..955b34f44e 100644 --- a/frappe/website/doctype/web_page/web_page.json +++ b/frappe/website/doctype/web_page/web_page.json @@ -137,6 +137,7 @@ }, { "collapsible": 1, + "collapsible_depends_on": "insert_code", "fieldname": "custom_javascript", "fieldtype": "Section Break", "label": "Script" @@ -157,6 +158,7 @@ }, { "collapsible": 1, + "collapsible_depends_on": "insert_style", "fieldname": "custom_css", "fieldtype": "Section Break", "label": "Style" @@ -292,7 +294,7 @@ "is_published_field": "published", "links": [], "max_attachments": 20, - "modified": "2020-07-21 16:25:17.899069", + "modified": "2020-08-07 10:55:54.885448", "modified_by": "Administrator", "module": "Website", "name": "Web Page", diff --git a/frappe/website/doctype/website_settings/website_settings.json b/frappe/website/doctype/website_settings/website_settings.json index c91366c103..65a45c1796 100644 --- a/frappe/website/doctype/website_settings/website_settings.json +++ b/frappe/website/doctype/website_settings/website_settings.json @@ -1,5 +1,11 @@ { - "actions": [], + "actions": [ + { + "action": "frappe.sessions.clear", + "action_type": "Server Action", + "label": "Clear Cache" + } + ], "creation": "2013-04-30 12:58:46", "doctype": "DocType", "document_type": "Other", @@ -358,7 +364,7 @@ "issingle": 1, "links": [], "max_attachments": 10, - "modified": "2020-05-15 14:12:32.907352", + "modified": "2020-08-07 13:34:19.181561", "modified_by": "Administrator", "module": "Website", "name": "Website Settings", diff --git a/frappe/website/utils.py b/frappe/website/utils.py index dc981fe30a..36e603f5e5 100644 --- a/frappe/website/utils.py +++ b/frappe/website/utils.py @@ -73,23 +73,22 @@ def get_home_page(): def _get_home_page(): home_page = None - get_website_user_home_page = frappe.get_hooks('get_website_user_home_page') - if get_website_user_home_page: - home_page = frappe.get_attr(get_website_user_home_page[-1])(frappe.session.user) + # for user + if frappe.session.user != 'Guest': + # by role + for role in frappe.get_roles(): + home_page = frappe.db.get_value('Role', role, 'home_page') + if home_page: break + # portal default + if not home_page: + home_page = frappe.db.get_value("Portal Settings", None, "default_portal_home") + + # by hooks if not home_page: - role_home_page = frappe.get_hooks("role_home_page") - if role_home_page: - for role in frappe.get_roles(): - if role in role_home_page: - home_page = role_home_page[role][-1] - break - - if not home_page: - home_page = frappe.get_hooks("home_page") - if home_page: - home_page = home_page[-1] + home_page = get_home_page_via_hooks() + # global if not home_page: home_page = frappe.db.get_value("Website Settings", None, "home_page") or "login" @@ -99,6 +98,31 @@ def get_home_page(): return frappe.cache().hget("home_page", frappe.session.user, _get_home_page) +def get_home_page_via_hooks(): + home_page = None + + home_page_method = frappe.get_hooks('get_website_user_home_page') + if home_page_method: + home_page = frappe.get_attr(home_page_method[-1])(user).strip('/') + elif frappe.get_hooks('website_user_home_page'): + home_page = frappe.get_hooks('website_user_home_page')[-1].strip('/') + + if not home_page: + role_home_page = frappe.get_hooks("role_home_page") + if role_home_page: + for role in frappe.get_roles(): + if role in role_home_page: + home_page = role_home_page[role][-1] + break + + if not home_page: + home_page = frappe.get_hooks("home_page") + if home_page: + home_page = home_page[-1] + + return home_page + + def is_signup_enabled(): if getattr(frappe.local, "is_signup_enabled", None) is None: frappe.local.is_signup_enabled = True diff --git a/frappe/www/login.py b/frappe/www/login.py index 65952f0154..f2d9c9d768 100644 --- a/frappe/www/login.py +++ b/frappe/www/login.py @@ -12,6 +12,7 @@ from frappe.integrations.doctype.ldap_settings.ldap_settings import LDAPSettings from frappe.utils.password import get_decrypted_password from frappe.utils.html_utils import get_icon_html from frappe.integrations.oauth2_logins import decoder_compat +from frappe.website.utils import get_home_page no_cache = True @@ -20,7 +21,10 @@ def get_context(context): if frappe.session.user != "Guest": if not redirect_to: - redirect_to = "/me" if frappe.session.data.user_type=="Website User" else "/desk" + if frappe.session.data.user_type=="Website User": + redirect_to = get_home_page() + else: + redirect_to = "/desk" frappe.local.flags.redirect_location = redirect_to raise frappe.Redirect