Skip to content

amsdal

v0.10.0rc3 - 2026-07-27

Changed

  • Require amsdal-data 0.10.0rc3 or newer, which fixes @transaction(atomic=False) to run non-atomically: operations commit independently and a later failure no longer rolls back the ones that already ran.
  • Rewrote the transactions documentation for the 0.10 model — required argument annotations with the ReferenceOnly / NewOnly markers, transaction discovery and addressing, per-transaction permissions (including overriding a shipped transaction's permissions), the HTTP RPC endpoints, brokerless local background execution, and corrected scheduling configuration.

v0.10.0rc2 - 2026-07-24

Changed

  • Transactions are now discovered and registered into a TransactionRegistry during AmsdalManager.setup() and addressed by name (or app_name.name), replacing the previous AST-based scanning. Each discovered transaction gets a validated argument signature — a pydantic model built from its annotations — used to bind raw arguments and resolve Reference / inline model objects, including the ReferenceOnly[...] and NewOnly argument markers.
  • Transaction authorization (ResourceType.TRANSACTIONS), the default dashboard, and the frontend-config transaction form now resolve transactions through the registry instead of re-loading them from source.
  • Require amsdal-data 0.10.0rc2 or newer.

Removed

  • The AST-based transaction execution service (amsdal.services.transaction_execution) and its helpers, superseded by the registry and signature mechanism.

v0.10.0rc1 - 2026-07-23

Changed

  • Require amsdal-models 0.10.0rc1 and amsdal-data 0.10.0rc1 or newer (the Rust-backed amsdal-glue SQL generator stack).

v0.9.16 - 2026-07-22

Added

  • amsdal.contrib.frontend_configs adds an optional theme field to FrontendConfigDashboard, served as-is through GET /api/contrib/frontend-config/dashboard/config. The new FrontendConfigDashboardTheme type model carries logo (a URL string — either a served static path like /static/logo.svg or an absolute external URL), colors (a FrontendConfigDashboardThemeColors type model with ten optional design tokens: primary, secondary, accent, background, surface, text, text_secondary, error, warning, success — any CSS color string, mapped to CSS variables by the frontend), and control_styles (dict[str, dict[str, str]] keyed by control type, e.g. select or button; values are camelCase inline-CSS dicts with the same semantics as additional_styles, and a control's own additional_styles wins on conflicting properties). The field is optional and additive: dashboards without a theme serialize unchanged, and the synthesized default dashboard sets no theme. Migration 0012_add_theme_to_frontendconfigdashboard registers both type models (TypeMeta) and adds the theme property to the FrontendConfigDashboard schema. The contrib admin form fixture exposes the theme as a JSON textarea, and the theme contract is documented in the contrib's docs/configs.md.
  • The frontend_configs contrib now serves the application's static directory. DashboardRouteListener mounts Starlette's StaticFiles at /static from settings.static_root_path when that directory exists (skipped silently otherwise). Previously the CLI build copied the app's static/ files into the build output, but nothing ever served them — dashboard theme logos are the first consumer, referenced from fixtures as /static/<name>.

v0.9.14 - 2026-07-09

Added

  • amsdal.models.mixins adds UserAuditMixin, the "who" counterpart to TimestampMixin: it auto-populates created_by on create and updated_by on update with the current user drawn from AmsdalContextManager (via the new _get_current_user() helper, which reads request.user.user). Both fields are foreign keys to the contrib User model, declared with ReferenceField(related_name='+') so no reverse accessor is registered on User — this avoids the reverse-name collision between the two FKs and across every model that adopts the mixin. When no authenticated user is present in context (migrations, system jobs, bulk operations) the field is left unchanged rather than overwritten with null, and created_by is never touched on update, mirroring how TimestampMixin treats created_at/updated_at. Sync (pre_create / pre_update) and async (apre_create / apre_update) hooks are provided, each chaining super() so the mixin composes with TimestampMixin / AuditMixin in the MRO. created_by / updated_by are registered as __auto_managed_fields__, so AuditMixin's change diff excludes them.

v0.9.13 - 2026-07-01

Fixed

  • FixturesManager._load_fixtures_recursive now skips the top-level files/ directory, which is reserved for file-attachment fixtures handled separately by apply_file_fixtures. The nested-folder loader introduced in v0.9.x recursed into files/ and, on encountering a files/<Class>/<name>.json whose content is a JSON list (e.g. a navbar menu served as a File), mis-detected it as a Pattern-A class folder and built FixtureData with external_id=None, crashing on the required external_id: str. File fixtures are now loaded only via apply_file_fixtures; object-fixture loading no longer double-processes them.
  • amsdal.contrib.frontend_configs now builds an editable form for the core File model instead of a field-less, button-only one. get_class_object_form / aget_class_object_form fell back to convert_to_frontend_config(File), which short-circuits to a nameless {'type': 'file'} payload with no controls, so the generated form contained only the Edit/Delete/Save buttons. The File field controls (filename as text, data as Bytes, size as number) are now emitted through a shared file_default_field_controls() / file_default_group() helper in conversion.convert, reused by both the object-list default-control builder (_get_default_control / _aget_default_control, which previously carried an inline copy) and the class-object form builder. The data control is typed Bytes, so the frontend submits file contents as a flat data:binary;base64, … string that File.data: bytes accepts rather than a nested upload object.
  • The core File model's storage accessor is now a PrivateProperty instead of a public @property. amsdal_server's object serializer copies every custom model property into the API response and JSON-encodes it, so exposing storage made POST / GET /api/objects/?class_name=File fail with PydanticSerializationError: Unable to serialize unknown type: DBStorage (HTTP 400) once a File could actually be created. As a PrivateProperty it is excluded from get_custom_properties and no longer serialized, while self.storage keeps working for pre_create / pre_update, open, url, and other internal callers.

v0.9.12 - 2026-06-30

Added

  • amsdal.contrib.frontend_configs adds a new update_form_element action to the control ActionType union. It replaces a single form element identified by target_id with content resolved from a control_source (static or dynamic), mirroring the existing update_form action at element scope. An optional async flag is supported: it is modeled as is_async with an async alias and a model_serializer that emits it back as async, so it survives the dashboard's plain model_dump(mode='json'). Model-only change — no migration, so only the runtime Pydantic models recognise the new action type.

v0.9.11 - 2026-06-30

Changed

  • amsdal.contrib.frontend_configs sidebar tabs builder now hides the redundant inner labels and lifts the form title to the tabs container. The Form tab and the form-content container are marked hideLabel: true, and the original schema's label is propagated onto the top-level tabs node (falling back to Sidebar Tabs), so the form's title shows on the tabs container instead of being duplicated inside it.

Dependencies

  • Refreshed uv.lock: dropped black from the published amsdal requirements (now dev-only), and bumped fastapi 0.138.0 → 0.138.2, polars 1.42.0 → 1.42.1, pydantic-partial 0.10.2 → 0.11.1, ruff 0.15.19 → 0.15.20, and wcwidth 0.8.1 → 0.8.2.

v0.9.10 - 2026-06-25

Changed

  • Application and contrib AppConfig lifecycle is now driven explicitly by AmsdalManager.setup() / teardown() instead of as a side effect of accessing settings. AppConfig gains three optional hooks — on_setup (runs before models and connections, for wiring/registration only), on_ready (runs after the framework is fully operational, for data seeding, cache warming, or startup checks), and on_teardown (runs at the start of teardown while connections are still alive). Hooks run contrib apps first, then the user app, and in reverse order on teardown; the same AppConfig instance receives all three, so state can be shared via self. AppConfig is no longer abstract and every hook defaults to a no-op. Accessing settings no longer runs on_setup, so the build phase no longer executes application hooks before the app has been generated.

Dependencies

  • Refreshed uv.lock: amsdal_models 0.8.8 → 0.8.10 and amsdal_cli 0.9.4 → 0.9.7 (plus transitive updates), within the existing pyproject.toml constraints.

v0.9.9 - 2026-06-17

Changed

  • CredentialsAuthHandler now caches the decoded public key on disk (auth_public_key in config_dir) alongside the existing auth_token. When both are present, credential validation runs fully offline by verifying the cached token against the cached public key, avoiding a network request on every command. The public key is fetched (and the cache refreshed) only when no valid cached token/key pair exists or a new session must be created.
  • The amsdal.contrib.frontend_configs form-schema transactions (get_class_object_form / aget_class_object_form and get_transaction_form / aget_transaction_form) are now decorated with @allow_any, so retrieving frontend form schemas no longer requires authenticated permissions.

v0.9.8 - 2026-06-17

Fixed

  • amsdal.contrib.frontend_configs now maps the Python Decimal type to a numeric control in default_types_map. Properties annotated directly with decimal.Decimal previously had no entry in the default type map and fell through to the generic handling instead of rendering as a number control. This complements the v0.9.5 decimal-field support so both schema-declared decimal properties and Decimal-annotated fields produce numeric controls.

v0.9.7 - 2026-06-16

Fixed

  • amsdal.contrib.frontend_configs default control generation for File fields. The handler now identifies the resolved target class by name (__name__ == File.__name__) instead of object identity. In production import_class('File') returns a runtime-built class that is not the same object as the imported File, so the previous is File check fell through to convert_to_frontend_config(File) and produced a nameless {'type': 'file'} payload that failed FrontendControlConfig validation. Applies to both the sync (_get_default_control) and async (_aget_default_control) paths.

v0.9.6 - 2026-06-16

Added

  • Transaction execution now resolves lists of model references in transaction arguments. When a transaction parameter is annotated as a collection of models (list[Book], set[Book], or tuple[Book, ...]) and the supplied value is a list whose items are reference payloads ({'ref': {...}}), each reference is loaded into its model instance, mirroring the existing single-model {'ref': {...}} resolution. Non-reference items in the list are passed through unchanged, and resolution is skipped entirely when load_references=False. Works for both sync and async transaction execution.

v0.9.5 - 2026-06-16

Added

  • Support for Decimal model fields with fixed precision and scale, e.g. amount: Decimal = Field(max_digits=10, decimal_places=2). Values are stored as NUMERIC(precision, scale) on PostgreSQL and as exact text on SQLite, so they round-trip as decimal.Decimal without floating-point drift. The schema dependency checker now recognises the decimal core type (a decimal property is no longer mistaken for an undefined model dependency), and the amsdal.contrib.frontend_configs contrib renders decimal properties as numeric controls.

v0.9.4 - 2026-06-15

Added

  • New amsdal.license.LicenseGuard — a process-level license validation gate. The license is validated exactly once per process and the result is cached at class scope, so it intentionally survives AmsdalManager.invalidate() / teardown(); a re-created manager no longer re-runs cloud authentication, which keeps per-test and per-request setup free of repeated cloud calls.
  • New AMSDAL_AUTH_TYPE setting (Settings.AUTH_TYPE) to explicitly select the authentication type (token or credentials) instead of relying on auto-detection from the configured credentials. An invalid value raises AmsdalAuthenticationError.
  • TokenAuthHandler now accepts offline DEV/CI license tokens: the JWT is validated against a list of accepted public keys (the production key plus an optional DEV_LICENSE_PUBLIC_KEY), so dev/CI tokens validate without contacting the cloud.

Changed

  • Reworked AmsdalManager / AsyncAmsdalManager authentication to go through LicenseGuard. The managers no longer construct AuthManager in __init__, and the raise_on_new_signup constructor argument together with the interactive signup-prompt path have been removed. authenticate() now delegates to LicenseGuard.ensure_valid(), and _check_auth() also succeeds when the license guard is already valid.
  • The init_config test helper now coerces raw string options into their StrEnum types, so client test suites launched via amsdal test (which forwards CLI arguments such as --lakehouse_option sqlite as plain strings) work without manual conversion. The init_manager_and_migrate helpers no longer call manager.authenticate() during migration setup.
  • Bumped the minimum amsdal_models dependency to >=0.8.7.

v0.9.3 - 2026-06-11

Fixed

  • amsdal.contrib.frontend_configs sidebar tabs: the tabs control is now the top-level form schema and the original top-level container (the auto-generated group, or a fixture's semantic container such as wizard/sections) is nested intact inside the Form tab, instead of being kept as an outer shell wrapping the tabs. This preserves the semantics of layout containers like wizard, which must own their step children directly rather than collapsing into an empty wrapper around a single tabs. Post-event mode buttons (Edit / Save / Delete) still route into the actions row inside the Form tab.
  • FixturesManager._process_object_data now resolves fixture keys against pydantic field aliases as well as field names. Foreign-key fields are stored under a private name (_<fk>_ref) with the public field name exposed only as the alias, so a fixture key naming the FK (e.g. object_control) was absent from model_fields keyed by name and raised KeyError. FK references (external_id strings) now load correctly.

v0.9.2 - 2026-06-08

Added

  • New TunnelDBAction and CloudActionsManager.tunnel_db(...) that expose an environment's database through an SSH tunnel via an EC2 bastion. The caller supplies an ephemeral OpenSSH public key, which is pushed to the bastion (valid for a short window), and the action returns the connection details (bastion host, ssh user, rds host/port, region) needed to open the tunnel locally.

Changed

  • Relaxed the pydantic dependency constraint from ~=2.12 to ~=2.13.

v0.9.1 - 2026-06-05

Fixed

  • amsdal.contrib.frontend_configs fixtures (fixtures/*.json) are now included in the packaged distribution. They were previously missing from package_data, so the built wheel shipped without the frontend_configs fixtures.
  • Dropped the incorrect cls: type local annotation in the AmsdalManager._freeze and AsyncAmsdalManager._freeze bootstrap loops. The loop value can be a non-type fallback, so the annotation was misleading; the accompanying # type: ignore is retained. No behavioural change.

v0.9.0 - 2026-06-01

Added

  • PIIStr, EncryptedStr, and get_pii_fields are now re-exported from amsdal.models. Previously these had to be imported from the internal amsdal_models.classes.fields.pii path; the public surface now mirrors the rest of the model API (Model, TypeModel, ReferenceField, ...).

Changed

  • AmsdalManager.setup() and AsyncAmsdalManager.setup() now eagerly import every registered model module and bulk-resolve deferred primary keys, foreign keys, and many-to-many references before returning. Previously these were resolved lazily through the metaclass on first class access. Behavioural impact: model import errors and circular-import problems now surface at setup() instead of at first attribute access. If you intentionally rely on a model being loaded after setup(), wrap the creation in allow_late_registration() from amsdal_models.classes.loading.
  • Auth contrib: the User.permissions: list[Permission] through-table has been renamed from UserPermission to UserPermissions to align with the auto-generated M2M through-class naming convention. Migrations 0004_create_class_userpermissions, 0005_migrate_user_permission_data, and 0006_delete_class_userpermission create the new class, copy existing rows in both directions (sync and async backends are both supported via AmsdalConfigManager().get_config().async_mode), and drop the legacy class. Breaking for application code that references the UserPermission class directly — replace with UserPermissions. Code that uses User.permissions through the QuerySet API is unaffected.

Fixed

  • FrontendConfigDashboardControlSource.model_rebuild() is now invoked in the frontend_config_control_action module-level rebuild block. Previously, depending on the import order of frontend_model_config (and therefore frontend_control_config) relative to other modules, FrontendConfigDashboardControlSource could be left with an unresolved forward reference to FrontendControlConfig, raising pydantic.errors.PydanticUserError: 'FrontendConfigDashboardControlSource' is not fully defined when instantiating an OpenSidebarAction whose content is a SidebarFormContent with a dynamic control_source.
  • AsyncAmsdalManager now registers AsyncMetadataInfoQuery via register_async_metadata_info_query() instead of the synchronous MetadataInfoQuery it was previously registering via register_metadata_info_query(). Async metadata queries (aget_metadata() and downstream callers) now consistently use the async implementation.

v0.8.14 - 2026-05-15

Added

  • Four new layout container types on FrontendControlConfig (amsdal.contrib.frontend_configs.models.frontend_control_config): row, column, tabs, tab. row arranges its column children side-by-side; column.width is an optional integer in the 1..12 Bootstrap-style grid (omitted columns share the row equally); tabs switches between its tab children, each of which requires a non-empty label. The new types compose recursively with each other and with the existing container types (group, section, sections, wizard, group_switch, group_toggle, info-group).
  • New optional width: int | None field on FrontendControlConfig (range 1..12), meaningful on column containers.
  • _validate_layout_pairing model validator on FrontendControlConfig enforcing strict parent-child pairing: row accepts only column children, tabs accepts only tab children, and every tab must declare a non-empty label. Misconfigurations surface at config-construction time with a clear ValueError rather than at render time.
  • Migration 0011_add_layout_control_types extends the stored FrontendControlConfig schema's type enum with row, column, tabs, tab and registers the width integer property. Pure additive migration — existing configs validate unchanged.
  • FrontendConfigDashboardVersions (amsdal.contrib.frontend_configs.models.frontend_config_dashboard) — new TypeModel with a single enabled: bool field (default True). Wired into FrontendConfigDashboardElement.versions (nullable, alongside pagination and sort); when set on a table element, the frontend renders the per-row versions UI. Migration 0011 also creates this class and adds the versions property on FrontendConfigDashboardElement.

Changed

  • _CONTAINER_TYPES frozenset in amsdal.contrib.frontend_configs.conversion.class_object_form extended with row, column, tabs, tab. Value pre-fill, readOnly propagation in 'view' mode, and recursive field-name collection in _decorate_tree / _collect_field_names now traverse the new containers, so leaf controls nested inside tabs > tab > row > column chains receive id, value, and readOnly decoration just like leaves inside section / group.
  • Auto-generated forms (convert_to_frontend_config) continue to emit a linear control list; the new layout primitives are opt-in for fixture-supplied (FrontendModelConfig.control) or statically authored FrontendControlConfig trees.

v0.8.13 - 2026-05-13

Added

  • OpenSidebarAction (type: 'open_sidebar') and CloseSidebarAction (type: 'close_sidebar') — new frontend control actions in amsdal.contrib.frontend_configs.models.frontend_config_control_action. Sidebars are stackable by id, positionable (left | right | top | bottom, default right), sized (small | medium | large), and closable either by built-in UI or CloseSidebarAction(target_id=...). Both actions join the ActionType discriminated union and are accepted everywhere ActionType is — FrontendControlConfig.actions, .on_enter, FrontendConfigDashboardElement.on_row_click, InvokeAction.onSuccess/.onError.
  • OpenSidebarAction.content is a discriminated union (SidebarContentType) with two kinds:
  • SidebarFormContent (content_type: 'form') — carries a control_source: FrontendConfigDashboardControlSource so the form is populated either statically (control_source.static_value) or dynamically by a transaction (control_source.dynamic_value), mirroring the UpdateFormAction / dashboard form element pattern.
  • SidebarStaticContent (content_type: 'static') — rendered text body in markdown (default), html, or text.
  • Default dashboard now opens a sidebar on table row click: _build_class_element (amsdal.contrib.frontend_configs.services.default_dashboard) emits a single open_sidebar action whose SidebarFormContent.control_source calls the class form provider (get_class_object_form sync, aget_class_object_form async) with address={row._lakehouse_address} and mode='view'. Replaces the previous update_form row-click action.
  • Migration 0010_add_sidebar_actions registers the new classes and extends ActionType consumers (FrontendControlConfig.actions/.on_enter, InvokeAction.onSuccess/.onError, FrontendConfigDashboardElement.on_row_click) to accept the two new action types.

Changed

  • Default dashboard _build_class_element no longer emits an update_form action on on_row_click; the read-only object form is now shown via the new sidebar instead.

v0.8.12 - 2026-05-12

Added

  • get_class_object_form_schema / aget_class_object_form_schema now consult FrontendModelConfig first via _load_fixture_root / _aload_fixture_root and use the stored control payload as the form layout when a matching, non-deleted record exists for class_name (latest version). When no fixture is found the auto-generated convert_to_frontend_config path is used as before. The fixture path is best-effort — any exception during import or query (e.g. pydantic schema rebuild failure, table missing) is swallowed and the schema falls back to auto-gen.
  • _decorate_tree walks fixture-supplied control trees recursively: containers (group, sections, section, group_switch, group_toggle, info-group, wizard) are descended via their controls list; buttons are passed through untouched; leaf controls get id = name, value from the loaded object, and readOnly = True in 'view' mode. Input controls are never mutated — every node is deep-cloned. _collect_field_names performs the matching traversal to gather every leaf name so the appended Save/Create button body templates cover the full tree, no matter how deeply nested. _build_from_fixture glues these together and appends the mode buttons at the root.
  • _apply_read_only_to_template recursively marks array / dict item templates (the singular control dict and any nested controls list) as readOnly. Wired into both the auto-gen path (_decorate_controls) and the fixture path, so per-item children of array / dict fields no longer render editable when the parent is readOnly.

Changed

  • _CONTAINER_TYPES frozenset and Versions.LATEST import added to class_object_form so fixture queries and tree-walks can filter the right node types and version.

v0.8.11 - 2026-05-08

Added

  • Nested per-app sections in the synthesized default dashboard: each top-level Classes and Transactions section now contains one subsection per app (id classes-<slug> / transactions-<slug>) — User Models/User Transactions first, then one entry per AppConfig in settings.CONTRIBS order, then Core last. Empty subsections are omitted.
  • AppConfig.title, AppConfig.slug, AppConfig.models_module_prefix, AppConfig.package_dir — new optional metadata on the contrib base class. slug, models_module_prefix, and package_dir derive from the subclass's __module__ by default (works for both amsdal.contrib.<name> and external contribs like amsdal_storages); title defaults to empty and contribs set it explicitly. Built-in AuthAppConfig.title = 'Auth' and FrontendConfigAppConfig.title = 'Frontend Configs'.
  • Curated core-models allowlist _CORE_DASHBOARD_MODELS = frozenset({'File'}) controlling which ModuleType.CORE classes surface in the synthesized dashboard's Core subsection.
  • Dynamic dashboard title resolution: synthesized dashboard title now reads (in priority order) the user APP_CONFIG class's title class attribute → humanized AmsdalConfigManager().get_config().application_name from config.yml ('amsdal-customers' → 'Amsdal Customers') → literal 'Dashboard'. Stored FrontendConfigDashboard(default) records continue to take precedence.

Changed

  • Per-class and per-transaction wrapper sections collapsed in the synthesized dashboard payload: each class now emits a single flat 'table' element carrying id='cls-<Name>' and title='<Name>' (instead of a 'section' wrapping a single 'table'); each transaction emits a flat 'form' element with id='tx-<Name>' and title='<Name>'. The FrontendConfigDashboardElement schema already permits id/title on every element type, so no model change. Frontends that match on type=='section' to find class/transaction headings need to read id/title off the leaf table/form element.
  • _class_objects_qs filter in the dashboard service replaces the hardcoded Q(title='File') shortcut with Q(module_type=ModuleType.CORE, title__in=list(_CORE_DASHBOARD_MODELS)).

v0.8.10 - 2026-05-07

Added

  • PII_CRYPTO_SERVICE setting to choose the PII crypto implementation via dotted path (amsdal.services.pii_cryptor.PIICryptorService or amsdal.services.fake_crypto.FakeCryptoService)
  • PIICryptorService.initialize() and FakeCryptoService.initialize() — the chosen service now validates its own requirements at registration time; FakeCryptoService logs a one-shot warning banner when active

Changed

  • register_pii_crypto_service() no longer accepts base_url and client_id arguments — it reads PII_CRYPTO_SERVICE, PII_CRYPTOR_BASE_URL, and PII_CRYPTOR_CLIENT_ID from settings and instantiates the configured service. Selection between real and fake is now explicit — apps that previously relied on an empty PII_CRYPTOR_BASE_URL to silently fall back to the fake service must now set PII_CRYPTO_SERVICE=amsdal.services.fake_crypto.FakeCryptoService (or provide a real PII_CRYPTOR_BASE_URL).
  • Bumped amsdal_models minimum to >=0.7.8; refreshed amsdal_data to 0.6.4 and amsdal_server to 0.8.3 in the lockfile

Fixed

  • Composite-PK regression: filter(_address__object_id__in=[(s, c), ...]) no longer produces invalid text = ANY(int[]) SQL — each tuple is split into per-segment AND-blocks combined by OR

v0.8.9 - 2026-05-06

Added

  • hidden=True kwarg on @transaction / @async_transaction decorators. Transactions decorated with hidden=True are omitted from GET /api/transactions/ and from the synthesized default dashboard's transaction sections. Detail (GET /api/transactions/{name}/) and execution (POST /api/transactions/{name}/) endpoints remain reachable, so internal helpers stay invokable by name. is_hidden_transaction AST helper is exposed in amsdal.services.transaction_execution and amsdal_server.apps.transactions.utils.
  • Built-in get_transaction_form / aget_transaction_form contrib transactions are now marked hidden=True so they no longer surface in the user-facing transaction list or dashboard.

Changed

  • get_transaction_form_schema / aget_transaction_form_schema now return a Run button as a type: 'button' control appended to controls (instead of a top-level actions list with type: 'submit'). Auto-generated field controls get id = name so the button's InvokeAction body can reference each field via {<id>} templating. The button posts to /api/transactions/<name>/ with a body that explicitly maps each declared transaction parameter ({arg: '{arg}', ...}). get_transaction_controls / aget_transaction_controls and the legacy _build_transaction_control alias are unchanged.

v0.8.8 - 2026-05-06

Added

  • get_transaction_form and aget_transaction_form contrib transactions in amsdal.contrib.frontend_configs.transactions. Each accepts a transaction_name and returns the auto-generated form schema (controls plus a submit actions entry) for the named transaction, allowing dashboard configs to retrieve a transaction's form via the standard dynamic_value.transaction execute path with body.transaction_name.
  • Shared helpers get_transaction_controls / aget_transaction_controls and get_transaction_form_schema / aget_transaction_form_schema in amsdal.contrib.frontend_configs.conversion.

Changed

  • Default dashboard transaction sections now emit dynamic_value: {type: 'transaction', entity_name: 'get_transaction_form' | 'aget_transaction_form', body: {transaction_name: <name>}} instead of placing the target transaction's name directly on dynamic_value.transaction. The previous shape continues to work because TransactionDetailControlListener is unchanged in observable behavior.

v0.8.7 - 2026-05-04

Added

  • Auto-generated default FrontendConfigDashboard returned by GET /api/contrib/frontend-config/dashboard/config when no default record exists. Synthesized payload exposes a "Classes" section (one paginated/sortable table per visible class, mirroring /api/classes/ filtering and per-user permissions) and a "Transactions" section (one dynamic-form section per visible transaction). Stored default records still take precedence.
  • TransactionExecutionService.iter_transaction_definitions public iterator over discovered transactions (renamed from _get_transaction_definitions).

v0.8.5 - 2026-04-12

Added

  • Fixtures for FrontendModelConfig and FrontendConfigDashboard forms
  • CRUD permissions for FrontendModelConfig

Fixed

  • Circular type reference in convert_to_frontend_config no longer causes infinite recursion

v0.8.4 - 2026-04-10

Added

  • pagination and sort fields on FrontendConfigDashboardElement for table dashboard elements, enabling server-side pagination and sorting contracts between the frontend and data source transactions

v0.8.3 - 2026-04-10

Added

  • AuditMixin for automatic audit tracking: created_by, updated_by, action, and field-level changes diff
  • __auto_managed_fields__ mechanism and get_auto_managed_fields() helper for excluding service fields from frontend forms
  • stamp_timestamp() and stamp_audit() public methods for manual stamping in bulk operations
  • hide_default_buttons field in FrontendControlConfig

Changed

  • Frontend configs conversion now uses get_auto_managed_fields() instead of hardcoded TimestampMixin check

v0.8.2 - 2026-03-30

Added

  • custom_css field added in frontend configs

Fixed

  • Fixed File.storage property to handle missing _storage PrivateAttr on migration-compiled classes
  • Fixed File.storage to resolve storage_address dict to Reference for migration-compiled classes
  • Clear migration-compiled classes from ClassManager after migrations to use filesystem-loaded classes at runtime

v0.8.1 - 2026-03-09

Added

  • Added table_actions for table dashboard config

v0.8.0 - 2026-02-25

Added

  • PII Cryptor service for encrypting and decrypting sensitive data
  • PII Cryptor settings (PII_CRYPTOR_BASE_URL, PII_CRYPTOR_CLIENT_ID) to configuration

v0.7.6 - 2026-02-24

Changed

  • Added paragraph and header frontend control config types

v0.7.5 - 2026-02-20

Fixed

  • Fix for circular imports in models

v0.7.4 - 2026-02-20

Changed

  • Frontend config action definition updated

v0.7.3 - 2026-02-19

Added

  • On row click added to dashboard config

v0.7.2 - 2026-02-17

Fixed

  • Fix async authentication to handle awaitable permission items in M2M lazy loading

v0.7.1 - 2026-02-16

Added

  • New transactions to generate email challenge

v0.7.0 - 2026-02-13

Changed

  • Refactored authorization system to use composable permissions (BasePermission, PermissionSet, RequireAuth)
  • Replaced legacy ALLOW_ANY constant and scope-based logic with has_admin_permissions and has_permissions functions
  • Updated migrations for LoginSession and MFADevice

v0.6.1 - 2026-02-11

Changed

  • Emit events on MFA challanges

v0.6.0 - 2026-02-05

Changed

  • New events

v0.5.44 - 2026-02-04

Changed

  • form type added to dashboard frontend config

v0.5.43 - 2026-01-25

Changed

  • Added support for fixture structure with nested folders

v0.5.42 - 2026-01-24

Changed

  • Use default manager in fixtures apply

v0.5.41 - 2026-01-22

Fixed

  • Fix for fixtures with Any field

v0.5.40 - 2026-01-19

Changed

  • Move CRM contrib into a separate plugin

v0.5.39 - 2026-01-14

Fixed

  • CRM contrib migrations

v0.5.38 - 2026-01-14

Fixed

  • CRM contrib migrations

v0.5.37 - 2026-01-13

Added

  • CRM contrib

v0.5.36 - 2026-01-02

Fixed

  • Fix for fixture loads with date/datetime values

v0.5.35 - 2025-12-26

Added

  • Added cloud functions for external connections

v0.5.34 - 2025-12-23

Changed

  • Deploying pyproject.toml if exists

v0.5.33 - 2025-12-22

Added

  • Added support for python 3.13

v0.5.32 - 2025-12-21

Changed

  • Update the pydantic to 2.12

v0.5.31 - 2025-12-18

Changed

  • Change the parameters of MFA transaction

v0.5.29 - 2025-12-18

Fixed

  • Fix for serialization

v0.5.28 - 2025-12-17

Added

  • New dashboard config added to the frontend config contrib

v0.5.27 - 2025-12-07

Added

  • Support for contrib transactions

v0.5.26 - 2025-11-30

Added

  • MFA transactions

v0.5.25 - 2025-11-27

Added

  • MFA support added to auth contrib

v0.5.24 - 2025-11-14

Added

  • New frontend config types: 'attachment', 'wizard'

v0.5.23 - 2025-11-05

Added

  • Added 'id' field to FrontendControlConfig model

v0.5.22 - 2025-11-05

Fixed

  • Fix for multiple models

v0.5.21 - 2025-11-05

Changed

  • Added actions to Frontend Config

v0.5.20 - 2025-10-22

Fixed

  • Fix for models compilation

v0.5.19 - 2025-10-20

Added

  • Support for external connections

v0.5.18 - 2025-10-12

Fixed

  • Moved processing of Annotated types earlier in the conversion function to ensure proper handling.

v0.5.17 - 2025-10-10

Fixed

  • Handle created_at field correctly in pre_update and apre_update methods of TimestampMixin to ensure it is set even if not explicitly provided during updates.

v0.5.16 - 2025-10-09

Changed

  • Allow to pass contribs to settings as comma-separated string or JSON array.

v0.5.15 - 2025-10-02

Fixed

  • Fix for handling of files in fixtures

v0.5.14 - 2025-09-26

Changed

  • Remove created_at and updated_at fields from frontend configurations for models that do not inherit from TimestampMixin

v0.5.13 - 2025-09-25

Fixed

  • Fixed conf env names for storage settings

v0.5.12 - 2025-09-25

Changed

  • Exclude TimestampMixin fields from frontend config

v0.5.11 - 2025-09-19

Fixed

  • Adjusted file persist

v0.5.10 - 2025-09-08

Added

  • Conditions added to frontend config

v0.5.9 - 2025-09-04

Fixed

  • Fixes

v0.5.8 - 2025-09-03

Changes

  • File storages

v0.5.7 - 2025-08-21

Added

  • Added TimestampMixin to models for automatic handling of created_at and updated_at fields.

v0.5.6 - 2025-07-31

Changed

  • Exclude models from stubgen

v0.5.5 - 2025-07-28

Fixed

  • Fixes for QS.only

v0.5.4 - 2025-07-11

Fixed

  • Fix for handling the token

v0.5.3 - 2025-07-11

Added

  • Use config_dir to cache token

v0.5.2 - 2025-07-02

Fixed

  • Fix for annotated types in frontend configs conversion.

v0.5.1 - 2025-06-20

Changed

  • Handle literals in frontend configs

v0.4.14 - 2025-06-19

Fixed

  • Handle literals in frontend configs

v0.4.13 - 2025-06-19

Fixed

  • Fix for frontend configs

v0.5.0 - 2025-05-22

Changed

  • Migrations improvements: transfer data on the connection level

v0.4.12 - 2025-05-06

Fixed

  • Fix for optional model parameters in transactions

v0.4.11 - 2025-04-17

Fixed

  • Fixed migration of models with enums

v0.4.10 - 2025-04-14

Added

  • Added short import for TypeModel

v0.4.9 - 2025-04-06

Fixed

  • Fixed deploy

v0.4.8 - 2025-04-04

Changed

  • Deploy amsdal-cli file if exist

v0.4.7 - 2025-03-25

Added

  • Added import shortcuts

v0.4.6 - 2025-03-17

Fixed

  • Fox for unique fields

v0.4.5 - 2025-03-13

Fixed

  • Authentication without proper email/password raises an error

v0.4.4 - 2025-03-11

Fixed

  • Fix for authentication without models

v0.4.3 - 2025-03-07

Fixed

  • Test helpers adjusted

v0.4.2 - 2025-03-05

Changed

  • Added support for db_field

v0.4.1 - 2025-02-25

Fixed

  • Added auth contrib fixtures

v0.4.0 - 2025-02-24

Added

  • Support for FKs and M2Ms
  • Python classes

v0.3.6 - 2024-02-13

Changed

  • Adjusted helpers for tests (adjusted-test-helpers)

v0.3.5 - 2024-12-10

Fixed

  • Use AsyncBackgroundTransactionManager (AsyncBackgroundTransactionManager)

v0.3.4 - 2024-12-09

Added

  • AsyncFileMigrationStore added (AsyncFileMigrationStore)

v0.3.3 - 2024-12-06

Added

  • Async hooks in contrib (async-hooks)
  • Execute async transactions (async-transactions)

v0.3.2 - 2024-12-05

Added

  • Async support (async-support)

v0.3.1 - 2024-11-28

Fixed

  • Fixed schema type usage in migration (schema-type-fix)

v0.3.0 - 2024-11-27

Changed

  • Metadata redesign: moving metadata into historical connection (metadata-redesign)

v0.2.6 - 2024-11-04

Added

  • Nested filtering support (nested-filtering)

v0.2.5 - 2024-10-28

Added

  • Python3.12 support added (python3.12-support)

v0.2.4 - 2024-10-24

No significant changes.

v0.2.3 - 2024-10-23

Changed

  • Optimization for User model init (user-init)

v0.2.2 - 2024-10-18

Fixed

  • Fix for worker connection init (worker-connection-init)

v0.2.1 - 2024-10-18

Fixed

  • Handle update with specific object version (update-specific-object-version)

v0.2.0 - 2024-10-15

Added

  • AMSDAL Glue integration (amsdal-glue)

v0.1.27 - 2024-09-12

Added

  • Added google style docstring (docstring)

v0.1.26 - 2024-09-04

Added

  • Background transactions (background-transactions)

v0.1.25 - 2024-08-26

Added

  • Added heplers for testing (testing-helpers)

v0.1.24 - 2024-08-20

Fixed

  • Fix password change for User (fix-password-change)

v0.1.23 - 2024-07-16

Added

  • Support for ordering in fixtures (support-for-ordering-in-fixtures)

v0.1.22 - 2024-07-11

Fixed

  • Handled dicts and structures in fixtures (handled-dicts-and-structures-in-fixtures)
  • Added frontend configs generation for structure types (frontend-configs-generation-for-structure-types)

v0.1.21 - 2024-06-07

Added

  • Cloud operation to delete environment (cloud-operation-delete-environment)

v0.1.20 - 2024-05-30

Fixed

  • Frontend config response handling (frontend-config-response-handling)

v0.1.19 - 2024-05-22

Added

  • Date and Datetime field types added (date-datetime-field-types)

v0.1.18 - 2024-05-15

Added

  • Environment management commands (environment-management-commands)

v0.1.17 - 2024-05-09

Changed

  • It is now possible to specify permissions for a specific object. A flag has been added that indicates the need for permissions for models by default (object-level-permissions)
  • Removed iceberg from default dependency (iceberg-removed)
  • Added list of all dependencies to ListDependenciesDetails (all-dependencies)

v0.1.16 - 2024-05-06

Added

  • Bulk operations (bulk-operations)

v0.1.15 - 2024-05-03

Changed

  • Improved repr of File to avoid printing whole file content (filre-repr)

Fixed

  • Fixed migration for deleted data (migrate-deleted-data)

v0.1.12 - 2024-04-25

Changed

  • Add ability to pass noinput flag for deploy service. (silent-deploy)

Fixed

  • Set left-to-right union mode for references. (left-to-right-union-mode-for-references)

v0.0.41 - 2024-03-12

Changed

  • Return object_latest in frontend configs for models in transaction arguments (return-object-latest)

v0.0.40 - 2024-03-07

Added

  • Context manager added (context-manager)

v0.0.39 - 2024-03-06

Fixed

  • Do not call hooks during state DB refresh (do-not-call-hooks-during-state-db-refresh)
  • previous_version method now uses the the lakehouse connection (previous-version-lakehouse-connection)

v0.0.38 - 2024-03-05

Changed

  • References are now resolved into objects (references-resolved-into-objects)

v0.0.37 - 2024-03-01

Added

  • Postgres state connection added (postgres-state-connection)

Changed

  • Files are now created first in fixtures (files-creation-first)

v0.0.36 - 2024-02-27

Fixed

  • Fixed static files handling (static-files-handling)
  • Fixed references in fixtures (fixed-references-in-fixtures)
  • Fixed object_version filter in lakehouse connections (fixed-object-version-filter)

v0.0.35 - 2024-02-22

Added

  • Allow to specify IP address in the expose DB operation (expose-db-ip)

v0.0.34 - 2024-02-22

Added

  • New operations to add dependencies and expose DB (cloud-dependency-operations)

v0.0.33 - 2024-02-20

Fixed

  • Fixed transaction parameters in frontend config (fixed-transaction-parameters)

v0.0.32 - 2024-02-20

Changed

  • Improved automatic frontend config generation (improved-frontend-config-generation)

v0.0.31 - 2024-02-15

Fixed

  • Remove old transactions on rebuild (remove-old-transactions)
  • Improved metadata performance (improved-metadata-performance)

v0.0.30 - 2024-02-14

Added

  • Cloud app secrets management (cloud-app-secrets)

v0.0.29 - 2024-02-13

Fixed

  • Fixed init class versions (fixed-init-class-versions)

v0.0.28 - 2024-02-06

Changed

  • Transactions are copied with full file structure (transactions-file-structure)

v0.0.27 - 2024-02-04

Fixed

  • Fixed handling of references (fixed-references-handling)

v0.0.26 - 2024-01-31

Changed

  • Added values in frontend config (frontend-config-values)

v0.0.25 - 2024-01-30

Added

  • Postgres connection added (postgres-connection)

v0.0.24 - 2024-01-23

Changed

  • Updates to deploy commands (deploy-cli-updates)

v0.0.23 - 2024-01-19

Changed

  • Changes to CLI methods methods (deploy-cli)

v0.0.22 - 2024-01-17

Fixed

  • Fixed authorization (authorization-fix)

v0.0.21 - 2024-01-16

Added

  • Fixes and improvements for supporting integrations (integrations)
  • Filtering by object (filtering-by-objects)

v0.0.20 - 2024-01-12

Added

  • Auto-generation of Frondend Config (frontend-config-auto-generation)
  • Deploy methods added to AMSDAL Manager (deploy-methods)

v0.0.19 - 2023-12-22

Fixed

  • Take into account the exclude_none parameter when dumping a model (respect-exclude-none)

v0.0.18 - 2023-12-20

Added

  • Added Address to documentation. (docs-address-api)
  • Added change-logs to documentation. (docs-change-logs)
  • Added QuerySet .using() and _address filter into documentation. (docs-queryset-using)
  • Added AMSDAL Server API documentation. (docs-server-api)
  • Transactions added to Metadata and Lakehouse (transactions)

Changed

  • Lazy loading of References in Metadata (lazy-references)