Changelog

What changed, and why

FastFort is pre-1.0 and the public API is not frozen. A minor release may contain breaking changes; each one is listed under a Breaking heading. Pin a version.

The authoritative file is CHANGELOG.md in the repository. This page is also a feed, built from the same array it renders — so a subscriber and a reader cannot be told different things.

0.3.1

Both ORM backends now satisfy the protocol they implement.

Fixed

  • SQLAlchemyBackend and TortoiseBackend narrowed adapter(uow=...) to their own unit of work. Parameter types are contravariant, so narrowing one made the class structurally incompatible with Backend — and every typed project got that error on the one line the README tells them to write.
  • mypy --strict over fastfort/ passed throughout, because the package never assigns a concrete backend to a Backend itself. The only place that happens is a project's own main.py, so the error landed on users and never on CI.

0.3.0

A second ORM behind the same contract, every column type with a real control, and five browser-side controls that had been rendering correctly and doing nothing.

Added

  • PostGIS: all eight geometry kinds drawn and edited on a hand-rolled slippy map.
  • Spatial filters — within, contains, intersects, overlaps, touches, crosses, bbox, and dwithin, which reads metres on a geography column and SRID units on a geometry.
  • pgvector similarity search: ?embedding__near=[…] with cosine, L2, L1 or inner product, a neighbour count and a distance bound.
  • Real controls for inet, macaddr, money, bit strings, hstore, ranges and multiranges — each had previously degraded to a read-only row.
  • register_type, so a project's own column types are classified once rather than retyped on every admin that shows them.
  • Import: CSV, Excel and JSON back in through the same parsers the form uses, every bad cell reported at once with its line number.
  • Thumbnails in list columns — an image column printed its stored path, which is the one thing a picture answers instantly.
  • ui.map_max_zoom: the deepest level to request from the tile source. It was a constant of 19, right for OpenStreetMap and wrong for every layer that serves deeper.
  • A Tortoise ORM backend, added without a change anywhere above fastfort/orm/ — which is the layering claim becoming a fact.

Fixed

  • A geography column printed raw WKB hex at whoever opened the page.
  • Interval and array columns silently degraded to read-only.
  • A month name the browser could not produce, and a clock the date picker now draws itself.
  • Sorting a list by a relation returned a 500.
  • The date picker's clock had never worked: it called a helper defined only in another bundle, so every call threw and the listener died silently. Choosing an hour did nothing and Done applied nothing.
  • Every required date column fell back to the browser's own picker. Two conditional attributes on consecutive lines were emitted glued together, so the selector matched nothing — 42 attributes across 6 templates.
  • The map went blank past zoom 19 with every tile loaded: a single-precision overflow in the compositor put each tile exactly 2^25 pixels off screen once the layer was scaled.
  • Opening a dropdown scrolled the page by about 120 pixels.
  • The confirm dialog's actions were the size of a toolbar button.

0.2.1

Tortoise ORM behind the same adapter contract.

Added

  • TortoiseBackend, added without a change anywhere above fastfort/orm/.
  • A conformance suite that asks both backends the same questions over identical model shapes.
  • Export: the current view as CSV, Excel or JSON, with filters, search and ordering applied.

Fixed

  • A connection the lifespan opened that the views could not see — Tortoise keeps its connections in a contextvar, and an ASGI server runs the lifespan in a different task.

0.1.0

The first release.

Added

  • @admin.register and ModelAdmin, validated against the model spec.
  • List, create, change and delete, all working with JavaScript switched off.
  • The deletion plan: DELETE, CLEAR and PROTECT, counted before anything is written.
  • Argon2id, JWT access and refresh with rotation and reuse detection, login lockout, CSRF.
  • Eleven language catalogues, shipped inside the wheel.
  • The fastfort command: generate-secret, createsuperuser, check, registered-models.