import typing as ty
from pydantic import BaseModel, Field, RootModel
from ipyautoui import AutoUi
class DataFrameCols(BaseModel):
str = Field("string", column_width=100)
string: int = Field(1, column_width=80)
integer: float = Field(3.1415, column_width=70, global_decimal_places=3)
floater: float = Field(324, column_width=100)
something_else: str] = None
nullable_string: ty.Optional[
class TestDataFrame(BaseModel):
"""a description of TestDataFrame"""
str
a: = Field([DataFrameCols().model_dump(mode="json")], format="dataframe") df: ty.List[DataFrameCols]
EditGrid
from ipyautoui.custom.editgrid import EditGrid
class TestDataFrame(RootModel):
"""a description of TestDataFrame"""
= Field(format="dataframe")
root: ty.List[DataFrameCols] = EditGrid(schema=TestDataFrame)
egrid egrid
= [
egrid.value
{"string": "important string",
"integer": 1,
"floater": 3.14,
"something_else": 324,
},"string": "update", "integer": 4, "floater": 3.12344, "something_else": 123},
{"string": "evening", "integer": 5, "floater": 3.14, "something_else": 235},
{"string": "morning", "integer": 5, "floater": 3.14, "something_else": 12},
{"string": "number", "integer": 3, "floater": 3.14, "something_else": 123},
{ ]
from pydantic import RootModel
# Test: EditGrid instance with multi-indexing.
= [
AUTO_GRID_DEFAULT_VALUE
{"string": "important string",
"integer": 1,
"floater": 3.14,
},
]= AUTO_GRID_DEFAULT_VALUE * 4
AUTO_GRID_DEFAULT_VALUE = AUTO_GRID_DEFAULT_VALUE + [
AUTO_GRID_DEFAULT_VALUE
{"string": None,
"integer": None,
"floater": None,
},
]
class DataFrameCols(BaseModel):
str] = Field(
string: ty.Optional["string", json_schema_extra=dict(column_width=400, section="a")
)int] = Field(
integer: ty.Optional[1, json_schema_extra=dict(column_width=80, section="a")
)float] = Field(
floater: ty.Optional[None, json_schema_extra=dict(column_width=70, section="b")
)
class TestDataFrame(RootModel):
"""a description of TestDataFrame"""
= Field(
root: ty.List[DataFrameCols] =AUTO_GRID_DEFAULT_VALUE,
default=dict(
json_schema_extraformat="dataframe", datagrid_index_name=("section", "title")
),
)
= "The Wonderful Edit Grid Application"
title = "Useful for all editing purposes whatever they may be đ"
description = EditGrid(
editgrid =TestDataFrame,
schema=title,
title=description,
description=None,
ui_add=None,
ui_edit=True,
warn_on_delete=False,
show_copy_dialogue=False,
close_crud_dialogue_on_action=1,
global_decimal_places={"String": 400},
column_width
)lambda c: print("_value changed"), "_value")
editgrid.observe( display(editgrid)
class TestProperties(BaseModel):
str
string: str] = None
nullable_string: ty.Optional[float = 1.5
floater: int = 1
inty:
class TestGridSchema(RootModel):
"""no default"""
= Field(
root: ty.List[TestProperties] ="string").model_dump()],
[TestProperties(string
)
= EditGrid(
egrid =TestGridSchema,
schema=[{"string": "test2","nullable_string":None, "floater": 2.2, "inty": 1}],
value
) egrid
from ipyautoui.autoobject import AutoObjectForm
from ipyautoui.demo_schemas import CoreIpywidgets
= AutoObjectForm.from_pydantic_model(CoreIpywidgets)
ui ui
# Row Validation (WIP)
from pydantic import RootModel
class Sub(BaseModel):
str = "a"
a: int = 1
b:
class Table(RootModel):
list[Sub]
root:
class NestedTable(BaseModel):
list[Sub]
table:
# for simple root tables it is simple to extract the pydantic model for the row
= Table.__pydantic_core_schema__["schema"]["items_schema"]["cls"]
RowSchema print(RowSchema)
# more difficult for nested rows
= NestedTable.__pydantic_core_schema__["schema"]["fields"]["table"][
NestedRowSchema "schema"
"items_schema"]["cls"]
][print(NestedRowSchema)
<class '__main__.Sub'>
<class '__main__.Sub'>