diff --git a/src/backend/base/langflow/api/v1/flows.py b/src/backend/base/langflow/api/v1/flows.py index 914a52740..08957e502 100644 --- a/src/backend/base/langflow/api/v1/flows.py +++ b/src/backend/base/langflow/api/v1/flows.py @@ -19,7 +19,6 @@ from langflow.services.database.models.folder.model import Folder from langflow.services.database.models.user.model import User from langflow.services.deps import get_session, get_settings_service from langflow.services.settings.service import SettingsService -from langflow.utils.util import utc_now # build router router = APIRouter(prefix="/flows", tags=["Flows"]) @@ -53,7 +52,7 @@ def create_flow( flow.name = f"{flow.name} (1)" db_flow = Flow.model_validate(flow, from_attributes=True) - db_flow.updated_at = utc_now() + db_flow.updated_at = datetime.now(timezone.utc) if db_flow.folder_id is None: # Make sure flows always have a folder @@ -189,7 +188,7 @@ def update_flow( setattr(db_flow, key, value) webhook_component = get_webhook_component_in_flow(db_flow.data) db_flow.webhook = webhook_component is not None - db_flow.updated_at = utc_now() + db_flow.updated_at = datetime.now(timezone.utc) if db_flow.folder_id is None: default_folder = session.exec(select(Folder).where(Folder.name == DEFAULT_FOLDER_NAME)).first() if default_folder: diff --git a/src/backend/base/langflow/api/v1/schemas.py b/src/backend/base/langflow/api/v1/schemas.py index 1885f0121..093dfd6c0 100644 --- a/src/backend/base/langflow/api/v1/schemas.py +++ b/src/backend/base/langflow/api/v1/schemas.py @@ -14,7 +14,6 @@ from langflow.services.database.models.api_key.model import ApiKeyRead from langflow.services.database.models.base import orjson_dumps from langflow.services.database.models.flow import FlowCreate, FlowRead from langflow.services.database.models.user import UserRead -from langflow.utils.util import utc_now class BuildStatus(Enum): @@ -264,7 +263,7 @@ class VertexBuildResponse(BaseModel): """JSON string of the params.""" data: ResultDataResponse """Mapping of vertex ids to result dict containing the param name and result value.""" - timestamp: Optional[datetime] = Field(default_factory=lambda: utc_now()) + timestamp: Optional[datetime] = Field(default_factory=lambda: datetime.now(timezone.utc)) """Timestamp of the build.""" diff --git a/src/backend/base/langflow/api/v1/variable.py b/src/backend/base/langflow/api/v1/variable.py index dd6d4fa44..f992c1429 100644 --- a/src/backend/base/langflow/api/v1/variable.py +++ b/src/backend/base/langflow/api/v1/variable.py @@ -9,7 +9,6 @@ from langflow.services.auth.utils import get_current_active_user from langflow.services.database.models.user.model import User from langflow.services.database.models.variable import Variable, VariableCreate, VariableRead, VariableUpdate from langflow.services.deps import get_session, get_settings_service -from langflow.utils.util import utc_now router = APIRouter(prefix="/variables", tags=["Variables"]) @@ -90,7 +89,7 @@ def update_variable( variable_data = variable.model_dump(exclude_unset=True) for key, value in variable_data.items(): setattr(db_variable, key, value) - db_variable.updated_at = utc_now() + db_variable.updated_at = datetime.now(timezone.utc) session.commit() session.refresh(db_variable) return db_variable diff --git a/src/backend/base/langflow/schema/message.py b/src/backend/base/langflow/schema/message.py index fd7c17a1f..706d337aa 100644 --- a/src/backend/base/langflow/schema/message.py +++ b/src/backend/base/langflow/schema/message.py @@ -9,6 +9,7 @@ from pydantic import BeforeValidator, ConfigDict, Field, field_serializer from langflow.schema.data import Data from langflow.schema.image import Image, get_file_paths, is_image_file + def _timestamp_to_str(timestamp: datetime) -> str: return timestamp.strftime("%Y-%m-%d %H:%M:%S") @@ -40,7 +41,7 @@ class Message(Data): self, ) -> BaseMessage: """ - Converts the Data into a BaseMessage. + Converts the Data to a BaseMessage. Returns: BaseMessage: The converted BaseMessage. diff --git a/src/backend/base/langflow/services/auth/utils.py b/src/backend/base/langflow/services/auth/utils.py index 5637617b3..d0ece7562 100644 --- a/src/backend/base/langflow/services/auth/utils.py +++ b/src/backend/base/langflow/services/auth/utils.py @@ -16,8 +16,6 @@ from langflow.services.database.models.api_key.model import ApiKey from langflow.services.database.models.user.crud import get_user_by_id, get_user_by_username, update_user_last_login_at from langflow.services.database.models.user.model import User from langflow.services.deps import get_session, get_settings_service -from langflow.utils.util import utc_now - oauth2_login = OAuth2PasswordBearer(tokenUrl="api/v1/login", auto_error=False) @@ -114,7 +112,7 @@ async def get_current_user_by_jwt( token_type: str = payload.get("type") if expires := payload.get("exp", None): expires_datetime = datetime.fromtimestamp(expires, timezone.utc) - if utc_now() > expires_datetime: + if datetime.now(timezone.utc) > expires_datetime: logger.info("Token expired for user") raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, @@ -191,7 +189,7 @@ def create_token(data: dict, expires_delta: timedelta): settings_service = get_settings_service() to_encode = data.copy() - expire = utc_now() + expires_delta + expire = datetime.now(timezone.utc) + expires_delta to_encode["exp"] = expire return jwt.encode( 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 8ab754ec6..157b08b32 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 @@ -5,13 +5,14 @@ from uuid import UUID, uuid4 from pydantic import field_validator from sqlmodel import Column, DateTime, Field, Relationship, SQLModel, func -from langflow.utils.util import utc_now - - if TYPE_CHECKING: from langflow.services.database.models.user import User +def utc_now(): + return datetime.now(timezone.utc) + + class ApiKeyBase(SQLModel): name: Optional[str] = Field(index=True, nullable=True, default=None) last_used_at: Optional[datetime] = Field(default=None, nullable=True) diff --git a/src/backend/base/langflow/services/database/models/flow/model.py b/src/backend/base/langflow/services/database/models/flow/model.py index 1e524dc52..624ea0543 100644 --- a/src/backend/base/langflow/services/database/models/flow/model.py +++ b/src/backend/base/langflow/services/database/models/flow/model.py @@ -14,7 +14,6 @@ from sqlalchemy import UniqueConstraint from sqlmodel import JSON, Column, Field, Relationship, SQLModel from langflow.schema import Data -from langflow.utils.util import utc_now if TYPE_CHECKING: from langflow.services.database.models.folder import Folder @@ -28,7 +27,7 @@ class FlowBase(SQLModel): icon_bg_color: Optional[str] = Field(default=None, nullable=True) data: Optional[Dict] = Field(default=None, nullable=True) is_component: Optional[bool] = Field(default=False, nullable=True) - updated_at: Optional[datetime] = Field(default_factory=lambda: utc_now(), nullable=True) + updated_at: Optional[datetime] = Field(default_factory=lambda: datetime.now(timezone.utc), nullable=True) webhook: Optional[bool] = Field(default=False, nullable=True, description="Can be used on the webhook endpoint") endpoint_name: Optional[str] = Field(default=None, nullable=True, index=True) diff --git a/src/backend/base/langflow/services/database/models/user/crud.py b/src/backend/base/langflow/services/database/models/user/crud.py index cbf91d8b0..5a948815e 100644 --- a/src/backend/base/langflow/services/database/models/user/crud.py +++ b/src/backend/base/langflow/services/database/models/user/crud.py @@ -9,7 +9,6 @@ from sqlmodel import Session, select from langflow.services.database.models.user.model import User, UserUpdate from langflow.services.deps import get_session -from langflow.utils.util import utc_now def get_user_by_username(db: Session, username: str) -> Union[User, None]: @@ -38,7 +37,7 @@ def update_user(user_db: Optional[User], user: UserUpdate, db: Session = Depends if not changed: raise HTTPException(status_code=status.HTTP_304_NOT_MODIFIED, detail="Nothing to update") - user_db.updated_at = utc_now() + user_db.updated_at = datetime.now(timezone.utc) flag_modified(user_db, "updated_at") try: @@ -52,7 +51,7 @@ def update_user(user_db: Optional[User], user: UserUpdate, db: Session = Depends def update_user_last_login_at(user_id: UUID, db: Session = Depends(get_session)): try: - user_data = UserUpdate(last_login_at=utc_now()) # type: ignore + user_data = UserUpdate(last_login_at=datetime.now(timezone.utc)) # type: ignore user = get_user_by_id(db, user_id) return update_user(user, user_data, db) except Exception: diff --git a/src/backend/base/langflow/services/database/models/user/model.py b/src/backend/base/langflow/services/database/models/user/model.py index 721ec3d87..dfc978c27 100644 --- a/src/backend/base/langflow/services/database/models/user/model.py +++ b/src/backend/base/langflow/services/database/models/user/model.py @@ -4,8 +4,6 @@ from uuid import UUID, uuid4 from sqlmodel import Field, Relationship, SQLModel -from langflow.utils.util import utc_now - if TYPE_CHECKING: from langflow.services.database.models.api_key import ApiKey from langflow.services.database.models.variable import Variable @@ -20,8 +18,8 @@ class User(SQLModel, table=True): profile_image: Optional[str] = Field(default=None, nullable=True) is_active: bool = Field(default=False) is_superuser: bool = Field(default=False) - create_at: datetime = Field(default_factory=lambda: utc_now()) - updated_at: datetime = Field(default_factory=lambda: utc_now()) + create_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc)) + updated_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc)) last_login_at: Optional[datetime] = Field(default=None, nullable=True) api_keys: list["ApiKey"] = Relationship( back_populates="user", diff --git a/src/backend/base/langflow/services/database/models/variable/model.py b/src/backend/base/langflow/services/database/models/variable/model.py index c32944ca2..1344dc9c3 100644 --- a/src/backend/base/langflow/services/database/models/variable/model.py +++ b/src/backend/base/langflow/services/database/models/variable/model.py @@ -4,13 +4,14 @@ from uuid import UUID, uuid4 from sqlmodel import JSON, Column, DateTime, Field, Relationship, SQLModel, func -from langflow.utils.util import utc_now - - if TYPE_CHECKING: from langflow.services.database.models.user.model import User +def utc_now(): + return datetime.now(timezone.utc) + + class VariableBase(SQLModel): name: str = Field(description="Name of the variable") value: str = Field(description="Encrypted value of the variable") diff --git a/src/backend/base/langflow/utils/util.py b/src/backend/base/langflow/utils/util.py index c8d4b2ea6..d58fdc4f8 100644 --- a/src/backend/base/langflow/utils/util.py +++ b/src/backend/base/langflow/utils/util.py @@ -4,7 +4,6 @@ import re from functools import wraps from pathlib import Path from typing import Any, Dict, List, Optional, Union -from datetime import datetime, timezone from docstring_parser import parse @@ -15,13 +14,6 @@ from langflow.utils import constants from langflow.utils.logger import logger - -def utc_now(stringify=False): - if stringify: - return datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S") - return datetime.now(timezone.utc) - - def unescape_string(s: str): # Replace escaped new line characters with actual new line characters return s.replace("\\n", "\n")