1717 RegisteredSolverFunction ,
1818)
1919from models_library .products import ProductName
20- from models_library .projects import ProjectID
2120from models_library .rest_pagination import Page
2221from models_library .rest_pagination_utils import paginate_data
23- from models_library .services_types import ServiceKey , ServiceVersion
2422from models_library .users import UserID
2523from pydantic import TypeAdapter
2624from servicelib .aiohttp import status
@@ -70,57 +68,49 @@ async def _build_function_access_rights(
7068 )
7169
7270
73- async def _build_project_function_extras_dict (
74- app : web .Application ,
75- * ,
76- user_id : UserID ,
77- function : RegisteredProjectFunction ,
71+ def _build_project_function_extras_dict (
72+ project : ProjectDBGet ,
7873) -> dict [str , Any ]:
79- project_dict = await _projects_service .get_project_for_user (
80- app = app ,
81- project_uuid = f"{ function .project_id } " ,
82- user_id = user_id ,
83- )
84-
8574 extras : dict [str , Any ] = {}
86- if thumbnail := project_dict [ " thumbnail" ] :
75+ if thumbnail := project . thumbnail :
8776 extras ["thumbnail" ] = thumbnail
8877 return extras
8978
9079
91- async def _build_solver_function_extras_dict (
92- app : web .Application ,
93- * ,
94- function : RegisteredSolverFunction ,
80+ def _build_solver_function_extras_dict (
81+ service_metadata : ServiceMetadata ,
9582) -> dict [str , Any ]:
96- services_metadata = await _services_metadata_proxy .get_service_metadata (
97- app ,
98- key = function .solver_key ,
99- version = function .solver_version ,
100- )
83+
10184 extras : dict [str , Any ] = {}
102- if thumbnail := services_metadata .thumbnail :
85+ if thumbnail := service_metadata .thumbnail :
10386 extras ["thumbnail" ] = thumbnail
10487 return extras
10588
10689
10790async def _build_function_extras (
108- app : web .Application , user_id : UserID , * , function : RegisteredFunction
91+ app : web .Application , * , function : RegisteredFunction
10992) -> dict [str , Any ]:
11093 extras : dict [str , Any ] = {}
11194 match function .function_class :
11295 case FunctionClass .PROJECT :
11396 assert isinstance (function , RegisteredProjectFunction )
114- extras |= await _build_project_function_extras_dict (
115- function = function ,
97+ projects = await _projects_service .batch_get_projects (
11698 app = app ,
117- user_id = user_id ,
99+ project_uuids = [ function . project_id ] ,
118100 )
101+ if project := projects .get (function .project_id ):
102+ extras |= _build_project_function_extras_dict (
103+ project = project ,
104+ )
119105 case FunctionClass .SOLVER :
120106 assert isinstance (function , RegisteredSolverFunction )
121- extras | = await _build_solver_function_extras_dict (
107+ services_metadata = await _services_metadata_proxy . get_service_metadata (
122108 app ,
123- function = function ,
109+ key = function .solver_key ,
110+ version = function .solver_version ,
111+ )
112+ extras |= _build_solver_function_extras_dict (
113+ service_metadata = services_metadata ,
124114 )
125115 return extras
126116
@@ -178,10 +168,7 @@ async def list_functions(request: web.Request) -> web.Response:
178168
179169 chunk : list [RegisteredFunctionGet ] = []
180170
181- projects_cache : dict [ProjectID , ProjectDBGet ] = {}
182- service_metadata_cache : dict [tuple [ServiceKey , ServiceVersion ], ServiceMetadata ] = (
183- {}
184- )
171+ extras_map : dict [FunctionID , dict [str , Any ]] = {}
185172
186173 if query_params .include_extras :
187174 if any (
@@ -192,10 +179,19 @@ async def list_functions(request: web.Request) -> web.Response:
192179 for function in functions
193180 if function .function_class == FunctionClass .PROJECT
194181 ]
195- projects_cache | = await _projects_service .batch_get_projects (
182+ projects_cache = await _projects_service .batch_get_projects (
196183 request .app ,
197184 project_uuids = project_uuids ,
198185 )
186+ for function in functions :
187+ if function .function_class == FunctionClass .PROJECT :
188+ project = projects_cache .get (function .project_id )
189+ if not project :
190+ continue
191+ extras_map [function .uid ] = _build_project_function_extras_dict (
192+ project = project
193+ )
194+
199195 if any (
200196 function .function_class == FunctionClass .SOLVER for function in functions
201197 ):
@@ -204,11 +200,21 @@ async def list_functions(request: web.Request) -> web.Response:
204200 for function in functions
205201 if function .function_class == FunctionClass .SOLVER
206202 }
207- service_metadata_cache | = (
203+ service_metadata_cache = (
208204 await _services_metadata_proxy .batch_get_service_metadata (
209205 app = request .app , keys_and_versions = service_keys_and_versions
210206 )
211207 )
208+ for function in functions :
209+ if function .function_class == FunctionClass .SOLVER :
210+ service_metadata = service_metadata_cache .get (
211+ (function .solver_key , function .solver_version )
212+ )
213+ if not service_metadata :
214+ continue
215+ extras_map [function .uid ] = _build_solver_function_extras_dict (
216+ service_metadata = service_metadata
217+ )
212218
213219 for function in functions :
214220 access_rights = await _build_function_access_rights (
@@ -218,13 +224,7 @@ async def list_functions(request: web.Request) -> web.Response:
218224 function_id = function .uid ,
219225 )
220226
221- extras = (
222- await _build_function_extras (
223- request .app , req_ctx .user_id , function = function
224- )
225- if query_params .include_extras
226- else {}
227- )
227+ extras = extras_map .get (function .uid , {})
228228
229229 chunk .append (
230230 TypeAdapter (RegisteredFunctionGet ).validate_python (
@@ -275,7 +275,7 @@ async def get_function(request: web.Request) -> web.Response:
275275 )
276276
277277 extras = (
278- await _build_function_extras (request .app , req_ctx . user_id , function = function )
278+ await _build_function_extras (request .app , function = function )
279279 if query_params .include_extras
280280 else {}
281281 )
@@ -323,7 +323,7 @@ async def update_function(request: web.Request) -> web.Response:
323323 )
324324
325325 extras = (
326- await _build_function_extras (request .app , req_ctx . user_id , function = function )
326+ await _build_function_extras (request .app , function = function )
327327 if query_params .include_extras
328328 else {}
329329 )
0 commit comments