diff --git a/src/backend/base/langflow/alembic/versions/e3bc869fa272_fix_nullable.py b/src/backend/base/langflow/alembic/versions/e3bc869fa272_fix_nullable.py new file mode 100644 index 000000000..594afefa1 --- /dev/null +++ b/src/backend/base/langflow/alembic/versions/e3bc869fa272_fix_nullable.py @@ -0,0 +1,60 @@ +"""Fix nullable + +Revision ID: e3bc869fa272 +Revises: 1a110b568907 +Create Date: 2024-04-10 19:17:22.820455 + +""" +from typing import Sequence, Union + +import sqlalchemy as sa +from alembic import op +from sqlalchemy.dialects import postgresql +from sqlalchemy.engine.reflection import Inspector + +# revision identifiers, used by Alembic. +revision: str = "e3bc869fa272" +down_revision: Union[str, None] = "1a110b568907" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + conn = op.get_bind() + inspector = Inspector.from_engine(conn) # type: ignore + table_names = inspector.get_table_names() + # ### commands auto generated by Alembic - please adjust! ### + if "variable" not in table_names: + return + + column_names = [column["name"] for column in inspector.get_columns("variable")] + + with op.batch_alter_table("variable", schema=None) as batch_op: + if "created_at" in column_names: + batch_op.alter_column( + "created_at", + existing_type=sa.TIMESTAMP(timezone=True), + nullable=True, + existing_server_default=sa.text("now()"), + ) + + # ### end Alembic commands ### + + +def downgrade() -> None: + conn = op.get_bind() + inspector = Inspector.from_engine(conn) # type: ignore + table_names = inspector.get_table_names() + # ### commands auto generated by Alembic - please adjust! ### + if "variable" not in table_names: + return + with op.batch_alter_table("variable", schema=None) as batch_op: + if "created_at" in inspector.get_columns("variable"): + batch_op.alter_column( + "created_at", + existing_type=sa.TIMESTAMP(timezone=True), + nullable=False, + existing_server_default=sa.text("now()"), + ) + + # ### end Alembic commands ### 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 e197ba1e3..c8897098c 100644 --- a/src/backend/base/langflow/services/database/models/variable/model.py +++ b/src/backend/base/langflow/services/database/models/variable/model.py @@ -26,11 +26,11 @@ class Variable(VariableBase, table=True): ) # name is unique per user created_at: datetime = Field( - sa_column=Column(DateTime(timezone=True), server_default=func.now(), nullable=False), + sa_column=Column(DateTime(timezone=True), server_default=func.now(), nullable=True), description="Creation time of the variable", ) updated_at: Optional[datetime] = Field( - sa_column=Column(DateTime(timezone=True)), + sa_column=Column(DateTime(timezone=True), nullable=True), description="Last update time of the variable", ) # foreign key to user table @@ -39,7 +39,9 @@ class Variable(VariableBase, table=True): class VariableCreate(VariableBase): - type: Optional[str] = Field(None, description="Type of the variable") + created_at: Optional[datetime] = Field(default_factory=utc_now, description="Creation time of the variable") + + updated_at: Optional[datetime] = Field(default_factory=utc_now, description="Creation time of the variable") class VariableRead(SQLModel): diff --git a/src/backend/base/langflow/services/variable/service.py b/src/backend/base/langflow/services/variable/service.py index fb2d346fe..ef23a95a2 100644 --- a/src/backend/base/langflow/services/variable/service.py +++ b/src/backend/base/langflow/services/variable/service.py @@ -3,13 +3,14 @@ from typing import TYPE_CHECKING, Optional, Union from uuid import UUID from fastapi import Depends -from langflow.services.auth import utils as auth_utils -from langflow.services.base import Service -from langflow.services.database.models.variable.model import Variable -from langflow.services.deps import get_session from loguru import logger from sqlmodel import Session, select +from langflow.services.auth import utils as auth_utils +from langflow.services.base import Service +from langflow.services.database.models.variable.model import Variable, VariableCreate +from langflow.services.deps import get_session + if TYPE_CHECKING: from langflow.services.settings.service import SettingsService @@ -93,14 +94,13 @@ class VariableService(Service): _type: str = "Generic", session: Session = Depends(get_session), ): - variable = Variable( - user_id=user_id, + variable_base = VariableCreate( name=name, type=_type, value=auth_utils.encrypt_api_key(value, settings_service=self.settings_service), ) + variable = Variable.model_validate(variable_base, from_attributes=True, update={"user_id": user_id}) session.add(variable) session.commit() session.refresh(variable) return variable - return variable