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(` +
+# 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()
+
+
+# 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