from rest_framework.exceptions import ValidationError from apps.projects.models import ProjectMembership def add_project_member(project, user_id, role): """ Adds a user to a project. Ensures no duplicate active memberships exist. """ if ProjectMembership.objects.filter(project=project, user_id=user_id, is_deleted=False).exists(): raise ValidationError({"user_id": "This user is already a member of the project."}) return ProjectMembership.objects.create( project=project, user_id=user_id, role=role, is_active=True ) def update_project_member(membership, **kwargs): """ Updates a project membership (e.g., changing role or active status). """ update_fields = [] for field, value in kwargs.items(): if hasattr(membership, field) and getattr(membership, field) != value: setattr(membership, field, value) update_fields.append(field) if update_fields: update_fields.append("updated_at") membership.save(update_fields=update_fields) return membership