From dd5374016601bd8f71055e722526d01b0001db11 Mon Sep 17 00:00:00 2001 From: Lucas Brandstaetter <lucas@brandstaetter.tech> Date: Sun, 20 Oct 2024 08:52:34 +0000 Subject: [PATCH] Add show_public flag to associated_with_user With this we can show public events if the list should include not only associated, but all events accessible by the user. --- src/core/models/base_managers.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/core/models/base_managers.py b/src/core/models/base_managers.py index 7afc9a73b..651ba1c3b 100644 --- a/src/core/models/base_managers.py +++ b/src/core/models/base_managers.py @@ -169,6 +169,7 @@ class ConferenceManagerMixin(models.Manager, Generic[_ModelType]): member: ConferenceMember | None = None, only_manageable: bool | None = None, staff_can_manage: bool = True, + show_public: bool = False, ) -> QuerySet[_ModelType]: if not user and not member: raise ValueError('Either user or member must be given') @@ -179,19 +180,18 @@ class ConferenceManagerMixin(models.Manager, Generic[_ModelType]): member = self.get_member(conference, user, member) qs = self.get_conference_queryset(conference) if not isinstance(member, ConferenceMember): - return qs.none() + return self.conference_accessible(conference=conference, member=member) if show_public else qs.none() if member.is_staff and staff_can_manage: if self.staff_permissions is None or (self.staff_permissions and member.has_staff_permission(*self.staff_permissions)): return qs - return ( - qs.filter( - id__in=self.apply_assembly_rights_filter(qs, member, only_manageable=only_manageable) - .values('id') - .union(self.apply_self_organized_rights_filter(qs, member, only_manageable=only_manageable).values('id')) - ) - .select_related(*self.select_related_fields or []) - .prefetch_related(*self.prefetch_related_fields or []) + id_list = ( + self.apply_assembly_rights_filter(qs, member, only_manageable=only_manageable) + .values('id') + .union(self.apply_self_organized_rights_filter(qs, member, only_manageable=only_manageable).values('id')) ) + if show_public: + id_list = id_list.union(self.apply_public_filter(qs, member).values('id')) + return qs.filter(id__in=id_list).select_related(*self.select_related_fields or []).prefetch_related(*self.prefetch_related_fields or []) def associated_with_user( self, @@ -200,6 +200,7 @@ class ConferenceManagerMixin(models.Manager, Generic[_ModelType]): user: 'PlatformUser | None' = None, member: ConferenceMember | None = None, staff_can_see: bool = True, + show_public: bool = False, ) -> QuerySet[_ModelType]: """Returns a queryset of objects that are accessible by the given user. @@ -223,6 +224,7 @@ class ConferenceManagerMixin(models.Manager, Generic[_ModelType]): member=member, only_manageable=False, staff_can_manage=staff_can_see, + show_public=show_public, ) def manageable_by_user( -- GitLab