From 61446c9cb53a5d511bb6b14f0332ac829d7c67d9 Mon Sep 17 00:00:00 2001
From: magicfelix <felix@felix-zauberer.de>
Date: Tue, 12 Sep 2023 20:22:39 +0200
Subject: [PATCH] Add permission checking

---
 aleksis/apps/kolego/rules.py          | 28 +++++++++++++++++++++++++++
 aleksis/apps/kolego/schema/absence.py | 24 +++++++++++++++--------
 2 files changed, 44 insertions(+), 8 deletions(-)
 create mode 100644 aleksis/apps/kolego/rules.py

diff --git a/aleksis/apps/kolego/rules.py b/aleksis/apps/kolego/rules.py
new file mode 100644
index 0000000..223f15b
--- /dev/null
+++ b/aleksis/apps/kolego/rules.py
@@ -0,0 +1,28 @@
+import rules
+
+from aleksis.core.util.predicates import (
+    has_global_perm,
+    has_object_perm,
+    has_person,
+)
+
+
+edit_absence_predicate = has_person & (
+    has_global_perm("kolego.change_absence") | has_object_perm("kolego.change_absence")
+)
+rules.add_perm("kolego.edit_absence_rule", edit_absence_predicate)
+
+delete_absence_predicate = has_person & (
+    has_global_perm("kolego.delete_absence") | has_object_perm("kolego.delete_absence")
+)
+rules.add_perm("kolego.delete_absence_rule", delete_absence_predicate)
+
+edit_absencereason_predicate = has_person & (
+    has_global_perm("kolego.change_absencereason") | has_object_perm("kolego.change_absencereason")
+)
+rules.add_perm("kolego.edit_absencereason_rule", edit_absencereason_predicate)
+
+delete_absencereason_predicate = has_person & (
+    has_global_perm("kolego.delete_absencereason") | has_object_perm("kolego.delete_absencereason")
+)
+rules.add_perm("kolego.delete_absencereason_rule", delete_absencereason_predicate)
diff --git a/aleksis/apps/kolego/schema/absence.py b/aleksis/apps/kolego/schema/absence.py
index cbe583b..7327e56 100644
--- a/aleksis/apps/kolego/schema/absence.py
+++ b/aleksis/apps/kolego/schema/absence.py
@@ -32,6 +32,10 @@ class AbsenceReasonType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectTyp
             "name": ["icontains", "exact"],
         }
 
+    @classmethod
+    def get_queryset(cls, queryset, info):
+        return get_objects_for_user(info.context.user, "kolego.view_absencereason", queryset)
+
 
 class AbsenceType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectType):
     class Meta:
@@ -42,13 +46,17 @@ class AbsenceType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectType):
             "comment": ["icontains", "exact"],
         }
 
+    @classmethod
+    def get_queryset(cls, queryset, info):
+        return get_objects_for_user(info.context.user, "kolego.view_absence", queryset)
+
 
 class AbsenceCreateMutation(DjangoCreateMutation):
     class Meta:
         model = Absence
         fields = ("person", "reason", "comment", "datetime_start", "datetime_end")
         optional_fields = ("comment", "reason")
-        permissions = ("",)  # FIXME
+        permissions = ("kolego.add_absence",)  # FIXME
 
     @classmethod
     def handle_datetime_start(cls, value, name, info) -> int:
@@ -70,19 +78,19 @@ class AbsenceBatchCreateMutation(DjangoBatchCreateMutation):
     class Meta:
         model = Absence
         fields = ("id", "person", "reason", "comment", "datetime_start", "datetime_end")
-        permissions = ("",)  # FIXME
+        permissions = ("kolego.add_absence",)  # FIXME
 
 
 class AbsenceDeleteMutation(DeleteMutation):
     klass = Absence
-    permission_required = ""  # FIXME
+    permission_required = "kolego.delete_absence"  # FIXME
 
 
 class AbsenceBatchPatchMutation(PermissionBatchPatchMixin, DjangoBatchPatchMutation):
     class Meta:
         model = Absence
         fields = ("id", "person", "reason", "comment", "datetime_start", "datetime_end")
-        permissions = ("",)  # FIXME
+        permissions = ("kolego.change_absence",)  # FIXME
 
     @classmethod
     def handle_datetime_start(cls, value, name, info) -> int:
@@ -105,7 +113,7 @@ class AbsenceReasonCreateMutation(DjangoCreateMutation):
         model = AbsenceReason
         fields = ("short_name", "name")
         optional_fields = ("name",)
-        permissions = ("",)  # FIXME
+        permissions = ("kolego.create_absencereason",)  # FIXME
 
 
 class AbsenceReasonBatchCreateMutation(DjangoBatchCreateMutation):
@@ -113,16 +121,16 @@ class AbsenceReasonBatchCreateMutation(DjangoBatchCreateMutation):
         model = AbsenceReason
         fields = ("short_name", "name")
         optional_fields = ("name",)
-        permissions = ("",)  # FIXME
+        permissions = ("kolego.create_absencereason",)  # FIXME
 
 
 class AbsenceReasonDeleteMutation(DeleteMutation):
     klass = AbsenceReason
-    permission_required = ""  # FIXME
+    permission_required = "kolego.delete_absencereason"  # FIXME
 
 
 class AbsenceReasonBatchPatchMutation(PermissionBatchPatchMixin, DjangoBatchPatchMutation):
     class Meta:
         model = AbsenceReason
         fields = ("id", "short_name", "name")
-        permissions = ("",)  # FIXME
+        permissions = ("kolego.change_absencereason",)  # FIXME
-- 
GitLab