Skip to content
Draft
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
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,7 @@
from dl_api_connector.form_config.models.common import (
SerializableConfig,
TFieldName,
remap_skip_if_null,
skip_if_null,
remap,
)


Expand All @@ -34,12 +33,12 @@ class FormFieldApiAction(Enum):
@attr.s(kw_only=True, frozen=True)
class FormFieldApiSchema(SerializableConfig):
name: TFieldName = attr.ib()
type: Optional[Literal["string", "boolean", "object"]] = attr.ib(default=None, metadata=skip_if_null())
type: Optional[Literal["string", "boolean", "object"]] = attr.ib(default=None)
required: bool = attr.ib(default=False)
length: Optional[int] = attr.ib(default=None, metadata=skip_if_null())
nullable: Optional[bool] = attr.ib(default=None, metadata=skip_if_null())
length: Optional[int] = attr.ib(default=None)
nullable: Optional[bool] = attr.ib(default=None)
default_action: FormFieldApiAction = attr.ib(
default=FormFieldApiAction.include, metadata=remap_skip_if_null("defaultAction")
default=FormFieldApiAction.include, metadata=remap("defaultAction")
)


Expand All @@ -64,6 +63,6 @@ class FormActionApiSchema(SerializableConfig):

@attr.s(kw_only=True, frozen=True)
class FormApiSchema(SerializableConfig):
create: Optional[FormActionApiSchema] = attr.ib(default=None, metadata=skip_if_null())
edit: Optional[FormActionApiSchema] = attr.ib(default=None, metadata=skip_if_null())
check: Optional[FormActionApiSchema] = attr.ib(default=None, metadata=skip_if_null())
create: Optional[FormActionApiSchema] = attr.ib(default=None)
edit: Optional[FormActionApiSchema] = attr.ib(default=None)
check: Optional[FormActionApiSchema] = attr.ib(default=None)
14 changes: 7 additions & 7 deletions lib/dl_api_connector/dl_api_connector/form_config/models/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
TFieldName,
TopLevelFieldName,
inner,
remap_skip_if_null,
remap,
)
from dl_api_connector.form_config.models.rows import CustomizableRow
from dl_api_connector.form_config.models.rows.base import (
Expand All @@ -43,13 +43,13 @@
@attr.s(kw_only=True, frozen=True)
class FormUIOverride(SerializableConfig):
show_create_dataset_btn: Optional[bool] = attr.ib(
default=None, metadata=remap_skip_if_null("showCreateDatasetButton")
default=None, metadata=remap("showCreateDatasetButton")
)
show_create_ql_chart_btn: Optional[bool] = attr.ib(
default=None, metadata=remap_skip_if_null("showCreateQlChartButton")
default=None, metadata=remap("showCreateQlChartButton")
)
show_create_editor_chart_btn: Optional[bool] = attr.ib(
default=None, metadata=remap_skip_if_null("showCreateEditorChartButton")
default=None, metadata=remap("showCreateEditorChartButton")
)


Expand All @@ -71,9 +71,9 @@ class ConnectionForm(SerializableConfig):

title: str = attr.ib()
rows: list[FormRow] = attr.ib()
api_schema: Optional[FormApiSchema] = attr.ib(default=None, metadata=remap_skip_if_null("apiSchema"))
template_name: Optional[str] = attr.ib(default=None, metadata=remap_skip_if_null("templateName"))
form_ui_override: Optional[FormUIOverride] = attr.ib(default=None, metadata=remap_skip_if_null("uiSchema"))
api_schema: Optional[FormApiSchema] = attr.ib(default=None, metadata=remap("apiSchema"))
template_name: Optional[str] = attr.ib(default=None, metadata=remap("templateName"))
form_ui_override: Optional[FormUIOverride] = attr.ib(default=None, metadata=remap("uiSchema"))

implicit_form_fields: set[TFieldName] = attr.ib(factory=set, metadata=inner())

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,6 @@ class CFGMeta:
inner: bool = attr.ib(
default=False
) # whether it is a service field involved only in inner logic and which needs to be skipped
skip_if_null: bool = attr.ib(default=False) # sometimes it is more convenient for the UI to receive undefined
key: Optional[str] = attr.ib(default=None) # remap key

def attr_meta(self) -> dict[str, CFGMeta]:
Expand Down Expand Up @@ -144,7 +143,7 @@ def _attr_value_serializer(inst: type, field: attr.Attribute, value: Any) -> Any
)
meta = field.metadata[CFGMeta.METADATA_KEY]
assert isinstance(meta, CFGMeta), f"Unexpected meta class, {CFGMeta.__name__} expected"
if meta.inner or meta.skip_if_null and value is None:
if meta.inner and value is None:
return cls._SKIP_SENTINEL
if meta.key is not None:
inst._remap_keys_buffer[field.name] = meta.key
Expand All @@ -161,17 +160,8 @@ def as_dict(self) -> dict[str, Any]:


# frequently used meta shortcuts
def skip_if_null() -> dict[str, CFGMeta]:
return CFGMeta(skip_if_null=True).attr_meta()


def remap(key: str) -> dict[str, CFGMeta]:
return CFGMeta(key=key).attr_meta()


def remap_skip_if_null(key: str) -> dict[str, CFGMeta]:
return CFGMeta(skip_if_null=True, key=key).attr_meta()


def inner() -> dict[str, CFGMeta]:
return CFGMeta(inner=True).attr_meta()
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,7 @@
SerializableConfig,
TFieldName,
Width,
remap_skip_if_null,
skip_if_null,
remap,
)


Expand All @@ -30,20 +29,20 @@ class DisplayConditionsMixin(SerializableConfig):
"""Allow to control item visibility based on form field values"""

display_conditions: Optional[TDisplayConditions] = attr.ib(
default=None, metadata=remap_skip_if_null("displayConditions")
default=None, metadata=remap("displayConditions")
)


@attr.s(kw_only=True, frozen=True)
class InnerFieldMixin(SerializableConfig):
"""Inner fields are not send to the API, but can affect other fields"""

inner: Optional[bool] = attr.ib(default=None, metadata=skip_if_null()) # false if undefined
inner: Optional[bool] = attr.ib(default=None) # false if undefined


@attr.s(kw_only=True, frozen=True)
class WidthMixin(SerializableConfig):
width: Optional[Width] = attr.ib(default=None, metadata=skip_if_null())
width: Optional[Width] = attr.ib(default=None)


class FormRow(SerializableConfig):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,7 @@
from dl_api_connector.form_config.models.common import (
MarkdownStr,
SerializableConfig,
remap_skip_if_null,
skip_if_null,
remap,
)
from dl_api_connector.form_config.models.rows.base import (
DisplayConditionsMixin,
Expand All @@ -34,19 +33,19 @@ def as_dict(self) -> dict[str, Any]:

@attr.s(kw_only=True, frozen=True)
class PlaceholderMixin(SerializableConfig):
placeholder: Optional[str] = attr.ib(default=None, metadata=skip_if_null())
placeholder: Optional[str] = attr.ib(default=None)


@attr.s(kw_only=True, frozen=True)
class DefaultValueMixin(SerializableConfig):
# comma separated if multiple=true
default_value: Optional[str | bool] = attr.ib(default=None, metadata=remap_skip_if_null("defaultValue"))
default_value: Optional[str | bool] = attr.ib(default=None, metadata=remap("defaultValue"))


@attr.s(kw_only=True, frozen=True)
class ControlRowItem(RowItem, FormFieldMixin, DisplayConditionsMixin, InnerFieldMixin, DefaultValueMixin, WidthMixin):
fake_value: Optional[str] = attr.ib(default=None, metadata=remap_skip_if_null("fakeValue"))
hint_text: Optional[MarkdownStr] = attr.ib(default=None, metadata=remap_skip_if_null("hintText"))
fake_value: Optional[str] = attr.ib(default=None, metadata=remap("fakeValue"))
hint_text: Optional[MarkdownStr] = attr.ib(default=None, metadata=remap("hintText"))


@attr.s(kw_only=True, frozen=True)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,7 @@
SerializableConfig,
Width,
inner,
remap_skip_if_null,
skip_if_null,
remap,
)
from dl_api_connector.form_config.models.rows.base import (
DisplayConditionsMixin,
Expand Down Expand Up @@ -42,8 +41,8 @@ class HiddenRowItem(RowItem, FormFieldMixin, InnerFieldMixin, DisplayConditionsM
class LabelRowItem(RowItem, DisplayConditionsMixin):
component_id = "label"
text: str = attr.ib()
align: Optional[Align] = attr.ib(default=None, metadata=skip_if_null())
help_text: Optional[MarkdownStr] = attr.ib(default=None, metadata=remap_skip_if_null("helpText"))
align: Optional[Align] = attr.ib(default=None)
help_text: Optional[MarkdownStr] = attr.ib(default=None, metadata=remap("helpText"))


@attr.s(kw_only=True, frozen=True)
Expand All @@ -56,39 +55,39 @@ class SelectableOption: # TODO rename to RadioButtonOption
class InputRowItem(ControlRowItem, PlaceholderMixin):
@attr.s(kw_only=True, frozen=True)
class Props(SerializableConfig):
multiline: Optional[bool] = attr.ib(default=None, metadata=skip_if_null()) # false if undefined
type: Optional[Literal["text", "password", "number"]] = attr.ib(default="text", metadata=skip_if_null())
disabled: Optional[bool] = attr.ib(default=None, metadata=skip_if_null())
multiline: Optional[bool] = attr.ib(default=None) # false if undefined
type: Optional[Literal["text", "password", "number"]] = attr.ib(default="text")
disabled: Optional[bool] = attr.ib(default=None)

component_id = "input"

control_props: Optional[Props] = attr.ib(default=None, metadata=remap_skip_if_null("controlProps"))
control_props: Optional[Props] = attr.ib(default=None, metadata=remap("controlProps"))


@attr.s(kw_only=True, frozen=True)
class SelectOption(SerializableConfig):
class Data(SerializableConfig):
description: Optional[str] = attr.ib(default=None, metadata=skip_if_null())
description: Optional[str] = attr.ib(default=None)

content: str = attr.ib()
value: str = attr.ib()
data: Optional[Data] = attr.ib(default=None, metadata=skip_if_null())
data: Optional[Data] = attr.ib(default=None)


@attr.s(kw_only=True, frozen=True)
class SelectRowItem(ControlRowItem, PlaceholderMixin):
@attr.s(kw_only=True, frozen=True)
class Props(SerializableConfig):
show_search: Optional[bool] = attr.ib(default=None, metadata=remap_skip_if_null("showSearch"))
has_clear: Optional[bool] = attr.ib(default=None, metadata=remap_skip_if_null("hasClear"))
multiple: Optional[bool] = attr.ib(default=None, metadata=skip_if_null())
show_search: Optional[bool] = attr.ib(default=None, metadata=remap("showSearch"))
has_clear: Optional[bool] = attr.ib(default=None, metadata=remap("hasClear"))
multiple: Optional[bool] = attr.ib(default=None)

component_id = "select"

available_values: Optional[list[SelectOption]] = attr.ib(
default=None, metadata=remap_skip_if_null("availableValues")
default=None, metadata=remap("availableValues")
)
control_props: Optional[Props] = attr.ib(default=None, metadata=remap_skip_if_null("controlProps"))
control_props: Optional[Props] = attr.ib(default=None, metadata=remap("controlProps"))


@attr.s(kw_only=True, frozen=True)
Expand All @@ -114,8 +113,8 @@ class View(enum.Enum):
view: View = attr.ib()

text: str = attr.ib()
hint_text: Optional[MarkdownStr] = attr.ib(default=None, metadata=remap_skip_if_null("hintText"))
text_end_icon: Optional[TextEndIcon] = attr.ib(default=None, metadata=remap_skip_if_null("textEndIcon"))
hint_text: Optional[MarkdownStr] = attr.ib(default=None, metadata=remap("hintText"))
text_end_icon: Optional[TextEndIcon] = attr.ib(default=None, metadata=remap("textEndIcon"))

content: ValueContent = attr.ib()
value: str = attr.ib()
Expand All @@ -125,13 +124,13 @@ class View(enum.Enum):
class RadioGroupRowItem(RowItem, DisplayConditionsMixin, FormFieldMixin, InnerFieldMixin):
@attr.s(kw_only=True, frozen=True)
class Props(SerializableConfig):
disabled: Optional[bool] = attr.ib(default=None, metadata=skip_if_null())
disabled: Optional[bool] = attr.ib(default=None)

component_id = "radio_group"

options: list[RadioGroupRowItemOption] = attr.ib()
default_value: Optional[str] = attr.ib(default=None, metadata=remap_skip_if_null("defaultValue"))
control_props: Optional[Props] = attr.ib(default=None, metadata=remap_skip_if_null("controlProps"))
default_value: Optional[str] = attr.ib(default=None, metadata=remap("defaultValue"))
control_props: Optional[Props] = attr.ib(default=None, metadata=remap("controlProps"))

def __attrs_post_init__(self) -> None:
if self.default_value is not None and self.default_value not in (
Expand All @@ -144,36 +143,36 @@ def __attrs_post_init__(self) -> None:
class CheckboxRowItem(RowItem, DisplayConditionsMixin, FormFieldMixin, InnerFieldMixin, DefaultValueMixin):
@attr.s(kw_only=True, frozen=True)
class Props(SerializableConfig):
disabled: Optional[bool] = attr.ib(default=None, metadata=skip_if_null())
size: Optional[Literal["m", "l"]] = attr.ib(default=None, metadata=skip_if_null())
disabled: Optional[bool] = attr.ib(default=None)
size: Optional[Literal["m", "l"]] = attr.ib(default=None)
qa: Optional[str] = attr.ib(
default=None, metadata=skip_if_null()
default=None
) # UI-specific testing stuff, should be removed at some point

component_id = "checkbox"

text: str = attr.ib()
control_props: Optional[Props] = attr.ib(default=None, metadata=remap_skip_if_null("controlProps"))
control_props: Optional[Props] = attr.ib(default=None, metadata=remap("controlProps"))


@attr.s(kw_only=True, frozen=True)
class DatepickerRowItem(ControlRowItem):
@attr.s(kw_only=True, frozen=True)
class Props(SerializableConfig):
size: Optional[Literal["s", "m", "l", "xl"]] = attr.ib(default=None, metadata=skip_if_null())
size: Optional[Literal["s", "m", "l", "xl"]] = attr.ib(default=None)

component_id = "datepicker"

width: Optional[Width] = attr.ib(default=None, init=False, metadata=inner()) # not supported by Datepicker
control_props: Optional[Props] = attr.ib(default=None, metadata=remap_skip_if_null("controlProps"))
control_props: Optional[Props] = attr.ib(default=None, metadata=remap("controlProps"))


@attr.s(kw_only=True, frozen=True)
class PlainTextRowItem(RowItem, DisplayConditionsMixin):
component_id = "plain_text"

text: str = attr.ib()
hint_text: Optional[MarkdownStr] = attr.ib(default=None, metadata=remap_skip_if_null("hintText"))
hint_text: Optional[MarkdownStr] = attr.ib(default=None, metadata=remap("hintText"))


@attr.s(kw_only=True, frozen=True)
Expand All @@ -190,7 +189,7 @@ class FileInputRowItem(RowItem, FormFieldMixin, InnerFieldMixin, DisplayConditio

@attr.s(kw_only=True, frozen=True)
class StyleItem(SerializableConfig):
width: Optional[Width] = attr.ib(default=None, metadata=skip_if_null())
width: Optional[Width] = attr.ib(default=None)


@attr.s(kw_only=True, frozen=True)
Expand All @@ -199,16 +198,16 @@ class KeyValueRowItem(RowItem, FormFieldMixin, DisplayConditionsMixin):

@attr.s(kw_only=True, frozen=True)
class KeySelectProps(SerializableConfig):
placeholder: Optional[str] = attr.ib(default=None, metadata=skip_if_null())
width: Optional[Width] = attr.ib(default=None, metadata=skip_if_null())
placeholder: Optional[str] = attr.ib(default=None)
width: Optional[Width] = attr.ib(default=None)

@attr.s(kw_only=True, frozen=True)
class ValueInputProps(SerializableConfig):
placeholder: Optional[str] = attr.ib(default=None, metadata=skip_if_null())
style: Optional[StyleItem] = attr.ib(default=None, metadata=skip_if_null())
hide_reveal_button: Optional[bool] = attr.ib(default=None, metadata=remap_skip_if_null("hideRevealButton"))

secret: Optional[bool] = attr.ib(default=None, metadata=skip_if_null())
keys: Optional[list[SelectOption]] = attr.ib(default=None, metadata=skip_if_null())
key_select_props: Optional[KeySelectProps] = attr.ib(default=None, metadata=remap_skip_if_null("keySelectProps"))
value_input_props: Optional[ValueInputProps] = attr.ib(default=None, metadata=remap_skip_if_null("valueInputProps"))
placeholder: Optional[str] = attr.ib(default=None)
style: Optional[StyleItem] = attr.ib(default=None)
hide_reveal_button: Optional[bool] = attr.ib(default=None, metadata=remap("hideRevealButton"))

secret: Optional[bool] = attr.ib(default=None)
keys: Optional[list[SelectOption]] = attr.ib(default=None)
key_select_props: Optional[KeySelectProps] = attr.ib(default=None, metadata=remap("keySelectProps"))
value_input_props: Optional[ValueInputProps] = attr.ib(default=None, metadata=remap("valueInputProps"))
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
from dl_api_connector.form_config.models.common import (
InnerFieldName,
SerializableConfig,
skip_if_null,
)
from dl_api_connector.form_config.models.rows.base import FormRow

Expand All @@ -32,4 +31,4 @@ def as_dict(self) -> dict[str, Any]:

@attr.s(kw_only=True, frozen=True)
class DisabledMixin(SerializableConfig):
disabled: Optional[bool] = attr.ib(default=None, metadata=skip_if_null())
disabled: Optional[bool] = attr.ib(default=None)
Loading
Loading