From 5b18cc4edc837876fccf6be0c99221b1810895cf Mon Sep 17 00:00:00 2001
From: Hangzhi Yu <hangzhi@protonmail.com>
Date: Sun, 16 Aug 2020 15:15:50 +0200
Subject: [PATCH] Filter person dropdown list of absence registration form with
 custom queryset instead of queryset_rules_filter

---
 aleksis/apps/alsijil/forms.py | 20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)

diff --git a/aleksis/apps/alsijil/forms.py b/aleksis/apps/alsijil/forms.py
index a5aaee072..b05cdeb4e 100644
--- a/aleksis/apps/alsijil/forms.py
+++ b/aleksis/apps/alsijil/forms.py
@@ -102,9 +102,7 @@ class RegisterAbsenceForm(forms.Form):
     date_start = forms.DateField(label=_("Start date"), initial=datetime.today)
     date_end = forms.DateField(label=_("End date"), initial=datetime.today)
     from_period = forms.IntegerField(label=_("From period"), initial=0, min_value=0)
-    person = forms.ModelChoiceField(
-        label=_("Person"), queryset=Person.objects.all(), widget=Select2Widget
-    )
+    person = forms.ModelChoiceField(label=_("Person"), queryset=None, widget=Select2Widget)
     absent = forms.BooleanField(label=_("Absent"), initial=True, required=False)
     excused = forms.BooleanField(label=_("Excused"), initial=True, required=False)
     remarks = forms.CharField(label=_("Remarks"), max_length=30, required=False)
@@ -112,8 +110,20 @@ class RegisterAbsenceForm(forms.Form):
     def __init__(self, *args, **kwargs):
         self.request = kwargs.pop("request")
         super().__init__(*args, **kwargs)
-        self.fields["person"].queryset = queryset_rules_filter(self.request, Person.objects.all(),
-                                                               "core.register_absence")
+        if check_global_permission(self.request.user, "alsijil.register_absence"):
+            self.fields["person"].queryset = Person.objects.all()
+        else:
+            self.fields["person"].queryset = (
+                get_objects_for_user(self.request.user, "core.register_absence_person", Person)
+                .union(Person.objects.filter(member_of__owners=self.request.user.person))
+                .union(
+                    Person.objects.filter(
+                        member_of__in=get_objects_for_user(
+                            self.request.user, "core.register_absence_group", Group
+                        )
+                    )
+                )
+            )
 
 
 class ExtraMarkForm(forms.ModelForm):
-- 
GitLab