11import logging
22from collections .abc import Callable
33from typing import Annotated
4- from uuid import UUID
54
65from fastapi import APIRouter , Depends , Header , Query , Request , status
76from fastapi .encoders import jsonable_encoder
87from fastapi .responses import JSONResponse
98from fastapi_pagination .api import create_page
10- from models_library .api_schemas_webserver .projects import ProjectPatch
11- from models_library .api_schemas_webserver .projects_nodes import NodeOutputs
129from models_library .clusters import ClusterID
13- from models_library .function_services_catalog .services import file_picker
1410from models_library .projects import ProjectID
15- from models_library .projects_nodes import InputID , InputTypes
1611from models_library .projects_nodes_io import NodeID
1712from pydantic import HttpUrl , PositiveInt
1813from servicelib .logging_utils import log_context
4237from ...services_http .solver_job_models_converters import create_jobstatus_from_task
4338from ...services_http .storage import StorageApi
4439from ...services_http .study_job_models_converters import (
45- create_job_from_study ,
4640 create_job_outputs_from_project_outputs ,
47- get_project_and_file_inputs_from_job_inputs ,
4841)
4942from ...services_http .webserver import AuthSession
50- from ...services_rpc .wb_api_server import WbApiRpcClient
5143from ..dependencies .application import get_reverse_url_mapper
52- from ..dependencies .authentication import get_current_user_id , get_product_name
44+ from ..dependencies .authentication import get_current_user_id
5345from ..dependencies .services import get_api_client , get_job_service
5446from ..dependencies .webserver_http import get_webserver_session
55- from ..dependencies .webserver_rpc import get_wb_api_rpc_client
5647from ._constants import (
5748 FMSG_CHANGELOG_CHANGED_IN_VERSION ,
5849 FMSG_CHANGELOG_NEW_IN_VERSION ,
@@ -121,27 +112,24 @@ async def list_study_jobs(
121112async def create_study_job (
122113 study_id : StudyID ,
123114 job_inputs : JobInputs ,
124- webserver_api : Annotated [AuthSession , Depends (get_webserver_session )],
125- wb_api_rpc : Annotated [WbApiRpcClient , Depends (get_wb_api_rpc_client )],
126115 url_for : Annotated [Callable , Depends (get_reverse_url_mapper )],
127- user_id : Annotated [PositiveInt , Depends (get_current_user_id )],
128- product_name : Annotated [str , Depends (get_product_name )],
116+ job_service : Annotated [JobService , Depends (get_job_service )],
129117 hidden : Annotated [bool , Query ()] = True , # noqa: FBT002
130118 x_simcore_parent_project_uuid : Annotated [ProjectID | None , Header ()] = None ,
131119 x_simcore_parent_node_id : Annotated [NodeID | None , Header ()] = None ,
132120) -> Job :
133121 """
134122 hidden -- if True (default) hides project from UI
135123 """
136- project = await webserver_api .clone_project (
137- project_id = study_id ,
124+
125+ job = await job_service .create_studies_job (
126+ study_id = study_id ,
127+ job_inputs = job_inputs ,
128+ x_simcore_parent_project_uuid = x_simcore_parent_project_uuid ,
129+ x_simcore_parent_node_id = x_simcore_parent_node_id ,
138130 hidden = hidden ,
139- parent_project_uuid = x_simcore_parent_project_uuid ,
140- parent_node_id = x_simcore_parent_node_id ,
141- )
142- job = create_job_from_study (
143- study_key = study_id , project = project , job_inputs = job_inputs
144131 )
132+ assert job .name == _compose_job_resource_name (study_id , job .id )
145133 job .url = url_for (
146134 "get_study_job" ,
147135 study_id = study_id ,
@@ -153,54 +141,6 @@ async def create_study_job(
153141 study_id = study_id ,
154142 job_id = job .id ,
155143 )
156-
157- await webserver_api .patch_project (
158- project_id = job .id ,
159- patch_params = ProjectPatch (name = job .name ),
160- )
161-
162- await wb_api_rpc .mark_project_as_job (
163- product_name = product_name ,
164- user_id = user_id ,
165- project_uuid = job .id ,
166- job_parent_resource_name = job .runner_name ,
167- storage_assets_deleted = False ,
168- )
169-
170- project_inputs = await webserver_api .get_project_inputs (project_id = project .uuid )
171-
172- file_param_nodes = {}
173- for node_id , node in project .workbench .items ():
174- if (
175- node .key == file_picker .META .key
176- and node .outputs is not None
177- and len (node .outputs ) == 0
178- ):
179- file_param_nodes [node .label ] = node_id
180-
181- file_inputs : dict [InputID , InputTypes ] = {}
182-
183- (
184- new_project_inputs ,
185- new_project_file_inputs ,
186- ) = get_project_and_file_inputs_from_job_inputs (
187- project_inputs , file_inputs , job_inputs
188- )
189-
190- for node_label , file_link in new_project_file_inputs .items ():
191- await webserver_api .update_node_outputs (
192- project_id = project .uuid ,
193- node_id = UUID (file_param_nodes [node_label ]),
194- new_node_outputs = NodeOutputs (outputs = {"outFile" : file_link }),
195- )
196-
197- if len (new_project_inputs ) > 0 :
198- await webserver_api .update_project_inputs (
199- project_id = project .uuid , new_inputs = new_project_inputs
200- )
201-
202- assert job .name == _compose_job_resource_name (study_id , job .id )
203-
204144 return job
205145
206146
0 commit comments