From c279ea65f2445348e6fad25e0ac6149b4108feca Mon Sep 17 00:00:00 2001 From: MuhammadZubair12 Date: Mon, 26 Feb 2024 16:29:33 +0500 Subject: [PATCH 1/7] new Permission for wiki space --- wiki/wiki/doctype/wiki_page/wiki_page.py | 69 ++++++++++++++++-------- 1 file changed, 47 insertions(+), 22 deletions(-) diff --git a/wiki/wiki/doctype/wiki_page/wiki_page.py b/wiki/wiki/doctype/wiki_page/wiki_page.py index bfed1837..1c0b3ff4 100644 --- a/wiki/wiki/doctype/wiki_page/wiki_page.py +++ b/wiki/wiki/doctype/wiki_page/wiki_page.py @@ -156,9 +156,9 @@ def update_page(self, title, content, edit_message, raised_by=None): self.save() def verify_permission(self, permtype): + permitted = frappe.has_permission(self.doctype, permtype, self) if permtype == "read" and self.allow_guest: return True - permitted = frappe.has_permission(self.doctype, permtype, self) if not permitted: action = permtype if action == "write": @@ -216,6 +216,23 @@ def calculate_toc_html(self, html): def get_context(self, context): self.verify_permission("read") self.set_breadcrumbs(context) + ccc = frappe.db.sql(""" select user, allow, for_value,name from `tabUser Permission` where user=%s and allow='Wiki Space' """,(frappe.session.user)) + print(self.name) + match_found = False + for c in ccc: + ws = frappe.db.sql(""" select w.wiki_page from `tabWiki Group Item` as w where parent=%s""",(c[2])) + for a in ws: + print(a[0]) + if a[0] == self.name: + match_found = True + break + if match_found: + print("ok") + else: + frappe.local.response["type"] = "redirect" + frappe.local.response["location"] = "/" + raise frappe.Redirect + print("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++") wiki_settings = frappe.get_single("Wiki Settings") context.navbar_search = wiki_settings.add_search_bar context.add_dark_mode = wiki_settings.add_dark_mode @@ -283,6 +300,7 @@ def get_context(self, context): def get_items(self, sidebar_items): topmost = frappe.get_value("Wiki Group Item", {"wiki_page": self.name}, ["parent"]) + wikiSpace = frappe.db.sql("""select name from `tabWiki Space`""") sidebar_html = frappe.cache().hget("wiki_sidebar", topmost) if not sidebar_html or frappe.conf.disable_website_cache or frappe.conf.developer_mode: @@ -294,6 +312,7 @@ def get_items(self, sidebar_items): context.current_route = self.route context.collapse_sidebar_groups = wiki_settings.collapse_sidebar_groups context.sidebar_items = sidebar_items + context.wikiSpace = wikiSpace context.wiki_search_scope = self.get_space_route() sidebar_html = frappe.render_template( "wiki/wiki/doctype/wiki_page/templates/web_sidebar.html", context @@ -304,30 +323,36 @@ def get_items(self, sidebar_items): def get_sidebar_items(self): wiki_sidebar = frappe.get_doc("Wiki Space", {"route": self.get_space_route()}).wiki_sidebars + check = frappe.db.sql(""" select user, allow, for_value,name from `tabUser Permission` where user=%s and allow='Wiki Space' """,(frappe.session.user)) + print("==================================================================") sidebar = {} for sidebar_item in wiki_sidebar: - wiki_page = frappe.get_doc("Wiki Page", sidebar_item.wiki_page) - if sidebar_item.parent_label not in sidebar: - sidebar[sidebar_item.parent_label] = [ - { - "name": wiki_page.name, - "type": "Wiki Page", - "title": wiki_page.title, - "route": wiki_page.route, - "group_name": sidebar_item.parent_label, - } - ] - else: - sidebar[sidebar_item.parent_label] += [ - { - "name": wiki_page.name, - "type": "Wiki Page", - "title": wiki_page.title, - "route": wiki_page.route, - "group_name": sidebar_item.parent_label, - } - ] + for c in check: + if c and c[2] and c[2] == sidebar_item.parent: + wiki_page = frappe.get_doc("Wiki Page", sidebar_item.wiki_page) + if sidebar_item.parent_label not in sidebar: + sidebar[sidebar_item.parent_label] = [ + { + "name": wiki_page.name, + "type": "Wiki Page", + "title": wiki_page.title, + "route": wiki_page.route, + "group_name": sidebar_item.parent_label, + } + ] + else: + sidebar[sidebar_item.parent_label] += [ + { + "name": wiki_page.name, + "type": "Wiki Page", + "title": wiki_page.title, + "route": wiki_page.route, + "group_name": sidebar_item.parent_label, + } + ] + else: + print("_________________________________________________") return self.get_items(sidebar) From 87957daaa30fdba25e8e2a641142df51bf9b3b43 Mon Sep 17 00:00:00 2001 From: MuhammadZubair12 Date: Mon, 4 Mar 2024 20:31:27 +0500 Subject: [PATCH 2/7] Updates query with builder --- wiki/wiki/doctype/wiki_page/wiki_page.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/wiki/wiki/doctype/wiki_page/wiki_page.py b/wiki/wiki/doctype/wiki_page/wiki_page.py index 1c0b3ff4..085a9768 100644 --- a/wiki/wiki/doctype/wiki_page/wiki_page.py +++ b/wiki/wiki/doctype/wiki_page/wiki_page.py @@ -216,23 +216,20 @@ def calculate_toc_html(self, html): def get_context(self, context): self.verify_permission("read") self.set_breadcrumbs(context) - ccc = frappe.db.sql(""" select user, allow, for_value,name from `tabUser Permission` where user=%s and allow='Wiki Space' """,(frappe.session.user)) - print(self.name) + results = frappe.db.get_value("User Permission", {"user": frappe.session.user, "allow": "Wiki Space"}, ["user", "allow", "for_value", "name"]) match_found = False - for c in ccc: - ws = frappe.db.sql(""" select w.wiki_page from `tabWiki Group Item` as w where parent=%s""",(c[2])) - for a in ws: - print(a[0]) - if a[0] == self.name: + for result in results: + wikiGroup = frappe.db.get_value("Wiki Group Item",{"parent",result[2]}) + for wk in wikiGroup: + if wk[0] == self.name: match_found = True break if match_found: - print("ok") + pass else: frappe.local.response["type"] = "redirect" frappe.local.response["location"] = "/" raise frappe.Redirect - print("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++") wiki_settings = frappe.get_single("Wiki Settings") context.navbar_search = wiki_settings.add_search_bar context.add_dark_mode = wiki_settings.add_dark_mode From 7b7dcfb320fd8f59d98c454932d77ad806ae7287 Mon Sep 17 00:00:00 2001 From: MuhammadZubair12 Date: Thu, 21 Mar 2024 14:33:41 +0500 Subject: [PATCH 3/7] remove print statement and also update query structure --- wiki/wiki/doctype/wiki_page/wiki_page.py | 77 +++++++++++++----------- 1 file changed, 42 insertions(+), 35 deletions(-) diff --git a/wiki/wiki/doctype/wiki_page/wiki_page.py b/wiki/wiki/doctype/wiki_page/wiki_page.py index 085a9768..f44ad38d 100644 --- a/wiki/wiki/doctype/wiki_page/wiki_page.py +++ b/wiki/wiki/doctype/wiki_page/wiki_page.py @@ -216,16 +216,22 @@ def calculate_toc_html(self, html): def get_context(self, context): self.verify_permission("read") self.set_breadcrumbs(context) - results = frappe.db.get_value("User Permission", {"user": frappe.session.user, "allow": "Wiki Space"}, ["user", "allow", "for_value", "name"]) - match_found = False - for result in results: - wikiGroup = frappe.db.get_value("Wiki Group Item",{"parent",result[2]}) - for wk in wikiGroup: - if wk[0] == self.name: - match_found = True + results = frappe.db.get_all("User Permission", {"user": frappe.session.user, "allow": "Wiki Space"}, ["user", "allow", "for_value", "name"]) + if results: + match_found = False + for result in results: + wikiGroup = frappe.db.get_all("Wiki Group Item", {"parent": result['for_value']},["name","wiki_page"]) + if wikiGroup: + for wk in wikiGroup: + if wk['wiki_page'] == self.name: + match_found = True + break + if match_found: break - if match_found: - pass + if not match_found: + frappe.local.response["type"] = "redirect" + frappe.local.response["location"] = "/" + raise frappe.Redirect else: frappe.local.response["type"] = "redirect" frappe.local.response["location"] = "/" @@ -320,36 +326,37 @@ def get_items(self, sidebar_items): def get_sidebar_items(self): wiki_sidebar = frappe.get_doc("Wiki Space", {"route": self.get_space_route()}).wiki_sidebars - check = frappe.db.sql(""" select user, allow, for_value,name from `tabUser Permission` where user=%s and allow='Wiki Space' """,(frappe.session.user)) - print("==================================================================") + user = frappe.session.user + check = frappe.db.get_all("User Permission", {"user": user, "allow": "Wiki Space"}, ["user", "allow", "for_value", "name"]) sidebar = {} for sidebar_item in wiki_sidebar: - for c in check: - if c and c[2] and c[2] == sidebar_item.parent: - wiki_page = frappe.get_doc("Wiki Page", sidebar_item.wiki_page) - if sidebar_item.parent_label not in sidebar: - sidebar[sidebar_item.parent_label] = [ - { - "name": wiki_page.name, - "type": "Wiki Page", - "title": wiki_page.title, - "route": wiki_page.route, - "group_name": sidebar_item.parent_label, - } - ] + if check: + for c in check: + if c and c['for_value'] and c['for_value'] == sidebar_item.parent: + wiki_page = frappe.get_doc("Wiki Page", sidebar_item.wiki_page) + if sidebar_item.parent_label not in sidebar: + sidebar[sidebar_item.parent_label] = [ + { + "name": wiki_page.name, + "type": "Wiki Page", + "title": wiki_page.title, + "route": wiki_page.route, + "group_name": sidebar_item.parent_label, + } + ] + else: + sidebar[sidebar_item.parent_label] += [ + { + "name": wiki_page.name, + "type": "Wiki Page", + "title": wiki_page.title, + "route": wiki_page.route, + "group_name": sidebar_item.parent_label, + } + ] else: - sidebar[sidebar_item.parent_label] += [ - { - "name": wiki_page.name, - "type": "Wiki Page", - "title": wiki_page.title, - "route": wiki_page.route, - "group_name": sidebar_item.parent_label, - } - ] - else: - print("_________________________________________________") + pass return self.get_items(sidebar) From ba8d5f76baedd75614ff7b6bd2563eb0a00d25da Mon Sep 17 00:00:00 2001 From: Hardik Zinzu Date: Sat, 7 Sep 2024 14:55:36 +0530 Subject: [PATCH 4/7] [COMMIT] #217 Optimised code for New permission for wiki space. --- wiki/wiki/doctype/wiki_page/wiki_page.py | 92 +++++++++++------------- 1 file changed, 42 insertions(+), 50 deletions(-) diff --git a/wiki/wiki/doctype/wiki_page/wiki_page.py b/wiki/wiki/doctype/wiki_page/wiki_page.py index ee1ae6cd..120e3632 100644 --- a/wiki/wiki/doctype/wiki_page/wiki_page.py +++ b/wiki/wiki/doctype/wiki_page/wiki_page.py @@ -50,17 +50,24 @@ def on_update(self): update_index(self) def on_trash(self): - frappe.db.sql("DELETE FROM `tabWiki Page Revision Item` WHERE wiki_page = %s", self.name) - - frappe.db.sql( - """DELETE FROM `tabWiki Page Revision` WHERE name in - ( - SELECT name FROM `tabWiki Page Revision` - EXCEPT - SELECT DISTINCT parent from `tabWiki Page Revision Item` - )""" + if frappe.db.exists('Wiki Page Revision Item', {'wiki_page': self.name}): + frappe.db.delete('Wiki Page Revision Item', {'wiki_page': self.name}) + + # Get names of revisions that are not referenced in `Wiki Page Revision Item` + revisions_to_delete = frappe.db.get_all( + "Wiki Page Revision", + filters={ + "name": ["not in", frappe.db.get_all( + "Wiki Page Revision Item", + fields=["distinct parent"] + )] + }, + pluck="name" ) + if revisions_to_delete: + frappe.db.delete("Wiki Page Revision", {"name": ["in", revisions_to_delete]}) + for name in frappe.get_all("Wiki Page Patch", {"wiki_page": self.name, "new": 0}, pluck="name"): patch = frappe.get_doc("Wiki Page Patch", name) try: @@ -72,8 +79,7 @@ def on_trash(self): for name in frappe.get_all("Wiki Page Patch", {"wiki_page": self.name, "new": 1}, pluck="name"): frappe.db.set_value("Wiki Page Patch", name, "wiki_page", "") - wiki_sidebar_name = frappe.get_value("Wiki Group Item", {"wiki_page": self.name}) - frappe.delete_doc("Wiki Group Item", wiki_sidebar_name) + frappe.db.delete("Wiki Group Item", {"wiki_page": self.name}) clear_sidebar_cache() remove_index(self) @@ -209,19 +215,18 @@ def calculate_toc_html(self, html): def get_context(self, context): self.verify_permission("read") self.set_breadcrumbs(context) - results = frappe.db.get_all("User Permission", {"user": frappe.session.user, "allow": "Wiki Space"}, ["user", "allow", "for_value", "name"]) - if results: - match_found = False - for result in results: - wikiGroup = frappe.db.get_all("Wiki Group Item", {"parent": result['for_value']},["name","wiki_page"]) - if wikiGroup: - for wk in wikiGroup: - if wk['wiki_page'] == self.name: - match_found = True - break - if match_found: - break - if not match_found: + + user_permissions = frappe.db.get_all("User Permission", filters={"user": frappe.session.user, "allow": "Wiki Space"}, pluck="for_value") + if user_permissions: + # Fetch all Wiki Groups associated with the user permissions + wiki_groups = frappe.db.get_all( + "Wiki Group Item", + filters={"parent": ["in", user_permissions]}, + pluck="wiki_page" + ) + + # Check if the current wiki page is in the allowed wiki groups + if self.name not in wiki_groups: frappe.local.response["type"] = "redirect" frappe.local.response["location"] = "/" raise frappe.Redirect @@ -304,7 +309,7 @@ def get_context(self, context): def get_items(self, sidebar_items): topmost = frappe.get_value("Wiki Group Item", {"wiki_page": self.name}, ["parent"]) - wikiSpace = frappe.db.sql("""select name from `tabWiki Space`""") + wikiSpace = frappe.get_all('Wiki Space', pluck='name') sidebar_html = frappe.cache().hget("wiki_sidebar", topmost) if not sidebar_html or frappe.conf.disable_website_cache or frappe.conf.developer_mode: @@ -337,31 +342,18 @@ def get_sidebar_items(self): wiki_page = frappe.get_doc("Wiki Page", sidebar_item.wiki_page) - if not wiki_page.allow_guest: - permitted = frappe.has_permission(wiki_page.doctype, "read", wiki_page) - if not permitted: - continue - - if sidebar_item.parent_label not in sidebar: - sidebar[sidebar_item.parent_label] = [ - { - "name": wiki_page.name, - "type": "Wiki Page", - "title": wiki_page.title, - "route": wiki_page.route, - "group_name": sidebar_item.parent_label, - } - ] - else: - sidebar[sidebar_item.parent_label] += [ - { - "name": wiki_page.name, - "type": "Wiki Page", - "title": wiki_page.title, - "route": wiki_page.route, - "group_name": sidebar_item.parent_label, - } - ] + if wiki_page.allow_guest or frappe.has_permission(wiki_page.doctype, "read", wiki_page): + page_info = { + "name": wiki_page.name, + "type": "Wiki Page", + "title": wiki_page.title, + "route": wiki_page.route, + "group_name": sidebar_item.parent_label, + } + if sidebar_item.parent_label not in sidebar: + sidebar[sidebar_item.parent_label] = [page_info] + else: + sidebar[sidebar_item.parent_label].append(page_info) return self.get_items(sidebar) From 20d0e93da2399fc44f1781a3da8981ba148b4ff2 Mon Sep 17 00:00:00 2001 From: Hardik Zinzuvadiya <25708027+Z4nzu@users.noreply.github.com> Date: Tue, 10 Sep 2024 10:43:05 +0000 Subject: [PATCH 5/7] Enhance permission handling for WikiPage in Frappe Wiki app --- wiki/wiki/doctype/wiki_page/wiki_page.py | 23 +++++------------------ 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/wiki/wiki/doctype/wiki_page/wiki_page.py b/wiki/wiki/doctype/wiki_page/wiki_page.py index 120e3632..4afe54f8 100644 --- a/wiki/wiki/doctype/wiki_page/wiki_page.py +++ b/wiki/wiki/doctype/wiki_page/wiki_page.py @@ -216,24 +216,11 @@ def get_context(self, context): self.verify_permission("read") self.set_breadcrumbs(context) - user_permissions = frappe.db.get_all("User Permission", filters={"user": frappe.session.user, "allow": "Wiki Space"}, pluck="for_value") - if user_permissions: - # Fetch all Wiki Groups associated with the user permissions - wiki_groups = frappe.db.get_all( - "Wiki Group Item", - filters={"parent": ["in", user_permissions]}, - pluck="wiki_page" - ) - - # Check if the current wiki page is in the allowed wiki groups - if self.name not in wiki_groups: - frappe.local.response["type"] = "redirect" - frappe.local.response["location"] = "/" - raise frappe.Redirect - else: - frappe.local.response["type"] = "redirect" - frappe.local.response["location"] = "/" - raise frappe.Redirect + if frappe.session.user != "Administrator": # Administrator should have all wiki access + user_permissions = frappe.db.get_all("User Permission", filters={"user": frappe.session.user, "allow": "Wiki Space"}, pluck="for_value") + + if not user_permissions or not frappe.db.exists("Wiki Group Item", {"parent": ["in", user_permissions], "wiki_page": self.name}): + raise frappe.PermissionError(_("You do not have permission to access this page.
Please contact the Administrator for assistance.
")) wiki_settings = frappe.get_single("Wiki Settings") wiki_space_name = frappe.get_value("Wiki Group Item", {"wiki_page": self.name}, "parent") From cab8d495ac87fe896855aecdf8186d6ae7aacfd0 Mon Sep 17 00:00:00 2001 From: Hardik Zinzuvadiya <25708027+Z4nzu@users.noreply.github.com> Date: Wed, 11 Sep 2024 14:51:23 +0000 Subject: [PATCH 6/7] [COMMIT] Enhance Wiki Page Visibility and Permissions Handling --- wiki/wiki/doctype/wiki_page/wiki_page.py | 125 +++++++++--------- .../doctype/wiki_settings/wiki_settings.json | 16 ++- 2 files changed, 74 insertions(+), 67 deletions(-) diff --git a/wiki/wiki/doctype/wiki_page/wiki_page.py b/wiki/wiki/doctype/wiki_page/wiki_page.py index 4afe54f8..8cbda86b 100644 --- a/wiki/wiki/doctype/wiki_page/wiki_page.py +++ b/wiki/wiki/doctype/wiki_page/wiki_page.py @@ -216,83 +216,77 @@ def get_context(self, context): self.verify_permission("read") self.set_breadcrumbs(context) - if frappe.session.user != "Administrator": # Administrator should have all wiki access + wiki_settings = frappe.get_single("Wiki Settings") + + if sbool(wiki_settings.enable_custom_permissions) and frappe.session.user != "Administrator" and not self.allow_guest: user_permissions = frappe.db.get_all("User Permission", filters={"user": frappe.session.user, "allow": "Wiki Space"}, pluck="for_value") - + if not user_permissions or not frappe.db.exists("Wiki Group Item", {"parent": ["in", user_permissions], "wiki_page": self.name}): - raise frappe.PermissionError(_("You do not have permission to access this page.
Please contact the Administrator for assistance.
")) + raise frappe.PermissionError(_("It seems you don't have access to this page. Please contact an administrator if you believe this is a mistake.")) - wiki_settings = frappe.get_single("Wiki Settings") wiki_space_name = frappe.get_value("Wiki Group Item", {"wiki_page": self.name}, "parent") wiki_space = frappe.get_doc("Wiki Space", wiki_space_name) - context.no_cache = 1 - context.navbar_search = wiki_settings.add_search_bar - context.light_mode_logo = wiki_space.light_mode_logo or wiki_settings.logo - context.dark_mode_logo = wiki_space.dark_mode_logo or wiki_settings.dark_mode_logo - if wiki_space.light_mode_logo or wiki_space.dark_mode_logo: - context.home_page = "/" + wiki_space.route - context.script = wiki_settings.javascript - context.show_feedback = wiki_settings.enable_feedback - context.ask_for_contact_details = wiki_settings.ask_for_contact_details - context.wiki_search_scope = self.get_space_route() - context.metatags = { - "title": self.title, - "description": self.meta_description, - "keywords": self.meta_keywords, - "image": self.meta_image, - "og:image:width": "1200", - "og:image:height": "630", - } - context.edit_wiki_page = frappe.form_dict.get("editWiki") - context.new_wiki_page = frappe.form_dict.get("newWiki") - context.last_revision = self.get_last_revision() - context.number_of_revisions = frappe.db.count("Wiki Page Revision Item", {"wiki_page": self.name}) - # TODO: group all context values - context.hide_on_sidebar = frappe.get_value( - "Wiki Group Item", {"wiki_page": self.name}, "hide_on_sidebar" - ) - html = frappe.utils.md_to_html(self.content) - context.content = html - context.page_toc_html = ( - self.calculate_toc_html(html) if wiki_settings.enable_table_of_contents else None - ) - + # Fetch values that are used more than once + navbar_items = wiki_space.navbar_items or wiki_settings.navbar + light_mode_logo = wiki_space.light_mode_logo or wiki_settings.logo + dark_mode_logo = wiki_space.dark_mode_logo or wiki_settings.dark_mode_logo revisions = frappe.db.get_all( "Wiki Page Revision", filters=[["wiki_page", "=", self.name]], fields=["content", "creation", "owner", "name", "raised_by", "raised_by_username"], ) - context.current_revision = revisions[0] - if len(revisions) > 1: - context.previous_revision = revisions[1] - else: - context.previous_revision = {"content": "

No Revisions

", "name": ""} - context.show_sidebar = True - context.hide_login = True - context.name = self.name - if (frappe.form_dict.editWiki or frappe.form_dict.newWiki) and frappe.form_dict.wikiPagePatch: - context.patch_new_code, context.patch_new_title = frappe.db.get_value( + # Prepare context updates in a single dictionary + context_updates = { + "no_cache": 1, + "navbar_search": wiki_settings.add_search_bar, + "light_mode_logo": light_mode_logo, + "dark_mode_logo": dark_mode_logo, + "home_page": f"/{wiki_space.route}" if light_mode_logo or dark_mode_logo else None, + "script": wiki_settings.javascript, + "show_feedback": wiki_settings.enable_feedback, + "ask_for_contact_details": wiki_settings.ask_for_contact_details, + "wiki_search_scope": self.get_space_route(), + "metatags": { + "title": self.title, + "description": self.meta_description, + "keywords": self.meta_keywords, + "image": self.meta_image, + "og:image:width": "1200", + "og:image:height": "630", + }, + "edit_wiki_page": frappe.form_dict.get("editWiki"), + "new_wiki_page": frappe.form_dict.get("newWiki"), + "last_revision": self.get_last_revision(), + "number_of_revisions": frappe.db.count("Wiki Page Revision Item", {"wiki_page": self.name}), + "hide_on_sidebar": frappe.get_value("Wiki Group Item", {"wiki_page": self.name}, "hide_on_sidebar"), + "content": frappe.utils.md_to_html(self.content), + "page_toc_html": self.calculate_toc_html( + frappe.utils.md_to_html(self.content)) if wiki_settings.enable_table_of_contents else None, + "current_revision": revisions[0] if revisions else 0, + "previous_revision": revisions[1] if len(revisions) > 1 else {"content": "

No Revisions

", + "name": ""}, + "show_sidebar": True, + "hide_login": True, + "name": self.name, + "navbar_items": modify_header_footer_items(navbar_items), + "post_login": [ + {"label": _("My Account"), "url": "/me"}, + {"label": _("Logout"), "url": "/?cmd=web_logout"}, + {"label": _("Contributions ") + get_open_contributions(), "url": "/contributions"}, + {"label": _("My Drafts ") + get_open_drafts(), "url": "/drafts"}, + ], + } + + # Handle conditional patch updates + if (context_updates["edit_wiki_page"] or context_updates["new_wiki_page"]) and frappe.form_dict.wikiPagePatch: + context_updates["patch_new_code"], context_updates["patch_new_title"] = frappe.db.get_value( "Wiki Page Patch", frappe.form_dict.wikiPagePatch, ["new_code", "new_title"] ) - context = context.update( - { - "navbar_items": modify_header_footer_items(wiki_space.navbar_items or wiki_settings.navbar), - "post_login": [ - {"label": _("My Account"), "url": "/me"}, - {"label": _("Logout"), "url": "/?cmd=web_logout"}, - { - "label": _("Contributions ") + get_open_contributions(), - "url": "/contributions", - }, - { - "label": _("My Drafts ") + get_open_drafts(), - "url": "/drafts", - }, - ], - } - ) + + # Apply all context updates in one go + context.update(context_updates) def get_items(self, sidebar_items): topmost = frappe.get_value("Wiki Group Item", {"wiki_page": self.name}, ["parent"]) @@ -319,8 +313,6 @@ def get_items(self, sidebar_items): def get_sidebar_items(self): wiki_sidebar = frappe.get_doc("Wiki Space", {"route": self.get_space_route()}).wiki_sidebars - user = frappe.session.user - check = frappe.db.get_all("User Permission", {"user": user, "allow": "Wiki Space"}, ["user", "allow", "for_value", "name"]) sidebar = {} for sidebar_item in wiki_sidebar: @@ -348,7 +340,8 @@ def get_last_revision(self): last_revision = frappe.db.get_value( "Wiki Page Revision Item", filters={"wiki_page": self.name}, fieldname="parent" ) - return frappe.get_doc("Wiki Page Revision", last_revision) + if frappe.db.exists('Wiki Page Revision', last_revision): + return frappe.get_doc("Wiki Page Revision", last_revision) def clone(self, original_space, new_space): # used in after_insert of Wiki Page to resist create of Wiki Page Revision diff --git a/wiki/wiki/doctype/wiki_settings/wiki_settings.json b/wiki/wiki/doctype/wiki_settings/wiki_settings.json index c8ea81a0..a312a4b4 100644 --- a/wiki/wiki/doctype/wiki_settings/wiki_settings.json +++ b/wiki/wiki/doctype/wiki_settings/wiki_settings.json @@ -14,6 +14,8 @@ "table_of_contents_section", "collapse_sidebar_groups", "enable_table_of_contents", + "permission_settings_section", + "enable_custom_permissions", "navbar_tab", "navbar_column", "navbar", @@ -149,12 +151,24 @@ "fieldname": "feedback_tab", "fieldtype": "Tab Break", "label": "Feedback" + }, + { + "default": "0", + "description": "Enable this to enforce permissions on Wiki pages.", + "fieldname": "enable_custom_permissions", + "fieldtype": "Check", + "label": "Enable Custom Permissions" + }, + { + "fieldname": "permission_settings_section", + "fieldtype": "Section Break", + "label": "Permission Settings" } ], "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2024-06-03 16:19:02.137667", + "modified": "2024-09-11 15:36:40.973302", "modified_by": "Administrator", "module": "Wiki", "name": "Wiki Settings", From d63880ed87602b28f39f931675de865c81b039f3 Mon Sep 17 00:00:00 2001 From: Hardik Zinzuvadiya <25708027+Z4nzu@users.noreply.github.com> Date: Fri, 13 Sep 2024 08:45:47 +0000 Subject: [PATCH 7/7] Improved code. --- wiki/wiki/doctype/wiki_page/wiki_page.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/wiki/wiki/doctype/wiki_page/wiki_page.py b/wiki/wiki/doctype/wiki_page/wiki_page.py index 8cbda86b..10d406f4 100644 --- a/wiki/wiki/doctype/wiki_page/wiki_page.py +++ b/wiki/wiki/doctype/wiki_page/wiki_page.py @@ -50,8 +50,7 @@ def on_update(self): update_index(self) def on_trash(self): - if frappe.db.exists('Wiki Page Revision Item', {'wiki_page': self.name}): - frappe.db.delete('Wiki Page Revision Item', {'wiki_page': self.name}) + frappe.delete_doc_if_exists('Wiki Page Revision Item', {'wiki_page': self.name}) # Get names of revisions that are not referenced in `Wiki Page Revision Item` revisions_to_delete = frappe.db.get_all( @@ -157,10 +156,9 @@ def update_page(self, title, content, edit_message, raised_by=None): self.save() def verify_permission(self, permtype): - permitted = frappe.has_permission(self.doctype, permtype, self) if permtype == "read" and self.allow_guest: return True - if not permitted: + if not frappe.has_permission(self.doctype, permtype, self): action = permtype if action == "write": action = "edit"