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_study_service
5446from ..dependencies .webserver_http import AuthSession , get_webserver_session
55- from ..dependencies .webserver_rpc import (
56- get_wb_api_rpc_client ,
57- )
5847from ._constants import (
5948 FMSG_CHANGELOG_CHANGED_IN_VERSION ,
6049 FMSG_CHANGELOG_NEW_IN_VERSION ,
@@ -98,9 +87,6 @@ async def list_study_jobs(
9887 study_service : Annotated [StudyService , Depends (get_study_service )],
9988 url_for : Annotated [Callable , Depends (get_reverse_url_mapper )],
10089):
101- msg = f"list study jobs study_id={ study_id !r} with pagination={ page_params !r} . SEE https://github.com/ITISFoundation/osparc-simcore/issues/4177"
102- _logger .debug (msg )
103-
10490 jobs , meta = await study_service .list_jobs (
10591 filter_by_study_id = study_id ,
10692 pagination_offset = page_params .offset ,
@@ -128,27 +114,24 @@ async def list_study_jobs(
128114async def create_study_job (
129115 study_id : StudyID ,
130116 job_inputs : JobInputs ,
131- webserver_api : Annotated [AuthSession , Depends (get_webserver_session )],
132- wb_api_rpc : Annotated [WbApiRpcClient , Depends (get_wb_api_rpc_client )],
117+ study_service : Annotated [StudyService , Depends (get_study_service )],
133118 url_for : Annotated [Callable , Depends (get_reverse_url_mapper )],
134- user_id : Annotated [PositiveInt , Depends ( get_current_user_id )],
135- product_name : Annotated [ str , Depends ( get_product_name )],
136- hidden : Annotated [ bool , Query () ] = True , # noqa: FBT002
119+ hidden : Annotated [
120+ bool , Query ( description = "If True (default) hides project from UI" )
121+ ] = True , # noqa: FBT002
137122 x_simcore_parent_project_uuid : ProjectID | None = Header (default = None ),
138123 x_simcore_parent_node_id : NodeID | None = Header (default = None ),
139124) -> Job :
140- """
141- hidden -- if True (default) hides project from UI
142- """
143- project = await webserver_api .clone_project (
144- project_id = study_id ,
125+
126+ job = await study_service .create_job (
127+ study_id = study_id ,
128+ job_inputs = job_inputs ,
145129 hidden = hidden ,
146130 parent_project_uuid = x_simcore_parent_project_uuid ,
147131 parent_node_id = x_simcore_parent_node_id ,
148132 )
149- job = create_job_from_study (
150- study_key = study_id , project = project , job_inputs = job_inputs
151- )
133+
134+ # Set URLs in the controller
152135 job .url = url_for (
153136 "get_study_job" ,
154137 study_id = study_id ,
@@ -161,50 +144,6 @@ async def create_study_job(
161144 job_id = job .id ,
162145 )
163146
164- await webserver_api .patch_project (
165- project_id = job .id ,
166- patch_params = ProjectPatch (name = job .name ), # type: ignore[arg-type]
167- )
168-
169- await wb_api_rpc .mark_project_as_job (
170- product_name = product_name ,
171- user_id = user_id ,
172- project_uuid = job .id ,
173- job_parent_resource_name = job .runner_name ,
174- )
175-
176- project_inputs = await webserver_api .get_project_inputs (project_id = project .uuid )
177-
178- file_param_nodes = {}
179- for node_id , node in project .workbench .items ():
180- if (
181- node .key == file_picker .META .key
182- and node .outputs is not None
183- and len (node .outputs ) == 0
184- ):
185- file_param_nodes [node .label ] = node_id
186-
187- file_inputs : dict [InputID , InputTypes ] = {}
188-
189- (
190- new_project_inputs ,
191- new_project_file_inputs ,
192- ) = get_project_and_file_inputs_from_job_inputs (
193- project_inputs , file_inputs , job_inputs
194- )
195-
196- for node_label , file_link in new_project_file_inputs .items ():
197- await webserver_api .update_node_outputs (
198- project_id = project .uuid ,
199- node_id = UUID (file_param_nodes [node_label ]),
200- new_node_outputs = NodeOutputs (outputs = {"outFile" : file_link }),
201- )
202-
203- if len (new_project_inputs ) > 0 :
204- await webserver_api .update_project_inputs (
205- project_id = project .uuid , new_inputs = new_project_inputs
206- )
207-
208147 assert job .name == _compose_job_resource_name (study_id , job .id )
209148
210149 return job
0 commit comments