geo-activity-playground 1.9.4__tar.gz → 1.11.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.
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/PKG-INFO +1 -1
- geo_activity_playground-1.11.0/geo_activity_playground/alembic/versions/10021d238ada_add_explorer_tile_bookmarks.py +32 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/core/datamodel.py +13 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/explorer/tile_visits.py +5 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/blueprints/explorer_blueprint.py +41 -4
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/blueprints/settings_blueprint.py +24 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/static/server-side-explorer.js +6 -1
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/explorer/server-side.html.j2 +36 -5
- geo_activity_playground-1.11.0/geo_activity_playground/webui/templates/settings/cluster-bookmarks-new.html.j2 +29 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/pyproject.toml +1 -1
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/LICENSE +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/__init__.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/__main__.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/alembic/README +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/alembic/env.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/alembic/script.py.mako +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/alembic/versions/0f02b92c4f94_add_tag_color.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/alembic/versions/38882503dc7c_add_tags_to_activities.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/alembic/versions/451e7836b53d_add_square_planner_bookmark.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/alembic/versions/63d3b7f6f93c_initial_version.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/alembic/versions/85fe0348e8a2_add_time_series_uuid_field.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/alembic/versions/93cc82ad1b60_add_parametricplotspec.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/alembic/versions/ab83b9d23127_add_upstream_id.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/alembic/versions/b03491c593f6_add_crop_indices.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/alembic/versions/da2cba03b71d_add_photos.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/alembic/versions/dc8073871da7_add_plotspec_group_by.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/alembic/versions/e02e27876deb_add_square_planner_bookmark_name.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/alembic/versions/f2f50843be2d_make_all_fields_in_activity_nullable.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/alembic/versions/script.py.mako +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/core/__init__.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/core/activities.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/core/config.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/core/coordinates.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/core/copernicus_dem.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/core/enrichment.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/core/export.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/core/heart_rate.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/core/meta_search.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/core/missing_values.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/core/parametric_plot.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/core/paths.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/core/photos.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/core/privacy_zones.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/core/raster_map.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/core/similarity.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/core/summary_stats.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/core/tasks.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/core/test_datamodel.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/core/test_meta_search.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/core/test_missing_values.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/core/test_pandas_timezone.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/core/test_summary_stats.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/core/test_tiles.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/core/test_time_zone_from_location.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/core/test_time_zone_import.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/core/test_timezone_sqlalchemy.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/core/tiles.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/core/time_conversion.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/explorer/__init__.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/explorer/grid_file.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/explorer/video.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/heatmap_video.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/importers/__init__.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/importers/activity_parsers.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/importers/csv_parser.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/importers/directory.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/importers/strava_api.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/importers/strava_checkout.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/importers/test_csv_parser.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/importers/test_directory.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/importers/test_strava_api.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/__init__.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/app.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/authenticator.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/blueprints/__init__.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/blueprints/activity_blueprint.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/blueprints/auth_blueprint.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/blueprints/bubble_chart_blueprint.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/blueprints/calendar_blueprint.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/blueprints/eddington_blueprints.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/blueprints/entry_views.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/blueprints/equipment_blueprint.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/blueprints/export_blueprint.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/blueprints/hall_of_fame_blueprint.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/blueprints/heatmap_blueprint.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/blueprints/photo_blueprint.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/blueprints/plot_builder_blueprint.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/blueprints/search_blueprint.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/blueprints/square_planner_blueprint.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/blueprints/summary_blueprint.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/blueprints/tile_blueprint.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/blueprints/time_zone_fixer_blueprint.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/blueprints/upload_blueprint.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/columns.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/flasher.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/plot_util.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/search_util.py +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/static/activity-trim.js +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/static/bootstrap/bootstrap-dark-mode.js +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/static/bootstrap/bootstrap.bundle.min.js +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/static/bootstrap/bootstrap.min.css +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/static/favicons/android-chrome-192x192.png +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/static/favicons/android-chrome-512x512.png +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/static/favicons/apple-touch-icon.png +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/static/favicons/browserconfig.xml +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/static/favicons/favicon-16x16.png +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/static/favicons/favicon-32x32.png +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/static/favicons/favicon-48x48.png +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/static/favicons/favicon.ico +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/static/favicons/favicon.svg +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/static/favicons/mstile-150x150.png +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/static/favicons/site.webmanifest +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/static/favicons/web-app-manifest-192x192.png +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/static/favicons/web-app-manifest-512x512.png +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/static/images/layers-2x.png +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/static/images/layers.png +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/static/images/marker-icon-2x.png +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/static/images/marker-icon.png +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/static/images/marker-shadow.png +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/static/leaflet/Leaflet.fullscreen.min.js +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/static/leaflet/MarkerCluster.Default.css +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/static/leaflet/MarkerCluster.css +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/static/leaflet/fullscreen.png +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/static/leaflet/fullscreen@2x.png +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/static/leaflet/images/layers-2x.png +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/static/leaflet/images/layers.png +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/static/leaflet/leaflet.css +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/static/leaflet/leaflet.fullscreen.css +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/static/leaflet/leaflet.js +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/static/leaflet/leaflet.markercluster.js +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/static/table-sort.min.js +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/static/vega/vega-embed@6.js +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/static/vega/vega-lite@4.js +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/static/vega/vega@5.js +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/activity/day.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/activity/edit.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/activity/lines.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/activity/name.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/activity/show.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/activity/trim.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/auth/index.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/bubble_chart/index.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/calendar/index.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/calendar/month.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/eddington/distance.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/eddington/elevation_gain.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/elevation_eddington/index.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/equipment/index.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/export/index.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/hall_of_fame/index.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/heatmap/index.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/home.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/page.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/photo/map.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/photo/new.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/plot-macros.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/plot_builder/edit.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/plot_builder/import-spec.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/plot_builder/index.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/search/index.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/search_form.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/settings/admin-password.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/settings/color-schemes.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/settings/heart-rate.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/settings/index.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/settings/manage-equipments.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/settings/manage-kinds.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/settings/metadata-extraction.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/settings/privacy-zones.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/settings/segmentation.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/settings/sharepic.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/settings/strava.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/settings/tags-edit.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/settings/tags-list.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/settings/tags-new.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/settings/tile-source.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/square_planner/index.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/summary/index.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/summary/vega-chart.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/time_zone_fixer/index.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/upload/index.html.j2 +0 -0
- {geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/webui/templates/upload/reload.html.j2 +0 -0
@@ -0,0 +1,32 @@
|
|
1
|
+
from typing import Sequence
|
2
|
+
from typing import Union
|
3
|
+
|
4
|
+
import sqlalchemy as sa
|
5
|
+
from alembic import op
|
6
|
+
|
7
|
+
|
8
|
+
# revision identifiers, used by Alembic.
|
9
|
+
revision: str = "10021d238ada"
|
10
|
+
down_revision: Union[str, None] = "85fe0348e8a2"
|
11
|
+
branch_labels: Union[str, Sequence[str], None] = None
|
12
|
+
depends_on: Union[str, Sequence[str], None] = None
|
13
|
+
|
14
|
+
|
15
|
+
def upgrade() -> None:
|
16
|
+
# ### commands auto generated by Alembic - please adjust! ###
|
17
|
+
op.create_table(
|
18
|
+
"explorer_tile_bookmarks",
|
19
|
+
sa.Column("id", sa.Integer(), nullable=False),
|
20
|
+
sa.Column("name", sa.String(), nullable=False),
|
21
|
+
sa.Column("zoom", sa.Integer(), nullable=False),
|
22
|
+
sa.Column("tile_x", sa.Integer(), nullable=False),
|
23
|
+
sa.Column("tile_y", sa.Integer(), nullable=False),
|
24
|
+
sa.PrimaryKeyConstraint("id"),
|
25
|
+
)
|
26
|
+
# ### end Alembic commands ###
|
27
|
+
|
28
|
+
|
29
|
+
def downgrade() -> None:
|
30
|
+
# ### commands auto generated by Alembic - please adjust! ###
|
31
|
+
op.drop_table("explorer_tile_bookmarks")
|
32
|
+
# ### end Alembic commands ###
|
@@ -497,3 +497,16 @@ class Photo(DB.Model):
|
|
497
497
|
@property
|
498
498
|
def path(self) -> pathlib.Path:
|
499
499
|
return pathlib.Path(self.filename)
|
500
|
+
|
501
|
+
|
502
|
+
class ExplorerTileBookmark(DB.Model):
|
503
|
+
__tablename__ = "explorer_tile_bookmarks"
|
504
|
+
id: Mapped[int] = mapped_column(primary_key=True)
|
505
|
+
|
506
|
+
name: Mapped[str] = mapped_column(sa.String, nullable=False)
|
507
|
+
zoom: Mapped[int] = mapped_column(sa.Integer, nullable=False)
|
508
|
+
tile_x: Mapped[int] = mapped_column(sa.Integer, nullable=False)
|
509
|
+
tile_y: Mapped[int] = mapped_column(sa.Integer, nullable=False)
|
510
|
+
|
511
|
+
def __str__(self) -> str:
|
512
|
+
return f"{self.name} ({self.tile_x}, {self.tile_y}) @ {self.zoom}"
|
@@ -76,8 +76,13 @@ class TileHistoryRow(TypedDict):
|
|
76
76
|
class TileEvolutionState:
|
77
77
|
def __init__(self) -> None:
|
78
78
|
self.num_neighbors: dict[tuple[int, int], int] = {}
|
79
|
+
"Mapping from tile to the number of its neighbors."
|
80
|
+
|
79
81
|
self.memberships: dict[tuple[int, int], tuple[int, int]] = {}
|
82
|
+
"Mapping from tile to the representative tile."
|
80
83
|
self.clusters: dict[tuple[int, int], list[tuple[int, int]]] = {}
|
84
|
+
"Mapping from representative tile to the list of all cluster members."
|
85
|
+
|
81
86
|
self.cluster_evolution = pd.DataFrame()
|
82
87
|
self.square_start = 0
|
83
88
|
self.cluster_start = 0
|
@@ -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 Any
|
7
8
|
from typing import Optional
|
8
9
|
from typing import Union
|
9
10
|
|
@@ -13,6 +14,7 @@ import matplotlib
|
|
13
14
|
import matplotlib.pyplot as pl
|
14
15
|
import numpy as np
|
15
16
|
import pandas as pd
|
17
|
+
import sqlalchemy
|
16
18
|
from flask import Blueprint
|
17
19
|
from flask import flash
|
18
20
|
from flask import redirect
|
@@ -26,6 +28,7 @@ from ...core.config import ConfigAccessor
|
|
26
28
|
from ...core.coordinates import Bounds
|
27
29
|
from ...core.datamodel import Activity
|
28
30
|
from ...core.datamodel import DB
|
31
|
+
from ...core.datamodel import ExplorerTileBookmark
|
29
32
|
from ...core.raster_map import ImageTransform
|
30
33
|
from ...core.raster_map import OSM_TILE_SIZE
|
31
34
|
from ...core.raster_map import TileGetter
|
@@ -237,6 +240,27 @@ def make_explorer_blueprint(
|
|
237
240
|
medians["tile_x"], medians["tile_y"], zoom
|
238
241
|
)
|
239
242
|
|
243
|
+
bookmarks: list[dict[str, Any]] = []
|
244
|
+
for bookmark in DB.session.scalars(
|
245
|
+
sqlalchemy.select(ExplorerTileBookmark).where(
|
246
|
+
ExplorerTileBookmark.zoom == zoom
|
247
|
+
)
|
248
|
+
).all():
|
249
|
+
tile = (bookmark.tile_x, bookmark.tile_y)
|
250
|
+
representative = tile_evolution_state.memberships.get(tile, None)
|
251
|
+
if not representative:
|
252
|
+
continue
|
253
|
+
cluster = tile_evolution_state.clusters.get(representative, None)
|
254
|
+
if not cluster:
|
255
|
+
continue
|
256
|
+
bookmarks.append(
|
257
|
+
{
|
258
|
+
"name": bookmark.name,
|
259
|
+
"bbox": geojson_bounding_box_for_tile_collection(cluster, zoom),
|
260
|
+
"size": len(cluster),
|
261
|
+
}
|
262
|
+
)
|
263
|
+
|
240
264
|
context = {
|
241
265
|
"center": {
|
242
266
|
"latitude": median_lat,
|
@@ -263,6 +287,7 @@ def make_explorer_blueprint(
|
|
263
287
|
"square_y": tile_evolution_state.square_y,
|
264
288
|
"square_size": tile_evolution_state.max_square_size,
|
265
289
|
"max_cluster_size": max(map(len, tile_evolution_state.clusters.values())),
|
290
|
+
"bookmarks": bookmarks,
|
266
291
|
}
|
267
292
|
return render_template("explorer/server-side.html.j2", **context)
|
268
293
|
|
@@ -450,6 +475,12 @@ def make_explorer_blueprint(
|
|
450
475
|
evolution_state.memberships.get(tile_xy, None), []
|
451
476
|
)
|
452
477
|
),
|
478
|
+
"new_bookmark_url": url_for(
|
479
|
+
"settings.cluster_bookmark_new",
|
480
|
+
zoom=zoom,
|
481
|
+
tile_x=tile_xy[0],
|
482
|
+
tile_y=tile_xy[1],
|
483
|
+
),
|
453
484
|
}
|
454
485
|
else:
|
455
486
|
result = {}
|
@@ -462,10 +493,16 @@ def bounding_box_for_biggest_cluster(
|
|
462
493
|
clusters: Iterable[list[tuple[int, int]]], zoom: int
|
463
494
|
) -> str:
|
464
495
|
biggest_cluster = max(clusters, key=lambda members: len(members))
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
496
|
+
return geojson_bounding_box_for_tile_collection(biggest_cluster, zoom)
|
497
|
+
|
498
|
+
|
499
|
+
def geojson_bounding_box_for_tile_collection(
|
500
|
+
tiles: list[tuple[int, int]], zoom: int
|
501
|
+
) -> str:
|
502
|
+
min_x = min(x for x, y in tiles)
|
503
|
+
max_x = max(x for x, y in tiles)
|
504
|
+
min_y = min(y for x, y in tiles)
|
505
|
+
max_y = max(y for x, y in tiles)
|
469
506
|
lat_max, lon_min = get_tile_upper_left_lat_lon(min_x, min_y, zoom)
|
470
507
|
lat_min, lon_max = get_tile_upper_left_lat_lon(max_x, max_y, zoom)
|
471
508
|
return geojson.dumps(
|
@@ -18,6 +18,7 @@ from ...core.config import ConfigAccessor
|
|
18
18
|
from ...core.datamodel import Activity
|
19
19
|
from ...core.datamodel import DB
|
20
20
|
from ...core.datamodel import Equipment
|
21
|
+
from ...core.datamodel import ExplorerTileBookmark
|
21
22
|
from ...core.datamodel import Kind
|
22
23
|
from ...core.datamodel import Tag
|
23
24
|
from ...core.enrichment import update_and_commit
|
@@ -110,6 +111,29 @@ def make_settings_blueprint(
|
|
110
111
|
)
|
111
112
|
)
|
112
113
|
|
114
|
+
@blueprint.route("/cluster-bookmarks/new", methods=["GET", "POST"])
|
115
|
+
@needs_authentication(authenticator)
|
116
|
+
def cluster_bookmark_new():
|
117
|
+
if request.method == "POST":
|
118
|
+
bm = ExplorerTileBookmark(
|
119
|
+
name=request.form["name"],
|
120
|
+
zoom=int(request.form["zoom"]),
|
121
|
+
tile_x=int(request.form["tile_x"]),
|
122
|
+
tile_y=int(request.form["tile_y"]),
|
123
|
+
)
|
124
|
+
DB.session.add(bm)
|
125
|
+
DB.session.commit()
|
126
|
+
return redirect(
|
127
|
+
url_for("explorer.server_side", zoom=int(request.form["zoom"]))
|
128
|
+
)
|
129
|
+
else:
|
130
|
+
return render_template(
|
131
|
+
"settings/cluster-bookmarks-new.html.j2",
|
132
|
+
zoom=request.args["zoom"],
|
133
|
+
tile_x=request.args["tile_x"],
|
134
|
+
tile_y=request.args["tile_y"],
|
135
|
+
)
|
136
|
+
|
113
137
|
@blueprint.route("/color-schemes", methods=["GET", "POST"])
|
114
138
|
@needs_authentication(authenticator)
|
115
139
|
def color_schemes():
|
@@ -84,6 +84,7 @@ map.on('click', e => {
|
|
84
84
|
]
|
85
85
|
if (data.this_cluster_size) {
|
86
86
|
lines.push(`<dt>This cluster size</dt><dd>${data.this_cluster_size}</dd>`)
|
87
|
+
lines.push(`<dt>Bookmark</dt><dd><a href="${data.new_bookmark_url}">Create cluster bookmark</a></dd>`)
|
87
88
|
}
|
88
89
|
|
89
90
|
L.popup()
|
@@ -97,4 +98,8 @@ map.on('click', e => {
|
|
97
98
|
function downloadAs(suffix) {
|
98
99
|
bounds = map.getBounds();
|
99
100
|
window.location.href = `/explorer/${zoom}/${bounds.getNorth()}/${bounds.getEast()}/${bounds.getSouth()}/${bounds.getWest()}/${suffix}`
|
100
|
-
}
|
101
|
+
}
|
102
|
+
|
103
|
+
function centerOn(bbox) {
|
104
|
+
map.fitBounds(L.geoJSON(bbox).getBounds())
|
105
|
+
}
|
@@ -24,6 +24,16 @@
|
|
24
24
|
</div>
|
25
25
|
</div>
|
26
26
|
|
27
|
+
{% if bookmarks %}
|
28
|
+
<div class="btn-group mb-3" role="group" aria-label="Cluster bookmarks">
|
29
|
+
<button type="button" class="btn btn-primary" onclick='centerOn({{ center.bbox | safe }})'>Biggest</button>
|
30
|
+
{% for bookmark in bookmarks %}
|
31
|
+
<button type="button" class="btn btn-primary" onclick='centerOn({{ bookmark.bbox | safe }})'>{{ bookmark.name
|
32
|
+
}}</button>
|
33
|
+
{% endfor %}
|
34
|
+
</div>
|
35
|
+
{% endif %}
|
36
|
+
|
27
37
|
<div class="row mb-3">
|
28
38
|
<div class="col">
|
29
39
|
<div id="explorer-map" class="mb-1" style="height: 800px;"></div>
|
@@ -42,11 +52,32 @@
|
|
42
52
|
</div>
|
43
53
|
</div>
|
44
54
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
55
|
+
|
56
|
+
{% if bookmarks %}
|
57
|
+
<h2 class="mb-3">Bookmarked cluster sizes</h2>
|
58
|
+
|
59
|
+
<table class="table mb-3">
|
60
|
+
<thead>
|
61
|
+
<tr>
|
62
|
+
<th>Name</th>
|
63
|
+
<th>Tiles</th>
|
64
|
+
<th>Relative to maximum</th>
|
65
|
+
</tr>
|
66
|
+
</thead>
|
67
|
+
<tbody>
|
68
|
+
{% for bookmark in bookmarks %}
|
69
|
+
<tr>
|
70
|
+
<td>{{ bookmark.name }}</td>
|
71
|
+
<td>{{ bookmark.size }}</td>
|
72
|
+
<td>{{ '%.1f'|format(bookmark.size / max_cluster_size * 100) }} %</td>
|
73
|
+
</tr>
|
74
|
+
{% endfor %}
|
75
|
+
</tbody>
|
76
|
+
</table>
|
77
|
+
|
78
|
+
{% endif %}
|
79
|
+
|
80
|
+
<h2 class="mb-3">Tile history</h2>
|
50
81
|
|
51
82
|
<div class="row mb-3">
|
52
83
|
<div class="col-md-4">
|
@@ -0,0 +1,29 @@
|
|
1
|
+
{% extends "page.html.j2" %}
|
2
|
+
|
3
|
+
{% block container %}
|
4
|
+
|
5
|
+
<h1 class="mb-3">Create Explorer Tile Cluster Bookmark</h1>
|
6
|
+
|
7
|
+
<form method="POST">
|
8
|
+
<div class="mb-3">
|
9
|
+
<label for="name" class="form-label">Name</label>
|
10
|
+
<input type="text" class="form-control" id="name" name="name" />
|
11
|
+
</div>
|
12
|
+
<div class="mb-3">
|
13
|
+
<label for="zoom" class="form-label">Zoom</label>
|
14
|
+
<input type="number" class="form-control" id="zoom" name="zoom" value="{{ zoom }}" />
|
15
|
+
</div>
|
16
|
+
<div class="mb-3">
|
17
|
+
<label for="tile_x" class="form-label">Tile X</label>
|
18
|
+
<input type="number" class="form-control" id="tile_x" name="tile_x" value="{{ tile_x }}" />
|
19
|
+
</div>
|
20
|
+
<div class="mb-3">
|
21
|
+
<label for="tile_y" class="form-label">Tile Y</label>
|
22
|
+
<input type="number" class="form-control" id="tile_y" name="tile_y" value="{{ tile_y }}" />
|
23
|
+
</div>
|
24
|
+
|
25
|
+
<button type="submit" class="btn btn-primary">Create</button>
|
26
|
+
</form>
|
27
|
+
|
28
|
+
|
29
|
+
{% endblock %}
|
File without changes
|
{geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/geo_activity_playground/__init__.py
RENAMED
File without changes
|
{geo_activity_playground-1.9.4 → geo_activity_playground-1.11.0}/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
|
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
|
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
|
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
|