Releases: opengisch/QFieldCloud
v25.10
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
Rangein 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,
nameandfile_typeby @suricactus in #1239 - refactor(localized): rename all
localized_prefixed variables toshared_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
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
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 collectstaticto work. This is due to changes introduced in #1211 and underlying Debian image. Apparently the user id of newly createdappuser has changed from 101 to 100, which breaks compatibility with already existingstatic_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
Listetc by @suricactus in #1213 - Bump python to the latest 3.10 series and change from
bustertobookwormby @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_deltasby @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
- @toebivankenoebi made their first contribution in #1227
Full Changelog: v25.7...v25.8
v25.7
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_urlfor 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
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
v25.4
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
What's Changed
- Fix some post-merge isort issues by @suricactus in #1184
Full Changelog: v25.2...v25.3
v25.2
What's Changed
- Prioritize the most recently active users to be migrated first in
migrateavatarby @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 onSTORAGESonly 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
MethodNotAllowederror 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
AuthenticationViaTokenFailedErrorin sentry reports by @suricactus in #1177
New Contributors
- @lukasgraf made their first contribution in #1159
Full Changelog: v25.1...v25.2
v25.1
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.examplefile. Note the only provider type supported isqfieldcloud.filestorage.backend.QfcS3Boto3Storage. For compatibility, there is a additionalQFC_IS_LEGACYflag that can be given on a singleSTORAGESprovider. This will be supported for short time to allow transition from the old storage to the new storage. Note ifSTORAGESis not available, the legacySTORAGE_ACCESS_KEY_ID,STORAGE_SECRET_KEY_ID,STORAGE_BUCKET_NAMEandSTORAGE_REGION_NAMEwill dynamically create a new storage nameddefault. Each project can be configured to be on a separate storage provider, which is controlled by theProject.file_storagefield.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 thedefaultkey.
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
filestorageapp, 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-stubsandmypy-boto3-s3from 1.35.90 to 1.37.0 andminiotoRELEASE.2025-02-18T16-25-55Zby @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_STORAGEby @suricactus in #1153 - Make
Project.statusa cached property to drastically reduce the number of DB queries by @suricactus in #1151 - For historical reasons we named the
etagasmd5sumin the API by @suricactus in #1156 - Add more logs when deleting files by @suricactus in #1157
- Move the default project setting
STORAGES_PROJECT_DEFAULT_STORAGEto 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
FileFieldfiles 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-srifrom0.7.0to0.8.0by @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
ApplyJobDeltatypings by @gounux in #1139 - Sign-up via invitation link process results in a broken
/accounts/profileredirect by @suricactus in #1134 - Fix typo in docker-compose.override.local.yml by @faebebin in #1143
- Use upstream
constancedatabase backend, since it no longer resets values by @suricactus in #1149 - Fix typing checks for
AbstractSubscriptionandSubscriptionby @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