@@ -357,8 +357,11 @@ def create_project(
357357 if step ["className" ] not in class_names :
358358 invalid_classes .append (step ["className" ])
359359 if invalid_classes :
360+ seen = set ()
361+ seen_add = seen .add
362+ invalid_classes = [i for i in invalid_classes if not (i in seen or seen_add (i ))]
360363 raise AppException (
361- f"There are no [{ ', ' .join (set ( invalid_classes ) )} ] classes created in the project."
364+ f"There are no [{ ', ' .join (invalid_classes )} ] classes created in the project."
362365 )
363366 project_response = self .controller .projects .create (
364367 entities .ProjectEntity (
@@ -477,6 +480,8 @@ def clone_project(
477480 else :
478481 project_copy .description = project .description
479482 project_copy .name = project_name
483+ if project .type in (constants .ProjectType .VECTOR , constants .ProjectType .PIXEL ):
484+ project .upload_state = enums .UploadState .INITIAL
480485 create_response = self .controller .projects .create (project_copy )
481486 create_response .raise_for_status ()
482487 new_project = create_response .data
@@ -494,14 +499,28 @@ def clone_project(
494499 )
495500 classes_response .raise_for_status ()
496501 project .classes = classes_response .data
497- if copy_workflow :
502+ if copy_workflow :
503+ if not copy_annotation_classes :
504+ logger .info (f"Skipping the workflow clone from { from_project } to { project_name } ." )
505+ else :
498506 logger .info (f"Cloning workflow from { from_project } to { project_name } ." )
499507 workflow_response = self .controller .projects .set_workflows (
500508 new_project , project .workflows
501509 )
502510 workflow_response .raise_for_status ()
503511 project .workflows = self .controller .projects .list_workflow (project ).data
504- return ProjectSerializer (new_project ).serialize ()
512+ response = self .controller .projects .get_metadata (
513+ new_project ,
514+ include_settings = copy_settings ,
515+ include_workflow = copy_workflow ,
516+ include_contributors = copy_contributors ,
517+ include_annotation_classes = copy_annotation_classes ,
518+ include_complete_image_count = True ,
519+ )
520+
521+ if response .errors :
522+ raise AppException (response .errors )
523+ return ProjectSerializer (response .data ).serialize ()
505524
506525 def create_folder (self , project : NotEmptyStr , folder_name : NotEmptyStr ):
507526 """Create a new folder in the project.
@@ -907,7 +926,7 @@ def assign_folder(
907926 raise AppException (response .errors )
908927
909928 contributors = response .data .users
910- verified_users = [i [ " user_id" ] for i in contributors ]
929+ verified_users = [i . user_id for i in contributors ]
911930 verified_users = set (users ).intersection (set (verified_users ))
912931 unverified_contributor = set (users ) - verified_users
913932
@@ -2155,7 +2174,7 @@ def add_contributors_to_project(
21552174 """
21562175 project = self .controller .projects .get_by_name (project ).data
21572176 contributors = [
2158- entities .ContributorEntity (email = email , user_role = constants .UserRole (role ))
2177+ entities .ContributorEntity (user_id = email , user_role = constants .UserRole (role ))
21592178 for email in emails
21602179 ]
21612180 response = self .controller .projects .add_contributors (
0 commit comments