diff --git a/pyopenproject/business/project_service.py b/pyopenproject/business/project_service.py index 7ebc821..2c24721 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 0000000..aefbef7 --- /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 6dd2736..c81b2c3 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 @@ -43,6 +44,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 1c27b33..177d1ac 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)