geo-activity-playground 1.5.2__tar.gz → 1.6.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 (181) hide show
  1. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/PKG-INFO +2 -1
  2. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/core/enrichment.py +2 -4
  3. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/core/photos.py +7 -3
  4. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/core/test_time_zone_from_location.py +6 -0
  5. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/core/time_conversion.py +7 -0
  6. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/explorer/tile_visits.py +5 -0
  7. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/importers/activity_parsers.py +2 -3
  8. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/importers/directory.py +16 -1
  9. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/importers/strava_checkout.py +2 -0
  10. geo_activity_playground-1.6.0/geo_activity_playground/webui/static/activity-trim.js +39 -0
  11. geo_activity_playground-1.6.0/geo_activity_playground/webui/templates/activity/trim.html.j2 +33 -0
  12. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/pyproject.toml +2 -1
  13. geo_activity_playground-1.5.2/geo_activity_playground/webui/templates/activity/trim.html.j2 +0 -68
  14. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/LICENSE +0 -0
  15. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/__init__.py +0 -0
  16. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/__main__.py +0 -0
  17. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/alembic/README +0 -0
  18. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/alembic/env.py +0 -0
  19. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/alembic/script.py.mako +0 -0
  20. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/alembic/versions/0f02b92c4f94_add_tag_color.py +0 -0
  21. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/alembic/versions/38882503dc7c_add_tags_to_activities.py +0 -0
  22. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/alembic/versions/451e7836b53d_add_square_planner_bookmark.py +0 -0
  23. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/alembic/versions/63d3b7f6f93c_initial_version.py +0 -0
  24. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/alembic/versions/85fe0348e8a2_add_time_series_uuid_field.py +0 -0
  25. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/alembic/versions/93cc82ad1b60_add_parametricplotspec.py +0 -0
  26. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/alembic/versions/ab83b9d23127_add_upstream_id.py +0 -0
  27. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/alembic/versions/b03491c593f6_add_crop_indices.py +0 -0
  28. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/alembic/versions/da2cba03b71d_add_photos.py +0 -0
  29. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/alembic/versions/dc8073871da7_add_plotspec_group_by.py +0 -0
  30. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/alembic/versions/e02e27876deb_add_square_planner_bookmark_name.py +0 -0
  31. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/alembic/versions/f2f50843be2d_make_all_fields_in_activity_nullable.py +0 -0
  32. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/alembic/versions/script.py.mako +0 -0
  33. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/core/__init__.py +0 -0
  34. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/core/activities.py +0 -0
  35. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/core/config.py +0 -0
  36. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/core/coordinates.py +0 -0
  37. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/core/copernicus_dem.py +0 -0
  38. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/core/datamodel.py +0 -0
  39. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/core/export.py +0 -0
  40. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/core/heart_rate.py +0 -0
  41. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/core/meta_search.py +0 -0
  42. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/core/missing_values.py +0 -0
  43. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/core/parametric_plot.py +0 -0
  44. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/core/paths.py +0 -0
  45. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/core/privacy_zones.py +0 -0
  46. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/core/raster_map.py +0 -0
  47. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/core/similarity.py +0 -0
  48. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/core/summary_stats.py +0 -0
  49. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/core/tasks.py +0 -0
  50. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/core/test_datamodel.py +0 -0
  51. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/core/test_meta_search.py +0 -0
  52. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/core/test_missing_values.py +0 -0
  53. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/core/test_pandas_timezone.py +0 -0
  54. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/core/test_summary_stats.py +0 -0
  55. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/core/test_tiles.py +0 -0
  56. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/core/test_time_zone_import.py +0 -0
  57. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/core/test_timezone_sqlalchemy.py +0 -0
  58. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/core/tiles.py +0 -0
  59. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/explorer/__init__.py +0 -0
  60. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/explorer/grid_file.py +0 -0
  61. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/explorer/video.py +0 -0
  62. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/heatmap_video.py +0 -0
  63. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/importers/__init__.py +0 -0
  64. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/importers/csv_parser.py +0 -0
  65. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/importers/strava_api.py +0 -0
  66. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/importers/test_csv_parser.py +0 -0
  67. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/importers/test_directory.py +0 -0
  68. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/importers/test_strava_api.py +0 -0
  69. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/__init__.py +0 -0
  70. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/app.py +0 -0
  71. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/authenticator.py +0 -0
  72. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/blueprints/__init__.py +0 -0
  73. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/blueprints/activity_blueprint.py +0 -0
  74. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/blueprints/auth_blueprint.py +0 -0
  75. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/blueprints/bubble_chart_blueprint.py +0 -0
  76. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/blueprints/calendar_blueprint.py +0 -0
  77. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/blueprints/eddington_blueprints.py +0 -0
  78. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/blueprints/entry_views.py +0 -0
  79. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/blueprints/equipment_blueprint.py +0 -0
  80. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/blueprints/explorer_blueprint.py +0 -0
  81. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/blueprints/export_blueprint.py +0 -0
  82. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/blueprints/hall_of_fame_blueprint.py +0 -0
  83. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/blueprints/heatmap_blueprint.py +0 -0
  84. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/blueprints/photo_blueprint.py +0 -0
  85. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/blueprints/plot_builder_blueprint.py +0 -0
  86. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/blueprints/search_blueprint.py +0 -0
  87. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/blueprints/settings_blueprint.py +0 -0
  88. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/blueprints/square_planner_blueprint.py +0 -0
  89. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/blueprints/summary_blueprint.py +0 -0
  90. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/blueprints/tile_blueprint.py +0 -0
  91. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/blueprints/time_zone_fixer_blueprint.py +0 -0
  92. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/blueprints/upload_blueprint.py +0 -0
  93. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/columns.py +0 -0
  94. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/flasher.py +0 -0
  95. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/plot_util.py +0 -0
  96. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/search_util.py +0 -0
  97. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/static/bootstrap/bootstrap-dark-mode.js +0 -0
  98. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/static/bootstrap/bootstrap.bundle.min.js +0 -0
  99. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/static/bootstrap/bootstrap.min.css +0 -0
  100. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/static/favicons/android-chrome-192x192.png +0 -0
  101. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/static/favicons/android-chrome-512x512.png +0 -0
  102. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/static/favicons/apple-touch-icon.png +0 -0
  103. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/static/favicons/browserconfig.xml +0 -0
  104. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/static/favicons/favicon-16x16.png +0 -0
  105. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/static/favicons/favicon-32x32.png +0 -0
  106. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/static/favicons/favicon-48x48.png +0 -0
  107. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/static/favicons/favicon.ico +0 -0
  108. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/static/favicons/favicon.svg +0 -0
  109. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/static/favicons/mstile-150x150.png +0 -0
  110. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/static/favicons/site.webmanifest +0 -0
  111. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/static/favicons/web-app-manifest-192x192.png +0 -0
  112. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/static/favicons/web-app-manifest-512x512.png +0 -0
  113. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/static/images/layers-2x.png +0 -0
  114. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/static/images/layers.png +0 -0
  115. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/static/images/marker-icon-2x.png +0 -0
  116. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/static/images/marker-icon.png +0 -0
  117. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/static/images/marker-shadow.png +0 -0
  118. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/static/leaflet/Leaflet.fullscreen.min.js +0 -0
  119. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/static/leaflet/MarkerCluster.Default.css +0 -0
  120. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/static/leaflet/MarkerCluster.css +0 -0
  121. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/static/leaflet/fullscreen.png +0 -0
  122. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/static/leaflet/fullscreen@2x.png +0 -0
  123. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/static/leaflet/images/layers-2x.png +0 -0
  124. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/static/leaflet/images/layers.png +0 -0
  125. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/static/leaflet/leaflet.css +0 -0
  126. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/static/leaflet/leaflet.fullscreen.css +0 -0
  127. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/static/leaflet/leaflet.js +0 -0
  128. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/static/leaflet/leaflet.markercluster.js +0 -0
  129. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/static/server-side-explorer.js +0 -0
  130. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/static/table-sort.min.js +0 -0
  131. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/static/vega/vega-embed@6.js +0 -0
  132. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/static/vega/vega-lite@4.js +0 -0
  133. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/static/vega/vega@5.js +0 -0
  134. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/activity/day.html.j2 +0 -0
  135. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/activity/edit.html.j2 +0 -0
  136. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/activity/lines.html.j2 +0 -0
  137. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/activity/name.html.j2 +0 -0
  138. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/activity/show.html.j2 +0 -0
  139. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/auth/index.html.j2 +0 -0
  140. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/bubble_chart/index.html.j2 +0 -0
  141. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/calendar/index.html.j2 +0 -0
  142. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/calendar/month.html.j2 +0 -0
  143. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/eddington/distance.html.j2 +0 -0
  144. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/eddington/elevation_gain.html.j2 +0 -0
  145. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/elevation_eddington/index.html.j2 +0 -0
  146. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/equipment/index.html.j2 +0 -0
  147. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/explorer/server-side.html.j2 +0 -0
  148. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/export/index.html.j2 +0 -0
  149. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/hall_of_fame/index.html.j2 +0 -0
  150. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/heatmap/index.html.j2 +0 -0
  151. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/home.html.j2 +0 -0
  152. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/page.html.j2 +0 -0
  153. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/photo/map.html.j2 +0 -0
  154. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/photo/new.html.j2 +0 -0
  155. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/plot-macros.html.j2 +0 -0
  156. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/plot_builder/edit.html.j2 +0 -0
  157. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/plot_builder/import-spec.html.j2 +0 -0
  158. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/plot_builder/index.html.j2 +0 -0
  159. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/search/index.html.j2 +0 -0
  160. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/search_form.html.j2 +0 -0
  161. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/settings/admin-password.html.j2 +0 -0
  162. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/settings/color-schemes.html.j2 +0 -0
  163. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/settings/heart-rate.html.j2 +0 -0
  164. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/settings/index.html.j2 +0 -0
  165. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/settings/manage-equipments.html.j2 +0 -0
  166. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/settings/manage-kinds.html.j2 +0 -0
  167. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/settings/metadata-extraction.html.j2 +0 -0
  168. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/settings/privacy-zones.html.j2 +0 -0
  169. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/settings/segmentation.html.j2 +0 -0
  170. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/settings/sharepic.html.j2 +0 -0
  171. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/settings/strava.html.j2 +0 -0
  172. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/settings/tags-edit.html.j2 +0 -0
  173. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/settings/tags-list.html.j2 +0 -0
  174. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/settings/tags-new.html.j2 +0 -0
  175. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/settings/tile-source.html.j2 +0 -0
  176. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/square_planner/index.html.j2 +0 -0
  177. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/summary/index.html.j2 +0 -0
  178. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/summary/vega-chart.html.j2 +0 -0
  179. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/time_zone_fixer/index.html.j2 +0 -0
  180. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.0}/geo_activity_playground/webui/templates/upload/index.html.j2 +0 -0
  181. {geo_activity_playground-1.5.2 → geo_activity_playground-1.6.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.5.2
3
+ Version: 1.6.0
4
4
  Summary: Analysis of geo data activities like rides, runs or hikes.
5
5
  License: MIT
6
6
  Author: Martin Ueding
@@ -37,6 +37,7 @@ Requires-Dist: shapely (>=2.0.5,<3.0.0)
37
37
  Requires-Dist: sqlalchemy (>=2.0.40,<3.0.0)
38
38
  Requires-Dist: stravalib (>=2.0,<3.0)
39
39
  Requires-Dist: tcxreader (>=0.4.5,<0.5.0)
40
+ Requires-Dist: timezonefinder (>=6.5.9,<7.0.0)
40
41
  Requires-Dist: tomli (>=2.0.1,<3.0.0) ; python_version < "3.11"
41
42
  Requires-Dist: tqdm (>=4.64.0,<5.0.0)
42
43
  Requires-Dist: vegafusion-python-embed (>=1.4.3,<2.0.0)
@@ -13,7 +13,7 @@ from .datamodel import Activity
13
13
  from .datamodel import DB
14
14
  from .missing_values import some
15
15
  from .tiles import compute_tile_float
16
- from .time_conversion import get_country_timezone
16
+ from .time_conversion import get_timezone
17
17
 
18
18
  logger = logging.getLogger(__name__)
19
19
 
@@ -26,9 +26,7 @@ def enrichment_set_timezone(
26
26
  ), f"You cannot import an activity without points. {activity=}"
27
27
  latitude, longitude = time_series[["latitude", "longitude"]].iloc[0].to_list()
28
28
  if activity.iana_timezone is None or activity.start_country is None:
29
- country, tz_str = get_country_timezone(latitude, longitude)
30
- activity.iana_timezone = tz_str
31
- activity.start_country = country
29
+ activity.iana_timezone = get_timezone(latitude, longitude)
32
30
  return True
33
31
  else:
34
32
  return False
@@ -23,10 +23,14 @@ def get_metadata_from_image(path: pathlib.Path) -> dict:
23
23
  except KeyError:
24
24
  pass
25
25
  try:
26
- metadata["time"] = dateutil.parser.parse(
27
- str(tags["EXIF DateTimeOriginal"])
28
- + str(tags.get("EXIF OffsetTime", "+00:00"))
26
+ date_time_original = str(tags["EXIF DateTimeOriginal"]) + str(
27
+ tags.get("EXIF OffsetTime", "+00:00")
28
+ ).replace(":", "")
29
+ print(f"Extracted date: {date_time_original}")
30
+ metadata["time"] = datetime.datetime.strptime(
31
+ date_time_original, "%Y:%m:%d %H:%M:%S%z"
29
32
  ).astimezone(zoneinfo.ZoneInfo("UTC"))
33
+
30
34
  except KeyError:
31
35
  pass
32
36
 
@@ -1,7 +1,13 @@
1
1
  from .time_conversion import get_country_timezone
2
+ from .time_conversion import get_timezone
2
3
 
3
4
 
4
5
  def test_time_zone_from_location() -> None:
5
6
  country, iana_timezone = get_country_timezone(50, 7)
6
7
  assert country == "Germany"
7
8
  assert iana_timezone == "Europe/Berlin"
9
+
10
+
11
+ def test_timezone_finder() -> None:
12
+ iana_timezone = get_timezone(50, 7)
13
+ assert iana_timezone == "Europe/Berlin"
@@ -2,8 +2,10 @@ import datetime
2
2
  import json
3
3
  import logging
4
4
  import zoneinfo
5
+ from typing import Optional
5
6
 
6
7
  import requests
8
+ import timezonefinder
7
9
 
8
10
  from .paths import USER_CACHE_DIR
9
11
 
@@ -40,3 +42,8 @@ def get_country_timezone(latitude: float, longitude: float) -> tuple[str, str]:
40
42
  with open(cache_file, "w") as f:
41
43
  json.dump(data, f)
42
44
  return data["location"], data["iana_timezone"]
45
+
46
+
47
+ def get_timezone(latitude: float, longitude: float) -> Optional[str]:
48
+ tf = timezonefinder.TimezoneFinder() # reuse
49
+ return tf.timezone_at(lng=longitude, lat=latitude)
@@ -4,6 +4,7 @@ import itertools
4
4
  import logging
5
5
  import pathlib
6
6
  import pickle
7
+ import zoneinfo
7
8
  from typing import Iterator
8
9
  from typing import Optional
9
10
  from typing import TypedDict
@@ -272,6 +273,10 @@ def _process_activity(
272
273
  def _tiles_from_points(
273
274
  time_series: pd.DataFrame, zoom: int
274
275
  ) -> Iterator[tuple[datetime.datetime, int, int]]:
276
+ # Some people haven't localized their time series yet. This breaks the tile history part. Just assume that it is UTC, should be good enough for tiles.
277
+ if time_series["time"].dt.tz is None:
278
+ time_series = time_series.copy()
279
+ time_series["time"].dt.tz_localize(zoneinfo.ZoneInfo("UTC"))
275
280
  xf = time_series["x"] * 2**zoom
276
281
  yf = time_series["y"] * 2**zoom
277
282
  for t1, x1, y1, x2, y2, s1, s2 in zip(
@@ -138,10 +138,9 @@ def read_fit_activity(path: pathlib.Path, open) -> tuple[Activity, pd.DataFrame]
138
138
  try:
139
139
  row["speed"] = values["enhanced_speed"] * factor
140
140
  except TypeError as e:
141
- # https://github.com/martin-ueding/geo-activity-playground/issues/301
142
- raise ActivityParseError(
141
+ logger.warning(
143
142
  f'Cannot work with {values["enhanced_speed"]!r}, {factor!r}'
144
- ) from e
143
+ )
145
144
  if "grade" in fields:
146
145
  row["grade"] = values["grade"]
147
146
  if "temperature" in fields:
@@ -4,6 +4,7 @@ import re
4
4
  import traceback
5
5
 
6
6
  import sqlalchemy
7
+ from tqdm import tqdm
7
8
 
8
9
  from ..core.activities import ActivityRepository
9
10
  from ..core.config import Config
@@ -37,8 +38,22 @@ def import_from_directory(
37
38
  and not path.stem.startswith(".")
38
39
  and not path.suffix in config.ignore_suffixes
39
40
  ]
41
+ activity_paths.sort()
40
42
 
41
- for i, activity_path in enumerate(activity_paths):
43
+ paths_to_import = [
44
+ activity_path
45
+ for activity_path in tqdm(
46
+ activity_paths, desc="Scanning for new files", delay=1
47
+ )
48
+ if DB.session.scalar(
49
+ sqlalchemy.select(Activity).filter(Activity.path == str(activity_path))
50
+ )
51
+ is None
52
+ ]
53
+
54
+ for i, activity_path in enumerate(
55
+ tqdm(paths_to_import, desc="Importing activity files", delay=0)
56
+ ):
42
57
  with DB.session.no_autoflush:
43
58
  activity = DB.session.scalar(
44
59
  sqlalchemy.select(Activity).filter(Activity.path == str(activity_path))
@@ -198,6 +198,8 @@ def import_from_strava_checkout(config: Config) -> None:
198
198
 
199
199
  activity_file = checkout_path / row["Filename"]
200
200
 
201
+ logger.info(f"Importing '{activity_file}' …")
202
+
201
203
  try:
202
204
  activity, time_series = read_activity(activity_file)
203
205
  except ActivityParseError as e:
@@ -0,0 +1,39 @@
1
+ var map = L.map('activity-map', {
2
+ fullscreenControl: true
3
+ });
4
+ L.tileLayer('/tile/pastel/{z}/{x}/{y}.png', {
5
+ maxZoom: 19,
6
+ attribution: map_tile_attribution
7
+ }).addTo(map);
8
+
9
+ let copy_to_input = function (value, input) {
10
+ document.getElementById(input).value = value;
11
+ }
12
+
13
+ let layer = L.geoJSON(color_line_geojson, {
14
+ pointToLayer: function (feature, lat_lon) {
15
+ let p = feature.properties
16
+
17
+ let marker = null
18
+ if (p.markerType == "circle") {
19
+ marker = L.circleMarker(lat_lon, p.markerStyle)
20
+ } else {
21
+ marker = L.marker(lat_lon)
22
+ }
23
+
24
+ let text = ''
25
+ if (p.name) {
26
+ text += `<button class="btn btn-primary" onclick="copy_to_input(${p.name}, 'begin')">Use as Begin</button>`
27
+ text += ' '
28
+ text += `<button class="btn btn-primary" onclick="copy_to_input(${p.name}+1, 'end')">Use as End</button>`
29
+ }
30
+ if (text) {
31
+ marker = marker.bindPopup(text)
32
+ }
33
+
34
+ return marker
35
+ }
36
+ })
37
+
38
+ layer.addTo(map)
39
+ map.fitBounds(layer.getBounds());
@@ -0,0 +1,33 @@
1
+ {% extends "page.html.j2" %}
2
+
3
+ {% block container %}
4
+ <div class="row mb-3">
5
+ <div class="col">
6
+ <h1>{{ activity["name"] }}</h1>
7
+ </div>
8
+ </div>
9
+
10
+ <a href="{{ url_for('.show', id=activity['id']) }}" class="btn btn-primary btn-small">Back</a>
11
+
12
+ <div id="activity-map" style="height: 600px;" class="mb-3"></div>
13
+ <script>
14
+ var map_tile_attribution = '{{ map_tile_attribution }}';
15
+ var color_line_geojson = {{ color_line_geojson | safe }};
16
+ </script>
17
+ <script src="/static/activity-trim.js"></script>
18
+
19
+ <form method="POST">
20
+ <div class="mb-3">
21
+ <label for="begin" class="form-label">Begin</label>
22
+ <input type="number" class="form-control" id="begin" name="begin" value="{{ activity.index_begin }}" />
23
+ </div>
24
+
25
+ <div class="mb-3">
26
+ <label for="end" class="form-label">End</label>
27
+ <input type="number" class="form-control" id="end" name="end" value="{{ activity.index_end }}" />
28
+ </div>
29
+
30
+ <button type="submit" class="btn btn-primary">Save</button>
31
+ </form>
32
+
33
+ {% endblock %}
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "geo-activity-playground"
3
- version = "1.5.2"
3
+ version = "1.6.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"
@@ -48,6 +48,7 @@ openpyxl = "^3.1.5"
48
48
  # numcodecs = "<0.15.0"
49
49
  # imagecodecs = "^2025.3.30"
50
50
  # tifffile = "2025.5.10"
51
+ timezonefinder = "^6.5.9"
51
52
 
52
53
  [tool.poetry.group.dev.dependencies]
53
54
  black = "^24.0.0"
@@ -1,68 +0,0 @@
1
- {% extends "page.html.j2" %}
2
-
3
- {% block container %}
4
- <div class="row mb-3">
5
- <div class="col">
6
- <h1>{{ activity["name"] }}</h1>
7
- </div>
8
- </div>
9
-
10
- <a href="{{ url_for('.show', id=activity['id']) }}" class="btn btn-primary btn-small">Back</a>
11
-
12
-
13
- <div id="activity-map" style="height: 600px;" class="mb-3"></div>
14
- <script>
15
- var map = L.map('activity-map', {
16
- fullscreenControl: true
17
- });
18
- L.tileLayer('/tile/pastel/{z}/{x}/{y}.png', {
19
- maxZoom: 19,
20
- attribution: '{{ map_tile_attribution|safe }}'
21
- }).addTo(map);
22
-
23
-
24
- let layer = L.geoJSON({{ color_line_geojson| safe }}, {
25
- pointToLayer: function (feature, lat_lon) {
26
- let p = feature.properties
27
-
28
- let marker = null
29
- if (p.markerType == "circle") {
30
- marker = L.circleMarker(lat_lon, p.markerStyle)
31
- } else {
32
- marker = L.marker(lat_lon)
33
- }
34
-
35
- let text = ''
36
- if (p.name) {
37
- text += `<p><b>${p.name}</b></p>`
38
- }
39
- if (p.description) {
40
- text += p.description
41
- }
42
- if (text) {
43
- marker = marker.bindPopup(text)
44
- }
45
-
46
- return marker
47
- }
48
- })
49
-
50
- layer.addTo(map)
51
- map.fitBounds(layer.getBounds());
52
- </script>
53
-
54
- <form method="POST">
55
- <div class="mb-3">
56
- <label for="begin" class="form-label">Begin</label>
57
- <input type="number" class="form-control" id="begin" name="begin" value="{{ activity.index_begin }}" />
58
- </div>
59
-
60
- <div class="mb-3">
61
- <label for="end" class="form-label">End</label>
62
- <input type="number" class="form-control" id="end" name="end" value="{{ activity.index_end }}" />
63
- </div>
64
-
65
- <button type="submit" class="btn btn-primary">Save</button>
66
- </form>
67
-
68
- {% endblock %}