Skip to content

Commit 1edc267

Browse files
feat: add method to retrieve user information by team ID and correspo… (#155)
* feat: add method to retrieve user information by team ID and corresponding unit tests * refactor: remove unused import of ObjectId in migrate_add_creator_to_teams command * refactor: improve code readability in migrate_add_creator_to_teams command and user retrieval method --------- Co-authored-by: Amit Prakash <[email protected]>
1 parent 6c38c10 commit 1edc267

File tree

3 files changed

+75
-0
lines changed

3 files changed

+75
-0
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
from django.core.management.base import BaseCommand
2+
from todo.models.team import UserTeamDetailsModel
3+
from todo.repositories.team_repository import TeamRepository, UserTeamDetailsRepository
4+
from todo.models.common.pyobjectid import PyObjectId
5+
6+
7+
class Command(BaseCommand):
8+
help = "Backfill user_team_details so every team has its creator as an active member."
9+
10+
def handle(self, *args, **options):
11+
teams = TeamRepository.get_collection().find({"is_deleted": False})
12+
updated = 0
13+
for team in teams:
14+
team_id = team["_id"]
15+
creator_id = team["created_by"]
16+
# Check if creator is already an active member
17+
exists = UserTeamDetailsRepository.get_collection().find_one(
18+
{
19+
"team_id": team_id,
20+
"user_id": creator_id,
21+
"is_active": True,
22+
}
23+
)
24+
if not exists:
25+
user_team = UserTeamDetailsModel(
26+
user_id=PyObjectId(creator_id),
27+
team_id=PyObjectId(team_id),
28+
role_id="1",
29+
is_active=True,
30+
created_by=PyObjectId(creator_id),
31+
updated_by=PyObjectId(creator_id),
32+
)
33+
UserTeamDetailsRepository.create(user_team)
34+
updated += 1
35+
self.stdout.write(self.style.SUCCESS(f"Added creator as member to {updated} teams."))

todo/repositories/team_repository.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,3 +101,18 @@ def get_users_by_team_id(cls, team_id: str) -> list[str]:
101101
return [str(data["user_id"]) for data in user_teams_data]
102102
except Exception:
103103
return []
104+
105+
@classmethod
106+
def get_user_infos_by_team_id(cls, team_id: str) -> list[dict]:
107+
"""
108+
Get all user info (user_id, name, email) for a specific team.
109+
"""
110+
from todo.repositories.user_repository import UserRepository
111+
112+
user_ids = cls.get_users_by_team_id(team_id)
113+
user_infos = []
114+
for user_id in user_ids:
115+
user = UserRepository.get_by_id(user_id)
116+
if user:
117+
user_infos.append({"user_id": user_id, "name": user.name, "email": user.email_id})
118+
return user_infos

todo/tests/unit/repositories/test_user_repository.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from todo.exceptions.auth_exceptions import UserNotFoundException, APIException
99
from todo.tests.fixtures.user import users_db_data
1010
from todo.constants.messages import RepositoryErrors
11+
from todo.repositories.team_repository import UserTeamDetailsRepository
1112

1213

1314
class UserRepositoryTests(TestCase):
@@ -92,3 +93,27 @@ def test_create_or_update_sets_timestamps(self, mock_db_manager):
9293
self.assertIn("updated_at", update_doc["$set"])
9394
self.assertIn("$setOnInsert", update_doc)
9495
self.assertIn("created_at", update_doc["$setOnInsert"])
96+
97+
98+
class UserTeamDetailsRepositoryTests(TestCase):
99+
@patch("todo.repositories.user_repository.UserRepository.get_by_id")
100+
@patch("todo.repositories.team_repository.UserTeamDetailsRepository.get_users_by_team_id")
101+
def test_get_user_infos_by_team_id(self, mock_get_users_by_team_id, mock_get_by_id):
102+
team_id = str(ObjectId())
103+
user_ids = [str(ObjectId()), str(ObjectId())]
104+
mock_get_users_by_team_id.return_value = user_ids
105+
user1 = MagicMock()
106+
user1.name = "Alice"
107+
user1.email_id = "[email protected]"
108+
user2 = MagicMock()
109+
user2.name = "Bob"
110+
user2.email_id = "[email protected]"
111+
mock_get_by_id.side_effect = [user1, user2]
112+
113+
result = UserTeamDetailsRepository.get_user_infos_by_team_id(team_id)
114+
115+
self.assertEqual(len(result), 2)
116+
self.assertEqual(result[0]["name"], "Alice")
117+
self.assertEqual(result[0]["email"], "[email protected]")
118+
self.assertEqual(result[1]["name"], "Bob")
119+
self.assertEqual(result[1]["email"], "[email protected]")

0 commit comments

Comments
 (0)