Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 0 additions & 4 deletions src/ipyautoui/automapschema.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,10 +91,6 @@ def _init_model_schema(
return model, schema


def pydantic_validate(model, value):
return model.model_validate(value).model_dump(mode="json")


def is_allowed_type(di: dict) -> bool:
# https://json-schema.org/understanding-json-schema/reference/combining.html
if "anyOf" in di:
Expand Down
2 changes: 0 additions & 2 deletions src/ipyautoui/autoui.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,7 @@
get_widgets_map,
get_containers_map,
map_widget,
widgetcaller,
_init_model_schema,
pydantic_validate,
)

logger = logging.getLogger(__name__)
Expand Down
10 changes: 4 additions & 6 deletions src/ipyautoui/custom/autogrid.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,12 @@
defines AutoGrid, a datagrid generated from a jsonschema."""

import typing as ty
from copy import deepcopy
import logging
import pandas as pd

import traitlets as tr
from pydantic import BaseModel, Field
from ipydatagrid import CellRenderer, DataGrid, TextRenderer, VegaExpr
from ipydatagrid.datagrid import SelectionHelper
from ipydatagrid import CellRenderer, TextRenderer

from ipyautoui.custom.datagrid import DataGrid
import ipyautoui.automapschema as asch
Expand Down Expand Up @@ -60,7 +58,7 @@ def get_default_row_data_from_schema_properties(
Returns:
dict: dictionary column values
"""
get = lambda k, v: v["default"] if "default" in v.keys() else None
def get(k, v): return v["default"] if "default" in v.keys() else None
di = {k: get(k, v) for k, v in properties.items()}
return {k: v for k, v in di.items()}

Expand Down Expand Up @@ -131,7 +129,7 @@ def get_global_renderer_from_schema(
if renderer_name in kwargs:
return kwargs[renderer_name]

get_from_schema = lambda r, schema: schema[r] if r in schema.keys() else None
def get_from_schema(r, schema): return schema[r] if r in schema.keys() else None
_ = get_from_schema(renderer_name, schema)

if _ is not None:
Expand All @@ -144,7 +142,7 @@ def get_global_renderers_from_schema(schema, **kwargs) -> dict:
li_renderers = ["default_renderer", "header_renderer", "corner_renderer"]
# ^ globally specified ipydatagrid renderers
renderers = {
l: get_global_renderer_from_schema(schema, l, **kwargs) for l in li_renderers
x: get_global_renderer_from_schema(schema, x, **kwargs) for x in li_renderers
}
return {k: v for k, v in renderers.items() if v is not None}

Expand Down
7 changes: 1 addition & 6 deletions src/ipyautoui/custom/datagrid.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,6 @@
import logging
from copy import deepcopy

import pandas as pd
import traitlets as tr

from ipydatagrid import CellRenderer, DataGrid, TextRenderer, VegaExpr
from ipydatagrid.datagrid import SelectionHelper
from ipydatagrid import DataGrid, VegaExpr


class DataGrid(DataGrid):
Expand Down
20 changes: 9 additions & 11 deletions src/ipyautoui/custom/editgrid.py
Original file line number Diff line number Diff line change
Expand Up @@ -328,7 +328,7 @@ def __init__(
# self.show_copy_dialogue = show_copy_dialogue
self.show_copy_dialogue = False
# ^ TODO: delete this when that functionality is added
self._set_children_editgrid()
self._set_children()
self._set_datahandler(datahandler=datahandler)
self._update_value_from_grid()

Expand All @@ -344,19 +344,17 @@ def update_from_schema(
ui_io: ty.Optional[ty.Callable] = None,
**kwargs,
):
getvalue = lambda value: (
None if value is None or value == [{}] else pd.DataFrame(value)
)
value = None if value is None or value == [{}] else pd.DataFrame(value)
self.grid.update_from_schema(
schema, data=getvalue(value), by_alias=self.by_alias, generate_pydantic_model_from_json_schema=self.generate_pydantic_model_from_json_schema, **kwargs
schema, data=value, by_alias=self.by_alias, generate_pydantic_model_from_json_schema=self.generate_pydantic_model_from_json_schema, **kwargs
)
self._init_ui_callables(
ui_add=ui_add, ui_edit=ui_edit, ui_delete=ui_delete, ui_copy=ui_copy, ui_io=ui_io
)
self._init_ui_io(ui_io=ui_io)
self._init_row_controls()
self._init_controls()
self._set_children_editgrid()
self._set_children()
self._set_datahandler(datahandler=datahandler)

def _init_autogrid(
Expand Down Expand Up @@ -408,7 +406,7 @@ def _factory():
if self.model is None:
return _missing_model_ui()
return EditTsvWithDiff(
model=self.model, fn_upload=self.fn_upload, transposed=self.transposed
model=self.model, fn_upload=self.fn_upload, transposed=self.transposed, by_alias = self.by_alias
)
self._ui_io_factory = _factory
else:
Expand All @@ -417,7 +415,7 @@ def _factory_custom():
return _missing_model_ui()
try:
return ui_io(
model=self.model, fn_upload=self.fn_upload, transposed=self.transposed
model=self.model, fn_upload=self.fn_upload, transposed=self.transposed, by_alias = self.by_alias
)
except Exception as e:
raise RuntimeError(
Expand All @@ -432,7 +430,7 @@ def _factory_custom():
def _init_ui_io(self, ui_io):
if ui_io is not None and self.ui_io_initialised:
self.ui_io = ui_io(
model=self.model, fn_upload=self.fn_upload, transposed=self.transposed
model=self.model, fn_upload=self.fn_upload, transposed=self.transposed, by_alias = self.by_alias
)

def _ensure_ui_io_initialised(self):
Expand All @@ -445,7 +443,7 @@ def _ensure_ui_io_initialised(self):
self.ui_io = self._ui_io_factory()
if hasattr(self.ui_io, "traits") and "transposed" in self.ui_io.traits():
self.ui_io.transposed = self.transposed
self._set_children_editgrid()
self._set_children()
return self.ui_io

def fn_upload(self, value):
Expand Down Expand Up @@ -492,7 +490,7 @@ def _set_datahandler(self, datahandler):
if self.datahandler is not None:
self.buttonbar_grid.fn_reload = self._reload_datahandler

def _set_children_editgrid(self):
def _set_children(self):
self.vbx_widget.children = [self.buttonbar_grid, self.stk_crud, self.grid]

# Base CRUD UIs
Expand Down
6 changes: 4 additions & 2 deletions src/ipyautoui/custom/edittsv.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import typing as ty
import xlsxdatagrid as xdg
from pathlib import Path
from ipyautoui.watch_validate import pydantic_validate

from ipyautoui.constants import BUTTON_WIDTH_MIN

Expand Down Expand Up @@ -132,6 +133,7 @@ def default_fn_upload(value):
class EditTsv(CopyToClipboard):
_value = tr.List(value=None, trait=tr.Dict, allow_none=True)
model = tr.Type(klass=BaseModel)
by_alias = tr.Bool(default_value=False)
errors = tr.List(value=[], trait=tr.Dict)
fn_upload = tr.Callable(default_value=default_fn_upload)
upload_status = tr.Enum(
Expand Down Expand Up @@ -213,7 +215,7 @@ def value(self):

@value.setter
def value(self, value):
data = self.model.model_validate(value).model_dump(mode="json", by_alias=True) if value else []
data = pydantic_validate(self.model, value, by_alias=self.by_alias) if value else []
self._value = data
self.text.value = self.get_tsv_data()

Expand Down Expand Up @@ -453,7 +455,7 @@ def value(self):

@value.setter
def value(self, value):
data = self.model.model_validate(value).model_dump(mode="json", by_alias=True) if value else []
data = pydantic_validate(self.model, value, by_alias=self.by_alias) if value else []
self._value = data
"""Code added to trigger manual validation if needed (text new value is same as previous text value - In that case,text obsever fn won't be triggered automatically)"""
trigger_manual_validation = False
Expand Down
4 changes: 2 additions & 2 deletions src/ipyautoui/watch_validate.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
logger = logging.getLogger(__name__)


def pydantic_validate(model: BaseModel, value):
return model.model_validate(value).model_dump(mode="json", by_alias=True)
def pydantic_validate(model: BaseModel, value, by_alias: bool = False, mode:str="json"):
return model.model_validate(value).model_dump(mode=mode, by_alias=by_alias)


class _WatchSilent(tr.HasTraits): # TODO: contains context manager for silencing traits
Expand Down
Loading