From c94b0e76dceba52712d423e714719d4f5e96629b Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 19 Mar 2026 15:53:43 +0100 Subject: [PATCH 1/4] actually filter graphql project by name --- ayon_api/_api_helpers/projects.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ayon_api/_api_helpers/projects.py b/ayon_api/_api_helpers/projects.py index a909100cf..97c61ec99 100644 --- a/ayon_api/_api_helpers/projects.py +++ b/ayon_api/_api_helpers/projects.py @@ -332,6 +332,7 @@ def get_project( graphql_project = next(self._get_graphql_projects( None, None, + project_name=project_name, fields=graphql_fields, own_attributes=own_attributes, ), None) From 25fd6033a426f80a327926623c9e8777a8893e15 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 19 Mar 2026 15:57:41 +0100 Subject: [PATCH 2/4] better merge of rest and graphql project data --- ayon_api/_api_helpers/projects.py | 45 ++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/ayon_api/_api_helpers/projects.py b/ayon_api/_api_helpers/projects.py index 97c61ec99..cc21a43ff 100644 --- a/ayon_api/_api_helpers/projects.py +++ b/ayon_api/_api_helpers/projects.py @@ -291,16 +291,14 @@ def get_projects( return projects_by_name = {p["name"]: p for p in projects} - for project in self.get_rest_projects(active, library): + for project in self.get_rest_projects(active=active, library=library): + if own_attributes: + fill_own_attribs(project) + name = project["name"] - graphql_p = projects_by_name.get(name) - if graphql_p: - for key in ( - "productTypes", - "usedTags", - ): - if key in graphql_p: - project[key] = graphql_p[key] + graphql_project = projects_by_name.get(name) + self._merge_project_graphql_data(project, graphql_project) + yield project def get_project( @@ -342,13 +340,9 @@ def get_project( project = self.get_rest_project(project_name) if own_attributes: fill_own_attribs(project) - if graphql_project: - for key in ( - "productTypes", - "usedTags", - ): - if key in graphql_project: - project[key] = graphql_project[key] + + self._merge_project_graphql_data(project, graphql_project) + return project def create_project( @@ -818,6 +812,25 @@ def _get_graphql_projects( self._fill_project_entity_data(project) yield project + def _merge_project_graphql_data( + self, + rest_project: dict[str, Any], + graphql_project: Optional[dict[str, Any]], + ) -> None: + if not graphql_project: + return + + for key, value in graphql_project.items(): + if ( + key not in rest_project + or key in ( + "productBaseTypes", + "productTypes", + "usedTags", + ) + ): + rest_project[key] = value + def _get_project_roots_values( self, project_name: str, From 405bf0cf90cbd131e41a05269c9e5de8739c63f9 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 20 Mar 2026 08:53:31 +0100 Subject: [PATCH 3/4] make sure all attributes are filled --- ayon_api/_api_helpers/projects.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ayon_api/_api_helpers/projects.py b/ayon_api/_api_helpers/projects.py index cc21a43ff..65513d7d7 100644 --- a/ayon_api/_api_helpers/projects.py +++ b/ayon_api/_api_helpers/projects.py @@ -162,6 +162,9 @@ def get_rest_project( if response.status != 200: return None project = response.data + attrib = project["attrib"] + for attr_name in self.get_attributes_for_type("project"): + attrib.setdefault(attr_name, None) self._fill_project_entity_data(project) return project From 9c4d08c9fd087db1f96c54b16338e14ccafe15f4 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 20 Mar 2026 08:53:40 +0100 Subject: [PATCH 4/4] define method in base --- ayon_api/_api_helpers/base.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ayon_api/_api_helpers/base.py b/ayon_api/_api_helpers/base.py index 8ef198c68..cca8aa8e3 100644 --- a/ayon_api/_api_helpers/base.py +++ b/ayon_api/_api_helpers/base.py @@ -132,6 +132,11 @@ def get_user( ) -> Optional[dict[str, Any]]: raise NotImplementedError() + def get_attributes_for_type( + self, entity_type: AttributeScope + ) -> set[str]: + raise NotImplementedError() + def get_attributes_fields_for_type( self, entity_type: AttributeScope ) -> set[str]: