@@ -174,6 +174,7 @@ def get_rest_projects(
174174 self ,
175175 active : Optional [bool ] = True ,
176176 library : Optional [bool ] = None ,
177+ skeleton : bool = False ,
177178 ) -> Generator [ProjectDict , None , None ]:
178179 """Query available project entities.
179180
@@ -184,12 +185,13 @@ def get_rest_projects(
184185 are returned if 'None' is passed.
185186 library (Optional[bool]): Filter standard/library projects. Both
186187 are returned if 'None' is passed.
188+ skeleton (bool): Include skeleton projects.
187189
188190 Returns:
189191 Generator[ProjectDict, None, None]: Available projects.
190192
191193 """
192- for project_name in self .get_project_names (active , library ):
194+ for project_name in self .get_project_names (active , library , skeleton ):
193195 project = self .get_rest_project (project_name )
194196 if project :
195197 yield project
@@ -198,6 +200,7 @@ def get_rest_projects_list(
198200 self ,
199201 active : Optional [bool ] = True ,
200202 library : Optional [bool ] = None ,
203+ skeleton : bool = False ,
201204 ) -> list [ProjectListDict ]:
202205 """Receive available projects.
203206
@@ -208,6 +211,7 @@ def get_rest_projects_list(
208211 are returned if 'None' is passed.
209212 library (Optional[bool]): Filter standard/library projects. Both
210213 are returned if 'None' is passed.
214+ skeleton (bool): Include skeleton projects.
211215
212216 Returns:
213217 list[ProjectListDict]: List of available projects.
@@ -219,10 +223,14 @@ def get_rest_projects_list(
219223 if library is not None :
220224 library = "true" if library else "false"
221225
222- query = prepare_query_string ( {
226+ query_data = {
223227 "active" : active ,
224228 "library" : library ,
225- })
229+ }
230+ if skeleton :
231+ query_data ["skeleton" ] = "true"
232+
233+ query = prepare_query_string (query_data )
226234 response = self .get (f"projects{ query } " )
227235 response .raise_for_status ()
228236 data = response .data
@@ -232,6 +240,7 @@ def get_project_names(
232240 self ,
233241 active : Optional [bool ] = True ,
234242 library : Optional [bool ] = None ,
243+ skeleton : bool = False ,
235244 ) -> list [str ]:
236245 """Receive available project names.
237246
@@ -242,20 +251,24 @@ def get_project_names(
242251 are returned if 'None' is passed.
243252 library (Optional[bool]): Filter standard/library projects. Both
244253 are returned if 'None' is passed.
254+ skeleton (bool): Include skeleton projects.
245255
246256 Returns:
247257 list[str]: List of available project names.
248258
249259 """
250260 return [
251261 project ["name" ]
252- for project in self .get_rest_projects_list (active , library )
262+ for project in self .get_rest_projects_list (
263+ active , library , skeleton
264+ )
253265 ]
254266
255267 def get_projects (
256268 self ,
257269 active : Optional [bool ] = True ,
258270 library : Optional [bool ] = None ,
271+ skeleton : bool = False ,
259272 fields : Optional [Iterable [str ]] = None ,
260273 own_attributes : bool = False ,
261274 ) -> Generator [ProjectDict , None , None ]:
@@ -280,14 +293,15 @@ def get_projects(
280293
281294 graphql_fields , fetch_type = self ._get_project_graphql_fields (fields )
282295 if fetch_type == ProjectFetchType .RESTList :
283- yield from self .get_rest_projects_list (active , library )
296+ yield from self .get_rest_projects_list (active , library , skeleton )
284297 return
285298
286299 projects_by_name = {}
287300 if graphql_fields :
288301 projects = list (self ._get_graphql_projects (
289302 active ,
290303 library ,
304+ skeleton = skeleton ,
291305 fields = graphql_fields ,
292306 own_attributes = own_attributes ,
293307 ))
@@ -296,7 +310,9 @@ def get_projects(
296310 return
297311 projects_by_name = {p ["name" ]: p for p in projects }
298312
299- for project in self .get_rest_projects (active = active , library = library ):
313+ for project in self .get_rest_projects (
314+ active = active , library = library , skeleton = skeleton
315+ ):
300316 if own_attributes :
301317 fill_own_attribs (project )
302318
@@ -356,6 +372,8 @@ def create_project(
356372 project_code : str ,
357373 library_project : bool = False ,
358374 preset_name : Optional [str ] = None ,
375+ data : dict [str , Any ] | None = None ,
376+ skeleton : bool = False ,
359377 ) -> ProjectDict :
360378 """Create project using AYON settings.
361379
@@ -375,6 +393,8 @@ def create_project(
375393 library_project (Optional[bool]): Project is library project.
376394 preset_name (Optional[str]): Name of anatomy preset. Default is
377395 used if not passed.
396+ data (dict[str, Any]): Project data.
397+ skeleton (bool): Project is skeleton project.
378398
379399 Raises:
380400 ValueError: When project name already exists.
@@ -395,12 +415,19 @@ def create_project(
395415
396416 preset = self .get_project_anatomy_preset (preset_name )
397417
418+ if data is None :
419+ data = {}
420+
421+ if skeleton :
422+ data ["skeleton" ] = True
423+
398424 result = self .post (
399425 "projects" ,
400426 name = project_name ,
401427 code = project_code ,
402428 anatomy = preset ,
403- library = library_project
429+ library = library_project ,
430+ data = data ,
404431 )
405432
406433 if result .status != 201 :
@@ -858,8 +885,9 @@ def _fill_project_entity_data(self, project: dict[str, Any]) -> None:
858885
859886 def _get_graphql_projects (
860887 self ,
861- active : Optional [bool ],
862- library : Optional [bool ],
888+ active : bool | None ,
889+ library : bool | None ,
890+ skeleton : bool ,
863891 fields : set [str ],
864892 own_attributes : bool ,
865893 project_name : Optional [str ] = None
@@ -876,6 +904,9 @@ def _get_graphql_projects(
876904 if project_name is not None :
877905 query .set_variable_value ("projectName" , project_name )
878906
907+ if skeleton :
908+ query .set_variable_value ("skeleton" , True )
909+
879910 attributes = {}
880911 if "allAttrib" in fields :
881912 attributes = self .get_attributes_for_type ("project" )
0 commit comments