From 3d7d2b1ba9246cbf735d3d2dd3a0cfb7103cfca7 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 13 Mar 2026 15:17:02 +0100 Subject: [PATCH 01/10] implemente helper to find out if links data can be fetched --- ayon_api/_api_helpers/base.py | 3 +++ ayon_api/server_api.py | 10 ++++++++++ 2 files changed, 13 insertions(+) diff --git a/ayon_api/_api_helpers/base.py b/ayon_api/_api_helpers/base.py index 0a3d19550..d2441bb14 100644 --- a/ayon_api/_api_helpers/base.py +++ b/ayon_api/_api_helpers/base.py @@ -28,6 +28,9 @@ def log(self) -> logging.Logger: def is_product_base_type_supported(self) -> bool: raise NotImplementedError() + def links_graphql_support_data(self) -> bool: + raise NotImplementedError() + def get_server_version(self) -> str: raise NotImplementedError() diff --git a/ayon_api/server_api.py b/ayon_api/server_api.py index b97e39f18..867a09efe 100644 --- a/ayon_api/server_api.py +++ b/ayon_api/server_api.py @@ -329,6 +329,7 @@ def __init__( self._graphql_allows_traits_in_representations: Optional[bool] = None self._product_base_type_supported = None + self._links_graphql_support_data = None self._session = None @@ -922,6 +923,15 @@ def is_product_base_type_supported(self) -> bool: ) return self._product_base_type_supported + def links_graphql_support_data(self) -> bool: + """Links data can be received by GraphQl.""" + if self._links_graphql_support_data is None: + major, minor, patch, _, _ = self.server_version_tuple + self._links_graphql_support_data = ( + (major, minor, patch) >= (1, 14, 2) + ) + return self._links_graphql_support_data + def _get_user_info(self) -> Optional[dict[str, Any]]: if self._access_token is None: return None From 26c9121d3e253c473c688bde26d4294d882df088 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 13 Mar 2026 15:23:36 +0100 Subject: [PATCH 02/10] graphql queries can pass in if supports links data --- ayon_api/graphql_queries.py | 101 ++++++++++++++++++++++++++++++------ 1 file changed, 86 insertions(+), 15 deletions(-) diff --git a/ayon_api/graphql_queries.py b/ayon_api/graphql_queries.py index df0a1e69e..9d5ceb0c4 100644 --- a/ayon_api/graphql_queries.py +++ b/ayon_api/graphql_queries.py @@ -1,15 +1,30 @@ +from __future__ import annotations + import collections +import typing from .constants import DEFAULT_LINK_FIELDS from .graphql import FIELD_VALUE, GraphQlQuery, fields_to_dict +if typing.TYPE_CHECKING: + from .graphql import ( + GraphQlQueryEdgeField, + ) + -def add_links_fields(entity_field, nested_fields): +def add_links_fields( + entity_field: GraphQlQueryEdgeField, + nested_fields: dict | None, + supports_data: bool = False, +) -> None: if "links" not in nested_fields: return links_fields = nested_fields.pop("links") link_edge_fields = set(DEFAULT_LINK_FIELDS) + if supports_data: + link_edge_fields.add("data") + if isinstance(links_fields, dict): simple_fields = set(links_fields) simple_variant = len(simple_fields - link_edge_fields) == 0 @@ -121,7 +136,11 @@ def product_types_query(fields): return query -def folders_graphql_query(fields): +def folders_graphql_query( + fields: set[str], + *, + links_support_data: bool = False, +) -> GraphQlQuery: query = GraphQlQuery("FoldersQuery") project_name_var = query.add_variable("projectName", "String!") folder_ids_var = query.add_variable("folderIds", "[String!]") @@ -161,7 +180,11 @@ def folders_graphql_query(fields): folders_field.set_filter("filter", filter_var) nested_fields = fields_to_dict(fields) - add_links_fields(folders_field, nested_fields) + add_links_fields( + folders_field, + nested_fields, + supports_data=links_support_data, + ) query_queue = collections.deque() for key, value in nested_fields.items(): @@ -179,7 +202,11 @@ def folders_graphql_query(fields): return query -def tasks_graphql_query(fields): +def tasks_graphql_query( + fields: set[str], + *, + links_support_data: bool = False, +) -> GraphQlQuery: query = GraphQlQuery("TasksQuery") project_name_var = query.add_variable("projectName", "String!") task_ids_var = query.add_variable("taskIds", "[String!]") @@ -209,7 +236,11 @@ def tasks_graphql_query(fields): tasks_field.set_filter("filter", filter_var) nested_fields = fields_to_dict(fields) - add_links_fields(tasks_field, nested_fields) + add_links_fields( + tasks_field, + nested_fields, + supports_data=links_support_data, + ) query_queue = collections.deque() for key, value in nested_fields.items(): @@ -227,7 +258,11 @@ def tasks_graphql_query(fields): return query -def tasks_by_folder_paths_graphql_query(fields): +def tasks_by_folder_paths_graphql_query( + fields: set[str], + *, + links_support_data: bool = False, +) -> GraphQlQuery: query = GraphQlQuery("TasksByFolderPathQuery") project_name_var = query.add_variable("projectName", "String!") task_names_var = query.add_variable("taskNames", "[String!]") @@ -258,7 +293,11 @@ def tasks_by_folder_paths_graphql_query(fields): tasks_field.set_filter("filter", filter_var) nested_fields = fields_to_dict(fields) - add_links_fields(tasks_field, nested_fields) + add_links_fields( + tasks_field, + nested_fields, + supports_data=links_support_data, + ) query_queue = collections.deque() for key, value in nested_fields.items(): @@ -276,7 +315,11 @@ def tasks_by_folder_paths_graphql_query(fields): return query -def products_graphql_query(fields): +def products_graphql_query( + fields: set[str], + *, + links_support_data: bool = False, +) -> GraphQlQuery: query = GraphQlQuery("ProductsQuery") project_name_var = query.add_variable("projectName", "String!") @@ -308,7 +351,11 @@ def products_graphql_query(fields): products_field.set_filter("filter", filter_var) nested_fields = fields_to_dict(set(fields)) - add_links_fields(products_field, nested_fields) + add_links_fields( + products_field, + nested_fields, + supports_data=links_support_data, + ) query_queue = collections.deque() for key, value in nested_fields.items(): @@ -326,7 +373,11 @@ def products_graphql_query(fields): return query -def versions_graphql_query(fields): +def versions_graphql_query( + fields: set[str], + *, + links_support_data: bool = False, +) -> GraphQlQuery: query = GraphQlQuery("VersionsQuery") project_name_var = query.add_variable("projectName", "String!") @@ -359,7 +410,11 @@ def versions_graphql_query(fields): versions_field.set_filter("filter", filter_var) nested_fields = fields_to_dict(set(fields)) - add_links_fields(versions_field, nested_fields) + add_links_fields( + versions_field, + nested_fields, + supports_data=links_support_data, + ) query_queue = collections.deque() for key, value in nested_fields.items(): @@ -377,7 +432,11 @@ def versions_graphql_query(fields): return query -def representations_graphql_query(fields): +def representations_graphql_query( + fields: set[str], + *, + links_support_data: bool = False, +) -> GraphQlQuery: query = GraphQlQuery("RepresentationsQuery") project_name_var = query.add_variable("projectName", "String!") @@ -408,7 +467,11 @@ def representations_graphql_query(fields): repres_field.set_filter("filter", filter_var) nested_fields = fields_to_dict(set(fields)) - add_links_fields(repres_field, nested_fields) + add_links_fields( + repres_field, + nested_fields, + supports_data=links_support_data, + ) query_queue = collections.deque() for key, value in nested_fields.items(): @@ -525,7 +588,11 @@ def representations_hierarchy_qraphql_query( return query -def workfiles_info_graphql_query(fields): +def workfiles_info_graphql_query( + fields: set[str], + *, + links_support_data: bool = False, +) -> GraphQlQuery: query = GraphQlQuery("WorkfilesInfo") project_name_var = query.add_variable("projectName", "String!") workfiles_info_ids = query.add_variable("workfileIds", "[String!]") @@ -549,7 +616,11 @@ def workfiles_info_graphql_query(fields): workfiles_field.set_filter("tags", tags_var) nested_fields = fields_to_dict(set(fields)) - add_links_fields(workfiles_field, nested_fields) + add_links_fields( + workfiles_field, + nested_fields, + supports_data=links_support_data, + ) query_queue = collections.deque() for key, value in nested_fields.items(): From 528c125bd7cbd59592e03bdc4cbf76fb9c169872 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 13 Mar 2026 15:25:45 +0100 Subject: [PATCH 03/10] pass information if server supports links data --- ayon_api/_api_helpers/folders.py | 10 ++++++++-- ayon_api/_api_helpers/links.py | 5 ++++- ayon_api/_api_helpers/products.py | 5 ++++- ayon_api/_api_helpers/representations.py | 5 ++++- ayon_api/_api_helpers/tasks.py | 10 ++++++++-- ayon_api/_api_helpers/versions.py | 15 ++++++++++++--- ayon_api/_api_helpers/workfiles.py | 5 ++++- 7 files changed, 44 insertions(+), 11 deletions(-) diff --git a/ayon_api/_api_helpers/folders.py b/ayon_api/_api_helpers/folders.py index 71535bdd5..8d27ee957 100644 --- a/ayon_api/_api_helpers/folders.py +++ b/ayon_api/_api_helpers/folders.py @@ -331,7 +331,10 @@ def get_folders( if own_attributes: fields.add("ownAttrib") - query = folders_graphql_query(fields) + query = folders_graphql_query( + fields, + links_support_data=self.links_graphql_support_data(), + ) for attr, filter_value in graphql_filters.items(): query.set_variable_value(attr, filter_value) @@ -478,7 +481,10 @@ def get_folder_ids_with_products( if not folder_ids: return set() - query = folders_graphql_query({"id"}) + query = folders_graphql_query( + {"id"}, + links_support_data=self.links_graphql_support_data(), + ) query.set_variable_value("projectName", project_name) query.set_variable_value("folderHasProducts", True) if folder_ids: diff --git a/ayon_api/_api_helpers/links.py b/ayon_api/_api_helpers/links.py index dc73f7890..de47107b5 100644 --- a/ayon_api/_api_helpers/links.py +++ b/ayon_api/_api_helpers/links.py @@ -362,7 +362,10 @@ def get_entities_links( return output link_fields = {"id", "links"} - query = query_func(link_fields) + query = query_func( + link_fields, + links_support_data=self.links_graphql_support_data(), + ) for attr, filter_value in filters.items(): query.set_variable_value(attr, filter_value) diff --git a/ayon_api/_api_helpers/products.py b/ayon_api/_api_helpers/products.py index db1e29a0c..f3c116be2 100644 --- a/ayon_api/_api_helpers/products.py +++ b/ayon_api/_api_helpers/products.py @@ -179,7 +179,10 @@ def get_products( if filter_value: graphql_filters[filter_key] = filter_value - query = products_graphql_query(fields) + query = products_graphql_query( + fields, + links_support_data=self.links_graphql_support_data(), + ) for attr, filter_value in graphql_filters.items(): query.set_variable_value(attr, filter_value) diff --git a/ayon_api/_api_helpers/representations.py b/ayon_api/_api_helpers/representations.py index 56ac8e372..c98070bb7 100644 --- a/ayon_api/_api_helpers/representations.py +++ b/ayon_api/_api_helpers/representations.py @@ -168,7 +168,10 @@ def get_representations( if filters: graphql_filters["filter"] = filters - query = representations_graphql_query(fields) + query = representations_graphql_query( + fields, + links_support_data=self.links_graphql_support_data(), + ) for attr, filter_value in graphql_filters.items(): query.set_variable_value(attr, filter_value) diff --git a/ayon_api/_api_helpers/tasks.py b/ayon_api/_api_helpers/tasks.py index 4109d72ed..b90224d6b 100644 --- a/ayon_api/_api_helpers/tasks.py +++ b/ayon_api/_api_helpers/tasks.py @@ -106,7 +106,10 @@ def get_tasks( if active is not None: fields.add("active") - query = tasks_graphql_query(fields) + query = tasks_graphql_query( + fields, + links_support_data=self.links_graphql_support_data(), + ) for attr, filter_value in graphql_filters.items(): query.set_variable_value(attr, filter_value) @@ -267,7 +270,10 @@ def get_tasks_by_folder_paths( if active is not None: fields.add("active") - query = tasks_by_folder_paths_graphql_query(fields) + query = tasks_by_folder_paths_graphql_query( + fields, + links_support_data=self.links_graphql_support_data(), + ) for attr, filter_value in graphql_filters.items(): query.set_variable_value(attr, filter_value) diff --git a/ayon_api/_api_helpers/versions.py b/ayon_api/_api_helpers/versions.py index 97800451c..fcef21ac7 100644 --- a/ayon_api/_api_helpers/versions.py +++ b/ayon_api/_api_helpers/versions.py @@ -130,14 +130,20 @@ def get_versions( if standard and not latest: # This query all versions standard + hero # - hero must be filtered out if is not enabled during loop - query = versions_graphql_query(fields) + query = versions_graphql_query( + fields, + links_support_data=self.links_graphql_support_data(), + ) for attr, filter_value in graphql_filters.items(): query.set_variable_value(attr, filter_value) queries.append(query) else: if hero: # Add hero query if hero is enabled - hero_query = versions_graphql_query(fields) + hero_query = versions_graphql_query( + fields, + links_support_data=self.links_graphql_support_data(), + ) for attr, filter_value in graphql_filters.items(): hero_query.set_variable_value(attr, filter_value) @@ -145,7 +151,10 @@ def get_versions( queries.append(hero_query) if standard: - standard_query = versions_graphql_query(fields) + standard_query = versions_graphql_query( + fields, + links_support_data=self.links_graphql_support_data(), + ) for attr, filter_value in graphql_filters.items(): standard_query.set_variable_value(attr, filter_value) diff --git a/ayon_api/_api_helpers/workfiles.py b/ayon_api/_api_helpers/workfiles.py index a0e35b9a8..d111f2906 100644 --- a/ayon_api/_api_helpers/workfiles.py +++ b/ayon_api/_api_helpers/workfiles.py @@ -93,7 +93,10 @@ def get_workfile_entities( fields = set(fields) self._prepare_fields("workfile", fields) - query = workfiles_info_graphql_query(fields) + query = workfiles_info_graphql_query( + fields, + links_support_data=self.links_graphql_support_data(), + ) for attr, filter_value in filters.items(): query.set_variable_value(attr, filter_value) From f7e1b6137a0d427a8c8f443ada29fa2dda21fc11 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 13 Mar 2026 15:32:12 +0100 Subject: [PATCH 04/10] supports_data is kwarg --- ayon_api/graphql_queries.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ayon_api/graphql_queries.py b/ayon_api/graphql_queries.py index 9d5ceb0c4..50bc127d6 100644 --- a/ayon_api/graphql_queries.py +++ b/ayon_api/graphql_queries.py @@ -15,6 +15,7 @@ def add_links_fields( entity_field: GraphQlQueryEdgeField, nested_fields: dict | None, + *, supports_data: bool = False, ) -> None: if "links" not in nested_fields: From 81fdc869893b4972df085a7575dc24ec71f5ab07 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 13 Mar 2026 15:35:03 +0100 Subject: [PATCH 05/10] update public api --- ayon_api/__init__.py | 2 ++ ayon_api/_api.py | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/ayon_api/__init__.py b/ayon_api/__init__.py index 0c52eb8ba..fc89a1dfb 100644 --- a/ayon_api/__init__.py +++ b/ayon_api/__init__.py @@ -55,6 +55,7 @@ get_server_version, get_server_version_tuple, is_product_base_type_supported, + links_graphql_support_data, get_users, get_user_by_name, get_user, @@ -339,6 +340,7 @@ "get_server_version", "get_server_version_tuple", "is_product_base_type_supported", + "links_graphql_support_data", "get_users", "get_user_by_name", "get_user", diff --git a/ayon_api/_api.py b/ayon_api/_api.py index 97833c8c8..a00bb04c0 100644 --- a/ayon_api/_api.py +++ b/ayon_api/_api.py @@ -729,6 +729,13 @@ def is_product_base_type_supported() -> bool: return con.is_product_base_type_supported() +def links_graphql_support_data() -> bool: + """Links data can be received by GraphQl. + """ + con = get_server_api_connection() + return con.links_graphql_support_data() + + def get_users( project_name: Optional[str] = None, usernames: Optional[Iterable[str]] = None, From 3f694895ef63dd5f7febcb44fc77fea76419ea89 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 18 Mar 2026 16:08:36 +0100 Subject: [PATCH 06/10] prepare links fields preparation --- ayon_api/_api_helpers/base.py | 3 +++ ayon_api/server_api.py | 12 ++++++++++++ 2 files changed, 15 insertions(+) diff --git a/ayon_api/_api_helpers/base.py b/ayon_api/_api_helpers/base.py index d2441bb14..8ef198c68 100644 --- a/ayon_api/_api_helpers/base.py +++ b/ayon_api/_api_helpers/base.py @@ -145,6 +145,9 @@ def _prepare_fields( ): raise NotImplementedError() + def _prepare_link_fields(self, fields: set[str]) -> None: + raise NotImplementedError() + def _prepare_advanced_filters( self, filters: Union[str, dict[str, Any], None] ) -> Optional[str]: diff --git a/ayon_api/server_api.py b/ayon_api/server_api.py index 867a09efe..db5f49b1f 100644 --- a/ayon_api/server_api.py +++ b/ayon_api/server_api.py @@ -38,6 +38,7 @@ DEFAULT_ACTIVITY_FIELDS, DEFAULT_USER_FIELDS, DEFAULT_ENTITY_LIST_FIELDS, + DEFAULT_LINK_FIELDS, ) from .graphql import INTROSPECTION_QUERY from .graphql_queries import users_graphql_query @@ -2455,6 +2456,17 @@ def _prepare_fields( ) } + def _prepare_link_fields(self, fields: set[str]) -> None: + if "links" not in fields: + return + + fields.discard("links") + for field in DEFAULT_LINK_FIELDS: + fields.add(f"links.{field}") + + if self.links_graphql_support_data(): + fields.add(f"links.data") + def _prepare_advanced_filters( self, filters: Union[str, dict[str, Any], None] ) -> Optional[str]: From 80420465b5a6855261caa18cd12058c19d93901a Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 18 Mar 2026 16:09:40 +0100 Subject: [PATCH 07/10] change how links fields are handled --- ayon_api/_api_helpers/folders.py | 12 +-- ayon_api/_api_helpers/products.py | 7 +- ayon_api/_api_helpers/representations.py | 7 +- ayon_api/_api_helpers/tasks.py | 14 ++-- ayon_api/_api_helpers/versions.py | 18 ++--- ayon_api/_api_helpers/workfiles.py | 7 +- ayon_api/graphql_queries.py | 95 +++++------------------- 7 files changed, 43 insertions(+), 117 deletions(-) diff --git a/ayon_api/_api_helpers/folders.py b/ayon_api/_api_helpers/folders.py index 8d27ee957..d10cfeb7a 100644 --- a/ayon_api/_api_helpers/folders.py +++ b/ayon_api/_api_helpers/folders.py @@ -331,10 +331,9 @@ def get_folders( if own_attributes: fields.add("ownAttrib") - query = folders_graphql_query( - fields, - links_support_data=self.links_graphql_support_data(), - ) + self._prepare_link_fields(fields) + + query = folders_graphql_query(fields) for attr, filter_value in graphql_filters.items(): query.set_variable_value(attr, filter_value) @@ -481,10 +480,7 @@ def get_folder_ids_with_products( if not folder_ids: return set() - query = folders_graphql_query( - {"id"}, - links_support_data=self.links_graphql_support_data(), - ) + query = folders_graphql_query({"id"}) query.set_variable_value("projectName", project_name) query.set_variable_value("folderHasProducts", True) if folder_ids: diff --git a/ayon_api/_api_helpers/products.py b/ayon_api/_api_helpers/products.py index f3c116be2..2eacb7cd7 100644 --- a/ayon_api/_api_helpers/products.py +++ b/ayon_api/_api_helpers/products.py @@ -179,10 +179,9 @@ def get_products( if filter_value: graphql_filters[filter_key] = filter_value - query = products_graphql_query( - fields, - links_support_data=self.links_graphql_support_data(), - ) + self._prepare_link_fields(fields) + + query = products_graphql_query(fields) for attr, filter_value in graphql_filters.items(): query.set_variable_value(attr, filter_value) diff --git a/ayon_api/_api_helpers/representations.py b/ayon_api/_api_helpers/representations.py index c98070bb7..4535fa633 100644 --- a/ayon_api/_api_helpers/representations.py +++ b/ayon_api/_api_helpers/representations.py @@ -108,6 +108,8 @@ def get_representations( fields.discard("files") fields |= REPRESENTATION_FILES_FIELDS + self._prepare_link_fields(fields) + graphql_filters = { "projectName": project_name } @@ -168,10 +170,7 @@ def get_representations( if filters: graphql_filters["filter"] = filters - query = representations_graphql_query( - fields, - links_support_data=self.links_graphql_support_data(), - ) + query = representations_graphql_query(fields) for attr, filter_value in graphql_filters.items(): query.set_variable_value(attr, filter_value) diff --git a/ayon_api/_api_helpers/tasks.py b/ayon_api/_api_helpers/tasks.py index b90224d6b..4ffa2dd5f 100644 --- a/ayon_api/_api_helpers/tasks.py +++ b/ayon_api/_api_helpers/tasks.py @@ -106,10 +106,9 @@ def get_tasks( if active is not None: fields.add("active") - query = tasks_graphql_query( - fields, - links_support_data=self.links_graphql_support_data(), - ) + self._prepare_link_fields(fields) + + query = tasks_graphql_query(fields) for attr, filter_value in graphql_filters.items(): query.set_variable_value(attr, filter_value) @@ -270,10 +269,9 @@ def get_tasks_by_folder_paths( if active is not None: fields.add("active") - query = tasks_by_folder_paths_graphql_query( - fields, - links_support_data=self.links_graphql_support_data(), - ) + self._prepare_link_fields(fields) + + query = tasks_by_folder_paths_graphql_query(fields) for attr, filter_value in graphql_filters.items(): query.set_variable_value(attr, filter_value) diff --git a/ayon_api/_api_helpers/versions.py b/ayon_api/_api_helpers/versions.py index fcef21ac7..8a355fca1 100644 --- a/ayon_api/_api_helpers/versions.py +++ b/ayon_api/_api_helpers/versions.py @@ -87,6 +87,8 @@ def get_versions( if active is not None: fields.add("active") + self._prepare_link_fields(fields) + if own_attributes is not _PLACEHOLDER: warnings.warn( ( @@ -116,7 +118,6 @@ def get_versions( ): return - filters = self._prepare_advanced_filters(filters) if filters: graphql_filters["filter"] = filters @@ -130,20 +131,14 @@ def get_versions( if standard and not latest: # This query all versions standard + hero # - hero must be filtered out if is not enabled during loop - query = versions_graphql_query( - fields, - links_support_data=self.links_graphql_support_data(), - ) + query = versions_graphql_query(fields) for attr, filter_value in graphql_filters.items(): query.set_variable_value(attr, filter_value) queries.append(query) else: if hero: # Add hero query if hero is enabled - hero_query = versions_graphql_query( - fields, - links_support_data=self.links_graphql_support_data(), - ) + hero_query = versions_graphql_query(fields) for attr, filter_value in graphql_filters.items(): hero_query.set_variable_value(attr, filter_value) @@ -151,10 +146,7 @@ def get_versions( queries.append(hero_query) if standard: - standard_query = versions_graphql_query( - fields, - links_support_data=self.links_graphql_support_data(), - ) + standard_query = versions_graphql_query(fields) for attr, filter_value in graphql_filters.items(): standard_query.set_variable_value(attr, filter_value) diff --git a/ayon_api/_api_helpers/workfiles.py b/ayon_api/_api_helpers/workfiles.py index d111f2906..67991da54 100644 --- a/ayon_api/_api_helpers/workfiles.py +++ b/ayon_api/_api_helpers/workfiles.py @@ -93,10 +93,9 @@ def get_workfile_entities( fields = set(fields) self._prepare_fields("workfile", fields) - query = workfiles_info_graphql_query( - fields, - links_support_data=self.links_graphql_support_data(), - ) + self._prepare_link_fields(fields) + + query = workfiles_info_graphql_query(fields) for attr, filter_value in filters.items(): query.set_variable_value(attr, filter_value) diff --git a/ayon_api/graphql_queries.py b/ayon_api/graphql_queries.py index 50bc127d6..27719d389 100644 --- a/ayon_api/graphql_queries.py +++ b/ayon_api/graphql_queries.py @@ -15,20 +15,17 @@ def add_links_fields( entity_field: GraphQlQueryEdgeField, nested_fields: dict | None, - *, - supports_data: bool = False, ) -> None: if "links" not in nested_fields: return links_fields = nested_fields.pop("links") - link_edge_fields = set(DEFAULT_LINK_FIELDS) - if supports_data: - link_edge_fields.add("data") if isinstance(links_fields, dict): simple_fields = set(links_fields) - simple_variant = len(simple_fields - link_edge_fields) == 0 + diff = simple_fields - link_edge_fields + diff.discard("data") + simple_variant = len(diff) == 0 else: simple_variant = True simple_fields = link_edge_fields @@ -137,11 +134,7 @@ def product_types_query(fields): return query -def folders_graphql_query( - fields: set[str], - *, - links_support_data: bool = False, -) -> GraphQlQuery: +def folders_graphql_query(fields: set[str]) -> GraphQlQuery: query = GraphQlQuery("FoldersQuery") project_name_var = query.add_variable("projectName", "String!") folder_ids_var = query.add_variable("folderIds", "[String!]") @@ -181,11 +174,8 @@ def folders_graphql_query( folders_field.set_filter("filter", filter_var) nested_fields = fields_to_dict(fields) - add_links_fields( - folders_field, - nested_fields, - supports_data=links_support_data, - ) + + add_links_fields(folders_field, nested_fields) query_queue = collections.deque() for key, value in nested_fields.items(): @@ -203,11 +193,7 @@ def folders_graphql_query( return query -def tasks_graphql_query( - fields: set[str], - *, - links_support_data: bool = False, -) -> GraphQlQuery: +def tasks_graphql_query(fields: set[str]) -> GraphQlQuery: query = GraphQlQuery("TasksQuery") project_name_var = query.add_variable("projectName", "String!") task_ids_var = query.add_variable("taskIds", "[String!]") @@ -237,11 +223,7 @@ def tasks_graphql_query( tasks_field.set_filter("filter", filter_var) nested_fields = fields_to_dict(fields) - add_links_fields( - tasks_field, - nested_fields, - supports_data=links_support_data, - ) + add_links_fields(tasks_field, nested_fields) query_queue = collections.deque() for key, value in nested_fields.items(): @@ -259,11 +241,7 @@ def tasks_graphql_query( return query -def tasks_by_folder_paths_graphql_query( - fields: set[str], - *, - links_support_data: bool = False, -) -> GraphQlQuery: +def tasks_by_folder_paths_graphql_query(fields: set[str]) -> GraphQlQuery: query = GraphQlQuery("TasksByFolderPathQuery") project_name_var = query.add_variable("projectName", "String!") task_names_var = query.add_variable("taskNames", "[String!]") @@ -294,11 +272,8 @@ def tasks_by_folder_paths_graphql_query( tasks_field.set_filter("filter", filter_var) nested_fields = fields_to_dict(fields) - add_links_fields( - tasks_field, - nested_fields, - supports_data=links_support_data, - ) + + add_links_fields(tasks_field, nested_fields) query_queue = collections.deque() for key, value in nested_fields.items(): @@ -316,11 +291,7 @@ def tasks_by_folder_paths_graphql_query( return query -def products_graphql_query( - fields: set[str], - *, - links_support_data: bool = False, -) -> GraphQlQuery: +def products_graphql_query(fields: set[str]) -> GraphQlQuery: query = GraphQlQuery("ProductsQuery") project_name_var = query.add_variable("projectName", "String!") @@ -352,11 +323,7 @@ def products_graphql_query( products_field.set_filter("filter", filter_var) nested_fields = fields_to_dict(set(fields)) - add_links_fields( - products_field, - nested_fields, - supports_data=links_support_data, - ) + add_links_fields(products_field, nested_fields) query_queue = collections.deque() for key, value in nested_fields.items(): @@ -374,11 +341,7 @@ def products_graphql_query( return query -def versions_graphql_query( - fields: set[str], - *, - links_support_data: bool = False, -) -> GraphQlQuery: +def versions_graphql_query(fields: set[str]) -> GraphQlQuery: query = GraphQlQuery("VersionsQuery") project_name_var = query.add_variable("projectName", "String!") @@ -411,11 +374,7 @@ def versions_graphql_query( versions_field.set_filter("filter", filter_var) nested_fields = fields_to_dict(set(fields)) - add_links_fields( - versions_field, - nested_fields, - supports_data=links_support_data, - ) + add_links_fields(versions_field, nested_fields) query_queue = collections.deque() for key, value in nested_fields.items(): @@ -433,11 +392,7 @@ def versions_graphql_query( return query -def representations_graphql_query( - fields: set[str], - *, - links_support_data: bool = False, -) -> GraphQlQuery: +def representations_graphql_query(fields: set[str]) -> GraphQlQuery: query = GraphQlQuery("RepresentationsQuery") project_name_var = query.add_variable("projectName", "String!") @@ -468,11 +423,7 @@ def representations_graphql_query( repres_field.set_filter("filter", filter_var) nested_fields = fields_to_dict(set(fields)) - add_links_fields( - repres_field, - nested_fields, - supports_data=links_support_data, - ) + add_links_fields(repres_field, nested_fields) query_queue = collections.deque() for key, value in nested_fields.items(): @@ -589,11 +540,7 @@ def representations_hierarchy_qraphql_query( return query -def workfiles_info_graphql_query( - fields: set[str], - *, - links_support_data: bool = False, -) -> GraphQlQuery: +def workfiles_info_graphql_query(fields: set[str]) -> GraphQlQuery: query = GraphQlQuery("WorkfilesInfo") project_name_var = query.add_variable("projectName", "String!") workfiles_info_ids = query.add_variable("workfileIds", "[String!]") @@ -617,11 +564,7 @@ def workfiles_info_graphql_query( workfiles_field.set_filter("tags", tags_var) nested_fields = fields_to_dict(set(fields)) - add_links_fields( - workfiles_field, - nested_fields, - supports_data=links_support_data, - ) + add_links_fields(workfiles_field, nested_fields) query_queue = collections.deque() for key, value in nested_fields.items(): From 4e9bf62929c36842e6454d4eeb535aff835f9b97 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 18 Mar 2026 16:45:14 +0100 Subject: [PATCH 08/10] remove f string --- ayon_api/server_api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ayon_api/server_api.py b/ayon_api/server_api.py index db5f49b1f..ab3a3d1f0 100644 --- a/ayon_api/server_api.py +++ b/ayon_api/server_api.py @@ -2465,7 +2465,7 @@ def _prepare_link_fields(self, fields: set[str]) -> None: fields.add(f"links.{field}") if self.links_graphql_support_data(): - fields.add(f"links.data") + fields.add("links.data") def _prepare_advanced_filters( self, filters: Union[str, dict[str, Any], None] From 4b9eda40c94bd90c463d9fe57e18c20289299b95 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 18 Mar 2026 16:48:03 +0100 Subject: [PATCH 09/10] remove forgotten 'links_support_data' --- ayon_api/_api_helpers/links.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/ayon_api/_api_helpers/links.py b/ayon_api/_api_helpers/links.py index de47107b5..dc73f7890 100644 --- a/ayon_api/_api_helpers/links.py +++ b/ayon_api/_api_helpers/links.py @@ -362,10 +362,7 @@ def get_entities_links( return output link_fields = {"id", "links"} - query = query_func( - link_fields, - links_support_data=self.links_graphql_support_data(), - ) + query = query_func(link_fields) for attr, filter_value in filters.items(): query.set_variable_value(attr, filter_value) From 0b11ca8e72585e2c78f4b2b62d4f8d63bcdd580f Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 18 Mar 2026 16:50:23 +0100 Subject: [PATCH 10/10] fix get_entities_links --- ayon_api/_api_helpers/links.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ayon_api/_api_helpers/links.py b/ayon_api/_api_helpers/links.py index dc73f7890..b2b8d0973 100644 --- a/ayon_api/_api_helpers/links.py +++ b/ayon_api/_api_helpers/links.py @@ -362,6 +362,7 @@ def get_entities_links( return output link_fields = {"id", "links"} + self._prepare_link_fields(link_fields) query = query_func(link_fields) for attr, filter_value in filters.items(): query.set_variable_value(attr, filter_value)