Skip to content

Releases: opengisch/QFieldCloud

v25.10

28 May 22:45

Choose a tag to compare

Notes

If you have problems with nginx not starting up, please verify the image is actually update to the latest label. The least supported version of nginx is 1.28.0.

What's Changed

  • Allow individual files to be stored at different storage providers within the same project (attachments) by @gounux in #1233
  • fix(nginx): refresh DNS when upstream app ip changes by @toebivankenoebi in #1232
  • Support Range in HTTP header during downloading files by @gounux in #1234
  • fix(nginx): disable ipv6 for the resolver in internal redirects for file download by @suricactus in #1240
  • perf(filestorage)!: add a unique key for files based on project, name and file_type by @suricactus in #1239
  • refactor(localized): rename all localized_ prefixed variables to shared_ regarding shared projects by @suricactus in #1241
  • feat: add ability to mark projects as featured, so they appear always on top by @suricactus in #1242
  • createbuckets: Use mc alias set instead of mc config by @lukasgraf in #1243
  • fix: when we show the loading page, we should reload the same page, not / by @suricactus in #1245
  • feat(project): add is_attachment_download_on_demand flag by @tdrivas in #1246

Full Changelog: v25.9...v25.10

v25.9

08 May 22:29

Choose a tag to compare

What's Changed

  • Refactor filestorage tests with files test mixin class by @gounux in #1225
  • Add bootstrap to installed apps by @gounux in #1228
  • Do not show an error for missing localized dataset when it is available by @suricactus in #1229
  • Skip missing project file problem for localized datasets project by @suricactus in #1230

Full Changelog: v25.8...v25.9

v25.8

07 May 14:29

Choose a tag to compare

Breaking changes

For pre-existing QFieldCloud instances that upgrade from older versions:

  • After succesfull build of the new images, one has to run the following command to allow manage.py collectstatic to work. This is due to changes introduced in #1211 and underlying Debian image. Apparently the user id of newly created app user has changed from 101 to 100, which breaks compatibility with already existing static_volume.
docker compose exec --user root app chown -R app:app /usr/src/app/staticfiles

What's Changed

  • Refactor styling for social login providers buttons by @gounux in #1208
  • Update minio createbuckets by @stcz in #1174
  • Apply docker best practices to Dockerfiles by @stcz in #1181
  • Customize reset password from key page by @gounux in #1204
  • Fixes and improvements regarding .env variables and Django settings by @suricactus in #1210
  • Remove types from docstrings, we can get them from PEP484 typing and retire List etc by @suricactus in #1213
  • Bump python to the latest 3.10 series and change from buster to bookworm by @suricactus in #1211
  • Move postgis docker image version to environment by @gounux in #1154
  • Fix user-defined environment variables not being passed to the QGIS worker by @suricactus in #1212
  • Remove unused queryset_utils.get_project_deltas by @suricactus in #1215
  • Add webdav storage backend by @gounux in #1214
  • Redirect QFieldSync project URL to the admin view by @suricactus in #1218
  • Fix error 500 when using the DRF in-browser viewer on GET /projects by @suricactus in #1223
  • Managing cross-project files (localized datasets) by @tdrivas in #1147
  • Return ObjectNotFoundError when get_object_or_404 is used in the code by @suricactus in #1224
  • Fix wrong syntax for docker-compose expose. by @toebivankenoebi in #1227

New Contributors

Full Changelog: v25.7...v25.8

v25.7

15 Apr 13:51

Choose a tag to compare

What's Changed

  • [CI] Fix CI docker image build tagging on tag event by @gounux in #1197
  • [CI] Build and push createbuckets docker image by @gounux in #1198
  • Customize auth providers buttons by overriding allauth's template by @gounux in #1203
  • Fix thumbnail_url for projects using legacy storage by @gounux in #1205
  • Fix downloading package files from projects with multiple packages by @gounux in #1206

Full Changelog: v25.6...v25.7

v25.6

09 Apr 10:29

Choose a tag to compare

What's Changed

  • Add API endpoint to list enabled auth providers by @lukasgraf in #1192
  • Fix incorrect key usage in kwargs.pop() for filename extraction by @tdrivas in #1199
  • Make social account providers configurable via env var. by @lukasgraf in #1200
  • Fix AttributeError: ''DeleteObsoleteProjectPackagesJob'' object has no attribute ''job'' by @gounux in #1194
  • Delete previous thumbnails versions on s3 when updating project thumbnail by @gounux in #1195

Full Changelog: v25.5...v25.6

v25.5

28 Mar 05:28

Choose a tag to compare

What's Changed

  • Revert "Merge pull request #1183 from opengisch/QF-5531-fix-download-latest-package" by @gounux in #1188

Full Changelog: v25.4...v25.5

v25.4

26 Mar 15:24

Choose a tag to compare

What's Changed

  • Add QGIS authentication middleware by @lukasgraf in #1186
  • Fix downloading package files from projects with multiple packages by @suricactus in #1183
  • Fix case sensitivity issue in username handling by @tdrivas in #1146
  • Fix potential assertion error when resending a confirmation email by @gounux in #1187

Full Changelog: v25.3...v25.4

v25.3

24 Mar 22:25

Choose a tag to compare

What's Changed

Full Changelog: v25.2...v25.3

v25.2

24 Mar 17:04

Choose a tag to compare

What's Changed

  • Prioritize the most recently active users to be migrated first in migrateavatar by @suricactus in #1168
  • Fallback to the legacy avatar if an avatar is not migrated yet, or serve static file if avatar is not available at all by @suricactus in #1169
  • Fix a misleading comment that the envvar is called DYNAMIC_STORAGES, but it we settled on STORAGES only by @suricactus in #1170
  • Add basic support for SSO using OpenID Connect by @lukasgraf in #1159
  • Docker: Add memcached restart: unless-stopped policy by @faebebin in #1182
  • Ignore MethodNotAllowed error as it is purely a client error by @suricactus in #1178
  • Fixed wrong query in dequeue script leading to the same jobs being picked by multiple worker wrappers by @suricactus in #1175
  • Fix: Do not require useraccount for teams during autocomplete by @tdrivas in #1176
  • Add STORAGE_ACCESS_KEY_ID and STORAGE_SECRET_ACCESS_KEY to .env.example by @stcz in #1173
  • Do not raise when subscription overlap in the admin by @tdrivas in #1141
  • Do not use raw strings when filtering jobs in the migration script by @suricactus in #1179
  • Remove the error log message as we throw an error a bit later anyways by @suricactus in #1172
  • Kill long retired middleware about request/response logging by @suricactus in #1171
  • Reintroduce isort in the pre-commit by @tdrivas in #1145
  • Ignore AuthenticationViaTokenFailedError in sentry reports by @suricactus in #1177

New Contributors

Full Changelog: v25.1...v25.2

v25.1

19 Mar 19:50

Choose a tag to compare

What's Changed

Important

Read the following lines carefully if you are upgrading from older QFieldCloud version.

This release introduces a major refactoring on th way how QFieldCloud stores and interacts with files. While backward compatibility is preserved in this version, the legacy way of interacting with files is due to be removed in the following months.

Prior to this release, QFieldCloud was directly interacting with the Object storage API via the boto3 library. This made Obejct storage a hard requirement of QFieldCloud. Not only that, but QFieldCloud was also insisting on having a versioned Object storage, which was used for the file versioning that QFieldCloud supports. In the years this proved to be limiting further growth of functionality for QFieldCloud, since all file manipulations and data storage was entirely relient on the Obejct storage provider.

The new approach introduced in this version is using the native Django FileField implementation, that abstracts file storage interactions. Using FileField put the need to introduce two new models, File and FileVersion where all file metadata can be stored without the need to query the Obejct storage. In addition, the requirement for versioned Object storage is dropped. Now each file version is stored with a separate key in the Object storage. Since the FileField is abstracting the actual storage, QFieldCloud now has the foundation to theoretically support other tthan Obejct storage.

There are a few new configurations to be made in the .env file.

  • STORAGES - consult Django Docs and .env.example file. Note the only provider type supported is qfieldcloud.filestorage.backend.QfcS3Boto3Storage. For compatibility, there is a additional QFC_IS_LEGACY flag that can be given on a single STORAGES provider. This will be supported for short time to allow transition from the old storage to the new storage. Note if STORAGES is not available, the legacy STORAGE_ACCESS_KEY_ID, STORAGE_SECRET_KEY_ID, STORAGE_BUCKET_NAME and STORAGE_REGION_NAME will dynamically create a new storage named default. Each project can be configured to be on a separate storage provider, which is controlled by the Project.file_storage field.
  • STORAGES_PROJECT_DEFAULT_STORAGE - indicates which should be the default project storage provider for new projects. Allows for gradual transition from legacy to non-legacy storage. If left empty, it will use the storage on the default key.

Note that configuring the right storage provider names at this stage will save you from manual database interventions to update your projects.

Consult the tests for a sample configuration if you are upgrading: https://github.com/opengisch/QFieldCloud/blob/v25.1/.github/workflows/test.yml#L69-L92

Migrating from the legacy storage to the new storage can happen via a one directional script, see https://github.com/opengisch/QFieldCloud/blob/v25.1/docker-app/qfieldcloud/filestorage/management/commands/migratefilestorage.py for projects and https://github.com/opengisch/QFieldCloud/blob/v25.1/docker-app/qfieldcloud/filestorage/management/commands/migrateavatars.py for avatars.

Caution

Please backup all your file storage and database before upgrading to the newer version. Make sure you deeply understand the changes and implications before upgrading.

File related changes

  • Introduce filestorage app, support for multiple file backends and store file metadata in the database by @suricactus in #1104
  • Migrate avatar storage using django-storages instead of raw s3 queries by @suricactus in #1121
  • Bump boto3, boto3-stubs and mypy-boto3-s3 from 1.35.90 to 1.37.0 and minio to RELEASE.2025-02-18T16-25-55Z by @suricactus in #1130
  • Make the avatars public by @suricactus in #1138
  • When using the STORAGE_ variable we actually need to create a legacy storage by @suricactus in #1144
  • Add the possibility to migrate file storage by exact username and support version ids that are not UUIDs by @suricactus in #1155
  • Make it easy to change the default storage by changing STORAGES_PROJECT_DEFAULT_STORAGE by @suricactus in #1153
  • Make Project.status a cached property to drastically reduce the number of DB queries by @suricactus in #1151
  • For historical reasons we named the etag as md5sum in the API by @suricactus in #1156
  • Add more logs when deleting files by @suricactus in #1157
  • Move the default project setting STORAGES_PROJECT_DEFAULT_STORAGE to be available also in non-test environment by @suricactus in #1158
  • Fix backwards compatibility with QField/QFieldSync for avatars by @suricactus in #1161
  • Remove trailing slash for avatars for backwards compatibility for QFieldSync by @suricactus in #1162
  • Add information in the admin when the project has been migrated by @suricactus in #1163
  • Migrate avatars from the old storage to the new storage by @suricactus in #1165
  • Delete the FileField files when a model entity is deleted by @suricactus in #1166
  • Attach project files also in last package view by @gounux in #1167

Other changes

  • Bump django-sri from 0.7.0 to 0.8.0 by @suricactus in #1132
  • Fix warning due to django-allauth update by @suricactus in #1131
  • Add some extra default settings to the cache configuration by @suricactus in #1136
  • [sentry] Fix comparison between of a constance setting and "Content-Length" header by @tdrivas in #1135
  • When reversing a URL, we need to pass it as kwargs, not just a dict by @suricactus in #1137
  • Fix ApplyJobDelta typings by @gounux in #1139
  • Sign-up via invitation link process results in a broken /accounts/profile redirect by @suricactus in #1134
  • Fix typo in docker-compose.override.local.yml by @faebebin in #1143
  • Use upstream constance database backend, since it no longer resets values by @suricactus in #1149
  • Fix typing checks for AbstractSubscription and Subscription by @suricactus in #1152
  • Add mail confirmation and resend django logic by @gounux in #1150
  • Add an assert when resending confirmation email by @gounux in #1160

Full Changelog: v0.32.5...v25.1