diff --git a/libs/labelbox/src/labelbox/schema/project.py b/libs/labelbox/src/labelbox/schema/project.py index dc634c0a6..9ffed2816 100644 --- a/libs/labelbox/src/labelbox/schema/project.py +++ b/libs/labelbox/src/labelbox/schema/project.py @@ -1809,6 +1809,23 @@ def get_overview(self) -> ProjectOverview: overview["all_in_data_rows"] = overview.pop("all") return ProjectOverview(**overview) + + def clone(self) -> "Project": + """ + Clones the current project. + + Returns: + Project: The cloned project. + """ + mutation = """ + mutation CloneProjectPyApi($projectId: ID!) { + cloneProject(data: { projectId: $projectId }) { + id + } + } + """ + result = self.client.execute(mutation, {"projectId": self.uid}) + return self.client.get_project(result["cloneProject"]["id"]) class ProjectMember(DbObject): diff --git a/libs/labelbox/tests/integration/test_project.py b/libs/labelbox/tests/integration/test_project.py index ac21fdda6..85d67a251 100644 --- a/libs/labelbox/tests/integration/test_project.py +++ b/libs/labelbox/tests/integration/test_project.py @@ -279,3 +279,19 @@ def test_label_count(client, configured_batch_project_with_label): [source_project, _, _, _] = configured_batch_project_with_label num_labels = sum([1 for _ in source_project.labels()]) assert source_project.get_label_count() == num_labels + + +def test_clone(client, project, rand_gen): + # cannot clone unknown project media type + project = client.create_project(name=rand_gen(str), media_type=MediaType.Image) + cloned_project = project.clone() + + assert cloned_project.description == project.description + assert cloned_project.media_type == project.media_type + assert cloned_project.queue_mode == project.queue_mode + assert cloned_project.auto_audit_number_of_labels == project.auto_audit_number_of_labels + assert cloned_project.auto_audit_percentage == project.auto_audit_percentage + assert cloned_project.get_label_count() == 0 + + project.delete() + cloned_project.delete() \ No newline at end of file