refactor: Add BaseInputMixin for common input field attributes and methods
This commit adds the `BaseInputMixin` class to the `input_mixin.py` file. The `BaseInputMixin` provides common input field attributes and methods for input fields in the codebase. This mixin includes attributes such as `field_type`, `required`, `placeholder`, `show`, `value`, `name`, `display_name`, `advanced`, `input_types`, `dynamic`, `info`, `real_time_refresh`, `refresh_button`, `refresh_button_text`, and `title_case`. The mixin also includes a `to_dict` method for converting the input field to a dictionary representation. This addition improves the organization and reusability of the codebase.
This commit is contained in:
parent
3224227f58
commit
edbdce7531
1 changed files with 114 additions and 0 deletions
114
src/backend/base/langflow/template/field/input_mixin.py
Normal file
114
src/backend/base/langflow/template/field/input_mixin.py
Normal file
|
|
@ -0,0 +1,114 @@
|
|||
from enum import Enum
|
||||
from typing import Any, Optional
|
||||
|
||||
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
||||
|
||||
from langflow.field_typing.range_spec import RangeSpec
|
||||
|
||||
|
||||
class FieldTypes(str, Enum):
|
||||
TEXT = "str"
|
||||
INTEGER = "int"
|
||||
PASSWORD = "SecretStr"
|
||||
FLOAT = "float"
|
||||
BOOLEAN = "bool"
|
||||
DICT = "dict"
|
||||
NESTED_DICT = "NestedDict"
|
||||
FILE = "file"
|
||||
PROMPT = "Prompt"
|
||||
|
||||
|
||||
# Base mixin for common input field attributes and methods
|
||||
class BaseInputMixin(BaseModel):
|
||||
model_config = ConfigDict(arbitrary_types_allowed=True)
|
||||
|
||||
field_type: Optional[FieldTypes] = Field(default=FieldTypes.TEXT)
|
||||
|
||||
required: bool = False
|
||||
"""Specifies if the field is required. Defaults to False."""
|
||||
|
||||
placeholder: str = ""
|
||||
"""A placeholder string for the field. Default is an empty string."""
|
||||
|
||||
show: bool = True
|
||||
"""Should the field be shown. Defaults to True."""
|
||||
|
||||
value: Any = None
|
||||
"""The value of the field. Default is None."""
|
||||
|
||||
name: Optional[str] = None
|
||||
"""Name of the field. Default is an empty string."""
|
||||
|
||||
display_name: Optional[str] = None
|
||||
"""Display name of the field. Defaults to None."""
|
||||
|
||||
advanced: bool = False
|
||||
"""Specifies if the field will an advanced parameter (hidden). Defaults to False."""
|
||||
|
||||
input_types: Optional[list[str]] = None
|
||||
"""List of input types for the handle when the field has more than one type. Default is an empty list."""
|
||||
|
||||
dynamic: bool = False
|
||||
"""Specifies if the field is dynamic. Defaults to False."""
|
||||
|
||||
info: Optional[str] = ""
|
||||
"""Additional information about the field to be shown in the tooltip. Defaults to an empty string."""
|
||||
|
||||
real_time_refresh: Optional[bool] = None
|
||||
"""Specifies if the field should have real time refresh. `refresh_button` must be False. Defaults to None."""
|
||||
|
||||
refresh_button: Optional[bool] = None
|
||||
"""Specifies if the field should have a refresh button. Defaults to False."""
|
||||
refresh_button_text: Optional[str] = None
|
||||
"""Specifies the text for the refresh button. Defaults to None."""
|
||||
|
||||
title_case: bool = False
|
||||
"""Specifies if the field should be displayed in title case. Defaults to True."""
|
||||
|
||||
def to_dict(self):
|
||||
return self.model_dump(exclude_none=True)
|
||||
|
||||
@field_validator("field_type", mode="before")
|
||||
@classmethod
|
||||
def validate_field_type(cls, v):
|
||||
if v not in FieldTypes:
|
||||
raise ValueError(f"field_type must be one of {FieldTypes}")
|
||||
return FieldTypes(v)
|
||||
|
||||
|
||||
# Mixin for input fields that can be listable
|
||||
class ListableInputMixin(BaseModel):
|
||||
is_list: bool = Field(default=False)
|
||||
|
||||
|
||||
# Specific mixin for fields needing database interaction
|
||||
class DatabaseLoadMixin(BaseModel):
|
||||
load_from_db: bool = Field(default=False)
|
||||
|
||||
|
||||
# Specific mixin for fields needing file interaction
|
||||
class FileMixin(BaseModel):
|
||||
file_path: Optional[str] = Field(default="")
|
||||
file_types: list[str] = Field(default=[], serialization_alias="fileTypes")
|
||||
|
||||
@field_validator("file_types")
|
||||
@classmethod
|
||||
def validate_file_types(cls, v):
|
||||
if not isinstance(v, list):
|
||||
raise ValueError("file_types must be a list")
|
||||
# types should be a list of extensions without the dot
|
||||
for file_type in v:
|
||||
if not isinstance(file_type, str):
|
||||
raise ValueError("file_types must be a list of strings")
|
||||
if file_type.startswith("."):
|
||||
raise ValueError("file_types should not start with a dot")
|
||||
return v
|
||||
|
||||
|
||||
class RangeMixin(BaseModel):
|
||||
range_spec: Optional[RangeSpec] = None
|
||||
|
||||
|
||||
class DropDownMixin(BaseModel):
|
||||
options: Optional[list[str]] = None
|
||||
"""List of options for the field. Only used when is_list=True. Default is an empty list."""
|
||||
Loading…
Add table
Add a link
Reference in a new issue