From db38f914a893dff2b5a23039d56d99a48e5bab06 Mon Sep 17 00:00:00 2001 From: Kraiem Taha Yassine Date: Mon, 18 Nov 2024 16:15:27 +0100 Subject: [PATCH] Dev (#2758) * fix(chalice): fixed Math-operators validation refactor(chalice): search for sessions that have events for heatmaps * refactor(chalice): search for sessions that have at least 1 location event for heatmaps * fix(chalice): fixed Math-operators validation refactor(chalice): search for sessions that have events for heatmaps * refactor(chalice): search for sessions that have at least 1 location event for heatmaps * feat(chalice): autocomplete return top 10 with stats * fix(chalice): fixed autocomplete top 10 meta-filters * fix(chalice): support special characters for name feat(chalice): return parsable error for alphanumeric exceptions resolve #2713 --- api/or_dependencies.py | 4 ++++ api/schemas/schemas.py | 16 ++++++++++------ api/schemas/transformers_validators.py | 13 +++++++++++-- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/api/or_dependencies.py b/api/or_dependencies.py index 828d0f1d5..18070d2f8 100644 --- a/api/or_dependencies.py +++ b/api/or_dependencies.py @@ -36,6 +36,10 @@ class ORRoute(APIRoute): # 422 validation exception logger.warning(f"!!! 422 exception when calling: {request.method} {request.url}") logger.warning(exc.errors()) + for e in exc.errors(): + if e.get("msg", "").endswith("must be alphanumeric"): + return JSONResponse(status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, + content={"errors": [e["msg"][18:]], "detail": str(exc)}) raise exc except HTTPException as e: if e.status_code // 100 == 4: diff --git a/api/schemas/schemas.py b/api/schemas/schemas.py index a203748fd..9dd659c5c 100644 --- a/api/schemas/schemas.py +++ b/api/schemas/schemas.py @@ -8,7 +8,7 @@ from pydantic.functional_validators import BeforeValidator from chalicelib.utils.TimeUTC import TimeUTC from .overrides import BaseModel, Enum, ORUnion from .transformers_validators import transform_email, remove_whitespace, remove_duplicate_values, single_to_list, \ - force_is_event, NAME_PATTERN, int_to_string + force_is_event, NAME_PATTERN, int_to_string, check_alphanumeric def transform_old_filter_type(cls, values): @@ -76,20 +76,23 @@ class UserLoginSchema(_GRecaptcha): class UserSignupSchema(UserLoginSchema): - fullname: str = Field(..., min_length=1, pattern=NAME_PATTERN) - organizationName: str = Field(..., min_length=1, pattern=NAME_PATTERN) + fullname: str = Field(..., min_length=1) + organizationName: str = Field(..., min_length=1) _transform_fullname = field_validator('fullname', mode='before')(remove_whitespace) _transform_organizationName = field_validator('organizationName', mode='before')(remove_whitespace) + _check_alphanumeric = field_validator('fullname', 'organizationName')(check_alphanumeric) + class EditAccountSchema(BaseModel): - name: Optional[str] = Field(default=None, pattern=NAME_PATTERN) - tenantName: Optional[str] = Field(default=None, pattern=NAME_PATTERN) + name: Optional[str] = Field(default=None) + tenantName: Optional[str] = Field(default=None) opt_out: Optional[bool] = Field(default=None) _transform_name = field_validator('name', mode='before')(remove_whitespace) _transform_tenantName = field_validator('tenantName', mode='before')(remove_whitespace) + _check_alphanumeric = field_validator('name', 'tenantName')(check_alphanumeric) class ForgetPasswordPayloadSchema(_GRecaptcha): @@ -226,12 +229,13 @@ class CreateMemberSchema(BaseModel): class EditMemberSchema(BaseModel): - name: str = Field(..., pattern=NAME_PATTERN) + name: str = Field(...) email: EmailStr = Field(...) admin: bool = Field(default=False) _transform_email = field_validator('email', mode='before')(transform_email) _transform_name = field_validator('name', mode='before')(remove_whitespace) + _check_alphanumeric = field_validator('name')(check_alphanumeric) class EditPasswordByInvitationSchema(BaseModel): diff --git a/api/schemas/transformers_validators.py b/api/schemas/transformers_validators.py index 1f9d041df..e50371aa4 100644 --- a/api/schemas/transformers_validators.py +++ b/api/schemas/transformers_validators.py @@ -1,7 +1,9 @@ -from .overrides import Enum - from typing import Union, Any, Type +from pydantic import ValidationInfo + +from .overrides import Enum + NAME_PATTERN = r"^[a-z,A-Z,0-9,\-,é,è,à,ç, ,|,&,\/,\\,_,.,#]*$" @@ -45,3 +47,10 @@ def force_is_event(events_enum: list[Type[Enum]]): return value return fn + + +def check_alphanumeric(v: str, info: ValidationInfo) -> str: + if isinstance(v, str): + is_alphanumeric = v.replace(' ', '').isalnum() + assert is_alphanumeric, f'{info.field_name} must be alphanumeric' + return v