geovisio 2.7.0__tar.gz → 2.7.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (317) hide show
  1. {geovisio-2.7.0 → geovisio-2.7.1}/CHANGELOG.md +28 -2
  2. {geovisio-2.7.0 → geovisio-2.7.1}/PKG-INFO +2 -2
  3. {geovisio-2.7.0 → geovisio-2.7.1}/docker/docker-compose-full.yml +1 -1
  4. {geovisio-2.7.0 → geovisio-2.7.1}/docs/api/open_api.json +171 -14
  5. {geovisio-2.7.0 → geovisio-2.7.1}/docs/dev/STAC_compatibility.md +3 -1
  6. {geovisio-2.7.0 → geovisio-2.7.1}/docs/dev/develop_server.md +18 -27
  7. {geovisio-2.7.0 → geovisio-2.7.1}/docs/install/running.md +9 -0
  8. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/__init__.py +2 -2
  9. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/admin_cli/cleanup.py +2 -2
  10. geovisio-2.7.1/geovisio/translations/de/LC_MESSAGES/messages.mo +0 -0
  11. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/translations/de/LC_MESSAGES/messages.po +139 -2
  12. {geovisio-2.7.0/geovisio/translations/nl → geovisio-2.7.1/geovisio/translations/el}/LC_MESSAGES/messages.mo +0 -0
  13. geovisio-2.7.0/geovisio/translations/messages.pot → geovisio-2.7.1/geovisio/translations/el/LC_MESSAGES/messages.po +3 -4
  14. geovisio-2.7.1/geovisio/translations/en/LC_MESSAGES/messages.mo +0 -0
  15. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/translations/en/LC_MESSAGES/messages.po +126 -118
  16. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/translations/fr/LC_MESSAGES/messages.mo +0 -0
  17. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/translations/fr/LC_MESSAGES/messages.po +1 -1
  18. geovisio-2.7.1/geovisio/translations/hu/LC_MESSAGES/messages.mo +0 -0
  19. geovisio-2.7.1/geovisio/translations/hu/LC_MESSAGES/messages.po +773 -0
  20. geovisio-2.7.1/geovisio/translations/messages.pot +694 -0
  21. geovisio-2.7.1/geovisio/translations/nl/LC_MESSAGES/messages.mo +0 -0
  22. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/translations/nl/LC_MESSAGES/messages.po +24 -16
  23. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/utils/pictures.py +18 -20
  24. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/utils/sequences.py +21 -23
  25. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/utils/upload_set.py +40 -52
  26. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/web/collections.py +19 -3
  27. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/web/docs.py +35 -1
  28. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/web/items.py +15 -6
  29. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/web/map.py +86 -18
  30. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/web/upload_set.py +9 -6
  31. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/workers/runner_pictures.py +19 -33
  32. geovisio-2.7.1/migrations/20241004_01_d1zfe-pictures-grid-360.rollback.sql +22 -0
  33. geovisio-2.7.1/migrations/20241004_01_d1zfe-pictures-grid-360.sql +24 -0
  34. geovisio-2.7.1/migrations/20241011_01_e1j5C-pic-quality.rollback.sql +21 -0
  35. geovisio-2.7.1/migrations/20241011_01_e1j5C-pic-quality.sql +247 -0
  36. geovisio-2.7.1/migrations/20241017_01_GuOjF-pic-quality-update.rollback.sql +4 -0
  37. geovisio-2.7.1/migrations/20241017_01_GuOjF-pic-quality-update.sql +61 -0
  38. geovisio-2.7.1/migrations/20241017_01_RiFlm-pictures-to-delete.rollback.sql +43 -0
  39. geovisio-2.7.1/migrations/20241017_01_RiFlm-pictures-to-delete.sql +75 -0
  40. geovisio-2.7.1/migrations/20241104_01_yhRVu-rejection-details.rollback.sql +4 -0
  41. geovisio-2.7.1/migrations/20241104_01_yhRVu-rejection-details.sql +4 -0
  42. {geovisio-2.7.0 → geovisio-2.7.1}/tests/conftest.py +82 -0
  43. geovisio-2.7.1/tests/data/focal_zero.jpg +0 -0
  44. {geovisio-2.7.0 → geovisio-2.7.1}/tests/fixed_data/test_web_collections_one_collection.py +1 -0
  45. {geovisio-2.7.0 → geovisio-2.7.1}/tests/integration/test_s3.py +5 -1
  46. {geovisio-2.7.0 → geovisio-2.7.1}/tests/test_web_collections.py +21 -11
  47. {geovisio-2.7.0 → geovisio-2.7.1}/tests/test_web_excluded_areas.py +8 -7
  48. {geovisio-2.7.0 → geovisio-2.7.1}/tests/test_web_items.py +65 -26
  49. {geovisio-2.7.0 → geovisio-2.7.1}/tests/test_web_map.py +64 -7
  50. {geovisio-2.7.0 → geovisio-2.7.1}/tests/test_web_upload_set.py +130 -134
  51. {geovisio-2.7.0 → geovisio-2.7.1}/tests/test_workers_runner_pictures.py +14 -14
  52. geovisio-2.7.0/geovisio/translations/de/LC_MESSAGES/messages.mo +0 -0
  53. geovisio-2.7.0/geovisio/translations/en/LC_MESSAGES/messages.mo +0 -0
  54. {geovisio-2.7.0 → geovisio-2.7.1}/.dockerignore +0 -0
  55. {geovisio-2.7.0 → geovisio-2.7.1}/.flaskenv +0 -0
  56. {geovisio-2.7.0 → geovisio-2.7.1}/.gitignore +0 -0
  57. {geovisio-2.7.0 → geovisio-2.7.1}/.gitlab-ci.yml +0 -0
  58. {geovisio-2.7.0 → geovisio-2.7.1}/.pre-commit-config.yaml +0 -0
  59. {geovisio-2.7.0 → geovisio-2.7.1}/CODE_OF_CONDUCT.md +0 -0
  60. {geovisio-2.7.0 → geovisio-2.7.1}/Dockerfile +0 -0
  61. {geovisio-2.7.0 → geovisio-2.7.1}/LICENSE +0 -0
  62. {geovisio-2.7.0 → geovisio-2.7.1}/Makefile +0 -0
  63. {geovisio-2.7.0 → geovisio-2.7.1}/Procfile +0 -0
  64. {geovisio-2.7.0 → geovisio-2.7.1}/README.md +0 -0
  65. {geovisio-2.7.0 → geovisio-2.7.1}/babel.cfg +0 -0
  66. {geovisio-2.7.0 → geovisio-2.7.1}/bin/post_compile +0 -0
  67. {geovisio-2.7.0 → geovisio-2.7.1}/bin/run_production_api.sh +0 -0
  68. {geovisio-2.7.0 → geovisio-2.7.1}/docker/docker-compose-blurring.yml +0 -0
  69. {geovisio-2.7.0 → geovisio-2.7.1}/docker/docker-compose-keycloak.yml +0 -0
  70. {geovisio-2.7.0 → geovisio-2.7.1}/docker/docker-compose-minio.yml +0 -0
  71. {geovisio-2.7.0 → geovisio-2.7.1}/docker/docker-entrypoint.sh +0 -0
  72. {geovisio-2.7.0 → geovisio-2.7.1}/docker/full-keycloak-auth/1-init-keycloak-db.sh +0 -0
  73. {geovisio-2.7.0 → geovisio-2.7.1}/docker/full-keycloak-auth/Dockerfile.keycloak +0 -0
  74. {geovisio-2.7.0 → geovisio-2.7.1}/docker/full-keycloak-auth/docker-compose.yml +0 -0
  75. {geovisio-2.7.0 → geovisio-2.7.1}/docker/full-keycloak-auth/env.example +0 -0
  76. {geovisio-2.7.0 → geovisio-2.7.1}/docker/full-keycloak-auth/keycloak-realm.json +0 -0
  77. {geovisio-2.7.0 → geovisio-2.7.1}/docker/full-keycloak-auth/nginx.conf +0 -0
  78. {geovisio-2.7.0 → geovisio-2.7.1}/docker/full-keycloak-auth/pictures_storage/.gitkeep +0 -0
  79. {geovisio-2.7.0 → geovisio-2.7.1}/docker/full-keycloak-auth/robots.txt +0 -0
  80. {geovisio-2.7.0 → geovisio-2.7.1}/docker/full-osm-auth/docker-compose.yml +0 -0
  81. {geovisio-2.7.0 → geovisio-2.7.1}/docker/full-osm-auth/env.example +0 -0
  82. {geovisio-2.7.0 → geovisio-2.7.1}/docker/full-osm-auth/nginx.conf +0 -0
  83. {geovisio-2.7.0 → geovisio-2.7.1}/docker/full-osm-auth/pictures_storage/.gitkeep +0 -0
  84. {geovisio-2.7.0 → geovisio-2.7.1}/docker/full-osm-auth/robots.txt +0 -0
  85. {geovisio-2.7.0 → geovisio-2.7.1}/docker/keycloak-realm.json +0 -0
  86. {geovisio-2.7.0 → geovisio-2.7.1}/docker-compose.yml +0 -0
  87. {geovisio-2.7.0 → geovisio-2.7.1}/docs/api/api.md +0 -0
  88. {geovisio-2.7.0 → geovisio-2.7.1}/docs/api/openapi.md +0 -0
  89. {geovisio-2.7.0 → geovisio-2.7.1}/docs/dev/releases.md +0 -0
  90. {geovisio-2.7.0 → geovisio-2.7.1}/docs/images/geovisio-architecture-simple.excalidraw +0 -0
  91. {geovisio-2.7.0 → geovisio-2.7.1}/docs/images/geovisio-architecture-simple.png +0 -0
  92. {geovisio-2.7.0 → geovisio-2.7.1}/docs/images/geovisio_authentication_flow.svg +0 -0
  93. {geovisio-2.7.0 → geovisio-2.7.1}/docs/index.md +0 -0
  94. {geovisio-2.7.0 → geovisio-2.7.1}/docs/install/cli.md +0 -0
  95. {geovisio-2.7.0 → geovisio-2.7.1}/docs/install/database_setup.md +0 -0
  96. {geovisio-2.7.0 → geovisio-2.7.1}/docs/install/deep_dive/blur_api.md +0 -0
  97. {geovisio-2.7.0 → geovisio-2.7.1}/docs/install/deep_dive/excluded_areas.md +0 -0
  98. {geovisio-2.7.0 → geovisio-2.7.1}/docs/install/deep_dive/external_Identity_Providers.md +0 -0
  99. {geovisio-2.7.0 → geovisio-2.7.1}/docs/install/deep_dive/pictures_processing.md +0 -0
  100. {geovisio-2.7.0 → geovisio-2.7.1}/docs/install/install.md +0 -0
  101. {geovisio-2.7.0 → geovisio-2.7.1}/docs/install/settings.md +0 -0
  102. {geovisio-2.7.0 → geovisio-2.7.1}/docs/install/tutorials/osm_oauth_client.png +0 -0
  103. {geovisio-2.7.0 → geovisio-2.7.1}/docs/install/tutorials/running_docker_keycloak.md +0 -0
  104. {geovisio-2.7.0 → geovisio-2.7.1}/docs/install/tutorials/running_docker_osm_auth.md +0 -0
  105. {geovisio-2.7.0 → geovisio-2.7.1}/docs/install/update.md +0 -0
  106. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/admin_cli/__init__.py +0 -0
  107. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/admin_cli/db.py +0 -0
  108. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/admin_cli/default_account_tokens.py +0 -0
  109. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/admin_cli/reorder_sequences.py +0 -0
  110. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/admin_cli/sequence_heading.py +0 -0
  111. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/config_app.py +0 -0
  112. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/db_migrations.py +0 -0
  113. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/errors.py +0 -0
  114. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/templates/main.html +0 -0
  115. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/templates/viewer.html +0 -0
  116. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/translations/es/LC_MESSAGES/messages.mo +0 -0
  117. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/translations/es/LC_MESSAGES/messages.po +0 -0
  118. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/translations/fi/LC_MESSAGES/messages.mo +0 -0
  119. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/translations/fi/LC_MESSAGES/messages.po +0 -0
  120. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/translations/ko/LC_MESSAGES/messages.mo +0 -0
  121. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/translations/ko/LC_MESSAGES/messages.po +0 -0
  122. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/utils/__init__.py +0 -0
  123. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/utils/auth.py +0 -0
  124. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/utils/db.py +0 -0
  125. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/utils/excluded_areas.py +0 -0
  126. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/utils/extent.py +0 -0
  127. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/utils/fields.py +0 -0
  128. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/utils/filesystems.py +0 -0
  129. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/utils/link.py +0 -0
  130. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/utils/params.py +0 -0
  131. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/utils/reports.py +0 -0
  132. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/utils/sentry.py +0 -0
  133. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/utils/time.py +0 -0
  134. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/utils/tokens.py +0 -0
  135. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/web/__init__.py +0 -0
  136. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/web/auth.py +0 -0
  137. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/web/configuration.py +0 -0
  138. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/web/excluded_areas.py +0 -0
  139. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/web/params.py +0 -0
  140. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/web/pictures.py +0 -0
  141. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/web/reports.py +0 -0
  142. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/web/rss.py +0 -0
  143. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/web/stac.py +0 -0
  144. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/web/tokens.py +0 -0
  145. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/web/users.py +0 -0
  146. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/web/utils.py +0 -0
  147. {geovisio-2.7.0 → geovisio-2.7.1}/geovisio/workers/__init__.py +0 -0
  148. {geovisio-2.7.0 → geovisio-2.7.1}/images/big_picture.png +0 -0
  149. {geovisio-2.7.0 → geovisio-2.7.1}/images/big_picture.svg +0 -0
  150. {geovisio-2.7.0 → geovisio-2.7.1}/images/favicon.ico +0 -0
  151. {geovisio-2.7.0 → geovisio-2.7.1}/images/favicon.svg +0 -0
  152. {geovisio-2.7.0 → geovisio-2.7.1}/images/logo.png +0 -0
  153. {geovisio-2.7.0 → geovisio-2.7.1}/images/logo.svg +0 -0
  154. {geovisio-2.7.0 → geovisio-2.7.1}/images/logo_full.png +0 -0
  155. {geovisio-2.7.0 → geovisio-2.7.1}/images/logo_full.svg +0 -0
  156. {geovisio-2.7.0 → geovisio-2.7.1}/images/sponsors.png +0 -0
  157. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20221201_01_wpCGc-initial-schema.rollback.sql +0 -0
  158. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20221201_01_wpCGc-initial-schema.sql +0 -0
  159. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20221201_02_ZG8AR-camera-information.py +0 -0
  160. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20221222_01_fsB6f-add-account.rollback.sql +0 -0
  161. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20221222_01_fsB6f-add-account.sql +0 -0
  162. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20230113_01_0co97-rm-metadata-duplicates.rollback.sql +0 -0
  163. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20230113_01_0co97-rm-metadata-duplicates.sql +0 -0
  164. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20230116_01_9PkjZ-add-oauth-provider.rollback.sql +0 -0
  165. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20230116_01_9PkjZ-add-oauth-provider.sql +0 -0
  166. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20230117_01_K71Pd-pictures-ts-index.rollback.sql +0 -0
  167. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20230117_01_K71Pd-pictures-ts-index.sql +0 -0
  168. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20230130_01_VRIv2-sequences-account.rollback.sql +0 -0
  169. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20230130_01_VRIv2-sequences-account.sql +0 -0
  170. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20230324_01_ba9WA-status.rollback.sql +0 -0
  171. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20230324_01_ba9WA-status.sql +0 -0
  172. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20230324_02_efgI6-picture-process.rollback.sql +0 -0
  173. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20230324_02_efgI6-picture-process.sql +0 -0
  174. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20230407_01_wofh1-computed-headings.rollback.sql +0 -0
  175. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20230407_01_wofh1-computed-headings.sql +0 -0
  176. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20230417_01_ZgLMY-add-exif-metadata-column-for-pictures.rollback.sql +0 -0
  177. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20230417_01_ZgLMY-add-exif-metadata-column-for-pictures.sql +0 -0
  178. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20230420_01_elaN3-remove-picture-and-sequence-file-paths.rollback.sql +0 -0
  179. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20230420_01_elaN3-remove-picture-and-sequence-file-paths.sql +0 -0
  180. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20230425_01_gYP77-pictures-edits-triggers.rollback.sql +0 -0
  181. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20230425_01_gYP77-pictures-edits-triggers.sql +0 -0
  182. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20230427_01_k5e5w-timestamps.rollback.sql +0 -0
  183. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20230427_01_k5e5w-timestamps.sql +0 -0
  184. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20230511_01_TdpKo-tokens.rollback.sql +0 -0
  185. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20230511_01_TdpKo-tokens.sql +0 -0
  186. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20230615_01_u7aRf-pic-delete-cascade.rollback.sql +0 -0
  187. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20230615_01_u7aRf-pic-delete-cascade.sql +0 -0
  188. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20230623_01_y1SiQ-pic-deletion-task.rollback.sql +0 -0
  189. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20230623_01_y1SiQ-pic-deletion-task.sql +0 -0
  190. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20230629_01_ZdB3i-compute-heading-0.sql +0 -0
  191. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20230711_01_JGSPB-inserted-at-index.rollback.sql +0 -0
  192. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20230711_01_JGSPB-inserted-at-index.sql +0 -0
  193. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20230720_01_EyQ0e-sequences-summary.rollback.sql +0 -0
  194. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20230720_01_EyQ0e-sequences-summary.sql +0 -0
  195. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20230803_01_aXusm-fix-sequence-computed.rollback.sql +0 -0
  196. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20230803_01_aXusm-fix-sequence-computed.sql +0 -0
  197. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20231018_01_4G3YE-pictures-exiv2.rollback.sql +0 -0
  198. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20231018_01_4G3YE-pictures-exiv2.sql +0 -0
  199. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20231103_01_ZVKEm-update-seq-on-pic-change.rollback.sql +0 -0
  200. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20231103_01_ZVKEm-update-seq-on-pic-change.sql +0 -0
  201. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20231110_01_3p070-jobs-error.rollback.sql +0 -0
  202. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20231110_01_3p070-jobs-error.sql +0 -0
  203. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20231121_01_v6oBF-more-specific-triggers.rollback.sql +0 -0
  204. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20231121_01_v6oBF-more-specific-triggers.sql +0 -0
  205. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20231121_02_1uZXT-deleted-tag.rollback.sql +0 -0
  206. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20231121_02_1uZXT-deleted-tag.sql +0 -0
  207. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240115_01_FatLR-token-delete-cascade.rollback.sql +0 -0
  208. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240115_01_FatLR-token-delete-cascade.sql +0 -0
  209. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240220_01_9wZs0-sequence-current-sort.rollback.sql +0 -0
  210. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240220_01_9wZs0-sequence-current-sort.sql +0 -0
  211. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240223_01_LsMHB-remove-binary-fields.sql +0 -0
  212. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240226_01_8iXl1-track-changes.rollback.sql +0 -0
  213. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240226_01_8iXl1-track-changes.sql +0 -0
  214. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240229_01_SgfQY-sequence-geom-multi-linestring.rollback.sql +0 -0
  215. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240229_01_SgfQY-sequence-geom-multi-linestring.sql +0 -0
  216. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240308_01_aF0Jb-migrate-sequence-geom-multi-linestring.sql +0 -0
  217. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240409_01_jnhra-pictures-grid.rollback.sql +0 -0
  218. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240409_01_jnhra-pictures-grid.sql +0 -0
  219. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240416_01_FpyGs-pictures-stats-on-sequences.rollback.sql +0 -0
  220. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240416_01_FpyGs-pictures-stats-on-sequences.sql +0 -0
  221. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240416_02_A5KzC-fill-pictures-stats-on-sequences.rollback.sql +0 -0
  222. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240416_02_A5KzC-fill-pictures-stats-on-sequences.sql +0 -0
  223. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240507_01_eBfqZ-refresh-table.rollback.sql +0 -0
  224. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240507_01_eBfqZ-refresh-table.sql +0 -0
  225. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240507_02_dzVET-picture-grid-public.rollback.sql +0 -0
  226. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240507_02_dzVET-picture-grid-public.sql +0 -0
  227. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240514_01_IT7DD-picture-delete-cascade.rollback.sql +0 -0
  228. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240514_01_IT7DD-picture-delete-cascade.sql +0 -0
  229. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240611_01_jftHn-content-md5.rollback.sql +0 -0
  230. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240611_01_jftHn-content-md5.sql +0 -0
  231. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240612_01_yNcuE-upload-set.rollback.sql +0 -0
  232. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240612_01_yNcuE-upload-set.sql +0 -0
  233. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240617_01_tKtlx-md5-concurrent-index.rollback.sql +0 -0
  234. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240617_01_tKtlx-md5-concurrent-index.sql +0 -0
  235. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240625_01_XMZ24-fix-sequence-stat-on-pic-insertion.rollback.sql +0 -0
  236. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240625_01_XMZ24-fix-sequence-stat-on-pic-insertion.sql +0 -0
  237. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240708_01_Xn7IH-job-queue.rollback.sql +0 -0
  238. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240708_01_Xn7IH-job-queue.sql +0 -0
  239. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240715_01_Hca9V-upload-set-metadata.rollback.sql +0 -0
  240. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240715_01_Hca9V-upload-set-metadata.sql +0 -0
  241. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240723_01_ePGFe-upload-set-files.rollback.sql +0 -0
  242. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240723_01_ePGFe-upload-set-files.sql +0 -0
  243. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240729_01_HALjj-upload-set-sort.rollback.sql +0 -0
  244. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240729_01_HALjj-upload-set-sort.sql +0 -0
  245. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240730_01_2BaCy-improve-deletion-triggers.rollback.sql +0 -0
  246. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240730_01_2BaCy-improve-deletion-triggers.sql +0 -0
  247. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240730_02_aRymN-rejection-status.rollback.sql +0 -0
  248. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240730_02_aRymN-rejection-status.sql +0 -0
  249. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240801_01_DOqmf-reports.rollback.sql +0 -0
  250. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240801_01_DOqmf-reports.sql +0 -0
  251. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240801_01_uKqPo-remove-files-delete-cascade.rollback.sql +0 -0
  252. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240801_01_uKqPo-remove-files-delete-cascade.sql +0 -0
  253. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240813_01_T1XkO-sequences-geom-splits.rollback.sql +0 -0
  254. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240813_01_T1XkO-sequences-geom-splits.sql +0 -0
  255. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240820_01_aB2ZK-exclusion-zones.rollback.sql +0 -0
  256. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240820_01_aB2ZK-exclusion-zones.sql +0 -0
  257. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240902_01_MDqSj-user-agent.rollback.sql +0 -0
  258. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240902_01_MDqSj-user-agent.sql +0 -0
  259. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240904_01_gFjlV-files-rejection-msg.rollback.sql +0 -0
  260. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240904_01_gFjlV-files-rejection-msg.sql +0 -0
  261. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240905_01_C8F6U-conflicts.rollback.sql +0 -0
  262. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240905_01_C8F6U-conflicts.sql +0 -0
  263. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240905_01_E5Ki0-upload-set-delete.rollback.sql +0 -0
  264. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240905_01_E5Ki0-upload-set-delete.sql +0 -0
  265. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240909_01_Muc22-unique-grid-index.rollback.sql +0 -0
  266. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240909_01_Muc22-unique-grid-index.sql +0 -0
  267. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240912_01_dAALm-account-index.rollback.sql +0 -0
  268. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/20240912_01_dAALm-account-index.sql +0 -0
  269. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/data/readme.md +0 -0
  270. {geovisio-2.7.0 → geovisio-2.7.1}/migrations/data/sensor_data.json +0 -0
  271. {geovisio-2.7.0 → geovisio-2.7.1}/mkdocs.yml +0 -0
  272. {geovisio-2.7.0 → geovisio-2.7.1}/pyproject.toml +0 -0
  273. {geovisio-2.7.0 → geovisio-2.7.1}/runtime.txt +0 -0
  274. {geovisio-2.7.0 → geovisio-2.7.1}/tests/__init__.py +0 -0
  275. {geovisio-2.7.0 → geovisio-2.7.1}/tests/data/1.jpg +0 -0
  276. {geovisio-2.7.0 → geovisio-2.7.1}/tests/data/1_blurred.jpg +0 -0
  277. {geovisio-2.7.0 → geovisio-2.7.1}/tests/data/2.jpg +0 -0
  278. {geovisio-2.7.0 → geovisio-2.7.1}/tests/data/3.jpg +0 -0
  279. {geovisio-2.7.0 → geovisio-2.7.1}/tests/data/4.jpg +0 -0
  280. {geovisio-2.7.0 → geovisio-2.7.1}/tests/data/5.jpg +0 -0
  281. {geovisio-2.7.0 → geovisio-2.7.1}/tests/data/b1.jpg +0 -0
  282. {geovisio-2.7.0 → geovisio-2.7.1}/tests/data/b2.jpg +0 -0
  283. {geovisio-2.7.0 → geovisio-2.7.1}/tests/data/c1.jpg +0 -0
  284. {geovisio-2.7.0 → geovisio-2.7.1}/tests/data/crop.jpg +0 -0
  285. {geovisio-2.7.0 → geovisio-2.7.1}/tests/data/d1.jpg +0 -0
  286. {geovisio-2.7.0 → geovisio-2.7.1}/tests/data/e1.jpg +0 -0
  287. {geovisio-2.7.0 → geovisio-2.7.1}/tests/data/e1_artist.jpg +0 -0
  288. {geovisio-2.7.0 → geovisio-2.7.1}/tests/data/e1_without_exif.jpg +0 -0
  289. {geovisio-2.7.0 → geovisio-2.7.1}/tests/data/e2.jpg +0 -0
  290. {geovisio-2.7.0 → geovisio-2.7.1}/tests/data/e3.jpg +0 -0
  291. {geovisio-2.7.0 → geovisio-2.7.1}/tests/data/e4.jpg +0 -0
  292. {geovisio-2.7.0 → geovisio-2.7.1}/tests/data/e5.jpg +0 -0
  293. {geovisio-2.7.0 → geovisio-2.7.1}/tests/data/invalid_exif.jpg +0 -0
  294. {geovisio-2.7.0 → geovisio-2.7.1}/tests/fixed_data/__init__.py +0 -0
  295. {geovisio-2.7.0 → geovisio-2.7.1}/tests/fixed_data/conftest.py +0 -0
  296. {geovisio-2.7.0 → geovisio-2.7.1}/tests/fixed_data/test_api_conformance.py +0 -0
  297. {geovisio-2.7.0 → geovisio-2.7.1}/tests/fixed_data/test_many_sequences.py +0 -0
  298. {geovisio-2.7.0 → geovisio-2.7.1}/tests/integration/__init__.py +0 -0
  299. {geovisio-2.7.0 → geovisio-2.7.1}/tests/integration/conftest.py +0 -0
  300. {geovisio-2.7.0 → geovisio-2.7.1}/tests/integration/docker-compose-auth-test.yml +0 -0
  301. {geovisio-2.7.0 → geovisio-2.7.1}/tests/integration/test_auth.py +0 -0
  302. {geovisio-2.7.0 → geovisio-2.7.1}/tests/integration/test_tokens.py +0 -0
  303. {geovisio-2.7.0 → geovisio-2.7.1}/tests/test_admin_cli_cleanup.py +0 -0
  304. {geovisio-2.7.0 → geovisio-2.7.1}/tests/test_db_migrations.py +0 -0
  305. {geovisio-2.7.0 → geovisio-2.7.1}/tests/test_factory.py +0 -0
  306. {geovisio-2.7.0 → geovisio-2.7.1}/tests/test_utils_auth.py +0 -0
  307. {geovisio-2.7.0 → geovisio-2.7.1}/tests/test_utils_filesystems.py +0 -0
  308. {geovisio-2.7.0 → geovisio-2.7.1}/tests/test_utils_pictures.py +0 -0
  309. {geovisio-2.7.0 → geovisio-2.7.1}/tests/test_utils_reports.py +0 -0
  310. {geovisio-2.7.0 → geovisio-2.7.1}/tests/test_utils_upload_set.py +0 -0
  311. {geovisio-2.7.0 → geovisio-2.7.1}/tests/test_web_configuration.py +0 -0
  312. {geovisio-2.7.0 → geovisio-2.7.1}/tests/test_web_params.py +0 -0
  313. {geovisio-2.7.0 → geovisio-2.7.1}/tests/test_web_pictures.py +0 -0
  314. {geovisio-2.7.0 → geovisio-2.7.1}/tests/test_web_reports.py +0 -0
  315. {geovisio-2.7.0 → geovisio-2.7.1}/tests/test_web_stac.py +0 -0
  316. {geovisio-2.7.0 → geovisio-2.7.1}/tests/test_web_users.py +0 -0
  317. {geovisio-2.7.0 → geovisio-2.7.1}/yoyo.ini +0 -0
@@ -9,6 +9,31 @@ Before _1.6.0_, [Viewer](https://gitlab.com/panoramax/clients/web-viewer) was em
9
9
 
10
10
  ## [Unreleased]
11
11
 
12
+ ## [2.7.1] - 2024-11-15
13
+
14
+ ### Added
15
+
16
+ - Routes returning items/pictures have the `pers:interior_orientation/sensor_array_dimensions` property set, letting users know about original picture dimensions (width/height).
17
+ - Add number and coefficient of 360° pictures to the pictures grid. This will makes it possible to display a grid of only 360° pictures.
18
+ - Add `missing_fields` list to the `/api/upload_sets/:id/files` response detailling the missing fields from a rejected uploaded picture.
19
+ - Details about picture quality are now offered for display and filtering:
20
+ - In sequences and pictures routes: `quality:horizontal_accuracy` for GPS position precision (in meters), `panoramax:horizontal_pixel_density` for pixel density on horizon (px/FOV degree).
21
+ - In vector tiles: `gps_accuracy` and `h_pixel_density` (for __sequences and pictures__ layers, not available on grid layer)
22
+ - In vector tiles style, a new metadata property `panoramax:fields` lists all available properties in each layer (pictures, sequences, grid). This will allow easier compatibility checks in web viewer.
23
+ - Translations in Spanish 🇪🇸 and Hungarian 🇭🇺.
24
+
25
+ ### Changed
26
+
27
+ - In vector tiles, grid layer is now returning circles instead of polygons. Map style is also adapted for a smoother transition on low zooms (for a heatmap-like effect).
28
+ - More EXIF tags are stripped out of database, to reduce used disk space: all keys containing hexadecimal sub-keys are removed (like `Exif.Sony.0x1234`). These fields are still available in original pictures files. A database migration removes them from existing pictures stock in your database (and could possibly take a bit of time to run...). After migration, you may want to run a little `VACUUM` to reclaim disk space.
29
+ - Add number and coefficient of 360° pictures to the pictures grid. This will makes it possible to display a grid of only 360° pictures.
30
+ - Change the way deleted pictures/upload_sets are handled, objects are removed from the database sooner than before, without needing a flag to tell that the underlying files needed deletion.
31
+
32
+ ### Fixed
33
+
34
+ - The rejection reason of duplicate files is now `file_duplicate` instead of `invalid_metadata`.
35
+ - Fix a bug when loading a picture with a focal length of 0.
36
+
12
37
  ## [2.7.0] - 2024-10-10
13
38
 
14
39
  ⚠️ The minimal supported Python version is now 3.10. Note that you can run it with newer python versions as some might bring better performance. ⚠
@@ -25,7 +50,7 @@ Before _1.6.0_, [Viewer](https://gitlab.com/panoramax/clients/web-viewer) was em
25
50
  - Support of cropped panorama, with new values in `pers:interior_orientation` in picture properties: `visible_area`, `sensor_array_dimensions` following [proposed definition in STAC](https://github.com/stac-extensions/perspective-imagery/issues/10).
26
51
  - Routes `/api` and `/api/configuration` return API version in a `geovisio_version` attribute (example: `2.6.0-12-ab12cd34`).
27
52
  - Routes returning collections display a `geovisio:upload-software` property showing which client has been used to create the collection (for meta-catalog statistics).
28
- - handle user agent `GeoVisioCli` and `PanoramaxCli` as the same `cli` software.
53
+ - Handle user agent `GeoVisioCli` and `PanoramaxCli` as the same `cli` software.
29
54
 
30
55
  ### Changed
31
56
 
@@ -547,7 +572,8 @@ FLASK_APP="src" flask process-sequences
547
572
  - Viewer based on Photo Sphere Viewer automatically calling API to search and retrieve pictures
548
573
  - Dockerfile for easy server setup
549
574
 
550
- [Unreleased]: https://gitlab.com/panoramax/server/api/-/compare/2.7.0...develop
575
+ [Unreleased]: https://gitlab.com/panoramax/server/api/-/compare/2.7.1...develop
576
+ [2.7.1]: https://gitlab.com/panoramax/server/api/-/compare/2.7.0...2.7.1
551
577
  [2.7.0]: https://gitlab.com/panoramax/server/api/-/compare/2.6.0...2.7.0
552
578
  [2.6.0]: https://gitlab.com/panoramax/server/api/-/compare/2.5.0...2.6.0
553
579
  [2.5.0]: https://gitlab.com/panoramax/server/api/-/compare/2.4.0...2.5.0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.3
2
2
  Name: geovisio
3
- Version: 2.7.0
3
+ Version: 2.7.1
4
4
  Summary: GeoVisio API - Main
5
5
  Author-email: Adrien PAVIE <panieravide@riseup.net>, Antoine Desbordes <antoine.desbordes@gmail.com>
6
6
  Requires-Python: >=3.10
@@ -31,7 +31,7 @@ services:
31
31
  restart: always
32
32
 
33
33
  migrations:
34
- image: panoramax/apii:latest
34
+ image: panoramax/api:latest
35
35
  build:
36
36
  context: ..
37
37
  dockerfile: Dockerfile
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "info": {
3
3
  "title": "geovisio",
4
- "version": "2.6.0",
4
+ "version": "2.7.0",
5
5
  "description": "# ![Panoramax](https://upload.wikimedia.org/wikipedia/commons/thumb/a/a9/Panoramax.svg/40px-Panoramax.svg.png) Panoramax\n\n__Panoramax__ is a digital resource for sharing and using \ud83d\udccd\ud83d\udcf7 field photos. Anyone can take photographs of places visible from the public streets and contribute them to the Panoramax database. This data is then freely accessible and reusable by all. More information available at [gitlab.com/panoramax](https://gitlab.com/panoramax) and [panoramax.fr](https://panoramax.fr/).\n\n\n# \ud83c\udf10 Panoramax API\n\nThis repository only contains __the backend and web API__ of a Panoramax instance.\n\n## Features\n\n* A __web API__ to search and upload pictures collections\n * Search pictures by ID, date, location\n * Compatible with [SpatioTemporal Asset Catalog](https://stacspec.org/) and [OGC WFS 3](https://github.com/opengeospatial/WFS_FES) specifications\n * Upload your pictures and sequences\n* An easy-to-use __backend__\n * Generates automatically thumbnail, small and tiled versions of your pictures\n * Compatible with various filesystems (classic, S3, FTP...)\n * Authentication and blurring API can be plugged-in for production-ready use\n\n\n## Install & run\n\nOur [documentation](https://gitlab.com/panoramax/server/api/-/tree/develop/docs) will help you install, configure and run a Panoramax instance.\n\nIf at some point you're lost or need help, you can contact us through [issues](https://gitlab.com/panoramax/server/api/-/issues) or by [email](mailto:panieravide@riseup.net).\n\n\n## Contributing\n\nPull requests are welcome. For major changes, please open an [issue](https://gitlab.com/panoramax/server/api/-/issues) first to discuss what you would like to change.\n\nMore information about developing is available in [documentation](https://gitlab.com/panoramax/server/api/-/tree/develop/docs).\n\n\n## \u2696\ufe0f License\n\nCopyright (c) Panoramax team 2022-2024, [released under MIT license](https://gitlab.com/panoramax/server/api/-/blob/develop/LICENSE).\n\n",
6
6
  "contact": {
7
7
  "name": "Adrien PAVIE",
@@ -1008,7 +1008,7 @@
1008
1008
  "/api/map/{z}/{x}/{y}.{format}": {
1009
1009
  "get": {
1010
1010
  "summary": "Get pictures and sequences as vector tiles",
1011
- "description": "<br/>Vector tiles contains different layers based on zoom level : sequences, pictures or grid.<br/><br/>Layer \"sequences\":<br/> - Available on zoom levels >= 6<br/> - Available properties:<br/> - id (sequence ID)<br/> - account_id<br/> - model (camera make and model)<br/> - type (flat or equirectangular)<br/> - date (capture date, as YYYY-MM-DD)<br/><br/>Layer \"pictures\":<br/> - Available on zoom levels >= 13<br/> - Available properties:<br/> - id (picture ID)<br/> - account_id<br/> - ts (picture date/time)<br/> - heading (picture heading in degrees)<br/> - sequences (list of sequences ID this pictures belongs to)<br/> - type (flat or equirectangular)<br/> - model (camera make and model)<br/><br/>Layer \"grid\":<br/> - Available on zoom levels 0 to 5 (included)<br/> - Available properties:<br/> - id<br/> - nb_pictures<br/> - coef (value from 0 to 1, relative quantity of available pictures)<br/><br/>",
1011
+ "description": "<br/>Vector tiles contains different layers based on zoom level : sequences, pictures or grid.<br/><br/>Layer \"sequences\":<br/> - Available on zoom levels >= 6<br/> - Available properties:<br/> - id (sequence ID)<br/> - account_id<br/> - model (camera make and model)<br/> - type (flat or equirectangular)<br/> - date (capture date, as YYYY-MM-DD)<br/> - gps_accuracy (95% confidence interval of GPS position precision, in meters)<br/> - h_pixel_density (number of pixels on horizon per field of view degree)<br/><br/>Layer \"pictures\":<br/> - Available on zoom levels >= 13<br/> - Available properties:<br/> - id (picture ID)<br/> - account_id<br/> - ts (picture date/time)<br/> - heading (picture heading in degrees)<br/> - sequences (list of sequences ID this pictures belongs to)<br/> - type (flat or equirectangular)<br/> - model (camera make and model)<br/> - gps_accuracy (95% confidence interval of GPS position precision, in meters)<br/> - h_pixel_density (number of pixels on horizon per field of view degree)<br/><br/>Layer \"grid\":<br/> - Available on zoom levels 0 to 5 (included)<br/> - Available properties:<br/> - id<br/> - nb_pictures<br/> - nb_360_pictures (number of 360\u00b0 pictures)<br/> - nb_flat_pictures (number of flat pictures)<br/> - coef (value from 0 to 1, relative quantity of available pictures)<br/> - coef_360_pictures (value from 0 to 1, relative quantity of available 360\u00b0 pictures)<br/> - coef_flat_pictures (value from 0 to 1, relative quantity of available flat pictures)<br/><br/>",
1012
1012
  "responses": {
1013
1013
  "200": {
1014
1014
  "description": "Sequences vector tile",
@@ -3602,6 +3602,72 @@
3602
3602
  },
3603
3603
  "GeoVisioUploadSetFile": {
3604
3604
  "$defs": {
3605
+ "FileRejection": {
3606
+ "description": "Details about a file rejection",
3607
+ "properties": {
3608
+ "reason": {
3609
+ "title": "Reason",
3610
+ "type": "string"
3611
+ },
3612
+ "severity": {
3613
+ "$ref": "#/components/schemas/GeoVisioUploadSetFile/$defs/FileRejectionStatusSeverity"
3614
+ },
3615
+ "message": {
3616
+ "anyOf": [
3617
+ {
3618
+ "type": "string"
3619
+ },
3620
+ {
3621
+ "type": "null"
3622
+ }
3623
+ ],
3624
+ "title": "Message"
3625
+ },
3626
+ "details": {
3627
+ "anyOf": [
3628
+ {
3629
+ "$ref": "#/components/schemas/GeoVisioUploadSetFile/$defs/FileRejectionDetails"
3630
+ },
3631
+ {
3632
+ "type": "null"
3633
+ }
3634
+ ]
3635
+ }
3636
+ },
3637
+ "required": [
3638
+ "reason",
3639
+ "severity",
3640
+ "message",
3641
+ "details"
3642
+ ],
3643
+ "title": "FileRejection",
3644
+ "type": "object"
3645
+ },
3646
+ "FileRejectionDetails": {
3647
+ "properties": {
3648
+ "missing_fields": {
3649
+ "items": {
3650
+ "type": "string"
3651
+ },
3652
+ "title": "Missing Fields",
3653
+ "type": "array"
3654
+ }
3655
+ },
3656
+ "required": [
3657
+ "missing_fields"
3658
+ ],
3659
+ "title": "FileRejectionDetails",
3660
+ "type": "object"
3661
+ },
3662
+ "FileRejectionStatusSeverity": {
3663
+ "enum": [
3664
+ "error",
3665
+ "warning",
3666
+ "info"
3667
+ ],
3668
+ "title": "FileRejectionStatusSeverity",
3669
+ "type": "string"
3670
+ },
3605
3671
  "FileType": {
3606
3672
  "const": "picture",
3607
3673
  "description": "Type of uploadedfile",
@@ -3718,14 +3784,13 @@
3718
3784
  "rejected": {
3719
3785
  "anyOf": [
3720
3786
  {
3721
- "type": "object"
3787
+ "$ref": "#/components/schemas/GeoVisioUploadSetFile/$defs/FileRejection"
3722
3788
  },
3723
3789
  {
3724
3790
  "type": "null"
3725
3791
  }
3726
3792
  ],
3727
- "readOnly": true,
3728
- "title": "Rejected"
3793
+ "readOnly": true
3729
3794
  }
3730
3795
  },
3731
3796
  "required": [
@@ -3739,6 +3804,72 @@
3739
3804
  },
3740
3805
  "GeoVisioUploadSetFiles": {
3741
3806
  "$defs": {
3807
+ "FileRejection": {
3808
+ "description": "Details about a file rejection",
3809
+ "properties": {
3810
+ "reason": {
3811
+ "title": "Reason",
3812
+ "type": "string"
3813
+ },
3814
+ "severity": {
3815
+ "$ref": "#/components/schemas/GeoVisioUploadSetFiles/$defs/FileRejectionStatusSeverity"
3816
+ },
3817
+ "message": {
3818
+ "anyOf": [
3819
+ {
3820
+ "type": "string"
3821
+ },
3822
+ {
3823
+ "type": "null"
3824
+ }
3825
+ ],
3826
+ "title": "Message"
3827
+ },
3828
+ "details": {
3829
+ "anyOf": [
3830
+ {
3831
+ "$ref": "#/components/schemas/GeoVisioUploadSetFiles/$defs/FileRejectionDetails"
3832
+ },
3833
+ {
3834
+ "type": "null"
3835
+ }
3836
+ ]
3837
+ }
3838
+ },
3839
+ "required": [
3840
+ "reason",
3841
+ "severity",
3842
+ "message",
3843
+ "details"
3844
+ ],
3845
+ "title": "FileRejection",
3846
+ "type": "object"
3847
+ },
3848
+ "FileRejectionDetails": {
3849
+ "properties": {
3850
+ "missing_fields": {
3851
+ "items": {
3852
+ "type": "string"
3853
+ },
3854
+ "title": "Missing Fields",
3855
+ "type": "array"
3856
+ }
3857
+ },
3858
+ "required": [
3859
+ "missing_fields"
3860
+ ],
3861
+ "title": "FileRejectionDetails",
3862
+ "type": "object"
3863
+ },
3864
+ "FileRejectionStatusSeverity": {
3865
+ "enum": [
3866
+ "error",
3867
+ "warning",
3868
+ "info"
3869
+ ],
3870
+ "title": "FileRejectionStatusSeverity",
3871
+ "type": "string"
3872
+ },
3742
3873
  "FileType": {
3743
3874
  "const": "picture",
3744
3875
  "description": "Type of uploadedfile",
@@ -3855,14 +3986,13 @@
3855
3986
  "rejected": {
3856
3987
  "anyOf": [
3857
3988
  {
3858
- "type": "object"
3989
+ "$ref": "#/components/schemas/GeoVisioUploadSetFiles/$defs/FileRejection"
3859
3990
  },
3860
3991
  {
3861
3992
  "type": "null"
3862
3993
  }
3863
3994
  ],
3864
- "readOnly": true,
3865
- "title": "Rejected"
3995
+ "readOnly": true
3866
3996
  }
3867
3997
  },
3868
3998
  "required": [
@@ -4085,11 +4215,33 @@
4085
4215
  "geovisio:length_km": {
4086
4216
  "$ref": "#/components/schemas/GeoVisioLengthKm"
4087
4217
  },
4218
+ "quality:horizontal_accuracy": {
4219
+ "type": "number",
4220
+ "title": "Estimated GPS position precision (in meters)"
4221
+ },
4222
+ "quality:horizontal_accuracy_type": {
4223
+ "type": "string",
4224
+ "title": "Estimation process for GPS precision",
4225
+ "example": "95% confidence interval"
4226
+ },
4088
4227
  "providers": {
4089
4228
  "type": "array",
4090
4229
  "items": {
4091
4230
  "$ref": "#/components/schemas/GeoVisioProvider"
4092
4231
  }
4232
+ },
4233
+ "summaries": {
4234
+ "type": "object",
4235
+ "properties": {
4236
+ "panoramax:horizontal_pixel_density": {
4237
+ "type": "array",
4238
+ "title": "Number of pixels on horizon per field of view degree (as a list with a single value for STAC conformance)",
4239
+ "items": {
4240
+ "type": "integer",
4241
+ "minimum": 0
4242
+ }
4243
+ }
4244
+ }
4093
4245
  }
4094
4246
  }
4095
4247
  }
@@ -4238,6 +4390,15 @@
4238
4390
  "original_file:name": {
4239
4391
  "type": "string",
4240
4392
  "title": "Original file name"
4393
+ },
4394
+ "panoramax:horizontal_pixel_density": {
4395
+ "type": "integer",
4396
+ "minimum": 0,
4397
+ "title": "Number of pixels on horizon per field of view degree"
4398
+ },
4399
+ "quality:horizontal_accuracy": {
4400
+ "type": "number",
4401
+ "title": "Estimated GPS position precision (in meters)"
4241
4402
  }
4242
4403
  }
4243
4404
  }
@@ -4336,7 +4497,7 @@
4336
4497
  },
4337
4498
  "isBlurred": {
4338
4499
  "type": "string",
4339
- "description": "Is picture blurred",
4500
+ "description": "Is picture blurred. If set to 'true', the server will not apply the face blurring algorithm but will publish the image as it is",
4340
4501
  "enum": [
4341
4502
  "true",
4342
4503
  "false",
@@ -4476,11 +4637,7 @@
4476
4637
  "description": "Parameters used to create a Report",
4477
4638
  "properties": {
4478
4639
  "issue": {
4479
- "allOf": [
4480
- {
4481
- "$ref": "#/components/schemas/GeoVisioPostReport/$defs/ReportType"
4482
- }
4483
- ],
4640
+ "$ref": "#/components/schemas/GeoVisioPostReport/$defs/ReportType",
4484
4641
  "description": "Nature of the issue you want to report"
4485
4642
  },
4486
4643
  "picture_id": {
@@ -54,7 +54,7 @@ This route doesn't exist in STAC, and is used here to provide information about
54
54
 
55
55
  According to processing status, HTTP response code can be 102 (under process) or 200 (ready). If picture is under process, some of its assets or metadata can be partial or not available at the moment.
56
56
 
57
- ### Geovisio-prefixed properties
57
+ ### Custom properties
58
58
 
59
59
  Many properties are added in the response (for clients not able to read info outside of GeoJSON `properties` object):
60
60
 
@@ -68,6 +68,8 @@ Many properties are added in the response (for clients not able to read info out
68
68
  - `geovisio:thumbnail`
69
69
  - `original_file:size`
70
70
  - `original_file:name`
71
+ - `panoramax:horizontal_pixel_density`
72
+ - `quality:horizontal_accuracy`
71
73
 
72
74
  Note: `original_file:size` is similar to the size defined by the STAC extension [file](https://github.com/stac-extensions/file), but it cannot be associated to an asset, since the original file has no associated asset (since it will be blurred).
73
75
 
@@ -219,18 +219,18 @@ So when possible, the migration of a column should be written in batch (and as a
219
219
  The migration of pictures table can for example be written like:
220
220
 
221
221
  ```sql
222
- CREATE OR REPLACE PROCEDURE update_all_pictures_with_important_stuff() AS
223
- $$
222
+ -- transactional: false
223
+ -- The comment above is essential for Yoyo migration to skip creating a transaction
224
+ -- Disable triggers temporarily (for better performance)
225
+ SET session_replication_role = replica;
226
+
227
+ CREATE OR REPLACE PROCEDURE update_all_pictures_with_important_stuff() AS $$
224
228
  DECLARE
225
- last_inserted_at TIMESTAMPTZ;
229
+ last_inserted_at TIMESTAMPTZ;
226
230
  BEGIN
227
231
  SELECT min(inserted_at) - INTERVAL '1 minute' FROM pictures INTO last_inserted_at;
228
232
 
229
- WHILE last_inserted_at IS NOT NULL LOOP
230
-
231
- -- Temporary removal of all update triggers that needs to be removed, be sure to check all the update trigger, and see which should be deactivated
232
- DROP TRIGGER pictures_update_sequences_trg ON pictures;
233
- DROP TRIGGER pictures_updates_on_sequences_trg ON pictures;
233
+ WHILE last_inserted_at IS NOT NULL LOOP
234
234
 
235
235
  WITH
236
236
  -- get a batch of 100 000 pictures to update
@@ -244,31 +244,22 @@ BEGIN
244
244
  )
245
245
  SELECT MAX(inserted_at) FROM pic_to_update INTO last_inserted_at;
246
246
 
247
- RAISE NOTICE 'max insertion date is now %', last_inserted_at;
248
-
249
-
250
- -- Restore all deactivated triggers
251
- CREATE TRIGGER pictures_updates_on_sequences_trg
252
- AFTER UPDATE ON pictures
253
- REFERENCING NEW TABLE AS pictures_after
254
- FOR EACH STATEMENT
255
- EXECUTE FUNCTION pictures_updates_on_sequences();
247
+ RAISE NOTICE 'max insertion date is now %', last_inserted_at;
256
248
 
257
- CREATE TRIGGER pictures_update_sequences_trg
258
- AFTER UPDATE ON pictures
259
- REFERENCING OLD TABLE AS old_table NEW TABLE AS new_table
260
- FOR EACH STATEMENT EXECUTE FUNCTION pictures_update_sequence();
261
-
262
- -- commit transaction (as a procedure is in an implicit transaction, it will start a new transaction after this)
249
+ -- commit transaction (as a procedure is in an implicit transaction, it will start a new transaction after this)
263
250
  COMMIT;
264
- END LOOP;
265
- RAISE NOTICE 'update finished';
251
+
252
+ END LOOP;
253
+ RAISE NOTICE 'update finished';
266
254
  END
267
- $$ LANGUAGE plpgsql;
255
+ $$ LANGUAGE plpgsql;
268
256
 
257
+ -- Actually run the update
269
258
  CALL update_all_pictures_with_important_stuff();
270
- DROP PROCEDURE update_all_pictures_with_important_stuff;
271
259
 
260
+ -- Set back triggers and remove update procedure
261
+ SET session_replication_role = DEFAULT;
262
+ DROP PROCEDURE update_all_pictures_with_important_stuff;
272
263
  ```
273
264
 
274
265
  The migrations [`pictures-exiv2`](https://gitlab.com/panoramax/server/api/-/blob/main/migrations/20231018_01_4G3YE-pictures-exiv2.sql) and [`jobs-error`](https://gitlab.com/panoramax/server/api/-/blob/main/migrations/20231110_01_3p070-jobs-error.sql) are real case examples of this.
@@ -82,10 +82,19 @@ This command starts the HTTP API to serve pictures & sequences to users.
82
82
  === ":magic_wand: Development API"
83
83
 
84
84
  With this you can have hot reload for better development experience.
85
+
85
86
  ```bash
86
87
  flask --debug run
87
88
  ```
88
89
 
90
+ Note that you can also run with another `env` file if you test over many setups:
91
+
92
+ ```bash
93
+ FLASK_SKIP_DOTENV=1 flask --env-file myconf.env run
94
+ ```
95
+
96
+ In that case, your `env` file may contain the `FLASK_APP=geovisio` variable to properly start.
97
+
89
98
  ## Background worker
90
99
 
91
100
  This command starts the 1 picture worker, used to process uploaded pictures in the background.
@@ -1,6 +1,6 @@
1
1
  """GeoVisio API - Main"""
2
2
 
3
- __version__ = "2.7.0"
3
+ __version__ = "2.7.1"
4
4
 
5
5
  import os
6
6
  from flask import Flask, jsonify, stream_template, send_from_directory, redirect, request
@@ -60,7 +60,7 @@ dictConfig(LOGGING_CONFIG)
60
60
  # Init i18n
61
61
  def get_locale():
62
62
  try:
63
- return request.accept_languages.best_match(["de", "fr", "en"]) or "en"
63
+ return request.accept_languages.best_match(["de", "fr", "en", "es", "hu"]) or "en"
64
64
  except:
65
65
  return "en"
66
66
 
@@ -60,12 +60,12 @@ def cleanup(sequences=[], full=False, database=False, cache=False, permanentPics
60
60
  if database:
61
61
  log.info("Cleaning up database...")
62
62
  if allSequences:
63
- conn.execute("DELETE FROM pictures_to_process")
63
+ conn.execute("DELETE FROM job_queue")
64
64
  conn.execute("DELETE FROM sequences_pictures")
65
65
  conn.execute("DELETE FROM sequences")
66
66
  conn.execute("DELETE FROM pictures")
67
67
  else:
68
- conn.execute("DELETE FROM pictures_to_process WHERE picture_id = ANY(%s)", [pics])
68
+ conn.execute("DELETE FROM job_queue WHERE picture_id = ANY(%s)", [pics])
69
69
  conn.execute("DELETE FROM sequences_pictures WHERE seq_id = ANY(%s)", [sequences])
70
70
  conn.execute("DELETE FROM sequences WHERE id = ANY(%s)", [sequences])
71
71
  conn.execute("DELETE FROM pictures WHERE id = ANY(%s)", [pics])
@@ -8,8 +8,8 @@ msgstr ""
8
8
  "Project-Id-Version: PROJECT VERSION\n"
9
9
  "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
10
10
  "POT-Creation-Date: 2024-07-10 14:10+0200\n"
11
- "PO-Revision-Date: 2024-07-22 14:33+0000\n"
12
- "Last-Translator: Bastian Greshake Tzovaras <bastian@gedankenstuecke.de>\n"
11
+ "PO-Revision-Date: 2024-11-10 08:10+0000\n"
12
+ "Last-Translator: mcliquid <weblate@mcliquid.de>\n"
13
13
  "Language-Team: German <http://weblate.panoramax.xyz/projects/panoramax/api/"
14
14
  "de/>\n"
15
15
  "Language: de\n"
@@ -665,3 +665,140 @@ msgstr ""
665
665
  #: geovisio/web/upload_set.py:460
666
666
  msgid "You're not authorized to add picture to this upload set"
667
667
  msgstr "Sie sind nicht authorisiert Fotos zu diesem Set hinzuzufügen"
668
+
669
+ #: geovisio/utils/upload_set.py:158
670
+ msgid ""
671
+ "The picture is too similar to another one (nearby and taken almost at the "
672
+ "same time)"
673
+ msgstr ""
674
+ "Das Foto ist zu ähnlich mit einem anderen (in der Nähe und zur gleichen Zeit "
675
+ "aufgenommen)"
676
+
677
+ #: geovisio/utils/upload_set.py:161
678
+ msgid "The sent file is not a valid JPEG"
679
+ msgstr "Die gesendete Datei ist kein valides JPEG"
680
+
681
+ #: geovisio/utils/upload_set.py:164
682
+ msgid ""
683
+ "The picture has invalid EXIF or XMP metadata, making it impossible to use"
684
+ msgstr ""
685
+ "Das Foto hat invalide EXIF oder XMP Metadaten, sodass es unmöglich ist es zu "
686
+ "nutzen"
687
+
688
+ #: geovisio/utils/excluded_areas.py:82
689
+ msgid "Impossible to find excluded area"
690
+ msgstr "Unmöglich, den ausgeschlossenen Bereich zu finden"
691
+
692
+ #: geovisio/utils/upload_set.py:167
693
+ msgid "Something went very wrong, but not due to the picture itself"
694
+ msgstr "Etwas ist sehr schief gelaufen, aber nicht wegen des Bildes selbst"
695
+
696
+ #: geovisio/web/items.py:1095 geovisio/web/upload_set.py:620
697
+ msgid "Picture has invalid metadata"
698
+ msgstr "Bild hat ungültige Metadaten"
699
+
700
+ #: geovisio/web/reports.py:352
701
+ msgid "You're not authorized to list reports"
702
+ msgstr "Du bist nicht berechtigt, Berichte aufzulisten"
703
+
704
+ #: geovisio/web/excluded_areas.py:133
705
+ msgid "You must be logged-in as admin to access all excluded areas"
706
+ msgstr ""
707
+ "Du musst als Administrator eingeloggt sein, um auf alle ausgeschlossenen "
708
+ "Bereiche zugreifen zu können"
709
+
710
+ #: geovisio/web/reports.py:144
711
+ msgid "Only authenticated users can access reports"
712
+ msgstr "Nur authentifizierte Benutzer können auf Berichte zugreifen"
713
+
714
+ #: geovisio/web/reports.py:148 geovisio/web/reports.py:266
715
+ msgid "Report doesn't exist"
716
+ msgstr "Der Bericht existiert nicht"
717
+
718
+ #: geovisio/web/reports.py:157
719
+ msgid "You're not authorized to access this report"
720
+ msgstr "Du bist nicht berechtigt, auf diesen Bericht zuzugreifen"
721
+
722
+ #: geovisio/web/excluded_areas.py:135
723
+ msgid "You're not authorized to access all excluded areas"
724
+ msgstr ""
725
+ "Du bist nicht berechtigt, auf alle ausgeschlossenen Bereiche zuzugreifen"
726
+
727
+ #: geovisio/web/reports.py:89 geovisio/web/reports.py:99
728
+ msgid "Impossible to create a Report"
729
+ msgstr "Erstellung eines Berichts nicht möglich"
730
+
731
+ #: geovisio/web/reports.py:91
732
+ msgid "Parameter for creating a Report should be a valid JSON"
733
+ msgstr ""
734
+ "Parameter für die Erstellung eines Berichts sollte ein gültiges JSON sein"
735
+
736
+ #: geovisio/web/reports.py:284
737
+ msgid "Impossible to edit the Report"
738
+ msgstr "Bearbeitung des Berichts nicht möglich"
739
+
740
+ #: geovisio/web/excluded_areas.py:174 geovisio/web/excluded_areas.py:338
741
+ msgid "Parameter for creating an Excluded Area should be a valid JSON"
742
+ msgstr ""
743
+ "Der Parameter für die Erstellung einer Excluded Area sollte ein gültiges "
744
+ "JSON sein"
745
+
746
+ #: geovisio/web/reports.py:277
747
+ msgid "You're not authorized to edit this Report"
748
+ msgstr "Du bist nicht berechtigt, diesen Bericht zu bearbeiten"
749
+
750
+ #: geovisio/web/excluded_areas.py:177 geovisio/web/excluded_areas.py:235
751
+ msgid "You must be logged-in as admin to edit excluded areas"
752
+ msgstr ""
753
+ "Du musst als Administrator eingeloggt sein, um ausgeschlossene Bereiche zu "
754
+ "bearbeiten"
755
+
756
+ #: geovisio/web/excluded_areas.py:230 geovisio/web/excluded_areas.py:242
757
+ msgid "Impossible to replace all Excluded Areas"
758
+ msgstr "Unmöglich, alle ausgeschlossenen Bereiche zu ersetzen"
759
+
760
+ #: geovisio/web/excluded_areas.py:232
761
+ msgid "Parameter for replacing all Excluded Areas should be a valid JSON"
762
+ msgstr ""
763
+ "Der Parameter zum Ersetzen aller ausgeschlossenen Bereiche sollte ein "
764
+ "gültiges JSON sein"
765
+
766
+ #: geovisio/web/items.py:1061
767
+ msgid "The collection has been deleted, impossible to add pictures to it"
768
+ msgstr "Die Sammlung wurde gelöscht, es ist unmöglich, ihr Bilder hinzuzufügen"
769
+
770
+ #: geovisio/web/upload_set.py:216
771
+ msgid "You're not authorized to list pictures in this upload set"
772
+ msgstr "Du bist nicht berechtigt, Bilder in diesem Upload-Set aufzulisten"
773
+
774
+ #: geovisio/web/upload_set.py:628
775
+ msgid ""
776
+ "Impossible to open file as image. The only supported image format is jpg."
777
+ msgstr ""
778
+ "Es ist nicht möglich, die Datei als Bild zu öffnen. Das einzige unterstützte "
779
+ "Bildformat ist jpg."
780
+
781
+ #: geovisio/web/upload_set.py:759
782
+ msgid "You're not authorized to delete this upload set"
783
+ msgstr "Du bist nicht berechtigt, dieses Upload-Set zu löschen"
784
+
785
+ #: geovisio/web/items.py:1052
786
+ #, python-format
787
+ msgid "Collection %(s)s wasn't found in database"
788
+ msgstr "Sammlung %(s)s wurde nicht in der Datenbank gefunden"
789
+
790
+ #: geovisio/web/excluded_areas.py:172 geovisio/web/excluded_areas.py:182
791
+ #: geovisio/web/excluded_areas.py:336 geovisio/web/excluded_areas.py:343
792
+ msgid "Impossible to create an Excluded Area"
793
+ msgstr "Es ist nicht möglich, einen Ausgeschlossenen Bereich zu erstellen"
794
+
795
+ #: geovisio/web/excluded_areas.py:272
796
+ msgid "You must be logged-in as admin to delete excluded areas"
797
+ msgstr ""
798
+ "Du musst als Administrator eingeloggt sein, um ausgeschlossene Bereiche zu "
799
+ "löschen"
800
+
801
+ #: geovisio/web/reports.py:286
802
+ msgid "Parameter for editing the Report should be a valid JSON"
803
+ msgstr ""
804
+ "Parameter für die Bearbeitung des Berichts sollte ein gültiges JSON sein"