|
|
from enum import Enum |
|
|
|
|
|
from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator |
|
|
|
|
|
VALID_TYPES = ["date", "number", "text", "json", "integer", "int", "float", "str", "string", "boolean"] |
|
|
|
|
|
|
|
|
class FormatterType(str, Enum): |
|
|
date = "date" |
|
|
text = "text" |
|
|
number = "number" |
|
|
json = "json" |
|
|
boolean = "boolean" |
|
|
|
|
|
|
|
|
class Column(BaseModel): |
|
|
model_config = ConfigDict(populate_by_name=True) |
|
|
name: str |
|
|
display_name: str = Field(default="") |
|
|
sortable: bool = Field(default=True) |
|
|
filterable: bool = Field(default=True) |
|
|
formatter: FormatterType | str | None = Field(default=None, alias="type") |
|
|
description: str | None = None |
|
|
default: str | None = None |
|
|
|
|
|
@model_validator(mode="after") |
|
|
def set_display_name(self): |
|
|
if not self.display_name: |
|
|
self.display_name = self.name |
|
|
return self |
|
|
|
|
|
@field_validator("formatter", mode="before") |
|
|
@classmethod |
|
|
def validate_formatter(cls, value): |
|
|
if value in {"integer", "int", "float"}: |
|
|
value = FormatterType.number |
|
|
if value in {"str", "string"}: |
|
|
value = FormatterType.text |
|
|
if value == "dict": |
|
|
value = FormatterType.json |
|
|
if isinstance(value, str): |
|
|
return FormatterType(value) |
|
|
if isinstance(value, FormatterType): |
|
|
return value |
|
|
msg = f"Invalid formatter type: {value}. Valid types are: {FormatterType}" |
|
|
raise ValueError(msg) |
|
|
|
|
|
|
|
|
class TableSchema(BaseModel): |
|
|
columns: list[Column] |
|
|
|