geo-activity-playground 1.11.0__tar.gz → 1.12.0__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 (183) hide show
  1. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/PKG-INFO +1 -1
  2. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/config.py +4 -0
  3. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/app.py +1 -0
  4. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/blueprints/explorer_blueprint.py +53 -20
  5. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/blueprints/settings_blueprint.py +36 -0
  6. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/server-side-explorer.js +7 -2
  7. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/explorer/server-side.html.j2 +12 -2
  8. geo_activity_playground-1.12.0/geo_activity_playground/webui/templates/settings/color-strategy.html.j2 +38 -0
  9. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/settings/index.html.j2 +10 -1
  10. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/pyproject.toml +1 -1
  11. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/LICENSE +0 -0
  12. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/__init__.py +0 -0
  13. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/__main__.py +0 -0
  14. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/alembic/README +0 -0
  15. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/alembic/env.py +0 -0
  16. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/alembic/script.py.mako +0 -0
  17. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/alembic/versions/0f02b92c4f94_add_tag_color.py +0 -0
  18. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/alembic/versions/10021d238ada_add_explorer_tile_bookmarks.py +0 -0
  19. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/alembic/versions/38882503dc7c_add_tags_to_activities.py +0 -0
  20. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/alembic/versions/451e7836b53d_add_square_planner_bookmark.py +0 -0
  21. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/alembic/versions/63d3b7f6f93c_initial_version.py +0 -0
  22. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/alembic/versions/85fe0348e8a2_add_time_series_uuid_field.py +0 -0
  23. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/alembic/versions/93cc82ad1b60_add_parametricplotspec.py +0 -0
  24. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/alembic/versions/ab83b9d23127_add_upstream_id.py +0 -0
  25. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/alembic/versions/b03491c593f6_add_crop_indices.py +0 -0
  26. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/alembic/versions/da2cba03b71d_add_photos.py +0 -0
  27. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/alembic/versions/dc8073871da7_add_plotspec_group_by.py +0 -0
  28. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/alembic/versions/e02e27876deb_add_square_planner_bookmark_name.py +0 -0
  29. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/alembic/versions/f2f50843be2d_make_all_fields_in_activity_nullable.py +0 -0
  30. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/alembic/versions/script.py.mako +0 -0
  31. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/__init__.py +0 -0
  32. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/activities.py +0 -0
  33. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/coordinates.py +0 -0
  34. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/copernicus_dem.py +0 -0
  35. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/datamodel.py +0 -0
  36. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/enrichment.py +0 -0
  37. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/export.py +0 -0
  38. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/heart_rate.py +0 -0
  39. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/meta_search.py +0 -0
  40. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/missing_values.py +0 -0
  41. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/parametric_plot.py +0 -0
  42. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/paths.py +0 -0
  43. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/photos.py +0 -0
  44. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/privacy_zones.py +0 -0
  45. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/raster_map.py +0 -0
  46. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/similarity.py +0 -0
  47. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/summary_stats.py +0 -0
  48. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/tasks.py +0 -0
  49. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/test_datamodel.py +0 -0
  50. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/test_meta_search.py +0 -0
  51. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/test_missing_values.py +0 -0
  52. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/test_pandas_timezone.py +0 -0
  53. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/test_summary_stats.py +0 -0
  54. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/test_tiles.py +0 -0
  55. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/test_time_zone_from_location.py +0 -0
  56. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/test_time_zone_import.py +0 -0
  57. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/test_timezone_sqlalchemy.py +0 -0
  58. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/tiles.py +0 -0
  59. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/core/time_conversion.py +0 -0
  60. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/explorer/__init__.py +0 -0
  61. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/explorer/grid_file.py +0 -0
  62. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/explorer/tile_visits.py +0 -0
  63. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/explorer/video.py +0 -0
  64. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/heatmap_video.py +0 -0
  65. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/importers/__init__.py +0 -0
  66. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/importers/activity_parsers.py +0 -0
  67. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/importers/csv_parser.py +0 -0
  68. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/importers/directory.py +0 -0
  69. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/importers/strava_api.py +0 -0
  70. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/importers/strava_checkout.py +0 -0
  71. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/importers/test_csv_parser.py +0 -0
  72. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/importers/test_directory.py +0 -0
  73. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/importers/test_strava_api.py +0 -0
  74. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/__init__.py +0 -0
  75. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/authenticator.py +0 -0
  76. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/blueprints/__init__.py +0 -0
  77. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/blueprints/activity_blueprint.py +0 -0
  78. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/blueprints/auth_blueprint.py +0 -0
  79. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/blueprints/bubble_chart_blueprint.py +0 -0
  80. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/blueprints/calendar_blueprint.py +0 -0
  81. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/blueprints/eddington_blueprints.py +0 -0
  82. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/blueprints/entry_views.py +0 -0
  83. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/blueprints/equipment_blueprint.py +0 -0
  84. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/blueprints/export_blueprint.py +0 -0
  85. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/blueprints/hall_of_fame_blueprint.py +0 -0
  86. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/blueprints/heatmap_blueprint.py +0 -0
  87. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/blueprints/photo_blueprint.py +0 -0
  88. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/blueprints/plot_builder_blueprint.py +0 -0
  89. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/blueprints/search_blueprint.py +0 -0
  90. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/blueprints/square_planner_blueprint.py +0 -0
  91. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/blueprints/summary_blueprint.py +0 -0
  92. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/blueprints/tile_blueprint.py +0 -0
  93. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/blueprints/time_zone_fixer_blueprint.py +0 -0
  94. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/blueprints/upload_blueprint.py +0 -0
  95. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/columns.py +0 -0
  96. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/flasher.py +0 -0
  97. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/plot_util.py +0 -0
  98. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/search_util.py +0 -0
  99. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/activity-trim.js +0 -0
  100. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/bootstrap/bootstrap-dark-mode.js +0 -0
  101. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/bootstrap/bootstrap.bundle.min.js +0 -0
  102. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/bootstrap/bootstrap.min.css +0 -0
  103. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/favicons/android-chrome-192x192.png +0 -0
  104. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/favicons/android-chrome-512x512.png +0 -0
  105. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/favicons/apple-touch-icon.png +0 -0
  106. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/favicons/browserconfig.xml +0 -0
  107. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/favicons/favicon-16x16.png +0 -0
  108. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/favicons/favicon-32x32.png +0 -0
  109. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/favicons/favicon-48x48.png +0 -0
  110. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/favicons/favicon.ico +0 -0
  111. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/favicons/favicon.svg +0 -0
  112. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/favicons/mstile-150x150.png +0 -0
  113. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/favicons/site.webmanifest +0 -0
  114. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/favicons/web-app-manifest-192x192.png +0 -0
  115. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/favicons/web-app-manifest-512x512.png +0 -0
  116. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/images/layers-2x.png +0 -0
  117. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/images/layers.png +0 -0
  118. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/images/marker-icon-2x.png +0 -0
  119. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/images/marker-icon.png +0 -0
  120. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/images/marker-shadow.png +0 -0
  121. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/leaflet/Leaflet.fullscreen.min.js +0 -0
  122. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/leaflet/MarkerCluster.Default.css +0 -0
  123. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/leaflet/MarkerCluster.css +0 -0
  124. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/leaflet/fullscreen.png +0 -0
  125. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/leaflet/fullscreen@2x.png +0 -0
  126. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/leaflet/images/layers-2x.png +0 -0
  127. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/leaflet/images/layers.png +0 -0
  128. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/leaflet/leaflet.css +0 -0
  129. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/leaflet/leaflet.fullscreen.css +0 -0
  130. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/leaflet/leaflet.js +0 -0
  131. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/leaflet/leaflet.markercluster.js +0 -0
  132. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/table-sort.min.js +0 -0
  133. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/vega/vega-embed@6.js +0 -0
  134. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/vega/vega-lite@4.js +0 -0
  135. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/static/vega/vega@5.js +0 -0
  136. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/activity/day.html.j2 +0 -0
  137. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/activity/edit.html.j2 +0 -0
  138. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/activity/lines.html.j2 +0 -0
  139. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/activity/name.html.j2 +0 -0
  140. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/activity/show.html.j2 +0 -0
  141. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/activity/trim.html.j2 +0 -0
  142. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/auth/index.html.j2 +0 -0
  143. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/bubble_chart/index.html.j2 +0 -0
  144. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/calendar/index.html.j2 +0 -0
  145. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/calendar/month.html.j2 +0 -0
  146. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/eddington/distance.html.j2 +0 -0
  147. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/eddington/elevation_gain.html.j2 +0 -0
  148. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/elevation_eddington/index.html.j2 +0 -0
  149. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/equipment/index.html.j2 +0 -0
  150. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/export/index.html.j2 +0 -0
  151. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/hall_of_fame/index.html.j2 +0 -0
  152. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/heatmap/index.html.j2 +0 -0
  153. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/home.html.j2 +0 -0
  154. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/page.html.j2 +0 -0
  155. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/photo/map.html.j2 +0 -0
  156. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/photo/new.html.j2 +0 -0
  157. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/plot-macros.html.j2 +0 -0
  158. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/plot_builder/edit.html.j2 +0 -0
  159. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/plot_builder/import-spec.html.j2 +0 -0
  160. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/plot_builder/index.html.j2 +0 -0
  161. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/search/index.html.j2 +0 -0
  162. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/search_form.html.j2 +0 -0
  163. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/settings/admin-password.html.j2 +0 -0
  164. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/settings/cluster-bookmarks-new.html.j2 +0 -0
  165. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/settings/color-schemes.html.j2 +0 -0
  166. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/settings/heart-rate.html.j2 +0 -0
  167. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/settings/manage-equipments.html.j2 +0 -0
  168. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/settings/manage-kinds.html.j2 +0 -0
  169. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/settings/metadata-extraction.html.j2 +0 -0
  170. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/settings/privacy-zones.html.j2 +0 -0
  171. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/settings/segmentation.html.j2 +0 -0
  172. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/settings/sharepic.html.j2 +0 -0
  173. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/settings/strava.html.j2 +0 -0
  174. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/settings/tags-edit.html.j2 +0 -0
  175. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/settings/tags-list.html.j2 +0 -0
  176. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/settings/tags-new.html.j2 +0 -0
  177. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/settings/tile-source.html.j2 +0 -0
  178. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/square_planner/index.html.j2 +0 -0
  179. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/summary/index.html.j2 +0 -0
  180. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/summary/vega-chart.html.j2 +0 -0
  181. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/time_zone_fixer/index.html.j2 +0 -0
  182. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/upload/index.html.j2 +0 -0
  183. {geo_activity_playground-1.11.0 → geo_activity_playground-1.12.0}/geo_activity_playground/webui/templates/upload/reload.html.j2 +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: geo-activity-playground
3
- Version: 1.11.0
3
+ Version: 1.12.0
4
4
  Summary: Analysis of geo data activities like rides, runs or hikes.
5
5
  License: MIT
6
6
  Author: Martin Ueding
@@ -25,6 +25,10 @@ class Config:
25
25
  color_scheme_for_counts: str = "teals"
26
26
  color_scheme_for_kind: str = "category10"
27
27
  color_scheme_for_heatmap: str = "hot"
28
+ color_strategy_max_cluster_color: str = "#377eb84d"
29
+ color_strategy_max_cluster_other_color: str = "#4daf4a4d"
30
+ color_strategy_visited_color: str = "#0000004d"
31
+ color_strategy_cmap_opacity: float = 0.5
28
32
  equipment_offsets: dict[str, float] = dataclasses.field(default_factory=dict)
29
33
  explorer_zoom_levels: list[int] = dataclasses.field(
30
34
  default_factory=lambda: [14, 17]
@@ -226,6 +226,7 @@ def web_ui_main(
226
226
  config_accessor,
227
227
  tile_getter,
228
228
  image_transforms,
229
+ config,
229
230
  ),
230
231
  "/export": make_export_blueprint(authenticator),
231
232
  "/hall-of-fame": make_hall_of_fame_blueprint(repository, search_query_history),
@@ -1,7 +1,9 @@
1
1
  import abc
2
2
  import datetime
3
+ import functools
3
4
  import hashlib
4
5
  import io
6
+ import itertools
5
7
  import logging
6
8
  from collections.abc import Iterable
7
9
  from typing import Any
@@ -24,6 +26,7 @@ from flask import Response
24
26
  from flask import url_for
25
27
  from flask.typing import ResponseReturnValue
26
28
 
29
+ from ...core.config import Config
27
30
  from ...core.config import ConfigAccessor
28
31
  from ...core.coordinates import Bounds
29
32
  from ...core.datamodel import Activity
@@ -55,6 +58,15 @@ def blend_color(
55
58
  return (1 - opacity) * base + opacity * addition
56
59
 
57
60
 
61
+ @functools.cache
62
+ def hex_color_to_float(color: str) -> np.ndarray:
63
+ values = [int("".join(x), base=16) / 255 for x in itertools.batched(color[1:], 2)]
64
+ assert (
65
+ min(values) >= 0.0 and max(values) <= 1.0
66
+ ), f"All {values=} must be within 0.0 and 1.0."
67
+ return np.array([[values]])
68
+
69
+
58
70
  class ColorStrategy(abc.ABC):
59
71
  @abc.abstractmethod
60
72
  def _color(self, tile_xy: tuple[int, int]) -> Optional[np.ndarray]:
@@ -62,27 +74,32 @@ class ColorStrategy(abc.ABC):
62
74
 
63
75
 
64
76
  class MaxClusterColorStrategy(ColorStrategy):
65
- def __init__(self, evolution_state, tile_visits):
77
+ def __init__(self, evolution_state, tile_visits, config: Config):
66
78
  self.evolution_state = evolution_state
67
79
  self.tile_visits = tile_visits
68
80
  self.max_cluster_members = max(
69
81
  evolution_state.clusters.values(),
70
82
  key=len,
71
83
  )
84
+ self._config = config
72
85
 
73
86
  def _color(self, tile_xy: tuple[int, int]) -> Optional[np.ndarray]:
74
87
  if tile_xy in self.max_cluster_members:
75
- return np.array([[[55, 126, 184, 70]]]) / 255
88
+ return hex_color_to_float(self._config.color_strategy_max_cluster_color)
76
89
  elif tile_xy in self.evolution_state.memberships:
77
- return np.array([[[77, 175, 74, 70]]]) / 255
90
+ return hex_color_to_float(
91
+ self._config.color_strategy_max_cluster_other_color
92
+ )
78
93
  elif tile_xy in self.tile_visits:
79
- return np.array([[[0, 0, 0, 70]]]) / 255
94
+ return hex_color_to_float(self._config.color_strategy_visited_color)
80
95
  else:
81
96
  return None
82
97
 
83
98
 
84
99
  class ColorfulClusterColorStrategy(ColorStrategy):
85
- def __init__(self, evolution_state: TileEvolutionState, tile_visits):
100
+ def __init__(
101
+ self, evolution_state: TileEvolutionState, tile_visits, config: Config
102
+ ):
86
103
  self.evolution_state = evolution_state
87
104
  self.tile_visits = tile_visits
88
105
  self.max_cluster_members = max(
@@ -90,6 +107,7 @@ class ColorfulClusterColorStrategy(ColorStrategy):
90
107
  key=len,
91
108
  )
92
109
  self._cmap = matplotlib.colormaps["hsv"]
110
+ self._config = config
93
111
 
94
112
  def _color(self, tile_xy: tuple[int, int]) -> Optional[np.ndarray]:
95
113
  if tile_xy in self.evolution_state.memberships:
@@ -97,17 +115,20 @@ class ColorfulClusterColorStrategy(ColorStrategy):
97
115
  m = hashlib.sha256()
98
116
  m.update(str(cluster_id).encode())
99
117
  d = int(m.hexdigest(), base=16) / (256.0**m.digest_size)
100
- return np.array([[self._cmap(d)[:3] + (0.5,)]])
118
+ return np.array(
119
+ [[self._cmap(d)[:3] + (self._config.color_strategy_cmap_opacity,)]]
120
+ )
101
121
  elif tile_xy in self.tile_visits:
102
- return np.array([[[0, 0, 0, 70]]]) / 255
122
+ return hex_color_to_float(self._config.color_strategy_visited_color)
103
123
  else:
104
124
  return None
105
125
 
106
126
 
107
127
  class VisitTimeColorStrategy(ColorStrategy):
108
- def __init__(self, tile_visits, use_first=True):
128
+ def __init__(self, tile_visits, config: Config, use_first=True):
109
129
  self.tile_visits = tile_visits
110
130
  self.use_first = use_first
131
+ self._config = config
111
132
 
112
133
  def _color(self, tile_xy: tuple[int, int]) -> Optional[np.ndarray]:
113
134
  if tile_xy in self.tile_visits:
@@ -118,39 +139,43 @@ class VisitTimeColorStrategy(ColorStrategy):
118
139
  tile_info["first_time"] if self.use_first else tile_info["last_time"]
119
140
  )
120
141
  if pd.isna(relevant_time):
121
- color = np.array([[[0, 0, 0, 70]]]) / 255
142
+ color = hex_color_to_float(self._config.color_strategy_visited_color)
122
143
  else:
123
144
  last_age_days = (today - relevant_time.date()).days
124
145
  color = cmap(max(1 - last_age_days / (2 * 365), 0.0))
125
- color = np.array([[color[:3] + (0.5,)]])
146
+ color = np.array(
147
+ [[color[:3] + (self._config.color_strategy_cmap_opacity,)]]
148
+ )
126
149
  return color
127
150
  else:
128
151
  return None
129
152
 
130
153
 
131
154
  class NumVisitsColorStrategy(ColorStrategy):
132
- def __init__(self, tile_visits):
155
+ def __init__(self, tile_visits, config: Config):
133
156
  self.tile_visits = tile_visits
157
+ self._config = config
134
158
 
135
159
  def _color(self, tile_xy: tuple[int, int]) -> Optional[np.ndarray]:
136
160
  if tile_xy in self.tile_visits:
137
161
  cmap = matplotlib.colormaps["viridis"]
138
162
  tile_info = self.tile_visits[tile_xy]
139
163
  color = cmap(min(len(tile_info["activity_ids"]) / 50, 1.0))
140
- return np.array([[color[:3] + (0.5,)]])
164
+ return np.array([[color[:3] + (self._config.color_strategy_cmap_opacity,)]])
141
165
  else:
142
166
  return None
143
167
 
144
168
 
145
169
  class MissingColorStrategy(ColorStrategy):
146
- def __init__(self, tile_visits):
170
+ def __init__(self, tile_visits, config: Config):
147
171
  self.tile_visits = tile_visits
172
+ self._config = config
148
173
 
149
174
  def _color(self, tile_xy: tuple[int, int]) -> Optional[np.ndarray]:
150
175
  if tile_xy in self.tile_visits:
151
176
  return None
152
177
  else:
153
- return np.array([[[0, 0, 0, 70]]]) / 255
178
+ return hex_color_to_float(self._config.color_strategy_visited_color)
154
179
 
155
180
 
156
181
  def make_explorer_blueprint(
@@ -159,6 +184,7 @@ def make_explorer_blueprint(
159
184
  config_accessor: ConfigAccessor,
160
185
  tile_getter: TileGetter,
161
186
  image_transforms: dict[str, ImageTransform],
187
+ config: Config,
162
188
  ) -> Blueprint:
163
189
  blueprint = Blueprint("explorer", __name__, template_folder="templates")
164
190
 
@@ -255,6 +281,7 @@ def make_explorer_blueprint(
255
281
  continue
256
282
  bookmarks.append(
257
283
  {
284
+ "id": bookmark.id,
258
285
  "name": bookmark.name,
259
286
  "bbox": geojson_bounding_box_for_tile_collection(cluster, zoom),
260
287
  "size": len(cluster),
@@ -307,19 +334,25 @@ def make_explorer_blueprint(
307
334
  color_strategy_name = config_accessor().cluster_color_strategy
308
335
  match color_strategy_name:
309
336
  case "max_cluster":
310
- color_strategy = MaxClusterColorStrategy(evolution_state, tile_visits)
337
+ color_strategy = MaxClusterColorStrategy(
338
+ evolution_state, tile_visits, config
339
+ )
311
340
  case "colorful_cluster":
312
341
  color_strategy = ColorfulClusterColorStrategy(
313
- evolution_state, tile_visits
342
+ evolution_state, tile_visits, config
314
343
  )
315
344
  case "first":
316
- color_strategy = VisitTimeColorStrategy(tile_visits, use_first=True)
345
+ color_strategy = VisitTimeColorStrategy(
346
+ tile_visits, config, use_first=True
347
+ )
317
348
  case "last":
318
- color_strategy = VisitTimeColorStrategy(tile_visits, use_first=False)
349
+ color_strategy = VisitTimeColorStrategy(
350
+ tile_visits, config, use_first=False
351
+ )
319
352
  case "visits":
320
- color_strategy = NumVisitsColorStrategy(tile_visits)
353
+ color_strategy = NumVisitsColorStrategy(tile_visits, config)
321
354
  case "missing":
322
- color_strategy = MissingColorStrategy(tile_visits)
355
+ color_strategy = MissingColorStrategy(tile_visits, config)
323
356
  case _:
324
357
  raise ValueError("Unsupported color strategy.")
325
358
 
@@ -134,6 +134,15 @@ def make_settings_blueprint(
134
134
  tile_y=request.args["tile_y"],
135
135
  )
136
136
 
137
+ @blueprint.route("/cluster-bookmarks/delete/<int:id>")
138
+ @needs_authentication(authenticator)
139
+ def cluster_bookmark_delete(id: int):
140
+ bookmark = DB.session.get_one(ExplorerTileBookmark, id)
141
+ flasher.flash_message(f"Bookmark {bookmark.name} deleted.", FlashTypes.SUCCESS)
142
+ DB.session.delete(bookmark)
143
+ DB.session.commit()
144
+ return redirect(request.referrer)
145
+
137
146
  @blueprint.route("/color-schemes", methods=["GET", "POST"])
138
147
  @needs_authentication(authenticator)
139
148
  def color_schemes():
@@ -175,6 +184,33 @@ def make_settings_blueprint(
175
184
  color_scheme_for_heatmap_avail=MATPLOTLIB_COLOR_SCHEMES_CONTINUOUS,
176
185
  )
177
186
 
187
+ @blueprint.route("/color-strategy", methods=["GET", "POST"])
188
+ @needs_authentication(authenticator)
189
+ def color_strategy():
190
+ if request.method == "POST":
191
+ config_accessor().color_strategy_max_cluster_color = request.form[
192
+ "color_strategy_max_cluster_color"
193
+ ]
194
+ config_accessor().color_strategy_max_cluster_other_color = request.form[
195
+ "color_strategy_max_cluster_other_color"
196
+ ]
197
+ config_accessor().color_strategy_visited_color = request.form[
198
+ "color_strategy_visited_color"
199
+ ]
200
+ config_accessor().color_strategy_cmap_opacity = float(
201
+ request.form["color_strategy_cmap_opacity"]
202
+ )
203
+ config_accessor.save()
204
+ flash("Updated color strategy values.", category="success")
205
+
206
+ return render_template(
207
+ "settings/color-strategy.html.j2",
208
+ color_strategy_max_cluster_color=config_accessor().color_strategy_max_cluster_color,
209
+ color_strategy_max_cluster_other_color=config_accessor().color_strategy_max_cluster_other_color,
210
+ color_strategy_visited_color=config_accessor().color_strategy_visited_color,
211
+ color_strategy_cmap_opacity=config_accessor().color_strategy_cmap_opacity,
212
+ )
213
+
178
214
  @blueprint.route("/manage-equipments", methods=["GET", "POST"])
179
215
  @needs_authentication(authenticator)
180
216
  def manage_equipments():
@@ -44,7 +44,7 @@ let overlay_maps = {
44
44
  maxZoom: 19,
45
45
  attribution: map_tile_attribution
46
46
  }),
47
- "Mising": L.tileLayer(`/explorer/${zoom}/tile/{z}/{x}/{y}.png?color_strategy=missing`, {
47
+ "Missing": L.tileLayer(`/explorer/${zoom}/tile/{z}/{x}/{y}.png?color_strategy=missing`, {
48
48
  maxZoom: 19,
49
49
  attribution: map_tile_attribution
50
50
  }),
@@ -84,7 +84,12 @@ map.on('click', e => {
84
84
  ]
85
85
  if (data.this_cluster_size) {
86
86
  lines.push(`<dt>This cluster size</dt><dd>${data.this_cluster_size}</dd>`)
87
- lines.push(`<dt>Bookmark</dt><dd><a href="${data.new_bookmark_url}">Create cluster bookmark</a></dd>`)
87
+ if (data.new_bookmark_url === undefined) {
88
+ console.error("Somehow we got a cluster that doesn't have a proper URL. This is the data that we got in response:")
89
+ console.error(data)
90
+ } else {
91
+ lines.push(`<dt>Bookmark</dt><dd><a href="${data.new_bookmark_url}">Create cluster bookmark</a></dd>`)
92
+ }
88
93
  }
89
94
 
90
95
  L.popup()
@@ -26,9 +26,9 @@
26
26
 
27
27
  {% if bookmarks %}
28
28
  <div class="btn-group mb-3" role="group" aria-label="Cluster bookmarks">
29
- <button type="button" class="btn btn-primary" onclick='centerOn({{ center.bbox | safe }})'>Biggest</button>
29
+ <button type="button" class="btn" onclick='centerOn({{ center.bbox | safe }})'>Biggest</button>
30
30
  {% for bookmark in bookmarks %}
31
- <button type="button" class="btn btn-primary" onclick='centerOn({{ bookmark.bbox | safe }})'>{{ bookmark.name
31
+ <button type="button" class="btn" onclick='centerOn({{ bookmark.bbox | safe }})'>{{ bookmark.name
32
32
  }}</button>
33
33
  {% endfor %}
34
34
  </div>
@@ -52,6 +52,7 @@
52
52
  </div>
53
53
  </div>
54
54
 
55
+ <p><a href="{{ url_for('settings.color_strategy') }}">Modify color values</a>.</p>
55
56
 
56
57
  {% if bookmarks %}
57
58
  <h2 class="mb-3">Bookmarked cluster sizes</h2>
@@ -65,11 +66,20 @@
65
66
  </tr>
66
67
  </thead>
67
68
  <tbody>
69
+ <tr>
70
+ <td>Max Cluster</td>
71
+ <td>{{ max_cluster_size }}</td>
72
+ <td></td>
73
+ <td></td>
74
+ </tr>
68
75
  {% for bookmark in bookmarks %}
69
76
  <tr>
70
77
  <td>{{ bookmark.name }}</td>
71
78
  <td>{{ bookmark.size }}</td>
72
79
  <td>{{ '%.1f'|format(bookmark.size / max_cluster_size * 100) }} %</td>
80
+ <td><a class="btn btn-danger btn-sm"
81
+ href="{{ url_for('settings.cluster_bookmark_delete', id=bookmark.id) }}"
82
+ onclick="if(!confirm('Are you sure to Delete This?')){ event.preventDefault() }">Delete</a></td>
73
83
  </tr>
74
84
  {% endfor %}
75
85
  </tbody>
@@ -0,0 +1,38 @@
1
+ {% extends "page.html.j2" %}
2
+
3
+ {% block container %}
4
+
5
+ <h1 class="mb-3">Color Strategy Values</h1>
6
+
7
+ <form method="POST">
8
+ <div class="mb-3">
9
+ <label for="color_strategy_max_cluster_color" class="form-label">Max cluster</label>
10
+ <input type="color" alpha class="form-control" id="color_strategy_max_cluster_color"
11
+ name="color_strategy_max_cluster_color" value="{{ color_strategy_max_cluster_color }}" />
12
+ </div>
13
+
14
+ <div class="mb-3">
15
+ <label for="color_strategy_max_cluster_other_color" class="form-label">Other clusters besides the maximum
16
+ one</label>
17
+ <input type="color" alpha class="form-control" id="color_strategy_max_cluster_other_color"
18
+ name="color_strategy_max_cluster_other_color" value="{{ color_strategy_max_cluster_other_color }}" />
19
+ </div>
20
+
21
+ <div class="mb-3">
22
+ <label for="color_strategy_visited_color" class="form-label">Visited tiles that are not part of a
23
+ cluster</label>
24
+ <input type="color" alpha class="form-control" id="color_strategy_visited_color"
25
+ name="color_strategy_visited_color" value="{{ color_strategy_visited_color }}" />
26
+ </div>
27
+
28
+ <div class="mb-3">
29
+ <label for="color_strategy_cmap_opacity" class="form-label">Color map opacity</label>
30
+ <input type="number" class="form-control" id="color_strategy_cmap_opacity" name="color_strategy_cmap_opacity"
31
+ value="{{ color_strategy_cmap_opacity }}" min="0.0" max="1.0" step="0.05" />
32
+ </div>
33
+
34
+ <button type="submit" class="btn btn-primary">Save</button>
35
+ </form>
36
+
37
+
38
+ {% endblock %}
@@ -24,11 +24,20 @@
24
24
  <div class="card">
25
25
  <div class="card-body">
26
26
  <h5 class="card-title">Color schemes</h5>
27
- <p class="card-text">Don't like the colors in the plots?</p>
27
+ <p class="card-text">Don't like the colors in the statistics plots?</p>
28
28
  <a href="{{ url_for('.color_schemes') }}" class="btn btn-primary">Set up color schemes</a>
29
29
  </div>
30
30
  </div>
31
31
  </div>
32
+ <div class="col">
33
+ <div class="card">
34
+ <div class="card-body">
35
+ <h5 class="card-title">Color strategy</h5>
36
+ <p class="card-text">Don't like the cluster colors in the explorer tile map?</p>
37
+ <a href="{{ url_for('.color_strategy') }}" class="btn btn-primary">Modify color strategies</a>
38
+ </div>
39
+ </div>
40
+ </div>
32
41
  <div class="col">
33
42
  <div class="card">
34
43
  <div class="card-body">
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "geo-activity-playground"
3
- version = "1.11.0"
3
+ version = "1.12.0"
4
4
  description = "Analysis of geo data activities like rides, runs or hikes."
5
5
  authors = ["Martin Ueding <mu@martin-ueding.de>"]
6
6
  license = "MIT"