From 490fba8cad23220f98491a2f904cdd29ce3f09c8 Mon Sep 17 00:00:00 2001 From: matusdrobuliak66 Date: Wed, 3 May 2023 05:11:58 +0200 Subject: [PATCH 1/7] mypy studies_dispatcher plugin --- .../studies_dispatcher/_core.py | 13 ++++++------ .../studies_dispatcher/_models.py | 4 +++- .../studies_dispatcher/_projects.py | 6 +++--- .../studies_dispatcher/_studies_access.py | 2 +- .../studies_dispatcher/handlers_redirects.py | 21 ++++++++----------- .../studies_dispatcher/settings.py | 2 +- 6 files changed, 23 insertions(+), 25 deletions(-) diff --git a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_core.py b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_core.py index 6c9046a4ad61..53e38714e3e8 100644 --- a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_core.py +++ b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_core.py @@ -2,7 +2,6 @@ import uuid from collections import deque from functools import lru_cache -from typing import Optional from aiohttp import web from pydantic import ValidationError @@ -29,13 +28,13 @@ def compose_uuid_from(*values) -> uuid.UUID: async def list_viewers_info( - app: web.Application, file_type: Optional[str] = None, *, only_default: bool = False + app: web.Application, file_type: str | None = None, *, only_default: bool = False ) -> list[ViewerInfo]: # # TODO: These services MUST be shared with EVERYBODY! Setup check on startup and fill # with !? # - consumers = deque() + consumers: deque = deque() async with app[APP_DB_ENGINE_KEY].acquire() as conn: @@ -71,7 +70,7 @@ async def list_viewers_info( async def get_default_viewer( app: web.Application, file_type: str, - file_size: Optional[int] = None, + file_size: int | None = None, ) -> ViewerInfo: try: viewers = await list_viewers_info(app, file_type, only_default=True) @@ -93,9 +92,9 @@ async def get_default_viewer( async def validate_requested_viewer( app: web.Application, file_type: str, - file_size: Optional[int] = None, - service_key: Optional[str] = None, - service_version: Optional[str] = None, + file_size: int | None = None, + service_key: str | None = None, + service_version: str | None = None, ) -> ViewerInfo: if not service_key and not service_version: diff --git a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_models.py b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_models.py index 71bd27be23f1..9cb8039690b4 100644 --- a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_models.py +++ b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_models.py @@ -18,7 +18,9 @@ class ServiceInfo(BaseModel): label: str = Field(..., description="Display name") - thumbnail: HttpUrl = Field(default="https://via.placeholder.com/170x120.png") + thumbnail: HttpUrl = Field( + default=HttpUrl("https://via.placeholder.com/170x120.png") + ) is_guest_allowed: bool = True diff --git a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_projects.py b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_projects.py index a8fd05cc9ce9..b81d5ed7f175 100644 --- a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_projects.py +++ b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_projects.py @@ -87,7 +87,7 @@ def _create_project( name=name, description=description, thumbnail=thumbnail, - prjOwner=owner.email, # type: ignore + prjOwner=owner.email, accessRights={owner.primary_gid: access_rights}, creationDate=now_str(), lastChangeDate=now_str(), @@ -161,11 +161,11 @@ def _create_project_with_filepicker_and_service( description=f"Autogenerated study with file-picker and service {viewer_info.footprint}", thumbnail=viewer_info.thumbnail, owner=owner, - workbench={ # type: ignore + workbench={ f"{file_picker_id}": file_picker, f"{viewer_id}": viewer_service, }, - workbench_ui={ # type: ignore + workbench_ui={ f"{file_picker_id}": {"position": {"x": 305, "y": 229}}, f"{viewer_id}": {"position": {"x": 633, "y": 229}}, }, diff --git a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_studies_access.py b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_studies_access.py index ff39bd72c8cf..c809f85551d7 100644 --- a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_studies_access.py +++ b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_studies_access.py @@ -189,7 +189,7 @@ async def get_authorized_user(request: web.Request) -> dict: db: AsyncpgStorage = get_plugin_storage(request.app) userid = await authorized_userid(request) - user = await db.get_user({"id": userid}) + user: dict = await db.get_user({"id": userid}) return user diff --git a/services/web/server/src/simcore_service_webserver/studies_dispatcher/handlers_redirects.py b/services/web/server/src/simcore_service_webserver/studies_dispatcher/handlers_redirects.py index 92b764f1d1a8..a25dac247d7c 100644 --- a/services/web/server/src/simcore_service_webserver/studies_dispatcher/handlers_redirects.py +++ b/services/web/server/src/simcore_service_webserver/studies_dispatcher/handlers_redirects.py @@ -19,8 +19,9 @@ from ..utils_aiohttp import create_redirect_response from ._catalog import validate_requested_service from ._constants import MSG_UNEXPECTED_ERROR -from ._core import StudyDispatcherError, ViewerInfo, validate_requested_viewer -from ._models import ServiceInfo +from ._core import validate_requested_viewer +from ._exceptions import StudyDispatcherError +from ._models import ServiceInfo, ViewerInfo from ._projects import acquire_project_with_service, acquire_project_with_viewer from ._users import UserInfo, acquire_user, ensure_authentication @@ -117,7 +118,7 @@ def compose_service_dispatcher_prefix_url( request: web.Request, service_key: str, service_version: str ) -> HttpUrl: params = ViewerQueryParams( - viewer_key=service_key, viewer_version=service_version # type: ignore + viewer_key=service_key, viewer_version=service_version ).dict(exclude_none=True, exclude_unset=True) absolute_url = request.url.join( request.app.router["get_redirection_to_viewer"].url_for().with_query(**params) @@ -188,7 +189,7 @@ async def get_redirection_to_viewer(request: web.Request): params = parse_request_query_parameters_as(RedirectionQueryParams, request) logger.debug("Requesting viewer %s", params) - + user: UserInfo if params.file_type and params.download_link: # TODO: Cannot check file_size from HEAD # removed await params.check_download_link() @@ -203,9 +204,7 @@ async def get_redirection_to_viewer(request: web.Request): logger.debug("Validated viewer %s", viewer) # Retrieve user or create a temporary guest - user: UserInfo = await acquire_user( - request, is_guest_allowed=viewer.is_guest_allowed - ) + user = await acquire_user(request, is_guest_allowed=viewer.is_guest_allowed) logger.debug("User acquired %s", user) # Generate one project per user + download_link + viewer @@ -242,17 +241,15 @@ async def get_redirection_to_viewer(request: web.Request): logger.debug("Validated service %s", valid_service) # Retrieve user or create a temporary guest - user: UserInfo = await acquire_user( - request, is_guest_allowed=valid_service.is_public - ) + user = await acquire_user(request, is_guest_allowed=valid_service.is_public) logger.debug("User acquired %s", user) project_id, viewer_id = await acquire_project_with_service( request.app, user, service_info=ServiceInfo( - key=valid_service.key, # type: ignore - version=valid_service.version, # type: ignore + key=valid_service.key, + version=valid_service.version, label=valid_service.title, ), product_name=get_product_name(request), diff --git a/services/web/server/src/simcore_service_webserver/studies_dispatcher/settings.py b/services/web/server/src/simcore_service_webserver/studies_dispatcher/settings.py index 037a555da9ac..4c041096f52a 100644 --- a/services/web/server/src/simcore_service_webserver/studies_dispatcher/settings.py +++ b/services/web/server/src/simcore_service_webserver/studies_dispatcher/settings.py @@ -21,7 +21,7 @@ class StudiesDispatcherSettings(BaseCustomSettings): ) STUDIES_DEFAULT_SERVICE_THUMBNAIL: HttpUrl = Field( - default="https://via.placeholder.com/170x120.png", + default=HttpUrl("https://via.placeholder.com/170x120.png"), description="Default servcie thumbnails in the service response", ) From 0fb918994b40a15fc6a3973f23d124b0489ea95c Mon Sep 17 00:00:00 2001 From: matusdrobuliak66 Date: Wed, 3 May 2023 08:37:47 +0200 Subject: [PATCH 2/7] casting HttpUrl in default Field --- .../simcore_service_webserver/studies_dispatcher/_models.py | 3 ++- .../simcore_service_webserver/studies_dispatcher/settings.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_models.py b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_models.py index 9cb8039690b4..06e9665d56f7 100644 --- a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_models.py +++ b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_models.py @@ -1,5 +1,6 @@ import logging import uuid +from typing import cast from aiopg.sa.result import RowProxy from models_library.services import ServiceKey, ServiceVersion @@ -19,7 +20,7 @@ class ServiceInfo(BaseModel): label: str = Field(..., description="Display name") thumbnail: HttpUrl = Field( - default=HttpUrl("https://via.placeholder.com/170x120.png") + default=cast(HttpUrl, "https://via.placeholder.com/170x120.png") ) is_guest_allowed: bool = True diff --git a/services/web/server/src/simcore_service_webserver/studies_dispatcher/settings.py b/services/web/server/src/simcore_service_webserver/studies_dispatcher/settings.py index 4c041096f52a..b63534281774 100644 --- a/services/web/server/src/simcore_service_webserver/studies_dispatcher/settings.py +++ b/services/web/server/src/simcore_service_webserver/studies_dispatcher/settings.py @@ -1,4 +1,5 @@ from datetime import timedelta +from typing import cast from aiohttp import web from pydantic import HttpUrl, validator @@ -21,7 +22,7 @@ class StudiesDispatcherSettings(BaseCustomSettings): ) STUDIES_DEFAULT_SERVICE_THUMBNAIL: HttpUrl = Field( - default=HttpUrl("https://via.placeholder.com/170x120.png"), + default=cast(HttpUrl, "https://via.placeholder.com/170x120.png"), description="Default servcie thumbnails in the service response", ) From 3b587f2ed7fa9f86201a6d0001778d8536459315 Mon Sep 17 00:00:00 2001 From: matusdrobuliak66 Date: Wed, 3 May 2023 13:50:41 +0200 Subject: [PATCH 3/7] using parse_obj_as instead of cast --- .../simcore_service_webserver/studies_dispatcher/settings.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/services/web/server/src/simcore_service_webserver/studies_dispatcher/settings.py b/services/web/server/src/simcore_service_webserver/studies_dispatcher/settings.py index b63534281774..05a8be538070 100644 --- a/services/web/server/src/simcore_service_webserver/studies_dispatcher/settings.py +++ b/services/web/server/src/simcore_service_webserver/studies_dispatcher/settings.py @@ -1,8 +1,7 @@ from datetime import timedelta -from typing import cast from aiohttp import web -from pydantic import HttpUrl, validator +from pydantic import HttpUrl, parse_obj_as, validator from pydantic.fields import Field from servicelib.aiohttp.application_keys import APP_SETTINGS_KEY from settings_library.base import BaseCustomSettings @@ -22,7 +21,7 @@ class StudiesDispatcherSettings(BaseCustomSettings): ) STUDIES_DEFAULT_SERVICE_THUMBNAIL: HttpUrl = Field( - default=cast(HttpUrl, "https://via.placeholder.com/170x120.png"), + default=parse_obj_as(HttpUrl, "https://via.placeholder.com/170x120.png"), description="Default servcie thumbnails in the service response", ) From d2a5ca64ec95d62dcb05387fcfff06706ae52263 Mon Sep 17 00:00:00 2001 From: matusdrobuliak66 Date: Thu, 4 May 2023 08:24:56 +0200 Subject: [PATCH 4/7] using parse_obj_as instead of cast --- .../simcore_service_webserver/studies_dispatcher/_models.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_models.py b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_models.py index 06e9665d56f7..17a4e8d3d495 100644 --- a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_models.py +++ b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_models.py @@ -1,10 +1,9 @@ import logging import uuid -from typing import cast from aiopg.sa.result import RowProxy from models_library.services import ServiceKey, ServiceVersion -from pydantic import BaseModel, Field, HttpUrl +from pydantic import BaseModel, Field, HttpUrl, parse_obj_as MEGABYTES = 1024 * 1024 _BASE_UUID = uuid.UUID("ca2144da-eabb-4daf-a1df-a3682050e25f") @@ -20,7 +19,7 @@ class ServiceInfo(BaseModel): label: str = Field(..., description="Display name") thumbnail: HttpUrl = Field( - default=cast(HttpUrl, "https://via.placeholder.com/170x120.png") + default=parse_obj_as(HttpUrl, "https://via.placeholder.com/170x120.png") ) is_guest_allowed: bool = True From b9dcc39cdffb154c76ebadf2c9d5353c43691492 Mon Sep 17 00:00:00 2001 From: matusdrobuliak66 Date: Thu, 4 May 2023 10:04:42 +0200 Subject: [PATCH 5/7] resolving merge conflict --- .../studies_dispatcher/_models.py | 6 ------ .../studies_dispatcher/settings.py | 15 +++++++++++++-- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_models.py b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_models.py index e8833dc61c32..6534542e9853 100644 --- a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_models.py +++ b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_models.py @@ -2,12 +2,6 @@ from models_library.services import ServiceKey, ServiceVersion from pydantic import BaseModel, Field, HttpUrl, PositiveInt, parse_obj_as -MEGABYTES = 1024 * 1024 -_BASE_UUID = uuid.UUID("ca2144da-eabb-4daf-a1df-a3682050e25f") - - -logger = logging.getLogger(__name__) - class ServiceInfo(BaseModel): key: ServiceKey diff --git a/services/web/server/src/simcore_service_webserver/studies_dispatcher/settings.py b/services/web/server/src/simcore_service_webserver/studies_dispatcher/settings.py index d12ab8f10cbd..32a9eee6d0e7 100644 --- a/services/web/server/src/simcore_service_webserver/studies_dispatcher/settings.py +++ b/services/web/server/src/simcore_service_webserver/studies_dispatcher/settings.py @@ -1,7 +1,7 @@ from datetime import timedelta from aiohttp import web -from pydantic import HttpUrl, parse_obj_as, validator +from pydantic import ByteSize, HttpUrl, parse_obj_as, validator from pydantic.fields import Field from servicelib.aiohttp.application_keys import APP_SETTINGS_KEY from settings_library.base import BaseCustomSettings @@ -22,7 +22,18 @@ class StudiesDispatcherSettings(BaseCustomSettings): STUDIES_DEFAULT_SERVICE_THUMBNAIL: HttpUrl = Field( default=parse_obj_as(HttpUrl, "https://via.placeholder.com/170x120.png"), - description="Default servcie thumbnails in the service response", + description="Default thumbnail for services or dispatch project with a service", + ) + + STUDIES_DEFAULT_FILE_THUMBNAIL: HttpUrl = Field( + default="https://via.placeholder.com/170x120.png", + description="Default thumbnail for dispatch projects with only data (i.e. file-picker)", + ) + + STUDIES_MAX_FILE_SIZE_ALLOWED: ByteSize = Field( + default=parse_obj_as(ByteSize, "50Mib"), + description="Limits the size of the files that can be dispatched" + "Note that the accuracy of the file size is not guaranteed and this limit might be surpassed", ) @validator("STUDIES_GUEST_ACCOUNT_LIFETIME") From dd51c93904b9fe478322ea2d215e6288b6183710 Mon Sep 17 00:00:00 2001 From: matusdrobuliak66 Date: Thu, 4 May 2023 11:42:56 +0200 Subject: [PATCH 6/7] study dispatcher - mypy after conflicts --- .../studies_dispatcher/_projects.py | 18 +++++----- .../studies_dispatcher/_redirects_handlers.py | 35 ++++++++++--------- .../studies_dispatcher/_rest_handlers.py | 8 +++-- .../studies_dispatcher/settings.py | 2 +- 4 files changed, 34 insertions(+), 29 deletions(-) diff --git a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_projects.py b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_projects.py index 17d33c483809..4b9bc9551ce1 100644 --- a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_projects.py +++ b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_projects.py @@ -60,7 +60,7 @@ def _create_file_picker(download_link: str): inputNodes=[], outputs={ # NOTE: Empty label checked with @odeimaiz - output_id: DownloadLink( # type: ignore + output_id: DownloadLink( downloadLink=parse_obj_as(AnyUrl, download_link), label="", ) @@ -90,13 +90,13 @@ def _create_project( uuid=project_id, name=name, description=description, - thumbnail=thumbnail, # type: ignore - prjOwner=owner.email, # type: ignore - accessRights={owner.primary_gid: access_rights}, # type: ignore - creationDate=now_str(), # type: ignore - lastChangeDate=now_str(), # type: ignore - workbench=workbench, # type: ignore - ui=StudyUI(workbench=workbench_ui), # type: ignore + thumbnail=thumbnail, + prjOwner=owner.email, + accessRights={owner.primary_gid: access_rights}, + creationDate=now_str(), + lastChangeDate=now_str(), + workbench=workbench, + ui=StudyUI(workbench=workbench_ui), ) return project @@ -149,7 +149,7 @@ def _create_project_with_filepicker_and_service( version=viewer_info.version, label=viewer_info.label, inputs={ - viewer_info.input_port_key: PortLink( # type: ignore + viewer_info.input_port_key: PortLink( nodeUuid=file_picker_id, output=file_picker_output_id, ) diff --git a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_redirects_handlers.py b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_redirects_handlers.py index d5fac21fde2d..442aa7ecfdab 100644 --- a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_redirects_handlers.py +++ b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_redirects_handlers.py @@ -20,9 +20,9 @@ from ..utils_aiohttp import create_redirect_response from ._catalog import ValidService, validate_requested_service from ._constants import MSG_UNEXPECTED_ERROR -from ._core import ViewerInfo, validate_requested_file, validate_requested_viewer +from ._core import validate_requested_file, validate_requested_viewer from ._errors import InvalidRedirectionParams, StudyDispatcherError -from ._models import FileParams, ServiceInfo, ServiceParams +from ._models import FileParams, ServiceInfo, ServiceParams, ViewerInfo from ._projects import ( get_or_create_project_with_file, get_or_create_project_with_file_and_service, @@ -77,7 +77,7 @@ def _create_service_info_from(service: ValidService) -> ServiceInfo: ) if service.thumbnail: values_map["thumbnail"] = service.thumbnail - return ServiceInfo.construct(_fields_set=set(values_map.keys()), **values_map) + return ServiceInfo.construct(_fields_set=set(values_map.keys()), **values_map) # type: ignore def _handle_errors_with_error_page(handler: Handler): @@ -220,9 +220,12 @@ async def get_redirection_to_viewer(request: web.Request): NOTE: Can be set as login_required programatically with STUDIES_ACCESS_ANONYMOUS_ALLOWED env var. """ - query_params = parse_request_query_parameters_as(RedirectionQueryParams, request) + query_params: RedirectionQueryParams = parse_request_query_parameters_as( + RedirectionQueryParams, request + ) _logger.debug("Requesting viewer %s [%s]", query_params, type(query_params)) + user: UserInfo if isinstance(query_params, ServiceAndFileParams): file_params = service_params = query_params @@ -236,7 +239,7 @@ async def get_redirection_to_viewer(request: web.Request): ) # Retrieve user or create a temporary guest - user: UserInfo = await get_or_create_user( + user = await get_or_create_user( request, is_guest_allowed=viewer.is_guest_allowed ) @@ -258,15 +261,15 @@ async def get_redirection_to_viewer(request: web.Request): ) elif isinstance(query_params, ServiceQueryParams): - service_params = query_params + service_params_ = ServiceQueryParams valid_service: ValidService = await validate_requested_service( app=request.app, - service_key=service_params.viewer_key, - service_version=service_params.viewer_version, + service_key=service_params_.viewer_key, + service_version=service_params_.viewer_version, ) - user: UserInfo = await get_or_create_user( + user = await get_or_create_user( request, is_guest_allowed=valid_service.is_public ) @@ -286,20 +289,20 @@ async def get_redirection_to_viewer(request: web.Request): ) elif isinstance(query_params, FileQueryParams): - file_params = query_params + file_params_ = query_params validate_requested_file( app=request.app, - file_type=file_params.file_type, - file_size=file_params.file_size, + file_type=file_params_.file_type, + file_size=file_params_.file_size, ) - user: UserInfo = await get_or_create_user(request, is_guest_allowed=True) + user = await get_or_create_user(request, is_guest_allowed=True) project_id, file_picker_id = await get_or_create_project_with_file( request.app, user, - file_params=file_params, + file_params=file_params_, project_thumbnail=get_plugin_settings( app=request.app ).STUDIES_DEFAULT_FILE_THUMBNAIL, @@ -310,8 +313,8 @@ async def get_redirection_to_viewer(request: web.Request): request.app, project_id=project_id, viewer_node_id=file_picker_id, # TODO: ask odei about this? - file_name=file_params.file_name, - file_size=file_params.file_size, + file_name=file_params_.file_name, + file_size=file_params_.file_size, ) else: diff --git a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_rest_handlers.py b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_rest_handlers.py index c98d338bb474..1dfccc5d9ac5 100644 --- a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_rest_handlers.py +++ b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_rest_handlers.py @@ -34,19 +34,21 @@ def _compose_file_and_service_dispatcher_prefix_url( absolute_url = request.url.join( request.app.router["get_redirection_to_viewer"].url_for().with_query(**params) ) - return parse_obj_as(HttpUrl, f"{absolute_url}") + absolute_url_: HttpUrl = parse_obj_as(HttpUrl, f"{absolute_url}") + return absolute_url_ def _compose_service_only_dispatcher_prefix_url( request: web.Request, service_key: str, service_version: str ) -> HttpUrl: params = ViewerQueryParams( - viewer_key=service_key, viewer_version=service_version # type: ignore + viewer_key=service_key, viewer_version=service_version ).dict(exclude_none=True, exclude_unset=True) absolute_url = request.url.join( request.app.router["get_redirection_to_viewer"].url_for().with_query(**params) ) - return parse_obj_as(HttpUrl, f"{absolute_url}") + absolute_url_: HttpUrl = parse_obj_as(HttpUrl, f"{absolute_url}") + return absolute_url_ # diff --git a/services/web/server/src/simcore_service_webserver/studies_dispatcher/settings.py b/services/web/server/src/simcore_service_webserver/studies_dispatcher/settings.py index 32a9eee6d0e7..a32a5d63a956 100644 --- a/services/web/server/src/simcore_service_webserver/studies_dispatcher/settings.py +++ b/services/web/server/src/simcore_service_webserver/studies_dispatcher/settings.py @@ -26,7 +26,7 @@ class StudiesDispatcherSettings(BaseCustomSettings): ) STUDIES_DEFAULT_FILE_THUMBNAIL: HttpUrl = Field( - default="https://via.placeholder.com/170x120.png", + default=parse_obj_as(HttpUrl, "https://via.placeholder.com/170x120.png"), description="Default thumbnail for dispatch projects with only data (i.e. file-picker)", ) From 835e8c02910d96709e0481bded78f8334bc60dfa Mon Sep 17 00:00:00 2001 From: matusdrobuliak66 Date: Thu, 4 May 2023 19:29:45 +0200 Subject: [PATCH 7/7] fixing test --- .../studies_dispatcher/_redirects_handlers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_redirects_handlers.py b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_redirects_handlers.py index 442aa7ecfdab..2a822b6effdc 100644 --- a/services/web/server/src/simcore_service_webserver/studies_dispatcher/_redirects_handlers.py +++ b/services/web/server/src/simcore_service_webserver/studies_dispatcher/_redirects_handlers.py @@ -261,7 +261,7 @@ async def get_redirection_to_viewer(request: web.Request): ) elif isinstance(query_params, ServiceQueryParams): - service_params_ = ServiceQueryParams + service_params_ = query_params valid_service: ValidService = await validate_requested_service( app=request.app,