From 6a8d8a9fcec3002814f1e8b83da57ffaa1ef7892 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20D=C3=ADaz?= Date: Fri, 3 Nov 2023 17:10:32 -0600 Subject: [PATCH 1/2] Create Project Copy --- pyopenproject/business/project_service.py | 3 +++ .../services/command/project/create_copy.py | 23 +++++++++++++++++++ .../business/services/project_service_impl.py | 4 ++++ tests/test_cases/project_service_test.py | 7 ++++++ 4 files changed, 37 insertions(+) create mode 100644 pyopenproject/business/services/command/project/create_copy.py diff --git a/pyopenproject/business/project_service.py b/pyopenproject/business/project_service.py index 7ebc821f..2c247217 100644 --- a/pyopenproject/business/project_service.py +++ b/pyopenproject/business/project_service.py @@ -36,6 +36,9 @@ def find_all(self, filters=None, sort_by=None): raise NotImplementedError @abstractmethod def create(self, project): raise NotImplementedError + @abstractmethod + def create_copy(self, project, project_id): raise NotImplementedError + @abstractmethod def find_schema(self): raise NotImplementedError diff --git a/pyopenproject/business/services/command/project/create_copy.py b/pyopenproject/business/services/command/project/create_copy.py new file mode 100644 index 00000000..aefbef7d --- /dev/null +++ b/pyopenproject/business/services/command/project/create_copy.py @@ -0,0 +1,23 @@ +from pyopenproject.api_connection.exceptions.request_exception import RequestError +from pyopenproject.api_connection.requests.post_request import PostRequest +from pyopenproject.business.exception.business_error import BusinessError +from pyopenproject.business.services.command.project.project_command import ProjectCommand +from pyopenproject.model import project as p + + +class CreateCopy(ProjectCommand): + + def __init__(self, connection, project, project_id): + super().__init__(connection) + self.project = project + self.project_id = project_id + + def execute(self): + try: + json_obj = PostRequest(connection=self.connection, + headers={"Content-Type": "application/json"}, + context=f"{self.CONTEXT}/{self.project_id}/copy", + json=self.project.__dict__).execute() + return p.Project(json_obj) + except RequestError as re: + raise BusinessError(f"Error creating project: {self.project.name}") from re diff --git a/pyopenproject/business/services/project_service_impl.py b/pyopenproject/business/services/project_service_impl.py index 6dd27369..edab0627 100644 --- a/pyopenproject/business/services/project_service_impl.py +++ b/pyopenproject/business/services/project_service_impl.py @@ -1,5 +1,6 @@ from pyopenproject.business.project_service import ProjectService from pyopenproject.business.services.command.project.create import Create +from pyopenproject.business.services.command.project.create_copy import CreateCopy from pyopenproject.business.services.command.project.create_form import CreateForm from pyopenproject.business.services.command.project.create_work_package import CreateWorkPackage from pyopenproject.business.services.command.project.create_work_package_form import CreateWorkPackageForm @@ -42,6 +43,9 @@ def find_all(self, filters=None, sort_by=None): def create(self, project): return Create(self.connection, project).execute() + + def create_copy(self, project, project_id): + return CreateCopy(self.connection, project, project_id).execute() def find_schema(self): return FindSchema(self.connection).execute() diff --git a/tests/test_cases/project_service_test.py b/tests/test_cases/project_service_test.py index 1c27b335..177d1ac4 100644 --- a/tests/test_cases/project_service_test.py +++ b/tests/test_cases/project_service_test.py @@ -53,6 +53,13 @@ def test_operations(self): self.assertEqual("New project name changed", project.name) self.proSer.delete(project) + def test_create_copy(self): + # Create + project = self.proSer.create(self.new_project) + # Copy + project_copy = self.proSer.create_copy(project, project.id) + self.assertEqual(project.name, project_copy.name) + def test_find_schema(self): schema = self.proSer.find_schema() self.assertIsNotNone(schema) From ec8f235a3b1464fd4ea0c27583f9558b04f31bb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Crhistian=20Andr=C3=A9=20D=C3=ADaz=20Bonfigli=20Pastrana?= Date: Wed, 17 Jul 2024 14:06:26 -0600 Subject: [PATCH 2/2] =?UTF-8?q?style:=20=F0=9F=8E=A8=20remove=20trailing?= =?UTF-8?q?=20whitespace?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyopenproject/business/services/project_service_impl.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyopenproject/business/services/project_service_impl.py b/pyopenproject/business/services/project_service_impl.py index edab0627..c81b2c35 100644 --- a/pyopenproject/business/services/project_service_impl.py +++ b/pyopenproject/business/services/project_service_impl.py @@ -43,7 +43,7 @@ def find_all(self, filters=None, sort_by=None): def create(self, project): return Create(self.connection, project).execute() - + def create_copy(self, project, project_id): return CreateCopy(self.connection, project, project_id).execute()