From 67f4de18022e701fdf0296c0d1c4e7a295c5b165 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Mon, 13 Mar 2017 12:47:08 +0530 Subject: [PATCH] [fix] Separate has role patch to make custom role from custom docperm, if custom role not available then chceck standard permission for page and report --- frappe/boot.py | 22 ++++----- frappe/config/setup.py | 5 ++ frappe/patches.txt | 1 + .../v8_0/rename_page_role_to_has_role.py | 44 +----------------- ...set_user_permission_for_page_and_report.py | 46 +++++++++++++++++++ 5 files changed, 64 insertions(+), 54 deletions(-) create mode 100644 frappe/patches/v8_0/set_user_permission_for_page_and_report.py diff --git a/frappe/boot.py b/frappe/boot.py index 3d367ac7ae..9f36718997 100644 --- a/frappe/boot.py +++ b/frappe/boot.py @@ -109,25 +109,23 @@ def get_user_page_or_report(parent): """.format(field=parent.lower(), roles = ', '.join(['%s']*len(roles))), roles, as_dict=1): has_role[p.name] = {"modified":p.modified, "title": p.name} - - if not has_role: - for p in frappe.db.sql("""select distinct + + for p in frappe.db.sql("""select distinct tab{parent}.name, tab{parent}.modified, tab{parent}.{field} as title from `tabHas Role`, `tab{parent}` where `tabHas Role`.role in ({roles}) - and `tabHas Role`.parent = `tab{parent}`.name - """.format(parent=parent, field=field, roles = ', '.join(['%s']*len(roles))), - roles, as_dict=True): - - has_role[p.name] = {"modified":p.modified, "title": p.title} + and `tabHas Role`.parent = `tab{parent}`.name + """.format(parent=parent, field=field, roles = ', '.join(['%s']*len(roles))), roles, as_dict=True): + if p.name not in has_role: + has_role[p.name] = {"modified":p.modified, "title": p.title} # pages or reports where role is not set are also allowed for p in frappe.db.sql("""select name, modified, {field} as title - from `tab{parent}` where + from `tab{parent}` where (select count(*) from `tabHas Role` - where `tabHas Role`.parent=tab{parent}.name) = 0""".format(parent=parent, field=field), as_dict=1): - - has_role[p.name] = {"modified":p.modified, "title": p.title} + where `tabHas Role`.parent=tab{parent}.name) = 0""".format(parent=parent, field=field), as_dict=1): + if p.name not in has_role: + has_role[p.name] = {"modified":p.modified, "title": p.title} return has_role diff --git a/frappe/config/setup.py b/frappe/config/setup.py index 45c3667a11..7bb9a419b7 100644 --- a/frappe/config/setup.py +++ b/frappe/config/setup.py @@ -45,6 +45,11 @@ def get_data(): "icon": "fa fa-upload", "description": _("Show or hide modules globally.") }, + { + "type": "doctype", + "name": "Role Permission for Page and Report", + "description": _("Set custom roles for page and report") + }, { "type": "report", "is_query_report": True, diff --git a/frappe/patches.txt b/frappe/patches.txt index 3cda981d6f..f6d1374d7e 100644 --- a/frappe/patches.txt +++ b/frappe/patches.txt @@ -13,6 +13,7 @@ frappe.patches.v8_0.drop_is_custom_from_docperm execute:frappe.reload_doc('core', 'doctype', 'custom_docperm') frappe.patches.v8_0.rename_page_role_to_has_role frappe.patches.v7_2.setup_custom_perms #2017-01-19 +frappe.patches.v8_0.set_user_permission_for_page_and_report frappe.patches.v8_0.drop_in_dialog execute:frappe.reload_doc('core', 'doctype', 'role') execute:frappe.reload_doc('core', 'doctype', 'user') diff --git a/frappe/patches/v8_0/rename_page_role_to_has_role.py b/frappe/patches/v8_0/rename_page_role_to_has_role.py index 3432aa27c4..445d437b6a 100644 --- a/frappe/patches/v8_0/rename_page_role_to_has_role.py +++ b/frappe/patches/v8_0/rename_page_role_to_has_role.py @@ -10,7 +10,6 @@ def execute(): reload_doc() set_ref_doctype_roles_to_report() copy_user_roles_to_has_roles() - set_user_permission_for_page_and_report() remove_doctypes() def reload_doc(): @@ -18,7 +17,6 @@ def reload_doc(): frappe.reload_doc("core", 'doctype', "report") frappe.reload_doc("core", 'doctype', "user") frappe.reload_doc("core", 'doctype', "has_role") - frappe.reload_doc("core", 'doctype', "custom_role") def set_ref_doctype_roles_to_report(): for data in frappe.get_all('Report', fields=["name"]): @@ -30,7 +28,7 @@ def set_ref_doctype_roles_to_report(): row.db_update() except: pass - + def copy_user_roles_to_has_roles(): for data in frappe.get_all('User', fields = ["name"]): doc = frappe.get_doc('User', data.name) @@ -42,46 +40,8 @@ def copy_user_roles_to_has_roles(): }) for role in doc.roles: role.db_update() - -def set_user_permission_for_page_and_report(): - make_custom_roles_for_page_and_report() - -def make_custom_roles_for_page_and_report(): - for doctype in ['Page', 'Report']: - for data in get_data(doctype): - doc = frappe.get_doc(doctype, data.name) - roles = get_roles(doctype, data, doc) - make_custom_roles(doctype, doc.name, roles) - -def get_data(doctype): - fields = ["name"] if doctype == 'Page' else ["name", "ref_doctype"] - return frappe.get_all(doctype, fields = fields) - -def get_roles(doctype, data, doc): - roles = [] - if doctype == 'Page': - for d in doc.roles: - if frappe.db.exists('Role', d.role): - roles.append({'role': d.role}) - else: - out = frappe.get_all('Custom DocPerm', fields='distinct role', filters=dict(parent = data.ref_doctype)) - if not out: - out = frappe.get_all('DocPerm', fields='distinct role', filters=dict(parent = data.ref_doctype)) - for d in out: - roles.append({'role': d.role}) - return roles - -def make_custom_roles(doctype, name, roles): - field = doctype.lower() - - if roles: - custom_permission = frappe.get_doc({ - 'doctype': 'Custom Role', - field : name, - 'roles' : roles - }).insert() def remove_doctypes(): for doctype in ['UserRole', 'Event Role']: if frappe.db.exists('DocType', doctype): - frappe.delete_doc('DocType', doctype) + frappe.delete_doc('DocType', doctype) \ No newline at end of file diff --git a/frappe/patches/v8_0/set_user_permission_for_page_and_report.py b/frappe/patches/v8_0/set_user_permission_for_page_and_report.py new file mode 100644 index 0000000000..8012368fe5 --- /dev/null +++ b/frappe/patches/v8_0/set_user_permission_for_page_and_report.py @@ -0,0 +1,46 @@ +# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors +# License: GNU General Public License v3. See license.txt + +from __future__ import unicode_literals +import frappe + +def execute(): + if not frappe.db.exists('DocType', 'Custom Role'): + frappe.reload_doc("core", 'doctype', "custom_role") + set_user_permission_for_page_and_report() + +def set_user_permission_for_page_and_report(): + make_custom_roles_for_page_and_report() + +def make_custom_roles_for_page_and_report(): + for doctype in ['Page', 'Report']: + for data in get_data(doctype): + doc = frappe.get_doc(doctype, data.name) + roles = get_roles(doctype, data, doc) + make_custom_roles(doctype, doc.name, roles) + +def get_data(doctype): + fields = ["name"] if doctype == 'Page' else ["name", "ref_doctype"] + return frappe.get_all(doctype, fields = fields) + +def get_roles(doctype, data, doc): + roles = [] + if doctype == 'Page': + for d in doc.roles: + if frappe.db.exists('Role', d.role): + roles.append({'role': d.role}) + else: + out = frappe.get_all('Custom DocPerm', fields='distinct role', filters=dict(parent = data.ref_doctype)) + for d in out: + roles.append({'role': d.role}) + return roles + +def make_custom_roles(doctype, name, roles): + field = doctype.lower() + + if roles: + custom_permission = frappe.get_doc({ + 'doctype': 'Custom Role', + field : name, + 'roles' : roles + }).insert()