diff --git a/ayon_api/_api.py b/ayon_api/_api.py index 377aaf5e5..9c06b6f45 100644 --- a/ayon_api/_api.py +++ b/ayon_api/_api.py @@ -5475,6 +5475,7 @@ def create_representation( files: Optional[List[Dict[str, Any]]] = None, attrib: Optional[Dict[str, Any]] = None, data: Optional[Dict[str, Any]] = None, + traits: Optional[Dict[str, Any]] = None, tags: Optional[List[str]] = None, status: Optional[str] = None, active: Optional[bool] = None, @@ -5489,6 +5490,8 @@ def create_representation( files (Optional[list[dict]]): Representation files information. attrib (Optional[dict[str, Any]]): Representation attributes. data (Optional[dict[str, Any]]): Representation data. + traits (Optional[dict[str, Any]]): Representation traits + serialized data as dict. tags (Optional[Iterable[str]]): Representation tags. status (Optional[str]): Representation status. active (Optional[bool]): Representation active state. @@ -5507,6 +5510,7 @@ def create_representation( files=files, attrib=attrib, data=data, + traits=traits, tags=tags, status=status, active=active, @@ -5522,6 +5526,7 @@ def update_representation( files: Optional[List[Dict[str, Any]]] = None, attrib: Optional[Dict[str, Any]] = None, data: Optional[Dict[str, Any]] = None, + traits: Optional[Dict[str, Any]] = None, tags: Optional[List[str]] = None, status: Optional[str] = None, active: Optional[bool] = None, @@ -5542,6 +5547,7 @@ def update_representation( information. attrib (Optional[dict[str, Any]]): New attributes. data (Optional[dict[str, Any]]): New data. + traits (Optional[dict[str, Any]]): New traits. tags (Optional[Iterable[str]]): New tags. status (Optional[str]): New status. active (Optional[bool]): New active state. @@ -5556,6 +5562,7 @@ def update_representation( files=files, attrib=attrib, data=data, + traits=traits, tags=tags, status=status, active=active, diff --git a/ayon_api/constants.py b/ayon_api/constants.py index 4d5700ce9..93ff2877f 100644 --- a/ayon_api/constants.py +++ b/ayon_api/constants.py @@ -131,6 +131,7 @@ "data", "status", "tags", + "traits", } REPRESENTATION_FILES_FIELDS = { diff --git a/ayon_api/operations.py b/ayon_api/operations.py index b6805b379..d4383fda1 100644 --- a/ayon_api/operations.py +++ b/ayon_api/operations.py @@ -276,7 +276,8 @@ def new_representation_entity( tags=None, attribs=None, data=None, - entity_id=None + traits=None, + entity_id=None, ): """Create skeleton data of representation entity. @@ -290,6 +291,8 @@ def new_representation_entity( attribs (Optional[Dict[str, Any]]): Explicitly set attributes of representation. data (Optional[Dict[str, Any]]): Representation entity data. + traits (Optional[Dict[str, Any]]): Representation traits. Empty + if not passed. entity_id (Optional[str]): Predefined id of entity. New id is created if not passed. @@ -309,8 +312,10 @@ def new_representation_entity( "files": files, "name": name, "data": data, - "attrib": attribs + "attrib": attribs, } + if traits: + output["traits"] = traits if tags: output["tags"] = tags if status: @@ -1359,6 +1364,7 @@ def create_representation( files=None, attrib=None, data=None, + traits=None, tags=None, status=None, active=None, @@ -1373,6 +1379,8 @@ def create_representation( files (Optional[list[dict]]): Representation files information. attrib (Optional[dict[str, Any]]): Representation attributes. data (Optional[dict[str, Any]]): Representation data. + traits (Optional[Dict[str, Any]]): Representation traits. Empty + if not passed. tags (Optional[Iterable[str]]): Representation tags. status (Optional[str]): Representation status. active (Optional[bool]): Representation active state. @@ -1394,6 +1402,7 @@ def create_representation( ("files", files), ("attrib", attrib), ("data", data), + ("traits", traits), ("tags", tags), ("status", status), ("active", active), @@ -1416,6 +1425,7 @@ def update_representation( files=None, attrib=None, data=None, + traits=None, tags=None, status=None, active=None, @@ -1436,6 +1446,7 @@ def update_representation( information. attrib (Optional[dict[str, Any]]): New attributes. data (Optional[dict[str, Any]]): New data. + traits (Optional[Dict[str, Any]]): New representation traits. tags (Optional[Iterable[str]]): New tags. status (Optional[str]): New status. active (Optional[bool]): New active state. @@ -1451,6 +1462,7 @@ def update_representation( ("files", files), ("attrib", attrib), ("data", data), + ("traits", traits), ("tags", tags), ("status", status), ("active", active), diff --git a/ayon_api/server_api.py b/ayon_api/server_api.py index 24967b52e..55608100b 100644 --- a/ayon_api/server_api.py +++ b/ayon_api/server_api.py @@ -521,6 +521,7 @@ def __init__( self._server_version_tuple = None self._graphql_allows_data_in_query = None + self._graphql_allows_traits_in_representations: Optional[bool] = None self._session = None @@ -1116,6 +1117,18 @@ def graphql_allows_data_in_query(self) -> bool: self._graphql_allows_data_in_query = graphql_allows_data_in_query return self._graphql_allows_data_in_query + + @property + def graphql_allows_traits_in_representations(self) -> bool: + """Check server support for representation traits.""" + if self._graphql_allows_traits_in_representations is None: + major, minor, patch, _, _ = self.server_version_tuple + self._graphql_allows_traits_in_representations = ( + (major, minor, patch) >= (1, 7, 5) + ) + return self._graphql_allows_traits_in_representations + + def _get_user_info(self) -> Optional[Dict[str, Any]]: if self._access_token is None: return None @@ -2779,6 +2792,9 @@ def get_default_fields_for_type(self, entity_type: str) -> Set[str]: if not self.graphql_allows_data_in_query: entity_type_defaults.discard("data") + if not self.graphql_allows_traits_in_representations: + entity_type_defaults.discard("traits") + elif entity_type == "folderType": entity_type_defaults = set(DEFAULT_FOLDER_TYPE_FIELDS) @@ -7474,6 +7490,7 @@ def create_representation( files: Optional[List[Dict[str, Any]]] = None, attrib: Optional[Dict[str, Any]] = None, data: Optional[Dict[str, Any]] = None, + traits: Optional[Dict[str, Any]] = None, tags: Optional[List[str]]=None, status: Optional[str] = None, active: Optional[bool] = None, @@ -7488,6 +7505,8 @@ def create_representation( files (Optional[list[dict]]): Representation files information. attrib (Optional[dict[str, Any]]): Representation attributes. data (Optional[dict[str, Any]]): Representation data. + traits (Optional[dict[str, Any]]): Representation traits + serialized data as dict. tags (Optional[Iterable[str]]): Representation tags. status (Optional[str]): Representation status. active (Optional[bool]): Representation active state. @@ -7509,6 +7528,7 @@ def create_representation( ("files", files), ("attrib", attrib), ("data", data), + ("traits", traits), ("tags", tags), ("status", status), ("active", active), @@ -7532,6 +7552,7 @@ def update_representation( files: Optional[List[Dict[str, Any]]] = None, attrib: Optional[Dict[str, Any]] = None, data: Optional[Dict[str, Any]] = None, + traits: Optional[Dict[str, Any]] = None, tags: Optional[List[str]] = None, status: Optional[str] = None, active: Optional[bool] = None, @@ -7552,6 +7573,7 @@ def update_representation( information. attrib (Optional[dict[str, Any]]): New attributes. data (Optional[dict[str, Any]]): New data. + traits (Optional[dict[str, Any]]): New traits. tags (Optional[Iterable[str]]): New tags. status (Optional[str]): New status. active (Optional[bool]): New active state. @@ -7564,6 +7586,7 @@ def update_representation( ("files", files), ("attrib", attrib), ("data", data), + ("traits", traits), ("tags", tags), ("status", status), ("active", active),