geo-activity-playground 1.8.3__tar.gz → 1.9.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.
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/PKG-INFO +1 -1
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/core/activities.py +1 -1
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/core/enrichment.py +6 -2
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/core/parametric_plot.py +10 -10
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/core/summary_stats.py +2 -2
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/explorer/tile_visits.py +2 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/importers/activity_parsers.py +26 -3
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/importers/strava_api.py +4 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/blueprints/activity_blueprint.py +6 -6
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/blueprints/bubble_chart_blueprint.py +2 -2
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/blueprints/calendar_blueprint.py +2 -2
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/blueprints/eddington_blueprints.py +5 -10
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/blueprints/entry_views.py +3 -3
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/blueprints/equipment_blueprint.py +5 -5
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/blueprints/explorer_blueprint.py +5 -3
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/blueprints/plot_builder_blueprint.py +1 -1
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/blueprints/summary_blueprint.py +2 -2
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/blueprints/upload_blueprint.py +15 -13
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/activity/day.html.j2 +1 -1
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/activity/show.html.j2 +1 -1
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/search/index.html.j2 +2 -2
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/upload/index.html.j2 +1 -1
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/pyproject.toml +1 -1
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/LICENSE +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/__init__.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/__main__.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/alembic/README +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/alembic/env.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/alembic/script.py.mako +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/alembic/versions/0f02b92c4f94_add_tag_color.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/alembic/versions/38882503dc7c_add_tags_to_activities.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/alembic/versions/451e7836b53d_add_square_planner_bookmark.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/alembic/versions/63d3b7f6f93c_initial_version.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/alembic/versions/85fe0348e8a2_add_time_series_uuid_field.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/alembic/versions/93cc82ad1b60_add_parametricplotspec.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/alembic/versions/ab83b9d23127_add_upstream_id.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/alembic/versions/b03491c593f6_add_crop_indices.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/alembic/versions/da2cba03b71d_add_photos.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/alembic/versions/dc8073871da7_add_plotspec_group_by.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/alembic/versions/e02e27876deb_add_square_planner_bookmark_name.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/alembic/versions/f2f50843be2d_make_all_fields_in_activity_nullable.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/alembic/versions/script.py.mako +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/core/__init__.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/core/config.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/core/coordinates.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/core/copernicus_dem.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/core/datamodel.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/core/export.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/core/heart_rate.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/core/meta_search.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/core/missing_values.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/core/paths.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/core/photos.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/core/privacy_zones.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/core/raster_map.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/core/similarity.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/core/tasks.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/core/test_datamodel.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/core/test_meta_search.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/core/test_missing_values.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/core/test_pandas_timezone.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/core/test_summary_stats.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/core/test_tiles.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/core/test_time_zone_from_location.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/core/test_time_zone_import.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/core/test_timezone_sqlalchemy.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/core/tiles.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/core/time_conversion.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/explorer/__init__.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/explorer/grid_file.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/explorer/video.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/heatmap_video.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/importers/__init__.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/importers/csv_parser.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/importers/directory.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/importers/strava_checkout.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/importers/test_csv_parser.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/importers/test_directory.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/importers/test_strava_api.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/__init__.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/app.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/authenticator.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/blueprints/__init__.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/blueprints/auth_blueprint.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/blueprints/export_blueprint.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/blueprints/hall_of_fame_blueprint.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/blueprints/heatmap_blueprint.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/blueprints/photo_blueprint.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/blueprints/search_blueprint.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/blueprints/settings_blueprint.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/blueprints/square_planner_blueprint.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/blueprints/tile_blueprint.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/blueprints/time_zone_fixer_blueprint.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/columns.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/flasher.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/plot_util.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/search_util.py +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/static/activity-trim.js +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/static/bootstrap/bootstrap-dark-mode.js +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/static/bootstrap/bootstrap.bundle.min.js +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/static/bootstrap/bootstrap.min.css +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/static/favicons/android-chrome-192x192.png +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/static/favicons/android-chrome-512x512.png +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/static/favicons/apple-touch-icon.png +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/static/favicons/browserconfig.xml +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/static/favicons/favicon-16x16.png +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/static/favicons/favicon-32x32.png +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/static/favicons/favicon-48x48.png +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/static/favicons/favicon.ico +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/static/favicons/favicon.svg +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/static/favicons/mstile-150x150.png +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/static/favicons/site.webmanifest +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/static/favicons/web-app-manifest-192x192.png +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/static/favicons/web-app-manifest-512x512.png +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/static/images/layers-2x.png +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/static/images/layers.png +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/static/images/marker-icon-2x.png +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/static/images/marker-icon.png +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/static/images/marker-shadow.png +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/static/leaflet/Leaflet.fullscreen.min.js +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/static/leaflet/MarkerCluster.Default.css +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/static/leaflet/MarkerCluster.css +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/static/leaflet/fullscreen.png +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/static/leaflet/fullscreen@2x.png +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/static/leaflet/images/layers-2x.png +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/static/leaflet/images/layers.png +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/static/leaflet/leaflet.css +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/static/leaflet/leaflet.fullscreen.css +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/static/leaflet/leaflet.js +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/static/leaflet/leaflet.markercluster.js +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/static/server-side-explorer.js +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/static/table-sort.min.js +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/static/vega/vega-embed@6.js +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/static/vega/vega-lite@4.js +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/static/vega/vega@5.js +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/activity/edit.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/activity/lines.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/activity/name.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/activity/trim.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/auth/index.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/bubble_chart/index.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/calendar/index.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/calendar/month.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/eddington/distance.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/eddington/elevation_gain.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/elevation_eddington/index.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/equipment/index.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/explorer/server-side.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/export/index.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/hall_of_fame/index.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/heatmap/index.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/home.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/page.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/photo/map.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/photo/new.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/plot-macros.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/plot_builder/edit.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/plot_builder/import-spec.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/plot_builder/index.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/search_form.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/settings/admin-password.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/settings/color-schemes.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/settings/heart-rate.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/settings/index.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/settings/manage-equipments.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/settings/manage-kinds.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/settings/metadata-extraction.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/settings/privacy-zones.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/settings/segmentation.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/settings/sharepic.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/settings/strava.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/settings/tags-edit.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/settings/tags-list.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/settings/tags-new.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/settings/tile-source.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/square_planner/index.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/summary/index.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/summary/vega-chart.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/time_zone_fixer/index.html.j2 +0 -0
- {geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/webui/templates/upload/reload.html.j2 +0 -0
@@ -183,14 +183,18 @@ def enrichment_distance(
|
|
183
183
|
if "speed" not in time_series.columns:
|
184
184
|
time_series["speed"] = (
|
185
185
|
time_series["distance_km"].diff()
|
186
|
-
/
|
186
|
+
/ time_series["time"].diff().dt.total_seconds()
|
187
187
|
* 3600
|
188
188
|
)
|
189
|
+
# Division by zero causes infinity. We replace these with NaN and interpolate the values instead.
|
190
|
+
time_series["speed"] = time_series["speed"].replace([np.inf, -np.inf], np.nan)
|
191
|
+
time_series.interpolate(inplace=True)
|
192
|
+
|
189
193
|
changed = True
|
190
194
|
|
191
195
|
potential_jumps = (time_series["speed"] > 40) & (time_series["speed"].diff() > 10)
|
192
196
|
if np.any(potential_jumps):
|
193
|
-
time_series.replace(time_series.loc[~potential_jumps])
|
197
|
+
time_series.replace(time_series.loc[~potential_jumps], inplace=True)
|
194
198
|
changed = True
|
195
199
|
|
196
200
|
if "segment_id" not in time_series.columns:
|
@@ -17,7 +17,7 @@ CONTINUOUS_VARIABLES = {
|
|
17
17
|
"distance_km_cumsum": "Cumulative Distance / km",
|
18
18
|
"sum(distance_km)": "Total distance / km",
|
19
19
|
"mean(distance_km)": "Average distance / km",
|
20
|
-
"
|
20
|
+
"start_local": "Date",
|
21
21
|
"hours": "Elapsed time / h",
|
22
22
|
"hours_moving": "Moving time / h",
|
23
23
|
"calories": "Energy / kcal",
|
@@ -40,17 +40,17 @@ DISCRETE_VARIABLES = {
|
|
40
40
|
"equipment": "Equipment",
|
41
41
|
"kind": "Activity kind",
|
42
42
|
"consider_for_achievements": "Consider for achievements",
|
43
|
-
"year(
|
43
|
+
"year(start_local):O": "Year",
|
44
44
|
"iso_year:O": "ISO Year",
|
45
|
-
"yearquarter(
|
46
|
-
"yearquartermonth(
|
47
|
-
"yearmonth(
|
48
|
-
"quarter(
|
49
|
-
"quartermonth(
|
50
|
-
"month(
|
45
|
+
"yearquarter(start_local)": "Year, Quarter",
|
46
|
+
"yearquartermonth(start_local)": "Year, Quarter, Month",
|
47
|
+
"yearmonth(start_local)": "Year, Month",
|
48
|
+
"quarter(start_local)": "Quarter",
|
49
|
+
"quartermonth(start_local)": "Quarter, Month",
|
50
|
+
"month(start_local)": "Month",
|
51
51
|
"week:O": "ISO Week",
|
52
|
-
"date(
|
53
|
-
"weekday(
|
52
|
+
"date(start_local)": "Day of month",
|
53
|
+
"weekday(start_local)": "Day of week",
|
54
54
|
"iso_day:O": "ISO Day",
|
55
55
|
}
|
56
56
|
GROUP_BY_VARIABLES = {
|
@@ -10,8 +10,8 @@ def get_equipment_use_table(
|
|
10
10
|
lambda group: pd.Series(
|
11
11
|
{
|
12
12
|
"total_distance_km": group["distance_km"].sum(),
|
13
|
-
"first_use": group["
|
14
|
-
"last_use": group["
|
13
|
+
"first_use": group["start_local"].min(skipna=True),
|
14
|
+
"last_use": group["start_local"].max(skipna=True),
|
15
15
|
},
|
16
16
|
),
|
17
17
|
include_groups=False,
|
@@ -240,6 +240,8 @@ def _process_activity(
|
|
240
240
|
zip(activity_tiles["tile_x"], activity_tiles["tile_y"]),
|
241
241
|
):
|
242
242
|
if activity.kind.consider_for_achievements:
|
243
|
+
if time is not None and time.tz is None:
|
244
|
+
time = time.tz_localize("UTC")
|
243
245
|
if tile not in tile_state["tile_visits"][zoom]:
|
244
246
|
new_tile_history_soa["activity_id"].append(activity_id)
|
245
247
|
new_tile_history_soa["time"].append(time)
|
@@ -202,9 +202,32 @@ def read_gpx_activity(path: pathlib.Path, open) -> pd.DataFrame:
|
|
202
202
|
time = dateutil.parser.parse(str(point.time))
|
203
203
|
else:
|
204
204
|
time = None
|
205
|
-
|
206
|
-
|
207
|
-
|
205
|
+
row = {
|
206
|
+
"time": time,
|
207
|
+
"latitude": point.latitude,
|
208
|
+
"longitude": point.longitude,
|
209
|
+
"elevation": point.elevation,
|
210
|
+
}
|
211
|
+
if point.extensions:
|
212
|
+
for ext in point.extensions:
|
213
|
+
if (
|
214
|
+
ext.tag
|
215
|
+
== "{http://www.garmin.com/xmlschemas/TrackPointExtension/v1}TrackPointExtension"
|
216
|
+
):
|
217
|
+
for datum in ext:
|
218
|
+
if (
|
219
|
+
datum.tag
|
220
|
+
== "{http://www.garmin.com/xmlschemas/TrackPointExtension/v1}hr"
|
221
|
+
):
|
222
|
+
row["heartrate"] = int(datum.text)
|
223
|
+
if (
|
224
|
+
datum.tag
|
225
|
+
== "{http://www.garmin.com/xmlschemas/TrackPointExtension/v1}cad"
|
226
|
+
):
|
227
|
+
row["cadence"] = int(datum.text)
|
228
|
+
|
229
|
+
points.append(row)
|
230
|
+
df = pd.DataFrame(points)
|
208
231
|
# Some files don't have elevation information. In these cases we remove the column.
|
209
232
|
if not df["elevation"].any():
|
210
233
|
del df["elevation"]
|
@@ -117,6 +117,9 @@ def try_import_strava(
|
|
117
117
|
for strava_activity in tqdm(
|
118
118
|
client.get_activities(after=get_after), desc="Downloading Strava activities"
|
119
119
|
):
|
120
|
+
logger.info(
|
121
|
+
f"Examining Strava activity with ID {strava_activity.id} and name '{strava_activity.name}' …"
|
122
|
+
)
|
120
123
|
if (
|
121
124
|
strava_end
|
122
125
|
and strava_activity.start_date is not None
|
@@ -195,6 +198,7 @@ def try_import_strava(
|
|
195
198
|
activity.moving_time = detailed_activity.moving_time
|
196
199
|
|
197
200
|
update_and_commit(activity, time_series, config)
|
201
|
+
logger.info(f"Added activity '{activity.name}' from Strava.")
|
198
202
|
compute_tile_visits_new(repository, tile_visit_accessor)
|
199
203
|
compute_tile_evolution(tile_visit_accessor.tile_state, config)
|
200
204
|
tile_visit_accessor.save()
|
@@ -207,7 +207,7 @@ def make_activity_blueprint(
|
|
207
207
|
@blueprint.route("/day/<int:year>/<int:month>/<int:day>")
|
208
208
|
def day(year: int, month: int, day: int) -> ResponseReturnValue:
|
209
209
|
meta = repository.meta
|
210
|
-
selection = meta["
|
210
|
+
selection = meta["start_local"].dt.date == datetime.date(year, month, day)
|
211
211
|
activities_that_day = meta.loc[selection]
|
212
212
|
|
213
213
|
time_series = [
|
@@ -258,7 +258,7 @@ def make_activity_blueprint(
|
|
258
258
|
@blueprint.route("/day-sharepic/<int:year>/<int:month>/<int:day>/sharepic.png")
|
259
259
|
def day_sharepic(year: int, month: int, day: int) -> ResponseReturnValue:
|
260
260
|
meta = repository.meta
|
261
|
-
selection = meta["
|
261
|
+
selection = meta["start_local"].dt.date == datetime.date(year, month, day)
|
262
262
|
activities_that_day = meta.loc[selection]
|
263
263
|
|
264
264
|
time_series = [
|
@@ -583,7 +583,7 @@ def name_tick_plot(meta: pd.DataFrame) -> str:
|
|
583
583
|
alt.Chart(meta, title="Repetitions")
|
584
584
|
.mark_tick()
|
585
585
|
.encode(
|
586
|
-
alt.X("
|
586
|
+
alt.X("start_local", title="Date"),
|
587
587
|
)
|
588
588
|
.to_json(format="vega")
|
589
589
|
)
|
@@ -693,8 +693,8 @@ def make_sharepic(
|
|
693
693
|
facts = {
|
694
694
|
"distance_km": f"\n{activity.distance_km:.1f} km",
|
695
695
|
}
|
696
|
-
if activity.
|
697
|
-
facts["start"] = f"{activity.
|
696
|
+
if activity.start_local_tz:
|
697
|
+
facts["start"] = f"{activity.start_local_tz.date()}"
|
698
698
|
if activity.elapsed_time:
|
699
699
|
facts["elapsed_time"] = re.sub(r"^0 days ", "", f"{activity.elapsed_time}")
|
700
700
|
if activity.kind:
|
@@ -744,7 +744,7 @@ def make_day_sharepic(
|
|
744
744
|
[0, img.height - footer_height, img.width, img.height], fill=(0, 0, 0, 180)
|
745
745
|
)
|
746
746
|
|
747
|
-
date = activities.iloc[0]["
|
747
|
+
date = activities.iloc[0]["start_local"].date()
|
748
748
|
distance_km = activities["distance_km"].sum()
|
749
749
|
elapsed_time: pd.Timedelta = activities["elapsed_time"].sum()
|
750
750
|
elapsed_time = elapsed_time.round("s")
|
@@ -25,7 +25,7 @@ def make_bubble_chart_blueprint(repository) -> Blueprint:
|
|
25
25
|
# Prepare the bubble chart data
|
26
26
|
bubble_data = activities[
|
27
27
|
[
|
28
|
-
"
|
28
|
+
"start_local",
|
29
29
|
"kind",
|
30
30
|
"activity_id",
|
31
31
|
column_distance.name,
|
@@ -33,7 +33,7 @@ def make_bubble_chart_blueprint(repository) -> Blueprint:
|
|
33
33
|
]
|
34
34
|
].rename(
|
35
35
|
columns={
|
36
|
-
"
|
36
|
+
"start_local": "date",
|
37
37
|
"kind": "activity",
|
38
38
|
"activity_id": "id",
|
39
39
|
}
|
@@ -55,7 +55,7 @@ def make_calendar_blueprint(repository: ActivityRepository) -> Blueprint:
|
|
55
55
|
|
56
56
|
filtered = meta.loc[
|
57
57
|
(meta["year"] == year) & (meta["month"] == month)
|
58
|
-
].sort_values("
|
58
|
+
].sort_values("start_local")
|
59
59
|
|
60
60
|
weeks = collections.defaultdict(dict)
|
61
61
|
day_of_month = collections.defaultdict(dict)
|
@@ -67,7 +67,7 @@ def make_calendar_blueprint(repository: ActivityRepository) -> Blueprint:
|
|
67
67
|
date += datetime.timedelta(days=1)
|
68
68
|
|
69
69
|
for index, row in filtered.iterrows():
|
70
|
-
iso = row["
|
70
|
+
iso = row["start_local"].isocalendar()
|
71
71
|
weeks[iso.week][iso.weekday].append(
|
72
72
|
{
|
73
73
|
"name": row["name"],
|
@@ -64,22 +64,19 @@ def _render_eddington_template(
|
|
64
64
|
|
65
65
|
query = search_query_from_form(request.args)
|
66
66
|
search_query_history.register_query(query)
|
67
|
-
activities =
|
67
|
+
activities = (
|
68
|
+
apply_search_query(query).dropna(subset=["start_local", column_name]).copy()
|
69
|
+
)
|
68
70
|
|
69
71
|
assert (
|
70
72
|
len(activities) > 0
|
71
73
|
), "The filter has selected zero elements, that cannot work here."
|
72
74
|
|
73
|
-
activities["year"] = [start.year for start in activities["start"]]
|
74
|
-
activities["date"] = [start.date() for start in activities["start"]]
|
75
|
-
activities["isoyear"] = [start.isocalendar().year for start in activities["start"]]
|
76
|
-
activities["isoweek"] = [start.isocalendar().week for start in activities["start"]]
|
77
|
-
|
78
75
|
en_per_day, eddington_df_per_day = _get_values_per_group(
|
79
76
|
activities.groupby("date"), column_name, divisor
|
80
77
|
)
|
81
78
|
en_per_week, eddington_df_per_week = _get_values_per_group(
|
82
|
-
activities.groupby(["
|
79
|
+
activities.groupby(["iso_year", "week"]), column_name, divisor
|
83
80
|
)
|
84
81
|
|
85
82
|
return render_template(
|
@@ -207,9 +204,7 @@ def _get_eddington_number(elevation_gains: pd.Series, divisor: int) -> int:
|
|
207
204
|
def _get_yearly_eddington(
|
208
205
|
meta: pd.DataFrame, columnName: str, divisor: int
|
209
206
|
) -> dict[int, int]:
|
210
|
-
meta = meta.dropna(subset=["
|
211
|
-
meta["year"] = [start.year for start in meta["start"]]
|
212
|
-
meta["date"] = [start.date() for start in meta["start"]]
|
207
|
+
meta = meta.dropna(subset=["start_local", columnName]).copy()
|
213
208
|
|
214
209
|
yearly_eddington = meta.groupby("year").apply(
|
215
210
|
lambda group: _get_eddington_number(
|
@@ -64,18 +64,18 @@ def _last_30_days_meta_plot(
|
|
64
64
|
)
|
65
65
|
return (
|
66
66
|
alt.Chart(
|
67
|
-
meta.loc[meta["
|
67
|
+
meta.loc[meta["start_local"] > before_30_days],
|
68
68
|
width=700,
|
69
69
|
height=200,
|
70
70
|
title=f"{column.display_name} per day",
|
71
71
|
)
|
72
72
|
.mark_bar()
|
73
73
|
.encode(
|
74
|
-
alt.X("yearmonthdate(
|
74
|
+
alt.X("yearmonthdate(start_local)", title="Date"),
|
75
75
|
alt.Y(f"sum({column.name})", title=f"{column.name} / {column.unit}"),
|
76
76
|
alt.Color("kind", scale=kind_scale, title="Kind"),
|
77
77
|
[
|
78
|
-
alt.Tooltip("yearmonthdate(
|
78
|
+
alt.Tooltip("yearmonthdate(start_local)", title="Date"),
|
79
79
|
alt.Tooltip("kind", title="Kind"),
|
80
80
|
alt.Tooltip(
|
81
81
|
f"sum({column.name})",
|
@@ -22,9 +22,9 @@ def make_equipment_blueprint(
|
|
22
22
|
)
|
23
23
|
|
24
24
|
# Prepare data for the stacked area chart
|
25
|
-
activities = repository.meta.dropna(subset=["
|
25
|
+
activities = repository.meta.dropna(subset=["start_local"])
|
26
26
|
activities["month"] = (
|
27
|
-
activities["
|
27
|
+
activities["start_local"].dt.to_period("M").apply(lambda r: r.start_time)
|
28
28
|
)
|
29
29
|
monthly_data = (
|
30
30
|
activities.groupby(["month", "equipment"])
|
@@ -58,7 +58,7 @@ def make_equipment_blueprint(
|
|
58
58
|
selection = repository.meta.loc[repository.meta["equipment"] == equipment]
|
59
59
|
total_distances = pd.DataFrame(
|
60
60
|
{
|
61
|
-
"time": selection["
|
61
|
+
"time": selection["start_local"],
|
62
62
|
"total_distance_km": selection["distance_km"].cumsum(),
|
63
63
|
}
|
64
64
|
)
|
@@ -95,7 +95,7 @@ def make_equipment_blueprint(
|
|
95
95
|
)
|
96
96
|
.mark_bar()
|
97
97
|
.encode(
|
98
|
-
alt.X("year(
|
98
|
+
alt.X("year(start_local):O", title="Year"),
|
99
99
|
alt.Y("sum(distance_km)", title="Distance / km"),
|
100
100
|
alt.Color(
|
101
101
|
"kind",
|
@@ -103,7 +103,7 @@ def make_equipment_blueprint(
|
|
103
103
|
title="Kind",
|
104
104
|
),
|
105
105
|
tooltip=[
|
106
|
-
alt.Tooltip("year(
|
106
|
+
alt.Tooltip("year(start_local):O", title="Year"),
|
107
107
|
alt.Tooltip(
|
108
108
|
"sum(distance_km):Q", title="Distance / km", format=".0f"
|
109
109
|
),
|
@@ -173,7 +173,7 @@ def make_explorer_blueprint(
|
|
173
173
|
return redirect(url_for(".map", zoom=zoom))
|
174
174
|
|
175
175
|
@blueprint.route(
|
176
|
-
"/<int:zoom>/<float:north>/<float:east>/<float:south>/<float:west>/missing.<suffix>"
|
176
|
+
"/<int:zoom>/<float(signed=True):north>/<float(signed=True):east>/<float(signed=True):south>/<float(signed=True):west>/missing.<suffix>"
|
177
177
|
)
|
178
178
|
def download_missing(
|
179
179
|
zoom: int, north: float, east: float, south: float, west: float, suffix: str
|
@@ -198,7 +198,7 @@ def make_explorer_blueprint(
|
|
198
198
|
)
|
199
199
|
|
200
200
|
@blueprint.route(
|
201
|
-
"/<int:zoom>/<float:north>/<float:east>/<float:south>/<float:west>/explored.<suffix>"
|
201
|
+
"/<int:zoom>/<float(signed=True):north>/<float(signed=True):east>/<float(signed=True):south>/<float(signed=True):west>/explored.<suffix>"
|
202
202
|
)
|
203
203
|
def download_explored(
|
204
204
|
zoom: int, north: float, east: float, south: float, west: float, suffix: str
|
@@ -424,7 +424,9 @@ def make_explorer_blueprint(
|
|
424
424
|
pl.imsave(f, result, format="png")
|
425
425
|
return Response(bytes(f.getbuffer()), mimetype="image/png")
|
426
426
|
|
427
|
-
@blueprint.route(
|
427
|
+
@blueprint.route(
|
428
|
+
"/<int:zoom>/info/<float(signed=True):latitude>/<float(signed=True):longitude>"
|
429
|
+
)
|
428
430
|
def info(zoom: int, latitude: float, longitude: float) -> dict:
|
429
431
|
tile_visits = tile_visit_accessor.tile_state["tile_visits"][zoom]
|
430
432
|
evolution_state = tile_visit_accessor.tile_state["evolution_state"][zoom]
|
@@ -164,7 +164,7 @@ def heatmap_per_day(df: pd.DataFrame, column: ColumnDescription) -> str:
|
|
164
164
|
def _filter_past_year(df: pd.DataFrame) -> pd.DataFrame:
|
165
165
|
now = datetime.datetime.combine(datetime.date.today(), datetime.time.min)
|
166
166
|
start = now - datetime.timedelta(days=365)
|
167
|
-
return df.loc[df["
|
167
|
+
return df.loc[df["start_local"] >= start]
|
168
168
|
|
169
169
|
|
170
170
|
def make_summary_blueprint(
|
@@ -181,7 +181,7 @@ def make_summary_blueprint(
|
|
181
181
|
df = apply_search_query(query)
|
182
182
|
|
183
183
|
kind_scale = make_kind_scale(repository.meta, config)
|
184
|
-
df_without_nan = df.loc[~pd.isna(df["
|
184
|
+
df_without_nan = df.loc[~pd.isna(df["start_local"])]
|
185
185
|
|
186
186
|
return render_template(
|
187
187
|
"summary/index.html.j2",
|
@@ -8,6 +8,7 @@ from flask import flash
|
|
8
8
|
from flask import redirect
|
9
9
|
from flask import render_template
|
10
10
|
from flask import request
|
11
|
+
from flask import Response
|
11
12
|
from flask import url_for
|
12
13
|
|
13
14
|
from ...core.activities import ActivityRepository
|
@@ -59,8 +60,9 @@ def make_upload_blueprint(
|
|
59
60
|
if file.filename == "":
|
60
61
|
flash("No selected file", "warning")
|
61
62
|
return redirect("/upload")
|
62
|
-
|
63
|
+
for file in request.files.getlist("file"):
|
63
64
|
filename = file.filename
|
65
|
+
assert filename is not None
|
64
66
|
target_path = pathlib.Path(request.form["directory"]) / filename
|
65
67
|
assert target_path.suffix in [
|
66
68
|
".csv",
|
@@ -79,18 +81,18 @@ def make_upload_blueprint(
|
|
79
81
|
)
|
80
82
|
return redirect(url_for(".index"))
|
81
83
|
file.save(target_path)
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
84
|
+
scan_for_activities(
|
85
|
+
repository,
|
86
|
+
tile_visit_accessor,
|
87
|
+
config,
|
88
|
+
skip_strava=True,
|
89
|
+
)
|
90
|
+
latest_activity = DB.session.scalar(
|
91
|
+
sqlalchemy.select(Activity).order_by(Activity.id.desc()).limit(1)
|
92
|
+
)
|
93
|
+
assert latest_activity is not None
|
94
|
+
flash(f"Activity was saved with ID {latest_activity.id}.", "success")
|
95
|
+
return redirect(f"/activity/{latest_activity.id}")
|
94
96
|
|
95
97
|
@blueprint.route("/refresh")
|
96
98
|
@needs_authentication(authenticator)
|
@@ -50,7 +50,7 @@
|
|
50
50
|
<td><span style="color: {{ activity['color'] }};">█</span> <a
|
51
51
|
href="{{ url_for('activity.show', id=activity.id) }}">{{
|
52
52
|
activity.name }}</a></td>
|
53
|
-
<td>{{ activity.
|
53
|
+
<td>{{ activity.start_local|dt }}</td>
|
54
54
|
<td>{{ activity.distance_km | round(1) }}</td>
|
55
55
|
<td>{{ activity.elapsed_time|td }}</td>
|
56
56
|
<td>{{ activity.average_speed_moving_kmh|round(1) }}</td>
|
@@ -308,7 +308,7 @@
|
|
308
308
|
<tbody>
|
309
309
|
{% for other_activity in similar_activites %}
|
310
310
|
<tr>
|
311
|
-
<td><a href="{{ url_for('.show', id=other_activity.id) }}">{{ other_activity.
|
311
|
+
<td><a href="{{ url_for('.show', id=other_activity.id) }}">{{ other_activity.start_local|dt
|
312
312
|
}}</a></td>
|
313
313
|
<td>{{ other_activity.distance_km | round(1) }}</td>
|
314
314
|
<td>{{ other_activity.elapsed_time|td }}</td>
|
@@ -25,8 +25,8 @@
|
|
25
25
|
<tr>
|
26
26
|
<td><a href="{{ url_for('activity.show', id=activity['id']) }}">{{ activity['name'] }}</a></td>
|
27
27
|
<td>
|
28
|
-
{% if activity['
|
29
|
-
{{ activity['
|
28
|
+
{% if activity['start_local'] is defined %}
|
29
|
+
{{ activity['start_local']|dt }} {{ activity.iana_timezone }}
|
30
30
|
{% endif %}
|
31
31
|
</td>
|
32
32
|
<td>{{ '%.1f' % activity["distance_km"] }} km</td>
|
@@ -6,7 +6,7 @@
|
|
6
6
|
<form method="post" enctype="multipart/form-data" action="{{ url_for('.receive') }}">
|
7
7
|
<div class="mb-3">
|
8
8
|
<label for="file1" class="form-label">Activity file</label>
|
9
|
-
<input type="file" name="file" id="file1" class="form-control">
|
9
|
+
<input type="file" name="file" id="file1" class="form-control" multiple>
|
10
10
|
</div>
|
11
11
|
<div class="mb-3">
|
12
12
|
<label for="directory" class="form-label">Target directory</label>
|
File without changes
|
{geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/__init__.py
RENAMED
File without changes
|
{geo_activity_playground-1.8.3 → geo_activity_playground-1.9.1}/geo_activity_playground/__main__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|