geo-activity-playground 1.4.1__tar.gz → 1.5.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 (179) hide show
  1. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/PKG-INFO +1 -1
  2. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/core/datamodel.py +7 -0
  3. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/importers/activity_parsers.py +2 -2
  4. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/app.py +1 -0
  5. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/blueprints/explorer_blueprint.py +85 -91
  6. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/blueprints/hall_of_fame_blueprint.py +2 -2
  7. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/blueprints/photo_blueprint.py +4 -1
  8. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/static/server-side-explorer.js +4 -0
  9. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/explorer/server-side.html.j2 +38 -1
  10. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/pyproject.toml +1 -1
  11. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/LICENSE +0 -0
  12. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/__init__.py +0 -0
  13. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/__main__.py +0 -0
  14. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/alembic/README +0 -0
  15. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/alembic/env.py +0 -0
  16. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/alembic/script.py.mako +0 -0
  17. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/alembic/versions/0f02b92c4f94_add_tag_color.py +0 -0
  18. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/alembic/versions/38882503dc7c_add_tags_to_activities.py +0 -0
  19. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/alembic/versions/451e7836b53d_add_square_planner_bookmark.py +0 -0
  20. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/alembic/versions/63d3b7f6f93c_initial_version.py +0 -0
  21. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/alembic/versions/85fe0348e8a2_add_time_series_uuid_field.py +0 -0
  22. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/alembic/versions/93cc82ad1b60_add_parametricplotspec.py +0 -0
  23. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/alembic/versions/ab83b9d23127_add_upstream_id.py +0 -0
  24. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/alembic/versions/b03491c593f6_add_crop_indices.py +0 -0
  25. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/alembic/versions/da2cba03b71d_add_photos.py +0 -0
  26. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/alembic/versions/dc8073871da7_add_plotspec_group_by.py +0 -0
  27. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/alembic/versions/e02e27876deb_add_square_planner_bookmark_name.py +0 -0
  28. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/alembic/versions/f2f50843be2d_make_all_fields_in_activity_nullable.py +0 -0
  29. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/alembic/versions/script.py.mako +0 -0
  30. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/core/__init__.py +0 -0
  31. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/core/activities.py +0 -0
  32. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/core/config.py +0 -0
  33. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/core/coordinates.py +0 -0
  34. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/core/copernicus_dem.py +0 -0
  35. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/core/enrichment.py +0 -0
  36. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/core/export.py +0 -0
  37. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/core/heart_rate.py +0 -0
  38. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/core/meta_search.py +0 -0
  39. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/core/missing_values.py +0 -0
  40. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/core/parametric_plot.py +0 -0
  41. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/core/paths.py +0 -0
  42. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/core/photos.py +0 -0
  43. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/core/privacy_zones.py +0 -0
  44. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/core/raster_map.py +0 -0
  45. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/core/similarity.py +0 -0
  46. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/core/summary_stats.py +0 -0
  47. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/core/tasks.py +0 -0
  48. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/core/test_datamodel.py +0 -0
  49. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/core/test_meta_search.py +0 -0
  50. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/core/test_missing_values.py +0 -0
  51. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/core/test_pandas_timezone.py +0 -0
  52. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/core/test_summary_stats.py +0 -0
  53. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/core/test_tiles.py +0 -0
  54. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/core/test_time_zone_from_location.py +0 -0
  55. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/core/test_time_zone_import.py +0 -0
  56. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/core/test_timezone_sqlalchemy.py +0 -0
  57. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/core/tiles.py +0 -0
  58. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/core/time_conversion.py +0 -0
  59. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/explorer/__init__.py +0 -0
  60. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/explorer/grid_file.py +0 -0
  61. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/explorer/tile_visits.py +0 -0
  62. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/explorer/video.py +0 -0
  63. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/heatmap_video.py +0 -0
  64. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/importers/__init__.py +0 -0
  65. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/importers/csv_parser.py +0 -0
  66. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/importers/directory.py +0 -0
  67. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/importers/strava_api.py +0 -0
  68. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/importers/strava_checkout.py +0 -0
  69. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/importers/test_csv_parser.py +0 -0
  70. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/importers/test_directory.py +0 -0
  71. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/importers/test_strava_api.py +0 -0
  72. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/__init__.py +0 -0
  73. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/authenticator.py +0 -0
  74. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/blueprints/__init__.py +0 -0
  75. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/blueprints/activity_blueprint.py +0 -0
  76. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/blueprints/auth_blueprint.py +0 -0
  77. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/blueprints/bubble_chart_blueprint.py +0 -0
  78. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/blueprints/calendar_blueprint.py +0 -0
  79. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/blueprints/eddington_blueprints.py +0 -0
  80. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/blueprints/entry_views.py +0 -0
  81. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/blueprints/equipment_blueprint.py +0 -0
  82. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/blueprints/export_blueprint.py +0 -0
  83. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/blueprints/heatmap_blueprint.py +0 -0
  84. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/blueprints/plot_builder_blueprint.py +0 -0
  85. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/blueprints/search_blueprint.py +0 -0
  86. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/blueprints/settings_blueprint.py +0 -0
  87. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/blueprints/square_planner_blueprint.py +0 -0
  88. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/blueprints/summary_blueprint.py +0 -0
  89. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/blueprints/tile_blueprint.py +0 -0
  90. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/blueprints/time_zone_fixer_blueprint.py +0 -0
  91. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/blueprints/upload_blueprint.py +0 -0
  92. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/columns.py +0 -0
  93. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/flasher.py +0 -0
  94. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/plot_util.py +0 -0
  95. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/search_util.py +0 -0
  96. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/static/bootstrap/bootstrap-dark-mode.js +0 -0
  97. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/static/bootstrap/bootstrap.bundle.min.js +0 -0
  98. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/static/bootstrap/bootstrap.min.css +0 -0
  99. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/static/favicons/android-chrome-192x192.png +0 -0
  100. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/static/favicons/android-chrome-512x512.png +0 -0
  101. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/static/favicons/apple-touch-icon.png +0 -0
  102. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/static/favicons/browserconfig.xml +0 -0
  103. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/static/favicons/favicon-16x16.png +0 -0
  104. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/static/favicons/favicon-32x32.png +0 -0
  105. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/static/favicons/favicon-48x48.png +0 -0
  106. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/static/favicons/favicon.ico +0 -0
  107. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/static/favicons/favicon.svg +0 -0
  108. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/static/favicons/mstile-150x150.png +0 -0
  109. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/static/favicons/site.webmanifest +0 -0
  110. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/static/favicons/web-app-manifest-192x192.png +0 -0
  111. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/static/favicons/web-app-manifest-512x512.png +0 -0
  112. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/static/images/layers-2x.png +0 -0
  113. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/static/images/layers.png +0 -0
  114. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/static/images/marker-icon-2x.png +0 -0
  115. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/static/images/marker-icon.png +0 -0
  116. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/static/images/marker-shadow.png +0 -0
  117. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/static/leaflet/Leaflet.fullscreen.min.js +0 -0
  118. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/static/leaflet/MarkerCluster.Default.css +0 -0
  119. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/static/leaflet/MarkerCluster.css +0 -0
  120. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/static/leaflet/fullscreen.png +0 -0
  121. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/static/leaflet/fullscreen@2x.png +0 -0
  122. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/static/leaflet/images/layers-2x.png +0 -0
  123. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/static/leaflet/images/layers.png +0 -0
  124. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/static/leaflet/leaflet.css +0 -0
  125. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/static/leaflet/leaflet.fullscreen.css +0 -0
  126. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/static/leaflet/leaflet.js +0 -0
  127. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/static/leaflet/leaflet.markercluster.js +0 -0
  128. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/static/table-sort.min.js +0 -0
  129. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/static/vega/vega-embed@6.js +0 -0
  130. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/static/vega/vega-lite@4.js +0 -0
  131. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/static/vega/vega@5.js +0 -0
  132. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/activity/day.html.j2 +0 -0
  133. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/activity/edit.html.j2 +0 -0
  134. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/activity/lines.html.j2 +0 -0
  135. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/activity/name.html.j2 +0 -0
  136. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/activity/show.html.j2 +0 -0
  137. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/activity/trim.html.j2 +0 -0
  138. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/auth/index.html.j2 +0 -0
  139. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/bubble_chart/index.html.j2 +0 -0
  140. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/calendar/index.html.j2 +0 -0
  141. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/calendar/month.html.j2 +0 -0
  142. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/eddington/distance.html.j2 +0 -0
  143. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/eddington/elevation_gain.html.j2 +0 -0
  144. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/elevation_eddington/index.html.j2 +0 -0
  145. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/equipment/index.html.j2 +0 -0
  146. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/export/index.html.j2 +0 -0
  147. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/hall_of_fame/index.html.j2 +0 -0
  148. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/heatmap/index.html.j2 +0 -0
  149. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/home.html.j2 +0 -0
  150. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/page.html.j2 +0 -0
  151. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/photo/map.html.j2 +0 -0
  152. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/photo/new.html.j2 +0 -0
  153. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/plot-macros.html.j2 +0 -0
  154. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/plot_builder/edit.html.j2 +0 -0
  155. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/plot_builder/import-spec.html.j2 +0 -0
  156. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/plot_builder/index.html.j2 +0 -0
  157. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/search/index.html.j2 +0 -0
  158. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/search_form.html.j2 +0 -0
  159. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/settings/admin-password.html.j2 +0 -0
  160. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/settings/color-schemes.html.j2 +0 -0
  161. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/settings/heart-rate.html.j2 +0 -0
  162. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/settings/index.html.j2 +0 -0
  163. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/settings/manage-equipments.html.j2 +0 -0
  164. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/settings/manage-kinds.html.j2 +0 -0
  165. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/settings/metadata-extraction.html.j2 +0 -0
  166. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/settings/privacy-zones.html.j2 +0 -0
  167. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/settings/segmentation.html.j2 +0 -0
  168. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/settings/sharepic.html.j2 +0 -0
  169. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/settings/strava.html.j2 +0 -0
  170. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/settings/tags-edit.html.j2 +0 -0
  171. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/settings/tags-list.html.j2 +0 -0
  172. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/settings/tags-new.html.j2 +0 -0
  173. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/settings/tile-source.html.j2 +0 -0
  174. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/square_planner/index.html.j2 +0 -0
  175. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/summary/index.html.j2 +0 -0
  176. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/summary/vega-chart.html.j2 +0 -0
  177. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/time_zone_fixer/index.html.j2 +0 -0
  178. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/geo_activity_playground/webui/templates/upload/index.html.j2 +0 -0
  179. {geo_activity_playground-1.4.1 → geo_activity_playground-1.5.1}/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.4.1
3
+ Version: 1.5.1
4
4
  Summary: Analysis of geo data activities like rides, runs or hikes.
5
5
  License: MIT
6
6
  Author: Martin Ueding
@@ -230,6 +230,13 @@ class Activity(DB.Model):
230
230
  else:
231
231
  return self.start
232
232
 
233
+ @property
234
+ def start_utc(self) -> Optional[datetime.datetime]:
235
+ if self.start:
236
+ return self.start.replace(microsecond=0, tzinfo=zoneinfo.ZoneInfo("UTC"))
237
+ else:
238
+ return None
239
+
233
240
 
234
241
  class Tag(DB.Model):
235
242
  __tablename__ = "tags"
@@ -8,7 +8,7 @@ from collections.abc import Iterator
8
8
  import charset_normalizer
9
9
  import dateutil.parser
10
10
  import fitdecode.exceptions
11
- import gpxpy
11
+ import gpxpy.gpx
12
12
  import pandas as pd
13
13
  import tcxreader.tcxreader
14
14
  import xmltodict
@@ -40,7 +40,7 @@ def read_activity(path: pathlib.Path) -> tuple[Activity, pd.DataFrame]:
40
40
  if file_type == ".gpx":
41
41
  try:
42
42
  timeseries = read_gpx_activity(path, opener)
43
- except gpxpy.gpx.GPXXMLSyntaxException as e:
43
+ except gpxpy.gpx.GPXException as e:
44
44
  raise ActivityParseError(f"Syntax error while parsing GPX file") from e
45
45
  except UnicodeDecodeError as e:
46
46
  raise ActivityParseError(f"Encoding issue") from e
@@ -256,6 +256,7 @@ def web_ui_main(
256
256
  # "search_query_favorites": search_query_history.prepare_favorites(),
257
257
  # "search_query_last": search_query_history.prepare_last(),
258
258
  "request_url": urllib.parse.quote_plus(request.url),
259
+ "host_url": request.host_url,
259
260
  }
260
261
  variables["equipments_avail"] = DB.session.scalars(
261
262
  sqlalchemy.select(Equipment).order_by(Equipment.name)
@@ -4,6 +4,7 @@ import hashlib
4
4
  import io
5
5
  import logging
6
6
  from collections.abc import Iterable
7
+ from typing import Optional
7
8
  from typing import Union
8
9
 
9
10
  import altair as alt
@@ -53,9 +54,7 @@ def blend_color(
53
54
 
54
55
  class ColorStrategy(abc.ABC):
55
56
  @abc.abstractmethod
56
- def color_image(
57
- self, tile_xy: tuple[int, int], grayscale: np.ndarray
58
- ) -> np.ndarray:
57
+ def _color(self, tile_xy: tuple[int, int]) -> Optional[np.ndarray]:
59
58
  pass
60
59
 
61
60
 
@@ -68,18 +67,15 @@ class MaxClusterColorStrategy(ColorStrategy):
68
67
  key=len,
69
68
  )
70
69
 
71
- def color_image(
72
- self, tile_xy: tuple[int, int], grayscale: np.ndarray
73
- ) -> np.ndarray:
70
+ def _color(self, tile_xy: tuple[int, int]) -> Optional[np.ndarray]:
74
71
  if tile_xy in self.max_cluster_members:
75
- color = np.array([[[55, 126, 184, 70]]]) / 256
72
+ return np.array([[[55, 126, 184, 70]]]) / 255
76
73
  elif tile_xy in self.evolution_state.memberships:
77
- color = np.array([[[77, 175, 74, 70]]]) / 256
74
+ return np.array([[[77, 175, 74, 70]]]) / 255
78
75
  elif tile_xy in self.tile_visits:
79
- color = np.array([[[0, 0, 0, 70]]]) / 256
76
+ return np.array([[[0, 0, 0, 70]]]) / 255
80
77
  else:
81
- color = np.array([[[0, 0, 0, 0]]]) / 256
82
- return np.broadcast_to(color, grayscale.shape)
78
+ return None
83
79
 
84
80
 
85
81
  class ColorfulClusterColorStrategy(ColorStrategy):
@@ -92,20 +88,17 @@ class ColorfulClusterColorStrategy(ColorStrategy):
92
88
  )
93
89
  self._cmap = matplotlib.colormaps["hsv"]
94
90
 
95
- def color_image(
96
- self, tile_xy: tuple[int, int], grayscale: np.ndarray
97
- ) -> np.ndarray:
91
+ def _color(self, tile_xy: tuple[int, int]) -> Optional[np.ndarray]:
98
92
  if tile_xy in self.evolution_state.memberships:
99
93
  cluster_id = self.evolution_state.memberships[tile_xy]
100
94
  m = hashlib.sha256()
101
95
  m.update(str(cluster_id).encode())
102
96
  d = int(m.hexdigest(), base=16) / (256.0**m.digest_size)
103
- color = np.array([[self._cmap(d)[:3] + (0.5,)]])
97
+ return np.array([[self._cmap(d)[:3] + (0.5,)]])
104
98
  elif tile_xy in self.tile_visits:
105
- color = np.array([[[0, 0, 0, 70]]]) / 256
99
+ return np.array([[[0, 0, 0, 70]]]) / 255
106
100
  else:
107
- color = np.array([[[0, 0, 0, 0]]]) / 256
108
- return np.broadcast_to(color, grayscale.shape)
101
+ return None
109
102
 
110
103
 
111
104
  class VisitTimeColorStrategy(ColorStrategy):
@@ -113,9 +106,7 @@ class VisitTimeColorStrategy(ColorStrategy):
113
106
  self.tile_visits = tile_visits
114
107
  self.use_first = use_first
115
108
 
116
- def color_image(
117
- self, tile_xy: tuple[int, int], grayscale: np.ndarray
118
- ) -> np.ndarray:
109
+ def _color(self, tile_xy: tuple[int, int]) -> Optional[np.ndarray]:
119
110
  if tile_xy in self.tile_visits:
120
111
  today = datetime.date.today()
121
112
  cmap = matplotlib.colormaps["plasma"]
@@ -124,31 +115,39 @@ class VisitTimeColorStrategy(ColorStrategy):
124
115
  tile_info["first_time"] if self.use_first else tile_info["last_time"]
125
116
  )
126
117
  if pd.isna(relevant_time):
127
- color = np.array([[[0, 0, 0, 70]]]) / 256
118
+ color = np.array([[[0, 0, 0, 70]]]) / 255
128
119
  else:
129
120
  last_age_days = (today - relevant_time.date()).days
130
121
  color = cmap(max(1 - last_age_days / (2 * 365), 0.0))
131
122
  color = np.array([[color[:3] + (0.5,)]])
123
+ return color
132
124
  else:
133
- color = np.array([[[0, 0, 0, 0]]]) / 256
134
- return np.broadcast_to(color, grayscale.shape)
125
+ return None
135
126
 
136
127
 
137
128
  class NumVisitsColorStrategy(ColorStrategy):
138
129
  def __init__(self, tile_visits):
139
130
  self.tile_visits = tile_visits
140
131
 
141
- def color_image(
142
- self, tile_xy: tuple[int, int], grayscale: np.ndarray
143
- ) -> np.ndarray:
132
+ def _color(self, tile_xy: tuple[int, int]) -> Optional[np.ndarray]:
144
133
  if tile_xy in self.tile_visits:
145
134
  cmap = matplotlib.colormaps["viridis"]
146
135
  tile_info = self.tile_visits[tile_xy]
147
136
  color = cmap(min(len(tile_info["activity_ids"]) / 50, 1.0))
148
- color = np.array([[color[:3] + (0.5,)]])
137
+ return np.array([[color[:3] + (0.5,)]])
149
138
  else:
150
- color = np.array([[[0, 0, 0, 0]]]) / 256
151
- return np.broadcast_to(color, grayscale.shape)
139
+ return None
140
+
141
+
142
+ class MissingColorStrategy(ColorStrategy):
143
+ def __init__(self, tile_visits):
144
+ self.tile_visits = tile_visits
145
+
146
+ def _color(self, tile_xy: tuple[int, int]) -> Optional[np.ndarray]:
147
+ if tile_xy in self.tile_visits:
148
+ return None
149
+ else:
150
+ return np.array([[[0, 0, 0, 70]]]) / 255
152
151
 
153
152
 
154
153
  def make_explorer_blueprint(
@@ -294,6 +293,8 @@ def make_explorer_blueprint(
294
293
  color_strategy = VisitTimeColorStrategy(tile_visits, use_first=False)
295
294
  case "visits":
296
295
  color_strategy = NumVisitsColorStrategy(tile_visits)
296
+ case "missing":
297
+ color_strategy = MissingColorStrategy(tile_visits)
297
298
  case _:
298
299
  raise ValueError("Unsupported color strategy.")
299
300
 
@@ -302,7 +303,11 @@ def make_explorer_blueprint(
302
303
  tile_x = x // factor
303
304
  tile_y = y // factor
304
305
  tile_xy = (tile_x, tile_y)
305
- result = color_strategy.color_image(tile_xy, grayscale).copy()
306
+ color = color_strategy._color(tile_xy)
307
+ if color is None:
308
+ result = grayscale
309
+ else:
310
+ result = np.broadcast_to(color, grayscale.shape)
306
311
 
307
312
  if x % factor == 0:
308
313
  result[:, 0, :] = 0.5
@@ -356,73 +361,62 @@ def make_explorer_blueprint(
356
361
  tile_x = x * factor + xo
357
362
  tile_y = y * factor + yo
358
363
  tile_xy = (tile_x, tile_y)
359
- if tile_xy in tile_visits:
364
+ color = color_strategy._color(tile_xy)
365
+ if color is not None:
360
366
  result[
361
367
  yo * width : (yo + 1) * width, xo * width : (xo + 1) * width
362
- ] = color_strategy.color_image(
363
- tile_xy,
364
- grayscale[
368
+ ] = color
369
+
370
+ if (
371
+ evolution_state.square_x is not None
372
+ and evolution_state.square_y is not None
373
+ ):
374
+ if (
375
+ tile_x == evolution_state.square_x
376
+ and evolution_state.square_y
377
+ <= tile_y
378
+ < evolution_state.square_y + evolution_state.max_square_size
379
+ ):
380
+ result[
365
381
  yo * width : (yo + 1) * width,
382
+ xo * width : xo * width + square_line_width,
383
+ ] = square_color
384
+ if (
385
+ tile_y == evolution_state.square_y
386
+ and evolution_state.square_x
387
+ <= tile_x
388
+ < evolution_state.square_x + evolution_state.max_square_size
389
+ ):
390
+ result[
391
+ yo * width : yo * width + square_line_width,
366
392
  xo * width : (xo + 1) * width,
367
- ],
368
- )
393
+ ] = square_color
369
394
 
370
395
  if (
371
- evolution_state.square_x is not None
372
- and evolution_state.square_y is not None
396
+ tile_x + 1
397
+ == evolution_state.square_x
398
+ + evolution_state.max_square_size
399
+ and evolution_state.square_y
400
+ <= tile_y
401
+ < evolution_state.square_y + evolution_state.max_square_size
373
402
  ):
374
- if (
375
- tile_x == evolution_state.square_x
376
- and evolution_state.square_y
377
- <= tile_y
378
- < evolution_state.square_y
379
- + evolution_state.max_square_size
380
- ):
381
- result[
382
- yo * width : (yo + 1) * width,
383
- xo * width : xo * width + square_line_width,
384
- ] = square_color
385
- if (
386
- tile_y == evolution_state.square_y
387
- and evolution_state.square_x
388
- <= tile_x
389
- < evolution_state.square_x
390
- + evolution_state.max_square_size
391
- ):
392
- result[
393
- yo * width : yo * width + square_line_width,
394
- xo * width : (xo + 1) * width,
395
- ] = square_color
396
-
397
- if (
398
- tile_x + 1
399
- == evolution_state.square_x
400
- + evolution_state.max_square_size
401
- and evolution_state.square_y
402
- <= tile_y
403
- < evolution_state.square_y
404
- + evolution_state.max_square_size
405
- ):
406
- result[
407
- yo * width : (yo + 1) * width,
408
- (xo + 1) * width
409
- - square_line_width : (xo + 1) * width,
410
- ] = square_color
411
-
412
- if (
413
- tile_y + 1
414
- == evolution_state.square_y
415
- + evolution_state.max_square_size
416
- and evolution_state.square_x
417
- <= tile_x
418
- < evolution_state.square_x
419
- + evolution_state.max_square_size
420
- ):
421
- result[
422
- (yo + 1) * width
423
- - square_line_width : (yo + 1) * width,
424
- xo * width : (xo + 1) * width,
425
- ] = square_color
403
+ result[
404
+ yo * width : (yo + 1) * width,
405
+ (xo + 1) * width - square_line_width : (xo + 1) * width,
406
+ ] = square_color
407
+
408
+ if (
409
+ tile_y + 1
410
+ == evolution_state.square_y
411
+ + evolution_state.max_square_size
412
+ and evolution_state.square_x
413
+ <= tile_x
414
+ < evolution_state.square_x + evolution_state.max_square_size
415
+ ):
416
+ result[
417
+ (yo + 1) * width - square_line_width : (yo + 1) * width,
418
+ xo * width : (xo + 1) * width,
419
+ ] = square_color
426
420
  if width >= 64:
427
421
  result[yo * width, :, :] = 0.5
428
422
  result[:, xo * width, :] = 0.5
@@ -79,11 +79,11 @@ def _nominate_activities_inner(
79
79
  if variable in meta.columns and not pd.isna(meta[variable]).all():
80
80
  try:
81
81
  i = meta[variable].idxmax()
82
- except ValueError as e:
82
+ except (KeyError, TypeError):
83
83
  print(meta[variable].tolist())
84
84
  print(f"{meta[variable].dtype=}")
85
85
  logger.error(f"Trying to work with {variable=}.")
86
- logger.error(f"We got a ValueError: {e}")
86
+ raise
87
87
  else:
88
88
  value = meta.loc[i, variable]
89
89
  format_applied = format_str.format(value)
@@ -143,7 +143,10 @@ def make_photo_blueprint(
143
143
  .order_by(Activity.start.desc())
144
144
  .limit(1)
145
145
  )
146
- if activity is None or activity.start + activity.elapsed_time < time:
146
+ if (
147
+ activity is None
148
+ or activity.start_utc + activity.elapsed_time < time
149
+ ):
147
150
  flasher.flash_message(
148
151
  f"Your image '{file.filename}' is from {time} but no activity could be found. Please first upload an activity or fix the time in the photo.",
149
152
  FlashTypes.DANGER,
@@ -44,6 +44,10 @@ 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`, {
48
+ maxZoom: 19,
49
+ attribution: map_tile_attribution
50
+ }),
47
51
  "Heatmap": L.tileLayer("/heatmap/tile/{z}/{x}/{y}.png", {
48
52
  maxZoom: 19,
49
53
  attribution: map_tile_attribution
@@ -42,7 +42,7 @@
42
42
  </div>
43
43
  </div>
44
44
 
45
- <div class=" row mb-3">
45
+ <div class="row mb-3">
46
46
  <div class="col">
47
47
  <h2>Tile history</h2>
48
48
  </div>
@@ -66,5 +66,42 @@
66
66
  </div>
67
67
  </div>
68
68
 
69
+ <h2 class="mb-3">Tile URLs</h2>
70
+
71
+ <p>You can use the overlay tiles with other services like <a href="https://bikerouter.de/" target="_blank">Bike
72
+ Router</a>. See <a href="https://martin-ueding.github.io/geo-activity-playground/using-maps-as-overlays/"
73
+ target="_blank">the documentation for this feature</a>. For your server, use the following URLs:</p>
74
+
75
+ <code><pre>
76
+ {{ host_url }}tile/grayscale/{z}/{x}/{y}.png
77
+ {{ host_url }}tile/pastel/{z}/{x}/{y}.png
78
+ {{ host_url }}tile/color/{z}/{x}/{y}.png
79
+ {{ host_url }}tile/inverse_grayscale/{z}/{x}/{y}.png
80
+ </pre></code>
81
+
82
+ <p>For the explorer tiles, you can use these:</p>
83
+
84
+ <code><pre>
85
+ {{ host_url }}explorer/14/tile/{z}/{x}/{y}.png?color_strategy=colorful_cluster
86
+ {{ host_url }}explorer/14/tile/{z}/{x}/{y}.png?color_strategy=max_cluster
87
+ {{ host_url }}explorer/14/tile/{z}/{x}/{y}.png?color_strategy=first
88
+ {{ host_url }}explorer/14/tile/{z}/{x}/{y}.png?color_strategy=last
89
+ {{ host_url }}explorer/14/tile/{z}/{x}/{y}.png?color_strategy=visits
90
+ {{ host_url }}explorer/14/tile/{z}/{x}/{y}.png?color_strategy=missing
91
+
92
+ {{ host_url }}explorer/17/tile/{z}/{x}/{y}.png?color_strategy=colorful_cluster
93
+ {{ host_url }}explorer/17/tile/{z}/{x}/{y}.png?color_strategy=max_cluster
94
+ {{ host_url }}explorer/17/tile/{z}/{x}/{y}.png?color_strategy=first
95
+ {{ host_url }}explorer/17/tile/{z}/{x}/{y}.png?color_strategy=last
96
+ {{ host_url }}explorer/17/tile/{z}/{x}/{y}.png?color_strategy=visits
97
+ {{ host_url }}explorer/17/tile/{z}/{x}/{y}.png?color_strategy=missing
98
+ </pre></code>
99
+
100
+ <p>And for the heatmap, you can use this:</p>
101
+
102
+ <code><pre>
103
+ {{ host_url }}heatmap/tile/{z}/{x}/{y}.png
104
+ </pre></code>
105
+
69
106
  {% endif %}
70
107
  {% endblock %}
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "geo-activity-playground"
3
- version = "1.4.1"
3
+ version = "1.5.1"
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"