diff --git a/frappe/core/doctype/role_permission_for_page_and_report/__init__.py b/frappe/core/doctype/role_permission_for_page_and_report/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/frappe/core/doctype/role_permission_for_page_and_report/role_permission_for_page_and_report.js b/frappe/core/doctype/role_permission_for_page_and_report/role_permission_for_page_and_report.js
new file mode 100644
index 0000000000..06f0bbb53a
--- /dev/null
+++ b/frappe/core/doctype/role_permission_for_page_and_report/role_permission_for_page_and_report.js
@@ -0,0 +1,55 @@
+// Copyright (c) 2016, Frappe Technologies and contributors
+// For license information, please see license.txt
+
+frappe.ui.form.on('Role Permission for Page and Report', {
+ refresh: function(frm) {
+ frm.disable_save();
+ frm.role_area.hide();
+ },
+
+ onload: function(frm) {
+ if(!frm.roles_editor) {
+ frm.role_area = $('
')
+ .appendTo(frm.fields_dict.roles_html.wrapper);
+ frm.roles_editor = new frappe.RoleEditor(frm.role_area);
+ }
+ },
+
+ page: function(frm) {
+ frm.trigger("get_roles")
+ },
+
+ report: function(frm){
+ frm.trigger("get_roles")
+ },
+
+ get_roles: function(frm) {
+ frm.role_area.show();
+
+ return frappe.call({
+ method:"get_custom_roles",
+ doc: frm.doc,
+ callback: function(r) {
+ refresh_field('roles')
+ frm.roles_editor.show()
+ }
+ })
+ },
+
+ update: function(frm) {
+ if(frm.roles_editor) {
+ frm.roles_editor.set_roles_in_table()
+ }
+
+ return frappe.call({
+ method:"set_custom_roles",
+ doc: frm.doc,
+ callback: function(r) {
+ refresh_field('roles')
+ frm.roles_editor.show()
+ frappe.msgprint(__("Successfully Updated"))
+ frm.reload_doc()
+ }
+ })
+ }
+});
diff --git a/frappe/core/doctype/role_permission_for_page_and_report/role_permission_for_page_and_report.json b/frappe/core/doctype/role_permission_for_page_and_report/role_permission_for_page_and_report.json
new file mode 100644
index 0000000000..43576b5f93
--- /dev/null
+++ b/frappe/core/doctype/role_permission_for_page_and_report/role_permission_for_page_and_report.json
@@ -0,0 +1,300 @@
+{
+ "allow_copy": 1,
+ "allow_import": 0,
+ "allow_rename": 0,
+ "beta": 0,
+ "creation": "2017-02-13 17:33:25.157332",
+ "custom": 0,
+ "docstatus": 0,
+ "doctype": "DocType",
+ "document_type": "",
+ "editable_grid": 1,
+ "engine": "InnoDB",
+ "fields": [
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "set_role_for",
+ "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": "Set Role For",
+ "length": 0,
+ "no_copy": 0,
+ "options": "\nPage\nReport",
+ "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_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "depends_on": "eval:doc.set_role_for == 'Page'",
+ "fieldname": "page",
+ "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": "Page",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Page",
+ "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_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "depends_on": "eval:doc.set_role_for == 'Report'",
+ "fieldname": "report",
+ "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": "Report",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Report",
+ "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_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "roles_permission",
+ "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": "Allow Roles",
+ "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_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "depends_on": "",
+ "fieldname": "roles_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": "Roles 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,
+ "unique": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "roles",
+ "fieldtype": "Table",
+ "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": "Roles",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Has Role",
+ "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_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "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,
+ "unique": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 0,
+ "columns": 0,
+ "fieldname": "update",
+ "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": "Update",
+ "length": 0,
+ "no_copy": 0,
+ "options": "",
+ "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
+ }
+ ],
+ "hide_heading": 0,
+ "hide_toolbar": 1,
+ "idx": 0,
+ "image_view": 0,
+ "in_create": 0,
+ "in_dialog": 0,
+ "is_submittable": 0,
+ "issingle": 1,
+ "istable": 0,
+ "max_attachments": 0,
+ "modified": "2017-03-02 16:06:16.295111",
+ "modified_by": "Administrator",
+ "module": "Core",
+ "name": "Role Permission for Page and Report",
+ "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": 0,
+ "read_only_onload": 0,
+ "show_name_in_global_search": 0,
+ "sort_field": "modified",
+ "sort_order": "DESC",
+ "track_changes": 0,
+ "track_seen": 0
+}
\ No newline at end of file
diff --git a/frappe/core/doctype/role_permission_for_page_and_report/role_permission_for_page_and_report.py b/frappe/core/doctype/role_permission_for_page_and_report/role_permission_for_page_and_report.py
new file mode 100644
index 0000000000..9e840c3ab5
--- /dev/null
+++ b/frappe/core/doctype/role_permission_for_page_and_report/role_permission_for_page_and_report.py
@@ -0,0 +1,49 @@
+# -*- coding: utf-8 -*-
+# Copyright (c) 2015, Frappe Technologies and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import frappe
+from frappe.model.document import Document
+
+class RolePermissionforPageandReport(Document):
+ def get_custom_roles(self):
+ args = self.get_args()
+ self.set('roles', [])
+
+ name = frappe.db.get_value('Custom Role', args, "name")
+ if name:
+ doc = frappe.get_doc('Custom Role', name)
+ else:
+ doctype = self.set_role_for
+ docname = self.page if self.set_role_for == 'Page' else self.report
+ doc = frappe.get_doc(doctype, docname)
+
+ self.set('roles', doc.roles)
+
+ def set_custom_roles(self):
+ args = self.get_args()
+ name = frappe.db.get_value('Custom Role', args, "name")
+
+ args.update({
+ 'doctype': 'Custom Role',
+ 'roles': self.roles
+ })
+
+ if name:
+ doc = frappe.get_doc("Custom Role", name)
+ doc.set('roles', self.roles)
+ doc.save()
+ else:
+ frappe.get_doc(args).insert()
+
+ def get_args(self, row=None):
+ name = self.page if self.set_role_for == 'Page' else self.report
+ check_for_field = self.set_role_for.replace(" ","_").lower()
+
+ return {
+ check_for_field: name
+ }
+
+ def update_status(self):
+ return frappe.render_template
diff --git a/frappe/core/doctype/user/user.json b/frappe/core/doctype/user/user.json
index ed638bd69b..bebb3c6518 100644
--- a/frappe/core/doctype/user/user.json
+++ b/frappe/core/doctype/user/user.json
@@ -1,5 +1,4 @@
{
- "_liked_by": "[]",
"allow_copy": 0,
"allow_import": 1,
"allow_rename": 1,
@@ -1145,7 +1144,7 @@
"length": 0,
"no_copy": 0,
"options": "Has Role",
- "permlevel": 0,
+ "permlevel": 1,
"precision": "",
"print_hide": 1,
"print_hide_if_no_value": 0,
@@ -1878,7 +1877,7 @@
"istable": 0,
"max_attachments": 5,
"menu_index": 0,
- "modified": "2017-02-22 16:47:32.546965",
+ "modified": "2017-03-02 08:00:49.978706",
"modified_by": "Administrator",
"module": "Core",
"name": "User",
diff --git a/frappe/core/doctype/user/user.py b/frappe/core/doctype/user/user.py
index ad5ee42f29..556e574f05 100644
--- a/frappe/core/doctype/user/user.py
+++ b/frappe/core/doctype/user/user.py
@@ -462,7 +462,7 @@ def get_timezones():
def get_all_roles(arg=None):
"""return all roles"""
return [r[0] for r in frappe.db.sql("""select name from tabRole
- where name not in ('Administrator', 'Guest', 'All') and not disabled order by name""")]
+ where name not in ('Administrator', 'Guest', 'All') and not disabled and desk_access = '1' order by name""")]
@frappe.whitelist()
def get_roles(arg=None):
diff --git a/frappe/patches/v7_3/copy_user_roles_to_has_roles.py b/frappe/patches/v7_3/copy_user_roles_to_has_roles.py
index 0e44581230..2410fd5a84 100644
--- a/frappe/patches/v7_3/copy_user_roles_to_has_roles.py
+++ b/frappe/patches/v7_3/copy_user_roles_to_has_roles.py
@@ -7,6 +7,7 @@ import frappe
def execute():
for data in frappe.get_all('User', fields = ["name"]):
doc = frappe.get_doc('User', data.name)
+ doc.set('roles',[])
roles = [{'role': d.role} for d in doc.user_roles]
doc.set('roles', roles)
for role in doc.roles:
diff --git a/frappe/public/css/role_editor.css b/frappe/public/css/role_editor.css
index aad8a0fe77..987f2ccb6b 100644
--- a/frappe/public/css/role_editor.css
+++ b/frappe/public/css/role_editor.css
@@ -3,6 +3,10 @@
width: 50%;
float: left;
}
+.role {
+ padding-left: 5px;
+ padding-top: 2px;
+}
table.user-perm {
border-collapse: collapse;
width: 100%;
diff --git a/frappe/public/js/frappe/form/footer/timeline.js b/frappe/public/js/frappe/form/footer/timeline.js
index bac794e58c..0150c16714 100644
--- a/frappe/public/js/frappe/form/footer/timeline.js
+++ b/frappe/public/js/frappe/form/footer/timeline.js
@@ -461,7 +461,7 @@ frappe.ui.form.Timeline = Class.extend({
if(data[key] && data[key].length) {
parts = (data[key] || []).map(function(p) {
var df = frappe.meta.get_docfield(me.frm.doctype, p[0], me.frm.docname);
- if(!df.hidden) {
+ if(df && !df.hidden) {
var field_display_status = frappe.perm.get_field_display_status(df, null,
me.frm.perm);
diff --git a/frappe/public/js/frappe/roles_editor.js b/frappe/public/js/frappe/roles_editor.js
index edce390e3c..c06e877733 100644
--- a/frappe/public/js/frappe/roles_editor.js
+++ b/frappe/public/js/frappe/roles_editor.js
@@ -47,7 +47,7 @@ frappe.RoleEditor = Class.extend({
$(me.wrapper).append(repl('
', {role_value: role,role_display:__(role)}));
});
diff --git a/frappe/public/less/role_editor.less b/frappe/public/less/role_editor.less
index ec17030060..c95f1ebc55 100644
--- a/frappe/public/less/role_editor.less
+++ b/frappe/public/less/role_editor.less
@@ -4,6 +4,11 @@
float: left;
}
+.role {
+ padding-left: 5px;
+ padding-top: 2px;
+}
+
table.user-perm {
border-collapse: collapse;
width: 100%;