Releases: opengisch/QFieldCloud
v25.30
This version adds 2 new environment variables :
STORAGES_PROJECT_DEFAULT_ATTACHMENTS_STORAGE: declares the storage key to which the attachments of new projects will be stored on.STORAGE_PROJECT_DEFAULT_ATTACHMENTS_VERSIONED: if the attachments should be versioned, currently implemented only on WebDAV storages.
Important
File storage migration notes, dropping support of the legacy file storage soon.
In future versions of QFieldCloud, the "legacy" file storage support will be dropped. We recommend you to migrate your projects from a potential legacy storage to a new default storage.
🔗 See v25.1's Release Notes for default storage configuration.
🔗 See the migratefilestorage Django command tool, that can be used to migrate projects, e.g. :
- Migrate a single project based on its id :
docker compose exec app python manage.py migratefilestorage --project-id <PROJECT_UUID> - Migrate all the projects on the instance :
docker compose exec app python manage.py migratefilestorage --all --no-filter
Note that avatar URL now is changed to use a public id, please consider updating any potential custom API implementation.
Warning
Note that shared_datasets projects now do not accept QGIS project files anymore.
What's Changed
- feat: add a setting for attachment storage and if versioned by @gounux in #1435
- refactor: remove margin-left from header logo in CSS by @Rakanhf in #1444
- chore: bump various dependencies by @gounux in #1441
- feat: disable
.qgsforshared_datasetsProject by @Rakanhf in #1433 - feat: do not repeat the same log twice for libqfieldsync by @suricactus in #1439
- fix: ensure there is some kind of extent when generating a thumbnail by @suricactus in #1440
- Use rustfs instead of minio for local development by @suricactus in #1450
- Revert "Merge pull request #1450 from opengisch/QF-7374-rustfs" by @suricactus in #1452
- Revert "chore: bump
boto3related dependencies from1.35.Xto1.42.3" by @gounux in #1457 - Introduce flake8-if-expr to forbid inline ifs by @suricactus in #1455
- feat: add
ModelAdminSearchParserMixinto enhance code quality by @Rakanhf in #1456 - feat: add user inactivity threshold and welcome back message on login by @Rakanhf in #1442
- feat: add public ID for user avatars by @Rakanhf in #1443
- feat: add
not-yet-packagedCLI filter in file storage migration script by @gounux in #1446 - test: add test for setting session role through
QFC_PG_EFFECTIVE_USERSecret by @gounux in #1458 - feat: expand
Personquick link navigation by @Rakanhf in #1459 - Expose the file_storage_bytes attribute in the /api/v1/projects serializer by @nirvn in #1460
- feat: update org memberships when owner changes by @gounux in #1462
- translations: update
LANGUAGESin settings by @gounux in #1463
Full Changelog: v25.29...v25.30
v25.29
What's Changed
- Add SSO branding for login with Microsoft Entra ID. by @lukasgraf in #1431
- Temporarily bump django-auditlog to version from git that contains SSO fix by @lukasgraf in #1432
- feat: add session_role to a postgis layer if configured, during deltas apply by @gounux in #1430
- feat: make attachments of a project optionally versionable by @gounux in #1427
- feat: override Django admin logout view to redirect to Allauth's logout by @Rakanhf in #1436
- feat: add whitelabelling by @Rakanhf in #1428
Full Changelog: v25.28...v25.29
v25.28
Release notes
Django Admin login now goes through django-allauth's templates.
Recommended version for running QFieldCloud's database is now PostgreSQL 17 / PostGIS 3.5.
From this version on, nginx can be configured with the following additional environment variables :
NGINX_CLIENT_MAX_BODY_SIZENGINX_PROXY_CONNECT_TIMEOUTNGINX_PROXY_READ_TIMEOUTNGINX_PROXY_SEND_TIMEOUT
What's Changed
- fix: wrongly hardcoded
Content-Typeheader in non-nginx responses by @suricactus in #1406 - fix: follow-up on wrongly hardcoded
Content-Typeheader in non-nginx responses by @Rakanhf in #1408 - Use only one login page from
allauthby @Rakanhf in #1387 - fix: do not check missing Sha256sum key when checking if file exists on legacy S3 during fs migration by @gounux in #1414
- feat(drf): ensure the login on drf browseable API page is also using allauth by @suricactus in #1294
- feat(admin): add custom admin site that reuses the allauth login by @suricactus in #1293
- tests: Make volume name for test DB respect COMPOSE_PROJECT_NAME by @lukasgraf in #1416
- Fix typos in README.md. by @felixxm in #1418
- chore: update .gitignore to include .env.test and .venv by @Rakanhf in #1422
- Various fixes and improvements in the jobs framework by @suricactus in #1409
- Drop field
is_meteredfromPlanmodel by @lukasgraf in #1421 - fix: flaky file size calculations by @Rakanhf in #1417
- Bump postgis image version to 17 in .env.example by @lukasgraf in #1413
- chore: bump various dependencies by @gounux in #1424
- Qf-6822 add restricted files update timestamp by @Rakanhf in #1411
- feat: add qfieldcloud version to admin panel by @Rakanhf in #1425
- follow up fix on Project
data_last_updated_aton file delete by @Rakanhf in #1426 - feat(nginx): Add env vars for Nginx max body size and proxy timeouts by @toebivankenoebi in #1429
New Contributors
Full Changelog: v25.27...v25.28
v25.27
Release notes
This version is mostly bugfixes and stability improvements. Check the detailed changedlog below for more info.
Caution
If you somehow depended on the long deprecated GeoDB module, this version of QFieldCloud finally removes the support for GeoDB. Before you proceed make sure you moved all your data outside your GeoDBs. The model and the data will be permanently deleted.
Because the GeoDB is no longer present as a service in the docker compose file, you need to docker compose up --remove-orphans.
Caution
If you have stored Secrets in the database and running on older version of QFieldCloud (<= v25.24), you should upgrade to v25.26 and run the migrations before upgrading to this version. Reason behind this is that the django_cryptography lib dependency which was used to store Secrets in older versions is removed in the requirements of this version, now using django-fernet-encrypted-fields to store encrypted values.
Also this version does a great restructuring of the envvars by adding a documentation to each and every of them. We recommend to reorder your .env file similar to .env.example so you can track changes by simply diff-ing between the two files.
What's Changed
- Fix unnecessary creation of storage_package as
PackageTypeby @Rakanhf in #1377 - refactor: fix typing for parsing the
Rangeheader and serving the files by @suricactus in #1380 - fix: use
the_qgis_file_namein calcprojectstorage command by @gounux in #1383 - refactor: no need for the
WEB_HTTP(S)_PORTin theappcontainer by @suricactus in #1381 - chore: drop
django_cryptographydependency by @gounux in #1384 - bug: fix the mismatch between requirements.in and requirements.txt and bump a few more dependencies by @suricactus in #1382
- feat(worker): make qgis jobs defined in a single file by @suricactus in #1367
- feat: kill the geodb once and forever by @suricactus in #1379
- Remove hardcoding of the third-party auth related headers by @gounux in #1385
- Ensure legacy thumbnail file exists on S3 before migrating it by @gounux in #1386
- test: add coverage reporting by @suricactus in #1390
- fix: when the project where we try to upload a file to does not exist return a JSON formatted 404 by @suricactus in #1389
- Fix flaky files API tests by @lukasgraf in #1393
- fix: kill geodb envvars that are no longer needed by @suricactus in #1394
- feat(worker): bump SDK to support streamable uploads by @suricactus in #1404
- Limit time it takes to render a project thumbnail by @nirvn in #1402
- Change nginx resolver to docker internal DNS for storage-download redirects by @gounux in #1399
- feat: add support for virtual layers without embedded layers by @suricactus in #1396
- fix: consider org member when getting who triggered latest_package_jobs by @gounux in #1391
- Update README.md with contributing guidelines by @suricactus in #1403
- feat: make the worker_wrapper logger level to debug if DEBUG==True by @suricactus in #1405
- feat: add docs to each and every envvar with links to docs, group them logically by @suricactus in #1395
- chore: change the default ENVIRONMENT from test to development by @suricactus in #1398
- feat: remove GET param to display third-party auth providers on login page by @gounux in #1397
- Bump sentry to v2 by @Rakanhf in #1388
New Contributors
Full Changelog: v25.26...v25.27
v25.26
What's Changed
- Use variable storage key for thumbnails by @lukasgraf in #1357
- feat(nginx): Cleaner nginx configuration, production ready by @toebivankenoebi in #1356
- typing: added typing to dequeue.py by @suricactus in #1351
- Bump qgis from 3.44.2 to 3.44.3 by @suricactus in #1365
- chore: add the ability to easily run a debugger on the qgis container by @suricactus in #1362
- feat: bump libqfieldsync to the latest version in the qgis worker by @suricactus in #1363
- refactor: simplify and reduce code repetition in the qgis worker code by @suricactus in #1364
- edit(fsmigration): use a project's
locked_atinstead ofis_lockedby @gounux in #1361 - chore: bump
ofeliafromv0.3.4to0.3.18by @suricactus in #1366 - fix(ofelia): disable accidental cronjob run in the worker_wrapper by
ofeliaby @toebivankenoebi in #1368 - fix(admin): the FaultyDelta admin was taking forever to open by @suricactus in #1371
- edit(fsmigration): log count of migrated package files by @gounux in #1372
- fix(admin): when listing projects in the admin, do not always suffix with KB by @suricactus in #1370
- Bump Python dependencies by @suricactus in #1369
- feat: check s3 etags before and after file storage migration by @gounux in #1373
- Bump
djangofrom4.2.24to4.2.25by @suricactus in #1375
Full Changelog: v25.25...v25.26
v25.25
What's Changed
- Bump various deps in QFieldCloud by @suricactus in #1313
- Bump various test dependencies by @suricactus in #1315
- chore(deps): Bump all indirect dependencies to their latest version by @suricactus in #1318
- Bump django-allauth from 65.4.1to 65.11.0 by @suricactus in #1314
- Bump and pin deps in the qgis worker container by @suricactus in #1319
- chore(deps): bump urllib3 from 2.2.2 to 2.5.0 in /docker-qgis in the pip group across 1 directory by @dependabot[bot] in #1321
- typing: do not assign None if the variable is not None-able by @suricactus in #1306
- fix(admin): searching for secrets admin throws error 500 by @suricactus in #1309
- refactor: rewrite the way how secrets are filtered in
latest_package_job_for_userby @suricactus in #1325 - feat(filestorage): disable the minimum bytes length in the HTTP Range header by @suricactus in #1324
- feat: do not report
TooManyLoginAttemptsErrorto Sentry by @suricactus in #1312 - test(delta): multiple deltas with same PK value in different layers are applied correctly by @suricactus in #1327
- feat: kill manage.py status command as very venerable and unused in practice by @suricactus in #1326
- feat: added configuration to set incident info and status page url by @suricactus in #1322
- feat(secrets): use
django-fernet-encrypted-fieldsfor encrypted values by @gounux in #1286 - fix(storage): if the project is using non-legacy storage, get it's size directly from the database by @suricactus in #1323
- feat(admin): add custom admin site that can be extended in the future by @suricactus in #1310
- feat(filestorage): Support
If-(None-)MatchandIf-(Un)Modified-Sinceheaders in file download endpoints by @suricactus in #1328 - feat(storage): add file storage migration command arguments by @gounux in #1333
- Update wget command to include chmod correctly by @urlacher23 in #1338
- edit(fs migration): update command error handling by @gounux in #1336
- fix: add the last remaining untraslated field names in admin by @suricactus in #1339
- feat: added django-stubs and drf-stubs by @suricactus in #1342
- docs: add docs about dump restore, improve the instance launch, add info how to access the database by @suricactus in #1340
- Bump various deps and fix warnings when installing deps by @suricactus in #1341
- edit(migration): remove prompt if accept argument is set by @gounux in #1343
- Add dedicated model to store faulty deltafiles by @lukasgraf in #1334
- feat(filestorage): always enable the versioning on QFieldCloud development stack by @suricactus in #1346
- fix(nginx): CSRF check failure when debug mode is enabled by @suricactus in #1347
- fix: revive Constance admin which disappeared with custom sites by @suricactus in #1348
- chore: add debugger config for vscode and update README.md by @suricactus in #1350
- Bump
django-stubsfrom5.2.2to5.2.5by @suricactus in #1352 - chore: pre-commit autoupgrade by @suricactus in #1353
- chore: bump
qgisfrom 3.44.1 to 3.44.2 by @suricactus in #1354 - fix(admin): add unregistered admins by @gounux in #1355
- fix(admin): revive the django axes admin by @suricactus in #1358
- fix(admin): use
QFieldCloudModelAdminto improve admin page loading speed by @suricactus in #1359 - storage: make project's
file_storageconfigurable in admin when there is no file by @gounux in #1360 - edit(fs migration): use harmonised logger during fs migration by @gounux in #1345
New Contributors
- @urlacher23 made their first contribution in #1338
Full Changelog: v25.24...v25.25
v25.24
v25.23
v25.22
Notes
This release contains two critical fixes regarding applying changes from different layers during one fieldwork session, as well as fixing a potential security exploit related to secrets usage in Jobs.
We recommend everyone using QFieldCloud 25.13 or newer to upgrade immediately.
What's Changed
- Fix last modified PK value match when modifying multiple offlined layers across multiple pushes by @nirvn in #1307
- fix: secrets filtering for projects owned by non-organizations by @suricactus in #1308
Full Changelog: v25.21...v25.22
v25.21
What's Changed
- fix: be explicit that the given assert is disabled on prod environment by @suricactus in #1305
Full Changelog: v25.20...v25.21