From a440a11a93789b1bfccccb84f891ff73117c47ad Mon Sep 17 00:00:00 2001 From: Raj Patel Date: Tue, 28 Jan 2025 15:58:42 +0530 Subject: [PATCH] Move project exclusion flag logic to transfer_project and reorder asset filter backends --- .../apps/project_ownership/models/transfer.py | 20 +++++++++++++++++++ kpi/filters.py | 2 +- kpi/views/v2/asset.py | 2 +- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/kobo/apps/project_ownership/models/transfer.py b/kobo/apps/project_ownership/models/transfer.py index 1e78aea513..266beabda5 100644 --- a/kobo/apps/project_ownership/models/transfer.py +++ b/kobo/apps/project_ownership/models/transfer.py @@ -129,6 +129,8 @@ def transfer_project(self): self.statuses.filter(status_type__in=status_types).update( status=TransferStatusChoices.SUCCESS ) + # Update `is_excluded_from_projects_list` flag + self._update_project_exclusion_flag() else: _rewrite_mongo = True with transaction.atomic(): @@ -147,6 +149,8 @@ def transfer_project(self): self._sent_in_app_messages() + # Update `is_excluded_from_projects_list` flag + self._update_project_exclusion_flag() # Do not delegate anything to Celery before the transaction has # been validated. Otherwise, Celery could fetch outdated data. transaction.on_commit(lambda: self._start_async_jobs(_rewrite_mongo)) @@ -331,6 +335,22 @@ def _update_invite_status(self): self.invite.status = invite.status self.invite.date_modified = invite.date_modified + def _update_project_exclusion_flag(self): + """ + Set `is_excluded_from_projects_list` to `True` for assets owned by the + sender or invitee joining the organization. These assets should be + excluded from the organization owner's `My Projects` list + """ + if isinstance(self.invite, OrgMembershipAutoInvite): + real_owner = get_real_owner(self.invite.sender) + self.asset.is_excluded_from_projects_list = ( + real_owner != self.invite.sender + ) + self.asset.save( + update_fields=['is_excluded_from_projects_list'], + adjust_content=False + ) + class TransferStatus(AbstractTimeStampedModel): diff --git a/kpi/filters.py b/kpi/filters.py index 23267691aa..6306478e93 100644 --- a/kpi/filters.py +++ b/kpi/filters.py @@ -158,7 +158,7 @@ class ExcludeOrgAssetFilter(filters.BaseFilterBackend): def filter_queryset(self, request, queryset, view): user = get_database_user(request.user) organization = user.organization - if organization.is_owner(user) and organization.is_mmo: + if organization and organization.is_owner(user) and organization.is_mmo: return queryset.exclude(is_excluded_from_projects_list=True) return queryset diff --git a/kpi/views/v2/asset.py b/kpi/views/v2/asset.py index 8961547ae9..ea9c54164d 100644 --- a/kpi/views/v2/asset.py +++ b/kpi/views/v2/asset.py @@ -369,10 +369,10 @@ class AssetViewSet( 'subscribers_count', ] filter_backends = [ + ExcludeOrgAssetFilter, KpiObjectPermissionsFilter, SearchFilter, AssetOrderingFilter, - ExcludeOrgAssetFilter ] renderer_classes = [ renderers.BrowsableAPIRenderer,