History¶
0.4.1 (2026-07-23)¶
-
Python 3.14 is supported and tested, against both Django 5.2 LTS and 6.0.
-
PyPI metadata is fuller: real keywords instead of just the package name, and links to the documentation, repository, issue tracker and changelog rather than the homepage alone.
Development Statusmoves from3 - Alphato5 - Production/Stable. -
Internal: removed the last Python 2 leftovers (
__future__imports, UTF-8 encoding headers,super(Class, self)) and turned on ruff'sUP(pyupgrade) ruleset, which had been off, so that they cannot creep back in. No runtime behaviour changed.
0.4.0 (2026-07-22)¶
-
Backwards incompatible: the minimum supported Django is now 5.2 LTS. Tested against Django 5.2 and 6.0.
-
The Polish translation now actually works when installed from PyPI. Django reads compiled
.mocatalogues rather than the.posources, and*.mois gitignored, so every release up to and including 0.3.2 shipped the.poalone and the translation silently did nothing. Releases now compile the catalogues before building, and the build fails if the wheel ends up with fewer.mofiles than.pofiles. -
The
example/project, which could not start on any supported Django, is replaced bydemo/-- a working project that runs against either the plain admin (make demo) or grappelli (make demo-grappelli) from one set of models and seed data. -
Documentation is rewritten and published to https://mpasternak.github.io/django-flexible-reports/. The previous
docs/readme.rstincluded aREADME.rstthat does not exist and rendered blank; the install instructions recommendedeasy_install.
The manual is now built with MkDocs and the Material theme instead of Sphinx, and its sources are Markdown.
-
Three migrations no longer import
django.contrib.postgres.fields.jsonb. That import pulled inpsycopg2at module load, somigratefailed on SQLite for anyone who had installed only the runtime dependencies. -
TableandReportcan now be cloned from the admin, using a Clone button on the change form. Cloning a table copies its columns and its sort order; cloning a report copies its elements, which keep pointing at the same tables and datasources. The clone's name gets a translatable(copy)suffix.
Both are also available programmatically as Table.clone() and
Report.clone(). Neither modifies the source object.
The button is verified to work with grappelli, which ships its own
admin/change_form.html; a regression test guards it.
- Fix stale table headers. A cached table class was kept per
Table.pkfor the lifetime of the process and never invalidated, so editing a column's label -- or deleting a column -- only became visible after restarting Django. With several workers the page alternated between old and new headers depending on which worker answered.
The cache is gone. Compiled column templates are cached instead, keyed by
the template source so no invalidation is needed, which more than pays the
removal back: rendering a 500-row table is ~1.25x faster than before, since
TemplateColumn used to recompile its template for every single cell.
0.3.2 (2026-06-03)¶
- Switch the DjangoQL dependency from upstream
djangoqlto thedjangoql-iplwebfork (>=0.20). The fork keeps thedjangoqlimport name unchanged, so no code changes are required, and it adds i18n support for parser/lexer/schema error messages (including a Polish translation).
0.3.1 (2026-05-31)¶
Datasourcegained an optionalsample_contextfield holding example values for a query's template parameters, used to validate a parametrised query on save (bothdslandDjangoQLbackends). It is nullable and must be a JSON object.- Fix an admin 500 when clearing Sample parameters — the
sample_contextJSONField is now nullable. - Don't HTML-escape query parameters when rendering
DjangoQLqueries, so values containing<,&or"are no longer corrupted. Thedjango-dslbackend received the same fix in django-dsl 0.1.14. - Fix the except-catchall element lookup (key off
ContentType.model) so the "everything except" table renders its rows instead of being silently empty; the caught querysets are OR-ed into a single exclude. - Escape the datasource query shown in the admin changelist.
- Chain
ValidationErrorfrom the original backend error for clearer diagnostics.
0.3.0 (2026-05-31)¶
Datasourcegained aquery_languagefield and can now interpret its query with eitherdjango-dsl(default) or DjangoQL. Query backends are pluggable (flexible_reports.query_backends). The django_tables2 adapter now consumes a filtered queryset from each datasource instead of a rawQobject. Existing datasources keep working unchanged (defaultdsl).
0.2.12 (2026-04-19)¶
- Fix
DeprecationWarning: Pickle, copy, and deepcopy support will be removed from itertools in Python 3.14raised when instantiating aTablewith columns usingCounterMixin. The mixin now keeps the counter as a plainintinstead ofitertools.countso that columns stored inTable.base_columnsremain deep-copyable on Python 3.14. tests.settings.DATABASES['default']['PORT']now respects thePOSTGRES_PORTenvironment variable (default:5432).
0.2.10 (2022-07-07)¶
- Drop support for Django 2.2 and below,
- Drop support for Python 3.7,
- Python 3.10 support,
- Django 3.2 support,
- enable GitHub Actions,
- remove Travis-CI config.
0.1.0 (2017-07-20)¶
- First release on PyPI.