Skip to content

Commit bbc8023

Browse files
fix: show team-assigned tasks only on POC dashboard (#234)
* fix: show team-assigned tasks only on POC dashboard - Modified TaskRepository._get_assigned_task_ids_for_user to include POC check - Team-assigned tasks now only appear on personal dashboard if user is POC - Team page (GET /v1/tasks?teamId=xxx) remains unchanged - shows all team tasks - Regular team members can still view team tasks via team-specific endpoint - Maintains existing functionality for user-assigned tasks * fix: failing tests * fix: formatting * chore: remove unnecessary code * refactor: Replace for loop with MongoDB queries in task assignment retrieval - Replace memory-heavy for loop in _get_assigned_task_ids_for_user with efficient MongoDB queries - Fix ObjectId/string data type mismatch that prevented team tasks from appearing on POC dashboard - Reduce database calls from N+1 to 2 queries for better performance - Ensure tasks assigned to teams are correctly displayed on POCs dashboard
1 parent 039488b commit bbc8023

File tree

2 files changed

+39
-12
lines changed

2 files changed

+39
-12
lines changed

todo/repositories/task_repository.py

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,16 +78,26 @@ def _get_assigned_task_ids_for_user(cls, user_id: str) -> List[ObjectId]:
7878
direct_task_ids = [assignment.task_id for assignment in direct_assignments]
7979

8080
# Get teams where user is a member
81-
from todo.repositories.team_repository import UserTeamDetailsRepository
81+
from todo.repositories.team_repository import UserTeamDetailsRepository, TeamRepository
8282

8383
user_teams = UserTeamDetailsRepository.get_by_user_id(user_id)
8484
team_ids = [str(team.team_id) for team in user_teams]
8585

86-
# Get tasks assigned to those teams
86+
# Get tasks assigned to those teams (only if user is POC)
8787
team_task_ids = []
88-
for team_id in team_ids:
89-
team_assignments = TaskAssignmentRepository.get_by_assignee_id(team_id, "team")
90-
team_task_ids.extend([assignment.task_id for assignment in team_assignments])
88+
if team_ids:
89+
# Get teams where user is POC
90+
poc_teams = TeamRepository.get_collection().find(
91+
{"_id": {"$in": [ObjectId(team_id) for team_id in team_ids]}, "is_deleted": False, "poc_id": user_id}
92+
)
93+
poc_team_ids = [str(team["_id"]) for team in poc_teams]
94+
95+
# Get team assignments for POC teams
96+
if poc_team_ids:
97+
team_assignments = TaskAssignmentRepository.get_collection().find(
98+
{"assignee_id": {"$in": poc_team_ids}, "user_type": "team", "is_active": True}
99+
)
100+
team_task_ids = [ObjectId(assignment["task_id"]) for assignment in team_assignments]
91101

92102
return direct_task_ids + team_task_ids
93103

todo/tests/unit/views/test_team.py

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from rest_framework.test import APIClient
44
from rest_framework import status
55

6-
from todo.views.team import TeamListView, JoinTeamByInviteCodeView
6+
from todo.views.team import TeamListView, JoinTeamByInviteCodeView, RemoveTeamMemberView
77
from todo.dto.responses.get_user_teams_response import GetUserTeamsResponse
88
from todo.dto.team_dto import TeamDTO
99
from datetime import datetime, timezone
@@ -138,30 +138,47 @@ def test_join_team_by_invite_code_validation_error(self):
138138

139139
class RemoveTeamMemberViewTests(TestCase):
140140
def setUp(self):
141-
self.client = APIClient()
141+
self.view = RemoveTeamMemberView()
142142
self.team_id = "507f1f77bcf86cd799439012"
143143
self.user_id = "507f1f77bcf86cd799439011"
144-
self.url = f"/teams/{self.team_id}/members/{self.user_id}/"
144+
self.mock_user_id = "507f1f77bcf86cd799439013"
145145

146146
@patch("todo.views.team.TeamService.remove_member_from_team")
147147
def test_remove_member_success(self, mock_remove):
148148
mock_remove.return_value = True
149-
response = self.client.delete(self.url)
149+
150+
mock_request = MagicMock()
151+
mock_request.user_id = self.mock_user_id
152+
153+
response = self.view.delete(mock_request, self.team_id, self.user_id)
154+
150155
self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
151-
mock_remove.assert_called_once_with(user_id=self.user_id, team_id=self.team_id)
156+
mock_remove.assert_called_once_with(
157+
user_id=self.user_id, team_id=self.team_id, removed_by_user_id=self.mock_user_id
158+
)
152159

153160
@patch("todo.views.team.TeamService.remove_member_from_team")
154161
def test_remove_member_not_found(self, mock_remove):
155162
from todo.services.team_service import TeamService
156163

157164
mock_remove.side_effect = TeamService.TeamOrUserNotFound()
158-
response = self.client.delete(self.url)
165+
166+
mock_request = MagicMock()
167+
mock_request.user_id = self.mock_user_id
168+
169+
response = self.view.delete(mock_request, self.team_id, self.user_id)
170+
159171
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
160172
self.assertIn("not found", response.data["detail"])
161173

162174
@patch("todo.views.team.TeamService.remove_member_from_team")
163175
def test_remove_member_generic_error(self, mock_remove):
164176
mock_remove.side_effect = Exception("Something went wrong")
165-
response = self.client.delete(self.url)
177+
178+
mock_request = MagicMock()
179+
mock_request.user_id = self.mock_user_id
180+
181+
response = self.view.delete(mock_request, self.team_id, self.user_id)
182+
166183
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
167184
self.assertIn("Something went wrong", response.data["detail"])

0 commit comments

Comments
 (0)