From 5675ce4f122e700ea9b8ab25df3429ae38e3cd53 Mon Sep 17 00:00:00 2001
From: Hangzhi Yu <hangzhi@protonmail.com>
Date: Tue, 9 Apr 2024 00:54:47 +0200
Subject: [PATCH] Add coursebook menu rule

---
 aleksis/apps/alsijil/frontend/index.js  | 4 ++--
 aleksis/apps/alsijil/rules.py           | 7 +++++++
 aleksis/apps/alsijil/util/predicates.py | 9 +++++++++
 3 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/aleksis/apps/alsijil/frontend/index.js b/aleksis/apps/alsijil/frontend/index.js
index edcda144e..39499709f 100644
--- a/aleksis/apps/alsijil/frontend/index.js
+++ b/aleksis/apps/alsijil/frontend/index.js
@@ -411,7 +411,7 @@ export default {
         iconActive: "mdi-book-education",
         titleKey: "alsijil.coursebook.menu_title",
         toolbarTitle: "alsijil.coursebook.menu_title",
-        permission: "core.view_calendar_feed_rule",
+        permission: "alsijil.view_documentations_menu_rule",
       },
       children: [
         {
@@ -421,7 +421,7 @@ export default {
           meta: {
             titleKey: "alsijil.coursebook.menu_title",
             toolbarTitle: "alsijil.coursebook.menu_title",
-            permission: "core.view_calendar_feed_rule",
+            permission: "alsijil.view_documentations_menu_rule",
             fullWidth: true,
           },
         },
diff --git a/aleksis/apps/alsijil/rules.py b/aleksis/apps/alsijil/rules.py
index f48bf498d..206cde1cf 100644
--- a/aleksis/apps/alsijil/rules.py
+++ b/aleksis/apps/alsijil/rules.py
@@ -13,6 +13,7 @@ from aleksis.core.util.predicates import (
 from .util.predicates import (
     can_edit_documentation,
     can_view_documentation,
+    can_view_any_documentation,
     has_lesson_group_object_perm,
     has_person_group_object_perm,
     has_personal_note_group_perm,
@@ -382,6 +383,12 @@ view_documentations_for_group_predicate = has_person & (
 )
 add_perm("alsijil.view_documentations_for_group_rule", view_documentations_for_group_predicate)
 
+view_documentations_menu_predicate = has_person & (
+    has_global_perm("alsijil.view_documentation")
+    | can_view_any_documentation
+)
+add_perm("alsijil.view_documentations_menu_rule", view_documentations_menu_predicate)
+
 view_documentations_for_teacher_predicate = has_person & (
     has_global_perm("alsijil.view_documentation") | is_current_person
 )
diff --git a/aleksis/apps/alsijil/util/predicates.py b/aleksis/apps/alsijil/util/predicates.py
index 892d733af..d0b50940d 100644
--- a/aleksis/apps/alsijil/util/predicates.py
+++ b/aleksis/apps/alsijil/util/predicates.py
@@ -1,6 +1,7 @@
 from typing import Any, Union
 
 from django.contrib.auth.models import User
+from django.db.models import Prefetch, Q
 from django.utils.timezone import localdate, localtime
 
 from rules import predicate
@@ -417,6 +418,14 @@ def can_view_documentation(user: User, obj: Documentation):
     return False
 
 
+@predicate
+def can_view_any_documentation(user: User):
+    """Predicate which checks if the user is allowed to view any documentation."""
+    allowed_lesson_events = LessonEvent.objects.related_to_person(user.person)
+
+    return Documentation.objects.filter(Q(teachers=user.person) | Q(lesson_event__in=allowed_lesson_events) | Q(course__teachers=user.person)).exists()
+
+
 @predicate
 def can_edit_documentation(user: User, obj: Documentation):
     """Predicate which checks if the user is allowed to edit or delete a documentation."""
-- 
GitLab