From 6e9a0f6079411faf82bd68818e73ca12fe4c62b6 Mon Sep 17 00:00:00 2001
From: Hangzhi Yu <hangzhi@protonmail.com>
Date: Sat, 18 Jul 2020 01:15:55 +0200
Subject: [PATCH] Add menu validators using rules

---
 aleksis/apps/alsijil/menus.py | 28 ++++++++++++++++++++++++----
 aleksis/apps/alsijil/rules.py | 22 +++++++++++++++++++---
 2 files changed, 43 insertions(+), 7 deletions(-)

diff --git a/aleksis/apps/alsijil/menus.py b/aleksis/apps/alsijil/menus.py
index 2b84cb6f7..4ed08937b 100644
--- a/aleksis/apps/alsijil/menus.py
+++ b/aleksis/apps/alsijil/menus.py
@@ -16,25 +16,45 @@ MENUS = {
                     "name": _("Current lesson"),
                     "url": "lesson",
                     "icon": "alarm",
-                    "validators": ["menu_generator.validators.is_authenticated"],
+                    "validators": [
+                        (
+                            "aleksis.core.util.predicates.permission_validator",
+                            "alsijil.view_lesson_menu",
+                        ),
+                    ],
                 },
                 {
                     "name": _("Current week"),
                     "url": "week_view",
                     "icon": "view_week",
-                    "validators": ["menu_generator.validators.is_authenticated"],
+                    "validators": [
+                        (
+                            "aleksis.core.util.predicates.permission_validator",
+                            "alsijil.view_week_menu",
+                        ),
+                    ],
                 },
                 {
                     "name": _("Register absence"),
                     "url": "register_absence",
                     "icon": "rate_review",
-                    "validators": ["menu_generator.validators.is_superuser"],
+                    "validators": [
+                        (
+                            "aleksis.core.util.predicates.permission_validator",
+                            "alsijil.view_register_absence",
+                        ),
+                    ],
                 },
                 {
                     "name": _("Personal note filters"),
                     "url": "list_personal_note_filters",
                     "icon": "filter_list",
-                    "validators": ["menu_generator.validators.is_superuser"],
+                    "validators": [
+                        (
+                            "aleksis.core.util.predicates.permission_validator",
+                            "alsijil.view_personal_note_filters",
+                        ),
+                    ],
                 },
             ],
         }
diff --git a/aleksis/apps/alsijil/rules.py b/aleksis/apps/alsijil/rules.py
index 3812aef2a..2c0e000a2 100644
--- a/aleksis/apps/alsijil/rules.py
+++ b/aleksis/apps/alsijil/rules.py
@@ -1,12 +1,15 @@
 from rules import add_perm
 
+from aleksis.core.models import Person
 from aleksis.core.util.predicates import (
+    has_any_object,
     has_global_perm,
     has_object_perm,
     has_person,
     is_current_person,
 )
 
+from .models import PersonalNoteFilter
 from .util.predicates import (
     has_lesson_group_object_perm,
     has_person_group_object_perm,
@@ -28,6 +31,9 @@ view_lesson_predicate = has_person & (
 )
 add_perm("alsijil.view_lesson", view_lesson_predicate)
 
+# View lesson in menu
+add_perm("alsijil.view_lesson_menu", has_person)
+
 # View lesson personal notes
 view_lesson_personal_notes_predicate = has_person & (
     has_global_perm("alsijil.view_personalnote")
@@ -73,6 +79,9 @@ view_week_predicate = has_person & (
 )
 add_perm("alsijil.view_week", view_week_predicate)
 
+# View week overview in menu
+add_perm("alsijil.view_week_menu", has_person)
+
 # View week personal notes
 view_week_personal_notes_predicate = has_person & (
     has_global_perm("alsijil.view_personalnote")
@@ -81,6 +90,12 @@ view_week_personal_notes_predicate = has_person & (
 )
 add_perm("alsijil.view_week_personalnote", view_week_personal_notes_predicate)
 
+# View register absence page
+view_register_absence_predicate = has_person & (
+    has_any_object("alsijil.register_absence", Person)
+)
+add_perm("alsijil.view_register_absence", view_register_absence_predicate)
+
 # Register absence
 register_absence_predicate = has_person & (
     has_global_perm("alsijil.register_absence")
@@ -99,10 +114,11 @@ view_full_register_predicate = has_person & (
 add_perm("alsijil.view_full_register", view_full_register_predicate)
 
 # View all personal note filters
-list_personal_note_filters_predicate = has_person & has_global_perm(
-    "alsijil.view_personal_note_filter"
+view_personal_note_filters_predicate = has_person & (
+    has_global_perm("alsijil.view_personalnotefilter")
+    | has_any_object("alsijil.view_personalnotefilter", PersonalNoteFilter)
 )
-add_perm("alsijil.view_personal_note_filters", list_personal_note_filters_predicate)
+add_perm("alsijil.view_personal_note_filters", view_personal_note_filters_predicate)
 
 # Edit personal note filter
 edit_personal_note_filter_predicate = has_person & (
-- 
GitLab