From 4401163d3f7bb99fd958401fd010ececcccfdc83 Mon Sep 17 00:00:00 2001 From: Toksi Date: Tue, 25 Nov 2025 15:08:28 +0500 Subject: [PATCH] =?UTF-8?q?=D0=9A=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D0=B0=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=B0=20=D0=B4=D1=83=D0=B1?= =?UTF-8?q?=D0=BB=D0=B8=D1=80=D1=83=D0=B5=D1=82=D1=81=D1=8F=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B8=20=D0=BD=D0=BE=D0=B2=D1=8B=D0=B9=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=B5=D0=BA=D1=82=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D0=BE=D0=B4?= =?UTF-8?q?=D0=B0=D1=87=D0=B8=20=D0=B5=D0=B3=D0=BE=20=D0=B2=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D0=B3=D1=80=D0=B0=D0=BC=D0=BC=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- projects/views.py | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/projects/views.py b/projects/views.py index 5820f58a..2e4f3181 100644 --- a/projects/views.py +++ b/projects/views.py @@ -671,6 +671,43 @@ def patch(self, request, project_pk: int, user_to_leader_pk: int) -> Response: class DuplicateProjectView(APIView): permission_classes = [IsAuthenticated, CanBindProjectToProgram] + @staticmethod + def _copy_collaborators(original_project: Project, new_project: Project) -> None: + """ + Copy all collaborators from the source project to the duplicated one. + Keep the leader collaborator (auto-created by signal) in sync with the original. + """ + leader_id = new_project.leader_id + collaborators_to_create: list[Collaborator] = [] + leader_collaborator = None + + for collaborator in original_project.collaborator_set.select_related("user").all(): + if collaborator.user_id == leader_id: + leader_collaborator = collaborator + continue + + collaborators_to_create.append( + Collaborator( + user=collaborator.user, + project=new_project, + role=collaborator.role, + specialization=collaborator.specialization, + ) + ) + + if collaborators_to_create: + Collaborator.objects.bulk_create(collaborators_to_create) + + if leader_collaborator: + Collaborator.objects.update_or_create( + user_id=leader_id, + project=new_project, + defaults={ + "role": leader_collaborator.role, + "specialization": leader_collaborator.specialization, + }, + ) + @swagger_auto_schema( request_body=ProjectDuplicateRequestSerializer, responses={201: ProjectDuplicateRequestSerializer(), 400: "Validation error"}, @@ -706,6 +743,8 @@ def post(self, request): cover=original_project.cover, ) + self._copy_collaborators(original_project, new_project) + program_link = PartnerProgramProject.objects.create( partner_program=partner_program, project=new_project )