From c40c7b5e3a6b6e34241bc5a8657792eff839ddc3 Mon Sep 17 00:00:00 2001 From: Viswamedha Nalabotu Date: Fri, 27 Feb 2026 13:58:00 +0000 Subject: [PATCH] Customised training file filters, role and member search and fixed invite redirect bug --- apps/knowledge/viewsets.py | 26 ++++--- site/src/views/InviteAccept.vue | 8 +- site/src/views/OrganizationManage.vue | 102 +++++++++++++++++++++++--- site/src/views/OrganizationView.vue | 28 ++++++- site/src/views/OrganizationsView.vue | 5 ++ 5 files changed, 144 insertions(+), 25 deletions(-) diff --git a/apps/knowledge/viewsets.py b/apps/knowledge/viewsets.py index 09b9bcb..b071c3d 100644 --- a/apps/knowledge/viewsets.py +++ b/apps/knowledge/viewsets.py @@ -19,25 +19,31 @@ class TrainingFileViewSet(ModelViewSet): def get_queryset(self): user = self.request.user - return TrainingFile.objects.filter( - Q(role__organization__owner=user) | + queryset = TrainingFile.objects.filter( + Q(role__organization__owner=user) | Q(role__organization__members=user) ).distinct() + organization_uuid = self.request.query_params.get('organization_uuid') + if organization_uuid: + queryset = queryset.filter(role__organization__uuid=organization_uuid) + + return queryset + def perform_create(self, serializer): role_uuid = self.request.data.get('role') - + try: role = Role.objects.get(uuid=role_uuid) except Role.DoesNotExist: return Response({'error': 'Role not found'}, status=status.HTTP_404_NOT_FOUND) - + is_owner = role.organization.owner == self.request.user - is_member = role.organization.members.filter(id=self.request.user.id).exists() + is_member = role.organization.members.filter(uuid=self.request.user.uuid).exists() if not (is_owner or is_member): return Response({'error': 'Permission denied'}, status=status.HTTP_403_FORBIDDEN) - + serializer.save( uploaded_by=self.request.user, role=role, @@ -48,13 +54,13 @@ class TrainingFileViewSet(ModelViewSet): def destroy(self, request, *args, **kwargs): instance = self.get_object() - + is_uploader = instance.uploaded_by == request.user is_org_owner = instance.role.organization.owner == request.user - + if not (is_uploader or is_org_owner or request.user.is_manager): return Response({'error': 'Permission denied'}, status=status.HTTP_403_FORBIDDEN) - + return super().destroy(request, *args, **kwargs) @@ -67,6 +73,6 @@ class RoleRagDocumentViewSet(ReadOnlyModelViewSet): def get_queryset(self): user = self.request.user return RoleRagDocument.objects.filter( - Q(role__organization__owner=user) | + Q(role__organization__owner=user) | Q(role__organization__members=user) ).distinct() diff --git a/site/src/views/InviteAccept.vue b/site/src/views/InviteAccept.vue index ccde24a..8ad338f 100644 --- a/site/src/views/InviteAccept.vue +++ b/site/src/views/InviteAccept.vue @@ -12,18 +12,22 @@ const loading = ref(false) const accepting = ref(false) const accepted = ref(false) const error = ref(null) +const joinedOrganizationUuid = ref(null) const acceptInvite = async () => { accepting.value = true error.value = null try { - const response = await apiClient.post<{ message: string; success: boolean; uuid: string }>( + const response = await apiClient.post<{ message?: string; organization?: { uuid?: string } }>( API.organization.invites.join(inviteUuid), ) + joinedOrganizationUuid.value = response.data?.organization?.uuid || null message.success(response.data?.message || 'Successfully joined organization') accepted.value = true setTimeout(() => { - if (response.data?.uuid) router.push(`/organization/${response.data.uuid}`) + if (joinedOrganizationUuid.value) { + router.push(`/organization/${joinedOrganizationUuid.value}`) + } else router.push('/') }, 1500) } catch (err) { diff --git a/site/src/views/OrganizationManage.vue b/site/src/views/OrganizationManage.vue index 1bab784..b218bbe 100644 --- a/site/src/views/OrganizationManage.vue +++ b/site/src/views/OrganizationManage.vue @@ -1,5 +1,5 @@