From 57be44f2375467bfe6ff0d158380e6991e456c57 Mon Sep 17 00:00:00 2001
From: Jonathan Weth <git@jonathanweth.de>
Date: Wed, 21 Oct 2020 17:27:49 +0200
Subject: [PATCH] Include depending predicates in permission rules,  so that
 permissions are basing on other ones

---
 aleksis/apps/alsijil/rules.py | 76 ++++++++++++++++++-----------------
 1 file changed, 40 insertions(+), 36 deletions(-)

diff --git a/aleksis/apps/alsijil/rules.py b/aleksis/apps/alsijil/rules.py
index 0e30bebb5..c20c0cfee 100644
--- a/aleksis/apps/alsijil/rules.py
+++ b/aleksis/apps/alsijil/rules.py
@@ -40,69 +40,61 @@ add_perm("alsijil.view_lesson", view_lesson_predicate)
 add_perm("alsijil.view_lesson_menu", has_person)
 
 # View lesson personal notes
-view_lesson_personal_notes_predicate = has_person & (
+view_lesson_personal_notes_predicate = view_lesson_predicate & (
     has_global_perm("alsijil.view_personalnote")
+    | ~is_lesson_participant
     | has_lesson_group_object_perm("core.view_personalnote_group")
-    | is_lesson_teacher
-    | is_lesson_parent_group_owner
 )
 add_perm("alsijil.view_lesson_personalnote", view_lesson_personal_notes_predicate)
 
 # Edit personal note
-edit_lesson_personal_note_predicate = has_person & (
+edit_lesson_personal_note_predicate = view_lesson_personal_notes_predicate & (
     has_global_perm("alsijil.change_personalnote")
+    | ~is_lesson_parent_group_owner
     | has_lesson_group_object_perm("core.edit_personalnote_group")
-    | is_lesson_teacher
 )
 add_perm("alsijil.edit_lesson_personalnote", edit_lesson_personal_note_predicate)
 
 # View personal note
 view_personal_note_predicate = has_person & (
     has_global_perm("alsijil.view_personalnote")
-    | has_personal_note_group_perm("core.view_personalnote_group")
     | is_personal_note_lesson_teacher
     | (
         is_own_personal_note
         & is_site_preference_set("alsijil", "view_own_personal_notes")
     )
     | is_personal_note_lesson_parent_group_owner
+    | has_personal_note_group_perm("core.view_personalnote_group")
 )
 add_perm("alsijil.view_personalnote", view_personal_note_predicate)
 
 # Edit personal note
-edit_personal_note_predicate = has_person & (
+edit_personal_note_predicate = view_personal_note_predicate & (
     has_global_perm("alsijil.view_personalnote")
+    | ~is_own_personal_note
     | has_personal_note_group_perm("core.edit_personalnote_group")
-    | is_personal_note_lesson_teacher
-    | is_personal_note_lesson_parent_group_owner
 )
 add_perm("alsijil.edit_personalnote", edit_personal_note_predicate)
 
 # View lesson documentation
-view_lesson_documentation_predicate = has_person & (
-    has_global_perm("alsijil.view_lessondocumentation")
-    | has_lesson_group_object_perm("core.view_lessondocumentation_group")
-    | is_lesson_teacher
-    | is_lesson_parent_group_owner
-    | is_lesson_participant
-)
+view_lesson_documentation_predicate = view_lesson_predicate
 add_perm("alsijil.view_lessondocumentation", view_lesson_documentation_predicate)
 
 # Edit lesson documentation
-edit_lesson_documentation_predicate = has_person & (
+edit_lesson_documentation_predicate = view_lesson_predicate & (
     has_global_perm("alsijil.change_lessondocumentation")
-    | has_lesson_group_object_perm("core.edit_lessondocumentation_group")
     | is_lesson_teacher
+    | has_lesson_group_object_perm("core.edit_lessondocumentation_group")
 )
 add_perm("alsijil.edit_lessondocumentation", edit_lesson_documentation_predicate)
 
 # View week overview
 view_week_predicate = has_person & (
     has_global_perm("alsijil.view_week")
-    | has_object_perm("core.view_week_class_register_group")
+    | is_current_person
     | is_group_member
     | is_group_owner
-    | is_current_person
+    | has_object_perm("core.view_week_class_register_group")
 )
 add_perm("alsijil.view_week", view_week_predicate)
 
@@ -164,7 +156,7 @@ view_person_overview_menu_predicate = has_person
 add_perm("alsijil.view_person_overview_menu", view_person_overview_menu_predicate)
 
 # View person overview personal notes
-view_person_overview_personal_notes_predicate = has_person & (
+view_person_overview_personal_notes_predicate = view_person_overview_predicate & (
     has_global_perm("alsijil.view_personalnote")
     | has_person_group_object_perm("core.view_personalnote_group")
     | is_person_primary_group_owner
@@ -176,10 +168,13 @@ add_perm(
 )
 
 # Edit person overview personal notes
-edit_person_overview_personal_notes_predicate = has_person & (
-    has_global_perm("alsijil.edit_personalnote")
-    | has_person_group_object_perm("core.edit_personalnote_group")
-    | is_person_primary_group_owner
+edit_person_overview_personal_notes_predicate = (
+    view_person_overview_personal_notes_predicate
+    & (
+        has_global_perm("alsijil.edit_personalnote")
+        | ~is_current_person
+        | has_person_group_object_perm("core.edit_personalnote_group")
+    )
 )
 add_perm(
     "alsijil.edit_person_overview_personalnote",
@@ -187,11 +182,8 @@ add_perm(
 )
 
 # View person statistics on personal notes
-view_person_statistics_personal_notes_predicate = has_person & (
-    has_global_perm("alsijil.view_personalnote")
-    | has_person_group_object_perm("core.view_personalnote_group")
-    | is_person_primary_group_owner
-    | is_current_person
+view_person_statistics_personal_notes_predicate = (
+    view_person_overview_personal_notes_predicate
 )
 add_perm(
     "alsijil.view_person_statistics_personalnote",
@@ -203,15 +195,21 @@ view_excusetypes_predicate = has_person & has_global_perm("alsijil.view_excusety
 add_perm("alsijil.view_excusetypes", view_excusetypes_predicate)
 
 # Add excuse type
-add_excusetype_predicate = has_person & has_global_perm("alsijil.add_excusetype")
+add_excusetype_predicate = view_excusetypes_predicate & has_global_perm(
+    "alsijil.add_excusetype"
+)
 add_perm("alsijil.add_excusetype", add_excusetype_predicate)
 
 # Edit excuse type
-edit_excusetype_predicate = has_person & has_global_perm("alsijil.change_excusetype")
+edit_excusetype_predicate = view_excusetypes_predicate & has_global_perm(
+    "alsijil.change_excusetype"
+)
 add_perm("alsijil.edit_excusetype", edit_excusetype_predicate)
 
 # Delete excuse type
-delete_excusetype_predicate = has_person & has_global_perm("alsijil.delete_excusetype")
+delete_excusetype_predicate = view_excusetypes_predicate & has_global_perm(
+    "alsijil.delete_excusetype"
+)
 add_perm("alsijil.delete_excusetype", delete_excusetype_predicate)
 
 # View extra mark list
@@ -219,13 +217,19 @@ view_extramarks_predicate = has_person & has_global_perm("alsijil.view_extramark
 add_perm("alsijil.view_extramarks", view_extramarks_predicate)
 
 # Add extra mark
-add_extramark_predicate = has_person & has_global_perm("alsijil.add_extramark")
+add_extramark_predicate = view_extramarks_predicate & has_global_perm(
+    "alsijil.add_extramark"
+)
 add_perm("alsijil.add_extramark", add_extramark_predicate)
 
 # Edit extra mark
-edit_extramark_predicate = has_person & has_global_perm("alsijil.change_extramark")
+edit_extramark_predicate = view_extramarks_predicate & has_global_perm(
+    "alsijil.change_extramark"
+)
 add_perm("alsijil.edit_extramark", edit_extramark_predicate)
 
 # Delete extra mark
-delete_extramark_predicate = has_person & has_global_perm("alsijil.delete_extramark")
+delete_extramark_predicate = view_extramarks_predicate & has_global_perm(
+    "alsijil.delete_extramark"
+)
 add_perm("alsijil.delete_extramark", delete_extramark_predicate)
-- 
GitLab