diff --git a/src/core/models/base_managers.py b/src/core/models/base_managers.py index 7afc9a73b718685c7a61aa195b78841ae0e838c6..651ba1c3bf0315b2a57647d3c30a82cb5bf2a8fc 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(