diff --git a/packages/service-library/src/servicelib/aiohttp/rest_middlewares.py b/packages/service-library/src/servicelib/aiohttp/rest_middlewares.py index 6bad10e73711..89a2c56d39a8 100644 --- a/packages/service-library/src/servicelib/aiohttp/rest_middlewares.py +++ b/packages/service-library/src/servicelib/aiohttp/rest_middlewares.py @@ -118,7 +118,7 @@ def handle_aiohttp_web_http_error( exception.content_type = MIMETYPE_APPLICATION_JSON if exception.reason: exception.set_status( - exception.status, safe_status_message(message=exception.reason) + exception.status, reason=safe_status_message(message=exception.reason) ) if not exception.text or not is_enveloped_from_text(exception.text): @@ -165,7 +165,7 @@ def _handle_aiohttp_web_http_successful( exception.content_type = MIMETYPE_APPLICATION_JSON if exception.reason: exception.set_status( - exception.status, safe_status_message(message=exception.reason) + exception.status, reason=safe_status_message(message=exception.reason) ) if exception.text and not is_enveloped_from_text(exception.text): diff --git a/services/web/server/src/simcore_service_webserver/api_keys/_service.py b/services/web/server/src/simcore_service_webserver/api_keys/_service.py index 64f10969e93a..c9171b04a298 100644 --- a/services/web/server/src/simcore_service_webserver/api_keys/_service.py +++ b/services/web/server/src/simcore_service_webserver/api_keys/_service.py @@ -77,7 +77,9 @@ async def get_api_key( if api_key is not None: return api_key - raise ApiKeyNotFoundError(api_key_id=api_key_id) + raise ApiKeyNotFoundError( + api_key_id=api_key_id, product_name=product_name, user_id=user_id + ) async def list_api_keys( diff --git a/services/web/server/src/simcore_service_webserver/api_keys/errors.py b/services/web/server/src/simcore_service_webserver/api_keys/errors.py index 5fbe6c38bd98..91bac8db8fcb 100644 --- a/services/web/server/src/simcore_service_webserver/api_keys/errors.py +++ b/services/web/server/src/simcore_service_webserver/api_keys/errors.py @@ -1,13 +1,14 @@ from ..errors import WebServerBaseError -class ApiKeysValueError(WebServerBaseError, ValueError): - ... +class ApiKeysValueError(WebServerBaseError, ValueError): ... class ApiKeyDuplicatedDisplayNameError(ApiKeysValueError): - msg_template = "API Key with display name '{display_name}' already exists. {reason}" + msg_template = ( + "API Key with display name '{display_name}' already exists: {details}" + ) class ApiKeyNotFoundError(ApiKeysValueError): - msg_template = "API Key with ID '{api_key_id}' not found. {reason}" + msg_template = "API Key with ID '{api_key_id}' not found: {details}" diff --git a/services/web/server/src/simcore_service_webserver/director_v2/_client_base.py b/services/web/server/src/simcore_service_webserver/director_v2/_client_base.py index d86e937ef00b..fddf396ea1d9 100644 --- a/services/web/server/src/simcore_service_webserver/director_v2/_client_base.py +++ b/services/web/server/src/simcore_service_webserver/director_v2/_client_base.py @@ -4,6 +4,7 @@ import aiohttp from aiohttp import ClientSession, ClientTimeout, web from servicelib.aiohttp import status +from servicelib.mimetype_constants import MIMETYPE_APPLICATION_JSON from tenacity import retry from tenacity.before_sleep import before_sleep_log from tenacity.stop import stop_after_attempt @@ -36,13 +37,14 @@ def _get_exception_from( - status_code: int, on_error: _StatusToExceptionMapping | None, reason: str, url: URL + status_code: int, on_error: _StatusToExceptionMapping | None, details: str, url: URL ): if on_error and status_code in on_error: - exc, exc_ctx = on_error[status_code] - return exc(**exc_ctx, status=status_code, reason=reason) + exc_cls, exc_ctx = on_error[status_code] + return exc_cls(**exc_ctx, status=status_code, details=details) + # default - return DirectorV2ServiceError(status=status_code, reason=reason, url=url) + return DirectorV2ServiceError(status=status_code, details=details, url=url) @retry(**DEFAULT_RETRY_POLICY) @@ -61,13 +63,13 @@ async def _make_request( ) as response: payload: dict[str, Any] | list[dict[str, Any]] | None | str = ( await response.json() - if response.content_type == "application/json" + if response.content_type == MIMETYPE_APPLICATION_JSON else await response.text() ) if response.status != expected_status.status_code: raise _get_exception_from( - response.status, on_error, reason=f"{payload}", url=url + response.status, on_error, details=f"{payload}", url=url ) return payload @@ -99,13 +101,13 @@ async def request_director_v2( except TimeoutError as err: raise DirectorV2ServiceError( status=status.HTTP_503_SERVICE_UNAVAILABLE, - reason=f"request to director-v2 timed-out: {err}", + details=f"request to director-v2 timed-out: {err}", url=url, ) from err except aiohttp.ClientError as err: raise DirectorV2ServiceError( status=status.HTTP_503_SERVICE_UNAVAILABLE, - reason=f"request to director-v2 service unexpected error {err}", + details=f"request to director-v2 service unexpected error {err}", url=url, ) from err diff --git a/services/web/server/src/simcore_service_webserver/director_v2/_controller/_rest_exceptions.py b/services/web/server/src/simcore_service_webserver/director_v2/_controller/_rest_exceptions.py index 809ec47b6a81..e1d822f8bb15 100644 --- a/services/web/server/src/simcore_service_webserver/director_v2/_controller/_rest_exceptions.py +++ b/services/web/server/src/simcore_service_webserver/director_v2/_controller/_rest_exceptions.py @@ -95,7 +95,7 @@ async def _handler_director_service_error_as_503_or_4xx( WalletNotEnoughCreditsError: HttpErrorInfo( status.HTTP_402_PAYMENT_REQUIRED, user_message( - "Your wallet does not have sufficient credits to run this computation. {reason}", + "Your wallet does not have sufficient credits to run this computation: {details}", _version=1, ), ), diff --git a/services/web/server/src/simcore_service_webserver/director_v2/_controller/rest.py b/services/web/server/src/simcore_service_webserver/director_v2/_controller/rest.py index d9016db8f373..22db4ca6d424 100644 --- a/services/web/server/src/simcore_service_webserver/director_v2/_controller/rest.py +++ b/services/web/server/src/simcore_service_webserver/director_v2/_controller/rest.py @@ -95,7 +95,7 @@ async def start_computation(request: web.Request) -> web.Response: now = datetime.now(UTC) if now - created_at > timedelta(minutes=5): raise web.HTTPBadRequest( - reason=( + text=( "This client generated collection is not new, " "it was created more than 5 minutes ago. " "Therefore, the client is probably wrongly generating it." diff --git a/services/web/server/src/simcore_service_webserver/director_v2/exceptions.py b/services/web/server/src/simcore_service_webserver/director_v2/exceptions.py index f127c08c795a..069b2b92da74 100644 --- a/services/web/server/src/simcore_service_webserver/director_v2/exceptions.py +++ b/services/web/server/src/simcore_service_webserver/director_v2/exceptions.py @@ -8,12 +8,12 @@ class DirectorV2ServiceError(WebServerBaseError, RuntimeError): """Basic exception for errors raised by director-v2""" - msg_template = "Unexpected error: director-v2 returned '{status}', reason '{reason}' after calling '{url}'" + msg_template = "Unexpected error: director-v2 returned '{status}', details '{details}' after calling '{url}'" - def __init__(self, *, status: int, reason: str, **ctx: Any) -> None: + def __init__(self, *, status: int, details: str, **ctx: Any) -> None: super().__init__(**ctx) self.status = status - self.reason = reason + self.details = details class ComputationNotFoundError(DirectorV2ServiceError): diff --git a/services/web/server/src/simcore_service_webserver/exception_handling/_factory.py b/services/web/server/src/simcore_service_webserver/exception_handling/_factory.py index df675b81dbf2..3fbf86bc541f 100644 --- a/services/web/server/src/simcore_service_webserver/exception_handling/_factory.py +++ b/services/web/server/src/simcore_service_webserver/exception_handling/_factory.py @@ -145,7 +145,7 @@ def create_http_error_exception_handlers_map() -> ExceptionHandlersMap: """ exc_handlers_map: ExceptionHandlersMap = { exc_type: create_exception_handler_from_http_info( - status_code=code, msg_template="{reason}" + status_code=code, msg_template="{text}" ) for code, exc_type in _STATUS_CODE_TO_HTTP_ERRORS.items() } diff --git a/services/web/server/src/simcore_service_webserver/folders/_common/exceptions_handlers.py b/services/web/server/src/simcore_service_webserver/folders/_common/exceptions_handlers.py index 52f2658ac7c7..be8445c20135 100644 --- a/services/web/server/src/simcore_service_webserver/folders/_common/exceptions_handlers.py +++ b/services/web/server/src/simcore_service_webserver/folders/_common/exceptions_handlers.py @@ -56,11 +56,11 @@ ), FolderValueNotPermittedError: HttpErrorInfo( status.HTTP_409_CONFLICT, - user_message("The folder operation cannot be completed: {reason}", _version=1), + user_message("The folder operation cannot be completed: {details}", _version=1), ), FoldersValueError: HttpErrorInfo( status.HTTP_409_CONFLICT, - user_message("The folder configuration is invalid: {reason}", _version=1), + user_message("The folder configuration is invalid: {details}", _version=1), ), ProjectInvalidRightsError: HttpErrorInfo( status.HTTP_403_FORBIDDEN, diff --git a/services/web/server/src/simcore_service_webserver/folders/_folders_repository.py b/services/web/server/src/simcore_service_webserver/folders/_folders_repository.py index 140f0594b779..641aceb2c8f0 100644 --- a/services/web/server/src/simcore_service_webserver/folders/_folders_repository.py +++ b/services/web/server/src/simcore_service_webserver/folders/_folders_repository.py @@ -338,7 +338,7 @@ async def get( row = result.first() if row is None: raise FolderAccessForbiddenError( - reason=f"Folder {folder_id} does not exist.", + details=f"Folder {folder_id} does not exist.", ) return FolderDB.model_validate(row) @@ -369,7 +369,7 @@ async def get_for_user_or_workspace( row = await result.first() if row is None: raise FolderAccessForbiddenError( - reason=f"User does not have access to the folder {folder_id}. Or folder does not exist.", + details=f"User does not have access to the folder {folder_id}. Or folder does not exist.", ) return FolderDB.model_validate(row) @@ -421,7 +421,7 @@ async def update( result = await conn.stream(query) row = await result.first() if row is None: - raise FolderNotFoundError(reason=f"Folder {folders_id_or_ids} not found.") + raise FolderNotFoundError(details=f"Folder {folders_id_or_ids} not found.") return FolderDB.model_validate(row) diff --git a/services/web/server/src/simcore_service_webserver/folders/_folders_service.py b/services/web/server/src/simcore_service_webserver/folders/_folders_service.py index 3b92126cc45f..af727bde0474 100644 --- a/services/web/server/src/simcore_service_webserver/folders/_folders_service.py +++ b/services/web/server/src/simcore_service_webserver/folders/_folders_service.py @@ -70,7 +70,7 @@ async def create_folder( if workspace_id and parent_folder_db.workspace_id != workspace_id: # Check parent folder id exists inside the same workspace raise WorkspaceAccessForbiddenError( - reason=f"Folder {parent_folder_id} does not exists in workspace {workspace_id}." + details=f"Folder {parent_folder_id} does not exists in workspace {workspace_id}." ) folder_db = await _folders_repository.create( @@ -291,7 +291,7 @@ async def update_folder( ) if parent_folder_id in _child_folders: raise FolderValueNotPermittedError( - reason="Parent folder id should not be one of children" + details="Parent folder id should not be one of children" ) folder_db = await _folders_repository.update( diff --git a/services/web/server/src/simcore_service_webserver/folders/_trash_service.py b/services/web/server/src/simcore_service_webserver/folders/_trash_service.py index 266e1447a112..5cb56aa53d1c 100644 --- a/services/web/server/src/simcore_service_webserver/folders/_trash_service.py +++ b/services/web/server/src/simcore_service_webserver/folders/_trash_service.py @@ -280,7 +280,7 @@ async def delete_trashed_folder( raise FolderNotTrashedError( folder_id=folder_id, user_id=user_id, - reason="Cannot delete trashed folder since it does not fit current criteria", + details="Cannot delete trashed folder since it does not fit current criteria", ) # NOTE: this function deletes folder AND its content recursively! diff --git a/services/web/server/src/simcore_service_webserver/folders/errors.py b/services/web/server/src/simcore_service_webserver/folders/errors.py index e8f2e346868b..39789d165684 100644 --- a/services/web/server/src/simcore_service_webserver/folders/errors.py +++ b/services/web/server/src/simcore_service_webserver/folders/errors.py @@ -1,33 +1,31 @@ from ..errors import WebServerBaseError -class FoldersValueError(WebServerBaseError, ValueError): - ... +class FoldersValueError(WebServerBaseError, ValueError): ... class FolderValueNotPermittedError(FoldersValueError): - msg_template = "Provided value is not permitted. {reason}" + msg_template = "Provided value is not permitted: {details}" class FolderNotFoundError(FoldersValueError): - msg_template = "Folder not found. {reason}" + msg_template = "Folder not found: {details}" class FolderAccessForbiddenError(FoldersValueError): - msg_template = "Folder access forbidden. {reason}" + msg_template = "Folder access forbidden: {details}" class FolderGroupNotFoundError(FoldersValueError): - msg_template = "Folder group not found. {reason}" + msg_template = "Folder group not found: {details}" -class FoldersRuntimeError(WebServerBaseError, RuntimeError): - ... +class FoldersRuntimeError(WebServerBaseError, RuntimeError): ... class FolderNotTrashedError(FoldersRuntimeError): msg_template = ( - "Cannot delete folder {folder_id} since it was not trashed first: {reason}" + "Cannot delete folder {folder_id} since it was not trashed first: {details}" ) diff --git a/services/web/server/src/simcore_service_webserver/groups/_classifiers_service.py b/services/web/server/src/simcore_service_webserver/groups/_classifiers_service.py index 481635b05f4c..eb2ba75aea7e 100644 --- a/services/web/server/src/simcore_service_webserver/groups/_classifiers_service.py +++ b/services/web/server/src/simcore_service_webserver/groups/_classifiers_service.py @@ -128,7 +128,7 @@ async def build_rrids_tree_view( ) -> dict[str, Any]: if tree_view_mode != "std": raise web.HTTPNotImplemented( - reason="Currently only 'std' option for the classifiers tree view is implemented" + text="Currently only 'std' option for the classifiers tree view is implemented" ) scicrunch = SciCrunch.get_instance(app) diff --git a/services/web/server/src/simcore_service_webserver/invitations/_service.py b/services/web/server/src/simcore_service_webserver/invitations/_service.py index 4c585d1ed0ec..b18fa2dbc6f3 100644 --- a/services/web/server/src/simcore_service_webserver/invitations/_service.py +++ b/services/web/server/src/simcore_service_webserver/invitations/_service.py @@ -51,7 +51,7 @@ async def validate_invitation_url( """ if current_product.group_id is None: raise InvitationsServiceUnavailableError( - reason="Current product is not configured for invitations", + details="Current product is not configured for invitations", current_product=current_product, guest_email=guest_email, ) @@ -60,7 +60,7 @@ async def validate_invitation_url( valid_url = TypeAdapter(AnyHttpUrl).validate_python(invitation_url) except ValidationError as err: raise InvalidInvitationError( - reason=MSG_INVALID_INVITATION_URL, + details=MSG_INVALID_INVITATION_URL, current_product=current_product, guest_email=guest_email, ) from err @@ -73,7 +73,7 @@ async def validate_invitation_url( # check email if invitation.guest.lower() != guest_email.lower(): raise InvalidInvitationError( - reason="This invitation was issued for a different email", + details="This invitation was issued for a different email", current_product=current_product, guest_email=guest_email, invitation=invitation, @@ -83,7 +83,7 @@ async def validate_invitation_url( assert current_product.group_id is not None # nosec if invitation.product is not None and invitation.product != current_product.name: raise InvalidInvitationError( - reason="This invitation was issued for a different product. " + details="This invitation was issued for a different product. " f"Got '{invitation.product}', expected '{current_product.name}'", guest_email=guest_email, current_product=current_product, @@ -101,7 +101,7 @@ async def validate_invitation_url( if is_user_registered_in_product: # NOTE: a user might be already registered but the invitation is for another product raise InvalidInvitationError( - reason=MSG_INVITATION_ALREADY_USED, + details=MSG_INVITATION_ALREADY_USED, guest_email=guest_email, current_product=current_product, invitation=invitation, @@ -124,7 +124,7 @@ async def extract_invitation( try: valid_url = TypeAdapter(AnyHttpUrl).validate_python(invitation_url) except ValidationError as err: - raise InvalidInvitationError(reason=MSG_INVALID_INVITATION_URL) from err + raise InvalidInvitationError(details=MSG_INVALID_INVITATION_URL) from err # check with service invitation: ApiInvitationContent = await get_invitations_service_api( diff --git a/services/web/server/src/simcore_service_webserver/invitations/errors.py b/services/web/server/src/simcore_service_webserver/invitations/errors.py index 0375c9b66851..27ed49213b79 100644 --- a/services/web/server/src/simcore_service_webserver/invitations/errors.py +++ b/services/web/server/src/simcore_service_webserver/invitations/errors.py @@ -22,4 +22,4 @@ class InvalidInvitationError(InvitationsError): class InvitationsServiceUnavailableError(InvitationsError): - msg_template = "Cannot process invitations" + msg_template = "Cannot process invitations: {details}" diff --git a/services/web/server/src/simcore_service_webserver/licenses/_licensed_items_service.py b/services/web/server/src/simcore_service_webserver/licenses/_licensed_items_service.py index 925cc8aee93a..ea616808458b 100644 --- a/services/web/server/src/simcore_service_webserver/licenses/_licensed_items_service.py +++ b/services/web/server/src/simcore_service_webserver/licenses/_licensed_items_service.py @@ -134,7 +134,7 @@ async def purchase_licensed_item( # Check whether wallet has enough credits if wallet.available_credits - pricing_unit.current_cost_per_unit < 0: raise WalletNotEnoughCreditsError( - reason=f"Wallet '{wallet.name}' has {wallet.available_credits} credits." + details=f"Wallet '{wallet.name}' has {wallet.available_credits} credits." ) user = await users_service.get_user(app, user_id=user_id) diff --git a/services/web/server/src/simcore_service_webserver/login/_controller/rest/auth.py b/services/web/server/src/simcore_service_webserver/login/_controller/rest/auth.py index 594d4f406373..972a3861343e 100644 --- a/services/web/server/src/simcore_service_webserver/login/_controller/rest/auth.py +++ b/services/web/server/src/simcore_service_webserver/login/_controller/rest/auth.py @@ -2,12 +2,12 @@ from aiohttp import web from aiohttp.web import RouteTableDef +from common_library.user_messages import user_message from models_library.authentification import TwoFactorAuthentificationMethod from pydantic import TypeAdapter from servicelib.aiohttp import status from servicelib.aiohttp.requests_validation import parse_request_body_as from servicelib.logging_utils import get_log_record_extra, log_context -from servicelib.mimetype_constants import MIMETYPE_APPLICATION_JSON from servicelib.request_keys import RQT_USERID_KEY from simcore_postgres_database.models.users import UserRole @@ -212,8 +212,7 @@ async def login_2fa(request: web.Request): ) if not settings.LOGIN_2FA_REQUIRED: raise web.HTTPServiceUnavailable( - reason="2FA login is not available", - content_type=MIMETYPE_APPLICATION_JSON, + text=user_message("2FA login is not available"), ) # validates input params @@ -224,13 +223,9 @@ async def login_2fa(request: web.Request): request.app, login_2fa_.email ) if not _expected_2fa_code: - raise web.HTTPUnauthorized( - reason=MSG_WRONG_2FA_CODE__EXPIRED, content_type=MIMETYPE_APPLICATION_JSON - ) + raise web.HTTPUnauthorized(text=MSG_WRONG_2FA_CODE__EXPIRED) if login_2fa_.code.get_secret_value() != _expected_2fa_code: - raise web.HTTPUnauthorized( - reason=MSG_WRONG_2FA_CODE__INVALID, content_type=MIMETYPE_APPLICATION_JSON - ) + raise web.HTTPUnauthorized(text=MSG_WRONG_2FA_CODE__INVALID) user = _auth_service.check_not_null_user( await _auth_service.get_user_or_none(request.app, email=login_2fa_.email) diff --git a/services/web/server/src/simcore_service_webserver/login/_twofa_service.py b/services/web/server/src/simcore_service_webserver/login/_twofa_service.py index c799e29e4a31..a7ef6d5fd067 100644 --- a/services/web/server/src/simcore_service_webserver/login/_twofa_service.py +++ b/services/web/server/src/simcore_service_webserver/login/_twofa_service.py @@ -134,7 +134,7 @@ def _sender(): except TwilioException as exc: raise SendingVerificationSmsError( - reason=f"Could not send SMS to {mask_phone_number(phone_number)}", + details=f"Could not send SMS to {mask_phone_number(phone_number)}", user_id=user_id, twilio_error=exc, ) from exc @@ -176,7 +176,7 @@ async def send_email_code( ) except Exception as exc: raise SendingVerificationEmailError( - reason=f"Could not send email to {user_email}", + details=f"Could not send email to {user_email}", user_id=user_id, user_email=user_email, email_error=exc, diff --git a/services/web/server/src/simcore_service_webserver/login/errors.py b/services/web/server/src/simcore_service_webserver/login/errors.py index c6512b2b23a3..4d34827a5e29 100644 --- a/services/web/server/src/simcore_service_webserver/login/errors.py +++ b/services/web/server/src/simcore_service_webserver/login/errors.py @@ -5,11 +5,11 @@ class LoginError(WebServerBaseError, ValueError): ... class SendingVerificationSmsError(LoginError): - msg_template = "Sending verification sms failed. {reason}" + msg_template = "Sending verification sms failed: {details}" class SendingVerificationEmailError(LoginError): - msg_template = "Sending verification email failed. {reason}" + msg_template = "Sending verification email failed: {details}" class WrongPasswordError(LoginError): diff --git a/services/web/server/src/simcore_service_webserver/payments/_onetime_api.py b/services/web/server/src/simcore_service_webserver/payments/_onetime_api.py index 6bf7ef4f1c11..ac634f965bb3 100644 --- a/services/web/server/src/simcore_service_webserver/payments/_onetime_api.py +++ b/services/web/server/src/simcore_service_webserver/payments/_onetime_api.py @@ -262,7 +262,7 @@ async def raise_for_wallet_payments_permissions( ) if not permissions.read or not permissions.write: raise WalletAccessForbiddenError( - reason=MSG_WALLET_NO_ACCESS_ERROR.format( + details=MSG_WALLET_NO_ACCESS_ERROR.format( user_id=user_id, wallet_id=wallet_id ) ) diff --git a/services/web/server/src/simcore_service_webserver/products/_service.py b/services/web/server/src/simcore_service_webserver/products/_service.py index 234198e08e72..4a894770d716 100644 --- a/services/web/server/src/simcore_service_webserver/products/_service.py +++ b/services/web/server/src/simcore_service_webserver/products/_service.py @@ -95,7 +95,7 @@ async def get_credit_amount( if price_info is None or not price_info.usd_per_credit: # '0 or None' should raise raise ProductPriceNotDefinedError( - reason=f"Product {product_name} usd_per_credit is either not defined or zero" + details=f"Product {product_name} usd_per_credit is either not defined or zero" ) if dollar_amount < price_info.min_payment_amount_usd: diff --git a/services/web/server/src/simcore_service_webserver/products/errors.py b/services/web/server/src/simcore_service_webserver/products/errors.py index 3b0da3564f51..6b5bff54a4d2 100644 --- a/services/web/server/src/simcore_service_webserver/products/errors.py +++ b/services/web/server/src/simcore_service_webserver/products/errors.py @@ -13,7 +13,7 @@ class ProductNotFoundError(ProductError): class ProductPriceNotDefinedError(ProductError): - msg_template = "Product price not defined. {reason}" + msg_template = "Product price not defined: {details}" class BelowMinimumPaymentError(ProductError): diff --git a/services/web/server/src/simcore_service_webserver/projects/_controller/_rest_exceptions.py b/services/web/server/src/simcore_service_webserver/projects/_controller/_rest_exceptions.py index 7b9e77aff264..60f24a3c6f69 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_controller/_rest_exceptions.py +++ b/services/web/server/src/simcore_service_webserver/projects/_controller/_rest_exceptions.py @@ -60,7 +60,7 @@ ), FolderNotFoundError: HttpErrorInfo( status.HTTP_404_NOT_FOUND, - user_message("The requested folder could not be found: {reason}", _version=1), + user_message("The requested folder could not be found", _version=1), ), } @@ -89,14 +89,14 @@ ProjectDeleteError: HttpErrorInfo( status.HTTP_409_CONFLICT, user_message( - "Unable to complete deletion of project '{project_uuid}': {reason}", + "Unable to complete deletion of project '{project_uuid}': {details}", _version=1, ), ), ProjectGroupNotFoundError: HttpErrorInfo( status.HTTP_404_NOT_FOUND, user_message( - "The requested project group could not be found: {reason}", _version=1 + "The requested project group could not be found: {details}", _version=1 ), ), ProjectInvalidRightsError: HttpErrorInfo( @@ -177,7 +177,7 @@ ProjectTypeAndTemplateIncompatibilityError: HttpErrorInfo( status.HTTP_400_BAD_REQUEST, user_message( - "The project type and template type combination is not valid: {reason}", + "The project type and template type combination is not valid", _version=1, ), ), @@ -187,12 +187,12 @@ _WORKSPACE_ERRORS: ExceptionToHttpErrorMap = { WorkspaceAccessForbiddenError: HttpErrorInfo( status.HTTP_403_FORBIDDEN, - user_message("Access to this workspace is forbidden: {reason}", _version=1), + user_message("Access to this workspace is forbidden: {details}", _version=1), ), WorkspaceNotFoundError: HttpErrorInfo( status.HTTP_404_NOT_FOUND, user_message( - "The requested workspace could not be found: {reason}", _version=1 + "The requested workspace could not be found: {details}", _version=1 ), ), } @@ -201,19 +201,19 @@ _WALLET_ERRORS: ExceptionToHttpErrorMap = { UserDefaultWalletNotFoundError: HttpErrorInfo( status.HTTP_404_NOT_FOUND, - user_message("The requested wallet could not be found: {reason}", _version=1), + user_message("The requested wallet could not be found: {details}", _version=1), ), WalletAccessForbiddenError: HttpErrorInfo( status.HTTP_403_FORBIDDEN, user_message( - "Payment is required, but you do not have access to the project's linked wallet: {reason}", + "Payment is required, but you do not have access to the project's linked wallet: {details}", _version=1, ), ), WalletNotEnoughCreditsError: HttpErrorInfo( status.HTTP_402_PAYMENT_REQUIRED, user_message( - "The wallet does not have enough credits to complete this operation: {reason}", + "The wallet does not have enough credits to complete this operation: {details}", _version=1, ), ), diff --git a/services/web/server/src/simcore_service_webserver/projects/_crud_api_delete.py b/services/web/server/src/simcore_service_webserver/projects/_crud_api_delete.py index 74ce45355719..b41045ac037e 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_crud_api_delete.py +++ b/services/web/server/src/simcore_service_webserver/projects/_crud_api_delete.py @@ -125,12 +125,12 @@ async def delete_project( except ProjectLockError as err: raise ProjectDeleteError( - project_uuid=project_uuid, reason=f"Project currently in use {err}" + project_uuid=project_uuid, details=f"Project currently in use {err}" ) from err except (ProjectInvalidRightsError, ProjectNotFoundError, UserNotFoundError) as err: raise ProjectDeleteError( - project_uuid=project_uuid, reason=f"Invalid project state {err}" + project_uuid=project_uuid, details=f"Invalid project state {err}" ) from err diff --git a/services/web/server/src/simcore_service_webserver/projects/_folders_service.py b/services/web/server/src/simcore_service_webserver/projects/_folders_service.py index 88659d68ac5f..f68b2b15c4c4 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_folders_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_folders_service.py @@ -39,7 +39,7 @@ async def move_project_into_folder( raise ProjectInvalidRightsError( user_id=user_id, project_uuid=project_id, - reason=f"User does not have write access to project {project_id}", + details=f"User does not have write access to project {project_id}", ) workspace_is_private = False diff --git a/services/web/server/src/simcore_service_webserver/projects/_groups_repository.py b/services/web/server/src/simcore_service_webserver/projects/_groups_repository.py index 00f7d467054a..bcdbd668a32b 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_groups_repository.py +++ b/services/web/server/src/simcore_service_webserver/projects/_groups_repository.py @@ -101,7 +101,7 @@ async def get_project_group( row = await result.first() if row is None: raise ProjectGroupNotFoundError( - reason=f"Project {project_id} group {group_id} not found" + details=f"Project {project_id} group {group_id} not found" ) return ProjectGroupGetDB.model_validate(row) @@ -136,7 +136,7 @@ async def replace_project_group( row = await result.first() if row is None: raise ProjectGroupNotFoundError( - reason=f"Project {project_id} group {group_id} not found" + details=f"Project {project_id} group {group_id} not found" ) return ProjectGroupGetDB.model_validate(row) diff --git a/services/web/server/src/simcore_service_webserver/projects/_groups_service.py b/services/web/server/src/simcore_service_webserver/projects/_groups_service.py index 88858ac11c27..37207fd2c6db 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_groups_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_groups_service.py @@ -121,7 +121,7 @@ async def replace_project_group( raise ProjectInvalidRightsError( user_id=user_id, project_uuid=project_id, - reason=f"User does not have access to modify owner project group in project {project_id}", + details=f"User does not have access to modify owner project group in project {project_id}", ) project_group_db: ProjectGroupGetDB = ( @@ -168,7 +168,7 @@ async def delete_project_group( raise ProjectInvalidRightsError( user_id=user_id, project_uuid=project_id, - reason=f"User does not have access to modify owner project group in project {project_id}", + details=f"User does not have access to modify owner project group in project {project_id}", ) await _groups_repository.delete_project_group( diff --git a/services/web/server/src/simcore_service_webserver/projects/_projects_repository_legacy.py b/services/web/server/src/simcore_service_webserver/projects/_projects_repository_legacy.py index 6e73f5e59c7b..59f9ff2dc31c 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_projects_repository_legacy.py +++ b/services/web/server/src/simcore_service_webserver/projects/_projects_repository_legacy.py @@ -1428,7 +1428,7 @@ async def check_project_has_only_one_product(self, project_uuid: ProjectID) -> N # reduce time to develop by not implementing something that might never be necessary raise ProjectDeleteError( project_uuid=project_uuid, - reason="Project has more than one linked product. This needs manual intervention. Please contact oSparc support.", + details="Project has more than one linked product. This needs manual intervention. Please contact oSparc support.", ) diff --git a/services/web/server/src/simcore_service_webserver/projects/_projects_service.py b/services/web/server/src/simcore_service_webserver/projects/_projects_service.py index 4e883b715c70..ca9da7873c64 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_projects_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_projects_service.py @@ -875,7 +875,7 @@ async def _() -> None: and wallet.available_credits <= ZERO_CREDITS ): raise WalletNotEnoughCreditsError( - reason=f"Wallet '{wallet.name}' has {wallet.available_credits} credits." + details=f"Wallet '{wallet.name}' has {wallet.available_credits} credits." ) pricing_info = PricingInfo( diff --git a/services/web/server/src/simcore_service_webserver/projects/_projects_service_delete.py b/services/web/server/src/simcore_service_webserver/projects/_projects_service_delete.py index 663cce23382d..a5fd6e0074f7 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_projects_service_delete.py +++ b/services/web/server/src/simcore_service_webserver/projects/_projects_service_delete.py @@ -95,13 +95,13 @@ async def delete_project_as_admin( except ProjectLockError as err: raise ProjectDeleteError( project_uuid=project_uuid, - reason=f"Cannot delete project {project_uuid} because it is currently in use. Details: {err}", + details=f"Cannot delete project {project_uuid} because it is currently in use. Details: {err}", state=state, ) from err except Exception as err: raise ProjectDeleteError( project_uuid=project_uuid, - reason=f"Unexpected error. Deletion sequence: {state=}", + details=f"Unexpected error. Deletion sequence: {state=}", state=state, ) from err diff --git a/services/web/server/src/simcore_service_webserver/projects/_trash_service.py b/services/web/server/src/simcore_service_webserver/projects/_trash_service.py index 45082ecfefe2..a1c711688ad8 100644 --- a/services/web/server/src/simcore_service_webserver/projects/_trash_service.py +++ b/services/web/server/src/simcore_service_webserver/projects/_trash_service.py @@ -222,7 +222,7 @@ async def delete_explicitly_trashed_project( raise ProjectNotTrashedError( project_uuid=project_id, user_id=user_id, - reason="Cannot delete trashed project since it does not fit current criteria", + details="Cannot delete trashed project since it does not fit current criteria", ) await _projects_service.delete_project_by_user( diff --git a/services/web/server/src/simcore_service_webserver/projects/exceptions.py b/services/web/server/src/simcore_service_webserver/projects/exceptions.py index 807ab6e0cbe2..62cb10129d2a 100644 --- a/services/web/server/src/simcore_service_webserver/projects/exceptions.py +++ b/services/web/server/src/simcore_service_webserver/projects/exceptions.py @@ -70,12 +70,12 @@ def debug_message(self): class ProjectDeleteError(BaseProjectError): - msg_template = "Failed to complete deletion of '{project_uuid}': {reason}" + msg_template = "Failed to complete deletion of '{project_uuid}': {details}" - def __init__(self, *, project_uuid, reason, **ctx): + def __init__(self, *, project_uuid, details, **ctx): super().__init__(**ctx) self.project_uuid = project_uuid - self.reason = reason + self.details = details class ProjectsBatchDeleteError(BaseProjectError): @@ -106,9 +106,7 @@ class ProjectRunningConflictError(ProjectTrashError): class ProjectNotTrashedError(ProjectTrashError): - msg_template = ( - "Cannot delete project {project_uuid} since it was not trashed first: {reason}" - ) + msg_template = "Cannot delete project {project_uuid} since it was not trashed first: {details}" class NodeNotFoundError(BaseProjectError): @@ -257,7 +255,7 @@ class InvalidInputValue(WebServerBaseError): class ProjectGroupNotFoundError(BaseProjectError): - msg_template = "Project group not found. {reason}" + msg_template = "Project group not found. {details}" class ProjectInDebtCanNotChangeWalletError(BaseProjectError): diff --git a/services/web/server/src/simcore_service_webserver/scicrunch/errors.py b/services/web/server/src/simcore_service_webserver/scicrunch/errors.py index aba2c00cb4d1..95a071c03bd3 100644 --- a/services/web/server/src/simcore_service_webserver/scicrunch/errors.py +++ b/services/web/server/src/simcore_service_webserver/scicrunch/errors.py @@ -9,7 +9,7 @@ class ScicrunchError(WebServerBaseError): - msg_template = "{reason}" + msg_template = "{details}" class ScicrunchServiceError(ScicrunchError): @@ -48,7 +48,7 @@ def map_to_scicrunch_error(rrid: str, error_code: int, message: str) -> Scicrunc ), error_code # nosec custom_error = ScicrunchError( - reason="Unexpected error in scicrunch.org", original_message=message + details="Unexpected error in scicrunch.org", original_message=message ) if error_code == web_exceptions.HTTPBadRequest.status_code: @@ -61,7 +61,7 @@ def map_to_scicrunch_error(rrid: str, error_code: int, message: str) -> Scicrunc elif error_code == web_exceptions.HTTPUnauthorized.status_code: custom_error = ScicrunchConfigError( - reason="osparc was not authorized to access scicrunch.org." + details="osparc was not authorized to access scicrunch.org." "Please check API access tokens.", original_message=message, ) @@ -70,7 +70,8 @@ def map_to_scicrunch_error(rrid: str, error_code: int, message: str) -> Scicrunc error_code >= status.HTTP_500_INTERNAL_SERVER_ERROR ): # scicrunch.org server error custom_error = ScicrunchServiceError( - reason="scicrunch.org cannot perform our requests", original_message=message + details="scicrunch.org cannot perform our requests", + original_message=message, ) return custom_error diff --git a/services/web/server/src/simcore_service_webserver/scicrunch/service_client.py b/services/web/server/src/simcore_service_webserver/scicrunch/service_client.py index ec8f43283b3f..c70454f4c62f 100644 --- a/services/web/server/src/simcore_service_webserver/scicrunch/service_client.py +++ b/services/web/server/src/simcore_service_webserver/scicrunch/service_client.py @@ -1,10 +1,9 @@ """ - Client to interact with scicrunch service (https://scicrunch.org) - - both with REST API and resolver API +Client to interact with scicrunch service (https://scicrunch.org) + - both with REST API and resolver API """ -import asyncio import logging from aiohttp import ClientSession, client_exceptions, web @@ -72,7 +71,7 @@ def get_instance(cls, app: web.Application) -> "SciCrunch": obj: SciCrunch | None = app.get(f"{__name__}.{cls.__name__}") if obj is None: raise ScicrunchConfigError( - reason="Services on scicrunch.org are currently disabled" + details="Services on scicrunch.org are currently disabled" ) return obj @@ -153,17 +152,17 @@ async def get_resource_fields(self, rrid: str) -> ResearchResource: except (ValidationError, client_exceptions.InvalidURL) as err: raise ScicrunchAPIError( - reason="scicrunch API response unexpectedly changed" + details="scicrunch API response unexpectedly changed" ) from err except ( client_exceptions.ClientConnectionError, client_exceptions.ClientPayloadError, - asyncio.TimeoutError, + TimeoutError, ) as err: # https://docs.aiohttp.org/en/stable/client_reference.html#hierarchy-of-exceptions raise ScicrunchServiceError( - reason="Failed to connect scicrunch service" + details="Failed to connect scicrunch service" ) from err async def search_resource(self, name_as: str) -> list[ResourceHit]: 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 0deaa0496ef2..16137769f16a 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 @@ -96,7 +96,7 @@ async def _get_published_template_project( ) if project_group_get.read is False: raise ProjectGroupNotFoundError( - reason=f"Project {project_uuid} group 1 not read access" + details=f"Project {project_uuid} group 1 not read access" ) if not prj: diff --git a/services/web/server/src/simcore_service_webserver/wallets/_api.py b/services/web/server/src/simcore_service_webserver/wallets/_api.py index 5ac8f9851bb0..77ef2dbdd72f 100644 --- a/services/web/server/src/simcore_service_webserver/wallets/_api.py +++ b/services/web/server/src/simcore_service_webserver/wallets/_api.py @@ -203,7 +203,7 @@ async def update_wallet( ) if wallet.write is False: raise WalletAccessForbiddenError( - reason=f"Wallet {wallet_id} does not have write permission", + details=f"Wallet {wallet_id} does not have write permission", user_id=user_id, wallet_id=wallet_id, product_name=product_name, @@ -237,7 +237,7 @@ async def delete_wallet( ) if wallet.delete is False: raise WalletAccessForbiddenError( - reason=f"Wallet {wallet_id} does not have delete permission", + details=f"Wallet {wallet_id} does not have delete permission", user_id=user_id, wallet_id=wallet_id, product_name=product_name, @@ -260,7 +260,7 @@ async def get_wallet_by_user( ) if wallet.read is False: raise WalletAccessForbiddenError( - reason=f"User {user_id} does not have read permission on wallet {wallet_id}", + details=f"User {user_id} does not have read permission on wallet {wallet_id}", user_id=user_id, wallet_id=wallet_id, product_name=product_name, diff --git a/services/web/server/src/simcore_service_webserver/wallets/_db.py b/services/web/server/src/simcore_service_webserver/wallets/_db.py index 3466f39b6449..ad99a398d39a 100644 --- a/services/web/server/src/simcore_service_webserver/wallets/_db.py +++ b/services/web/server/src/simcore_service_webserver/wallets/_db.py @@ -150,7 +150,7 @@ async def get_wallet_for_user( row = await result.first() if row is None: raise WalletAccessForbiddenError( - reason=f"User does not have access to the wallet {wallet_id}. Or wallet does not exist.", + details=f"User does not have access to the wallet {wallet_id}. Or wallet does not exist.", user_id=user_id, wallet_id=wallet_id, product_name=product_name, @@ -182,7 +182,7 @@ async def get_wallet( result = await conn.execute(stmt) row = await result.first() if row is None: - raise WalletNotFoundError(reason=f"Wallet {wallet_id} not found.") + raise WalletNotFoundError(details=f"Wallet {wallet_id} not found.") return WalletDB.model_validate(row) @@ -213,7 +213,7 @@ async def update_wallet( ) row = await result.first() if row is None: - raise WalletNotFoundError(reason=f"Wallet {wallet_id} not found.") + raise WalletNotFoundError(details=f"Wallet {wallet_id} not found.") return WalletDB.model_validate(row) diff --git a/services/web/server/src/simcore_service_webserver/wallets/_groups_api.py b/services/web/server/src/simcore_service_webserver/wallets/_groups_api.py index 56d6830c1de5..35b03376ba44 100644 --- a/services/web/server/src/simcore_service_webserver/wallets/_groups_api.py +++ b/services/web/server/src/simcore_service_webserver/wallets/_groups_api.py @@ -44,7 +44,7 @@ async def create_wallet_group( ) if wallet.write is False: raise WalletAccessForbiddenError( - reason=f"User does not have write access to wallet {wallet_id}", + details=f"User does not have write access to wallet {wallet_id}", user_id=user_id, wallet_id=wallet_id, product_name=product_name, @@ -78,7 +78,7 @@ async def list_wallet_groups_by_user_and_wallet( ) if wallet.read is False: raise WalletAccessForbiddenError( - reason=f"User does not have read access to wallet {wallet_id}", + details=f"User does not have read access to wallet {wallet_id}", user_id=user_id, wallet_id=wallet_id, product_name=product_name, @@ -132,14 +132,14 @@ async def update_wallet_group( ) if wallet.write is False: raise WalletAccessForbiddenError( - reason=f"User does not have write access to wallet {wallet_id}" + details=f"User does not have write access to wallet {wallet_id}" ) if wallet.owner == group_id: user: dict = await users_service.get_user(app, user_id) if user["primary_gid"] != wallet.owner: # Only the owner of the wallet can modify the owner group raise WalletAccessForbiddenError( - reason=f"User does not have access to modify owner wallet group in wallet {wallet_id}", + details=f"User does not have access to modify owner wallet group in wallet {wallet_id}", user_id=user_id, wallet_id=wallet_id, product_name=product_name, @@ -174,14 +174,14 @@ async def delete_wallet_group( ) if wallet.delete is False: raise WalletAccessForbiddenError( - reason=f"User does not have delete access to wallet {wallet_id}" + details=f"User does not have delete access to wallet {wallet_id}" ) if wallet.owner == group_id: user: dict = await users_service.get_user(app, user_id) if user["primary_gid"] != wallet.owner: # Only the owner of the wallet can delete the owner group raise WalletAccessForbiddenError( - reason=f"User does not have access to modify owner wallet group in wallet {wallet_id}" + details=f"User does not have access to modify owner wallet group in wallet {wallet_id}" ) await wallets_groups_db.delete_wallet_group( diff --git a/services/web/server/src/simcore_service_webserver/wallets/_groups_db.py b/services/web/server/src/simcore_service_webserver/wallets/_groups_db.py index 8d6860b6ea15..e8ae3c804d7f 100644 --- a/services/web/server/src/simcore_service_webserver/wallets/_groups_db.py +++ b/services/web/server/src/simcore_service_webserver/wallets/_groups_db.py @@ -105,7 +105,7 @@ async def get_wallet_group( row = await result.first() if row is None: raise WalletGroupNotFoundError( - reason=f"Wallet {wallet_id} group {group_id} not found" + details=f"Wallet {wallet_id} group {group_id} not found" ) return WalletGroupGetDB.model_validate(row) @@ -136,7 +136,7 @@ async def update_wallet_group( row = await result.first() if row is None: raise WalletGroupNotFoundError( - reason=f"Wallet {wallet_id} group {group_id} not found" + details=f"Wallet {wallet_id} group {group_id} not found" ) return WalletGroupGetDB.model_validate(row) diff --git a/services/web/server/src/simcore_service_webserver/wallets/errors.py b/services/web/server/src/simcore_service_webserver/wallets/errors.py index 320605bb14d3..573d5750e18a 100644 --- a/services/web/server/src/simcore_service_webserver/wallets/errors.py +++ b/services/web/server/src/simcore_service_webserver/wallets/errors.py @@ -1,24 +1,23 @@ from ..errors import WebServerBaseError -class WalletsValueError(WebServerBaseError, ValueError): - ... +class WalletsValueError(WebServerBaseError, ValueError): ... class WalletNotFoundError(WalletsValueError): - msg_template = "Wallet not found. {reason}" + msg_template = "Wallet not found: {details}" class WalletAccessForbiddenError(WalletsValueError): - msg_template = "Wallet access forbidden. {reason}" + msg_template = "Wallet access forbidden: {details}" class WalletNotEnoughCreditsError(WalletsValueError): - msg_template = "Wallet does not have enough credits. {reason}" + msg_template = "Wallet does not have enough credits: {details}" # Wallet groups class WalletGroupNotFoundError(WalletsValueError): - msg_template = "Wallet group not found. {reason}" + msg_template = "Wallet group not found: {details}" diff --git a/services/web/server/src/simcore_service_webserver/workspaces/_common/exceptions_handlers.py b/services/web/server/src/simcore_service_webserver/workspaces/_common/exceptions_handlers.py index aa11ad4afe4e..5c29a4f7d9de 100644 --- a/services/web/server/src/simcore_service_webserver/workspaces/_common/exceptions_handlers.py +++ b/services/web/server/src/simcore_service_webserver/workspaces/_common/exceptions_handlers.py @@ -36,7 +36,7 @@ WorkspaceNotFoundError: HttpErrorInfo( status.HTTP_404_NOT_FOUND, user_message( - "The requested workspace could not be found. {reason}", _version=1 + "The requested workspace could not be found: {details}", _version=1 ), ), # Trashing diff --git a/services/web/server/src/simcore_service_webserver/workspaces/_groups_service.py b/services/web/server/src/simcore_service_webserver/workspaces/_groups_service.py index b21021f2ff58..18fbc8bc9b88 100644 --- a/services/web/server/src/simcore_service_webserver/workspaces/_groups_service.py +++ b/services/web/server/src/simcore_service_webserver/workspaces/_groups_service.py @@ -134,14 +134,14 @@ async def update_workspace_group( ) if workspace.my_access_rights.write is False: raise WorkspaceAccessForbiddenError( - reason=f"User does not have write access to workspace {workspace_id}" + details=f"User does not have write access to workspace {workspace_id}" ) if workspace.owner_primary_gid == group_id: user: dict = await users_service.get_user(app, user_id) if user["primary_gid"] != workspace.owner_primary_gid: # Only the owner of the workspace can modify the owner group raise WorkspaceAccessForbiddenError( - reason=f"User does not have access to modify owner workspace group in workspace {workspace_id}" + details=f"User does not have access to modify owner workspace group in workspace {workspace_id}" ) workspace_group_db: WorkspaceGroupGetDB = ( @@ -180,7 +180,7 @@ async def delete_workspace_group( ) if user["primary_gid"] != group_id and workspace.my_access_rights.delete is False: raise WorkspaceAccessForbiddenError( - reason=f"User does not have delete access to workspace {workspace_id}" + details=f"User does not have delete access to workspace {workspace_id}" ) if ( workspace.owner_primary_gid == group_id @@ -188,7 +188,7 @@ async def delete_workspace_group( ): # Only the owner of the workspace can delete the owner group raise WorkspaceAccessForbiddenError( - reason=f"User does not have access to modify owner workspace group in workspace {workspace_id}" + details=f"User does not have access to modify owner workspace group in workspace {workspace_id}" ) await workspaces_groups_db.delete_workspace_group( diff --git a/services/web/server/src/simcore_service_webserver/workspaces/_trash_service.py b/services/web/server/src/simcore_service_webserver/workspaces/_trash_service.py index 18c70c328533..10996802c520 100644 --- a/services/web/server/src/simcore_service_webserver/workspaces/_trash_service.py +++ b/services/web/server/src/simcore_service_webserver/workspaces/_trash_service.py @@ -269,7 +269,7 @@ async def delete_trashed_workspace( raise WorkspaceNotTrashedError( workspace_id=workspace_id, user_id=user_id, - reason="Cannot delete trashed workspace since it does not fit current criteria", + details="Cannot delete trashed workspace since it does not fit current criteria", ) # NOTE: this function deletes workspace AND its content recursively! diff --git a/services/web/server/src/simcore_service_webserver/workspaces/_workspaces_repository.py b/services/web/server/src/simcore_service_webserver/workspaces/_workspaces_repository.py index b08e86284e7b..58e26416c12a 100644 --- a/services/web/server/src/simcore_service_webserver/workspaces/_workspaces_repository.py +++ b/services/web/server/src/simcore_service_webserver/workspaces/_workspaces_repository.py @@ -196,7 +196,7 @@ async def get_workspace_for_user( row = result.one_or_none() if row is None: raise WorkspaceAccessForbiddenError( - reason=f"User {user_id} does not have access to the workspace {workspace_id}. Or workspace does not exist.", + details=f"User {user_id} does not have access to the workspace {workspace_id}. Or workspace does not exist.", ) return UserWorkspaceWithAccessRights.model_validate(row) @@ -217,7 +217,7 @@ async def get_workspace_db_get( ) row = result.one_or_none() if row is None: - raise WorkspaceNotFoundError(reason=f"Workspace {workspace_id} not found.") + raise WorkspaceNotFoundError(details=f"Workspace {workspace_id} not found.") return WorkspaceDBGet.model_validate(row) @@ -247,7 +247,7 @@ async def update_workspace( ) row = await result.first() if row is None: - raise WorkspaceNotFoundError(reason=f"Workspace {workspace_id} not found.") + raise WorkspaceNotFoundError(details=f"Workspace {workspace_id} not found.") return Workspace.model_validate(row) diff --git a/services/web/server/src/simcore_service_webserver/workspaces/errors.py b/services/web/server/src/simcore_service_webserver/workspaces/errors.py index 66991deaaef9..0af34814670f 100644 --- a/services/web/server/src/simcore_service_webserver/workspaces/errors.py +++ b/services/web/server/src/simcore_service_webserver/workspaces/errors.py @@ -8,11 +8,11 @@ class WorkspacesRuntimeError(WebServerBaseError, RuntimeError): ... class WorkspaceNotFoundError(WorkspacesValueError): - msg_template = "Workspace not found. {reason}" + msg_template = "Workspace not found: {details}" class WorkspaceAccessForbiddenError(WorkspacesValueError): - msg_template = "Workspace access forbidden. {reason}" + msg_template = "Workspace access forbidden: {details}" class WorkspaceBatchDeleteError(WorkspacesValueError): @@ -31,4 +31,4 @@ class WorkspaceFolderInconsistencyError(WorkspacesValueError): class WorkspaceNotTrashedError(WorkspacesRuntimeError): - msg_template = "Cannot delete workspace {workspace_id} since it was not trashed first: {reason}" + msg_template = "Cannot delete workspace {workspace_id} since it was not trashed first: {details}"