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.
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.
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.
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.
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.