diff --git a/aleksis/apps/alsijil/forms.py b/aleksis/apps/alsijil/forms.py index 39ddbebf19741d0f35c649b0cf4a99adea9e8735..746a4762888a971b25d6793e8123cb765ad98e45 100644 --- a/aleksis/apps/alsijil/forms.py +++ b/aleksis/apps/alsijil/forms.py @@ -278,20 +278,10 @@ class AssignGroupRoleForm(forms.ModelForm): if get_site_preferences()["alsijil__group_owners_can_assign_roles_to_parents"]: persons = persons.filter( Q(member_of__owners=self.request.user.person) - | Q(member_of__parent_groups__owners=self.request.user.person) - | Q(children__member_of__owners=self.request.user.person) - | Q(children__member_of__parent_groups__owners=self.request.user.person) - if get_site_preferences()["alsijil__inherit_privileges_from_parent_group"] - else Q(member_of__owners=self.request.user.person) | Q(children__member_of__owners=self.request.user.person) ) else: - persons = persons.filter( - Q(member_of__owners=self.request.user.person) - | Q(member_of__parent_groups__owners=self.request.user.person) - if get_site_preferences()["alsijil__inherit_privileges_from_parent_group"] - else Q(member_of__owners=self.request.user.person) - ) + persons = persons.filter(member_of__owners=self.request.user.person) self.fields["person"].queryset = persons.distinct() if "groups" not in initial: diff --git a/aleksis/apps/alsijil/rules.py b/aleksis/apps/alsijil/rules.py index 40856e27eed7f22a56afec5e3127053acc143149..9d143604e3c0ca62688da71703df0e08d501db85 100644 --- a/aleksis/apps/alsijil/rules.py +++ b/aleksis/apps/alsijil/rules.py @@ -26,7 +26,6 @@ from .util.predicates import ( is_owner_of_any_group, is_parent_group_owner, is_person_group_owner, - is_person_parent_group_owner, is_person_primary_group_owner, is_personal_note_lesson_original_teacher, is_personal_note_lesson_parent_group_owner, @@ -204,10 +203,6 @@ add_perm("alsijil.view_students_list_rule", view_students_list_predicate) view_person_overview_predicate = has_person & ( (is_current_person & is_site_preference_set("alsijil", "view_own_personal_notes")) | is_person_group_owner - | ( - is_person_parent_group_owner - & is_site_preference_set("alsijil", "inherit_privileges_from_parent_group") - ) ) add_perm("alsijil.view_person_overview_rule", view_person_overview_predicate) @@ -219,10 +214,6 @@ add_perm("alsijil.view_person_overview_menu_rule", view_person_overview_menu_pre view_person_overview_personal_notes_predicate = view_person_overview_predicate & ( (is_current_person & is_site_preference_set("alsijil", "view_own_personal_notes")) | is_person_primary_group_owner - | ( - is_person_parent_group_owner - & is_site_preference_set("alsijil", "inherit_privileges_from_parent_group") - ) | has_global_perm("alsijil.view_personalnote") | has_person_group_object_perm("core.view_personalnote_group") ) @@ -326,12 +317,7 @@ add_perm( ) assign_group_role_person_predicate = has_person & ( - is_person_group_owner - | ( - is_person_parent_group_owner - & is_site_preference_set("alsijil", "inherit_privileges_from_parent_group") - ) - | has_global_perm("alsijil.assign_grouprole") + is_person_group_owner | has_global_perm("alsijil.assign_grouprole") ) add_perm("alsijil.assign_grouprole_to_person_rule", assign_group_role_person_predicate) diff --git a/aleksis/apps/alsijil/util/predicates.py b/aleksis/apps/alsijil/util/predicates.py index fbc163b3c00d2a4f4252dfce23365e22748803e8..d66ebb41d052e17dac94087526997df71824c2cc 100644 --- a/aleksis/apps/alsijil/util/predicates.py +++ b/aleksis/apps/alsijil/util/predicates.py @@ -125,22 +125,6 @@ def is_person_primary_group_owner(user: User, obj: Person) -> bool: return False -@predicate -def is_person_parent_group_owner(user: User, obj: Person) -> bool: - """ - Predicate for parent group owners of a person. - - Checks whether the person linked to the user is the owner of - any parent groups of any groups of the given person. - """ - if obj: - for group in use_prefetched(obj, "member_of"): - for parent_group in use_prefetched(group, "parent_groups"): - if user.person in use_prefetched(parent_group, "owners"): - return True - return False - - def has_person_group_object_perm(perm: str): """Predicate builder for permissions on a set of member groups. @@ -273,11 +257,15 @@ def is_personal_note_lesson_parent_group_owner(user: User, obj: PersonalNote) -> Checks whether the person linked to the user is the owner of any parent groups of any groups of the given LessonPeriod lesson of the given PersonalNote. + If so, also checks whether the person linked to the personal note actually is a member of this + parent group. """ if hasattr(obj, "register_object"): for group in obj.register_object.get_groups().all(): for parent_group in group.parent_groups.all(): - if user.person in list(parent_group.owners.all()): + if user.person in use_prefetched( + parent_group, "owners" + ) and obj.person in use_prefetched(parent_group, "members"): return True return False diff --git a/aleksis/apps/alsijil/views.py b/aleksis/apps/alsijil/views.py index a4ba938d25e4ca327b0a4aaf36631a985e75e753..de3866e0b4ecb62cffd2fc0223c1383f70772c30 100644 --- a/aleksis/apps/alsijil/views.py +++ b/aleksis/apps/alsijil/views.py @@ -222,7 +222,9 @@ def register_object( else: persons = Person.objects.all() - persons_qs = register_object.get_personal_notes(persons, wanted_week) + persons_qs = register_object.get_personal_notes(persons, wanted_week).filter( + person__member_of__in=request.user.person.owner_of.all() + ) # Annotate group roles if show_group_roles: @@ -456,9 +458,13 @@ def week_view( if not request.user.has_perm("alsijil.view_week_personalnote_rule", instance): persons_qs = persons_qs.filter(pk=request.user.person.pk) elif group: - persons_qs = persons_qs.filter(member_of=group) + persons_qs = persons_qs.filter(member_of=group).filter( + member_of__in=request.user.person.owner_of.all() + ) else: - persons_qs = persons_qs.filter(member_of__in=groups) + persons_qs = persons_qs.filter(member_of__in=groups).filter( + member_of__in=request.user.person.owner_of.all() + ) # Prefetch object permissions for persons and groups the persons are members of # because the object permissions are checked for both persons and groups @@ -763,7 +769,7 @@ def my_students(request: HttpRequest) -> HttpResponse: "primary_group__owners", Prefetch("member_of", queryset=relevant_groups, to_attr="member_of_prefetched"), ) - ) + ).filter(member_of__in=request.user.person.owner_of.all()) persons_for_group = [] for person in persons: person.set_object_permission_checker(checker) @@ -795,7 +801,11 @@ class StudentsList(PermissionRequiredMixin, DetailView): def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context["group"] = self.object - context["persons"] = self.object.generate_person_list_with_class_register_statistics() + context[ + "persons" + ] = self.object.generate_person_list_with_class_register_statistics().filter( + member_of__in=self.request.user.person.owner_of.all() + ) context["extra_marks"] = ExtraMark.objects.all() context["excuse_types"] = ExcuseType.objects.all() return context