Skip to content

Commit 4b4ae55

Browse files
committed
feat(remove-from-team): remove unecessary comments
- fix bug where done tasks were also being reassigned - fix bug where in postgres_user_role where data sync failed if a user was removed and added more than once - updated reassigned tasks status and add sync to postgres db
1 parent 3b50a66 commit 4b4ae55

File tree

4 files changed

+85
-23
lines changed

4 files changed

+85
-23
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# Generated by Django 5.1.5 on 2025-09-09 14:49
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
dependencies = [
8+
("todo", "0004_alter_postgresuserrole_unique_together"),
9+
]
10+
11+
operations = [
12+
migrations.AlterUniqueTogether(
13+
name="postgresuserrole",
14+
unique_together=set(),
15+
),
16+
migrations.AddConstraint(
17+
model_name="postgresuserrole",
18+
constraint=models.UniqueConstraint(
19+
condition=models.Q(("is_active", True)),
20+
fields=("user_id", "role_name", "scope", "team_id"),
21+
name="unique_active_user_team_role",
22+
),
23+
),
24+
]

todo/models/postgres/user_role.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,13 @@ class PostgresUserRole(models.Model):
2727

2828
class Meta:
2929
db_table = "postgres_user_roles"
30-
unique_together = ["user_id", "role_name", "scope", "team_id", "is_active"]
30+
constraints = [
31+
models.UniqueConstraint(
32+
fields=["user_id", "role_name", "scope", "team_id"],
33+
condition=models.Q(is_active=True),
34+
name="unique_active_user_team_role",
35+
)
36+
]
3137
indexes = [
3238
models.Index(fields=["mongo_id"]),
3339
models.Index(fields=["user_id"]),

todo/repositories/task_assignment_repository.py

Lines changed: 54 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -401,40 +401,36 @@ def reassign_tasks_from_user_to_team(cls, user_id: str, team_id: str, performed_
401401
{"$unwind": "$task_info"},
402402
{"$match": {"task_info.status": {"$ne": TaskStatus.DONE.value}}},
403403
]
404-
405404
user_task_assignments = list(collection.aggregate(pipeline))
406405
if not user_task_assignments:
407406
return 0
408-
409-
# Deactivate current assignment (try using both ObjectId and string)
407+
not_done_task_assignment_ids = [assignment["_id"] for assignment in user_task_assignments]
408+
not_done_task_ids = [assignment["task_id_obj"] for assignment in user_task_assignments]
410409
collection.update_many(
411-
{
412-
"assignee_id": {"$in": [user_id, ObjectId(user_id)]},
413-
"team_id": {"$in": [team_id, ObjectId(team_id)]},
414-
"is_active": True,
415-
},
410+
{"_id": {"$in": not_done_task_assignment_ids}},
416411
{"$set": {"is_active": False, "updated_by": ObjectId(performed_by_user_id), "updated_at": now}},
417412
session=session,
418413
)
419414

420415
new_assignments = []
416+
421417
operations = []
422418
dual_write_service = EnhancedDualWriteService()
423-
for task in user_task_assignments:
419+
for assignment in user_task_assignments:
424420
operations.append(
425421
{
426422
"collection_name": "task_assignments",
427423
"operation": "update",
428-
"mongo_id": task["_id"],
424+
"mongo_id": assignment["_id"],
429425
"data": {
430-
"task_mongo_id": str(task["task_id"]),
431-
"assignee_id": str(task["assignee_id"]),
432-
"user_type": task["user_type"],
433-
"team_id": str(task["team_id"]),
426+
"task_mongo_id": str(assignment["task_id"]),
427+
"assignee_id": str(assignment["assignee_id"]),
428+
"user_type": assignment["user_type"],
429+
"team_id": str(assignment["team_id"]),
434430
"is_active": False,
435-
"created_at": task["created_at"],
431+
"created_at": assignment["created_at"],
436432
"updated_at": datetime.now(timezone.utc),
437-
"created_by": str(task["created_by"]),
433+
"created_by": str(assignment["created_by"]),
438434
"updated_by": str(performed_by_user_id),
439435
},
440436
}
@@ -443,7 +439,7 @@ def reassign_tasks_from_user_to_team(cls, user_id: str, team_id: str, performed_
443439
new_assignments.append(
444440
TaskAssignmentModel(
445441
_id=new_assignment_id,
446-
task_id=task["task_id_obj"],
442+
task_id=assignment["task_id_obj"],
447443
assignee_id=PyObjectId(team_id),
448444
user_type="team",
449445
created_by=PyObjectId(performed_by_user_id),
@@ -457,7 +453,7 @@ def reassign_tasks_from_user_to_team(cls, user_id: str, team_id: str, performed_
457453
"operation": "create",
458454
"mongo_id": new_assignment_id,
459455
"data": {
460-
"task_mongo_id": str(task["task_id"]),
456+
"task_mongo_id": str(assignment["task_id"]),
461457
"assignee_id": str(team_id),
462458
"user_type": "team",
463459
"team_id": str(team_id),
@@ -469,9 +465,49 @@ def reassign_tasks_from_user_to_team(cls, user_id: str, team_id: str, performed_
469465
},
470466
}
471467
)
468+
task_details = assignment["task_info"]
469+
operations.append(
470+
{
471+
"collection_name": "tasks",
472+
"operation": "update",
473+
"mongo_id": assignment["task_id"],
474+
"data": {
475+
"title": task_details.get("title"),
476+
"description": task_details.get("description"),
477+
"priority": task_details.get("priority"),
478+
"status": TaskStatus.TODO,
479+
"displayId": task_details.get("displayId"),
480+
"deferredDetails": None,
481+
"isAcknowledged": task_details.get("isAcknowledged", False),
482+
"isDeleted": task_details.get("isDeleted", False),
483+
"startedAt": task_details.get("startedAt"),
484+
"dueAt": task_details.get("dueAt"),
485+
"createdAt": task_details.get("createdAt"),
486+
"updatedAt": datetime.now(timezone.utc),
487+
"createdBy": str(task_details.get("createdBy")),
488+
"updated_by": str(performed_by_user_id),
489+
},
490+
}
491+
)
492+
472493
if new_assignments:
473494
collection.insert_many(new_assignments, session=session)
495+
from todo.repositories.task_repository import TaskRepository
496+
497+
tasks_collection = TaskRepository.get_collection()
498+
tasks_collection.update_many(
499+
{"_id": {"$in": not_done_task_ids}},
500+
{
501+
"$set": {
502+
"status": TaskStatus.TODO.value,
503+
"deferredDetails": None,
504+
"updatedAt": datetime.now(timezone.utc),
505+
}
506+
},
507+
session=session,
508+
)
474509
dual_write_success = dual_write_service.batch_operations(operations)
510+
475511
if not dual_write_success:
476512
import logging
477513

todo/services/team_service.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -497,7 +497,6 @@ def remove_member_from_team(cls, user_id: str, team_id: str, removed_by_user_id:
497497
team_members = UserService.get_users_by_team_id(team_id)
498498
team_member_ids = [user.id for user in team_members]
499499

500-
# Authentication Checks
501500
if user_id not in team_member_ids:
502501
raise cls.TeamOrUserNotFound
503502
if user_id == team.created_by:
@@ -508,16 +507,13 @@ def remove_member_from_team(cls, user_id: str, team_id: str, removed_by_user_id:
508507
if not UserRoleService.has_role(removed_by_user_id, RoleName.ADMIN.value, RoleScope.TEAM.value, team_id):
509508
raise NotTeamAdminException()
510509

511-
# Remove User Roles
512510
user_roles = UserRoleService.get_user_roles(user_id, RoleScope.TEAM.value, team_id)
513511
user_role_ids = [roles["role_id"] for roles in user_roles]
514512
for role_id in user_role_ids:
515513
UserRoleService.remove_role_by_id(user_id, role_id, RoleScope.TEAM.value, team_id)
516514

517-
# Reassign Tasks:
518515
TaskAssignmentService.reassign_tasks_from_user_to_team(user_id, team_id, removed_by_user_id)
519516

520-
# Remove User
521517
from todo.repositories.user_team_details_repository import UserTeamDetailsRepository
522518

523519
success = UserTeamDetailsRepository.remove_member_from_team(user_id=user_id, team_id=team_id)

0 commit comments

Comments
 (0)