diff --git a/src/backend/base/langflow/services/database/models/api_key/model.py b/src/backend/base/langflow/services/database/models/api_key/model.py index be4e3ed4d..cb216d9ae 100644 --- a/src/backend/base/langflow/services/database/models/api_key/model.py +++ b/src/backend/base/langflow/services/database/models/api_key/model.py @@ -2,7 +2,7 @@ from datetime import datetime, timezone from typing import TYPE_CHECKING, Optional from uuid import UUID, uuid4 -from pydantic import field_validator, validator +from pydantic import field_validator from sqlmodel import Column, DateTime, Field, Relationship, SQLModel, func if TYPE_CHECKING: @@ -40,6 +40,7 @@ class ApiKeyCreate(ApiKeyBase): created_at: Optional[datetime] = Field(default_factory=utc_now) @field_validator("created_at", mode="before") + @classmethod def set_created_at(cls, v): return v or utc_now() @@ -52,10 +53,11 @@ class UnmaskedApiKeyRead(ApiKeyBase): class ApiKeyRead(ApiKeyBase): id: UUID - api_key: str = Field() + api_key: str = Field(schema_extra={"validate_default": True}) user_id: UUID = Field() - @validator("api_key", always=True) + @field_validator("api_key") + @classmethod def mask_api_key(cls, v): # This validator will always run, and will mask the API key return f"{v[:8]}{'*' * (len(v) - 8)}" diff --git a/src/backend/base/langflow/services/settings/auth.py b/src/backend/base/langflow/services/settings/auth.py index 103c96a40..0ea3c237e 100644 --- a/src/backend/base/langflow/services/settings/auth.py +++ b/src/backend/base/langflow/services/settings/auth.py @@ -4,7 +4,7 @@ from typing import Literal from loguru import logger from passlib.context import CryptContext -from pydantic import Field, SecretStr, validator +from pydantic import Field, SecretStr, field_validator from pydantic_settings import BaseSettings from langflow.services.settings.constants import DEFAULT_SUPERUSER, DEFAULT_SUPERUSER_PASSWORD @@ -62,23 +62,25 @@ class AuthSettings(BaseSettings): # the default values # so we need to validate the superuser and superuser_password # fields - @validator("SUPERUSER", "SUPERUSER_PASSWORD", pre=True) - def validate_superuser(cls, value, values): - if values.get("AUTO_LOGIN"): + @field_validator("SUPERUSER", "SUPERUSER_PASSWORD", mode="before") + @classmethod + def validate_superuser(cls, value, info): + if info.data.get("AUTO_LOGIN"): if value != DEFAULT_SUPERUSER: value = DEFAULT_SUPERUSER logger.debug("Resetting superuser to default value") - if values.get("SUPERUSER_PASSWORD") != DEFAULT_SUPERUSER_PASSWORD: - values["SUPERUSER_PASSWORD"] = DEFAULT_SUPERUSER_PASSWORD + if info.data.get("SUPERUSER_PASSWORD") != DEFAULT_SUPERUSER_PASSWORD: + info.data["SUPERUSER_PASSWORD"] = DEFAULT_SUPERUSER_PASSWORD logger.debug("Resetting superuser password to default value") return value return value - @validator("SECRET_KEY", pre=True) - def get_secret_key(cls, value, values): - config_dir = values.get("CONFIG_DIR") + @field_validator("SECRET_KEY", mode="before") + @classmethod + def get_secret_key(cls, value, info): + config_dir = info.data.get("CONFIG_DIR") if not config_dir: logger.debug("No CONFIG_DIR provided, not saving secret key") diff --git a/src/backend/base/langflow/services/store/schema.py b/src/backend/base/langflow/services/store/schema.py index 0fe89de18..0c37e1166 100644 --- a/src/backend/base/langflow/services/store/schema.py +++ b/src/backend/base/langflow/services/store/schema.py @@ -1,7 +1,7 @@ from typing import List, Optional from uuid import UUID -from pydantic import BaseModel, validator +from pydantic import BaseModel, field_validator class TagResponse(BaseModel): @@ -37,7 +37,8 @@ class ListComponentResponse(BaseModel): private: Optional[bool] = None # tags comes as a TagsIdResponse but we want to return a list of TagResponse - @validator("tags", pre=True) + @field_validator("tags", mode="before") + @classmethod def tags_to_list(cls, v): # Check if all values are have id and name # if so, return v else transform to TagResponse