geo-activity-playground 0.31.0__py3-none-any.whl → 0.34.1__py3-none-any.whl

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 (55) hide show
  1. geo_activity_playground/__main__.py +1 -1
  2. geo_activity_playground/core/activities.py +1 -1
  3. geo_activity_playground/core/config.py +5 -1
  4. geo_activity_playground/core/heatmap.py +61 -15
  5. geo_activity_playground/core/tiles.py +8 -5
  6. geo_activity_playground/explorer/video.py +2 -1
  7. geo_activity_playground/importers/directory.py +6 -2
  8. geo_activity_playground/importers/strava_checkout.py +8 -2
  9. geo_activity_playground/webui/activity/blueprint.py +7 -0
  10. geo_activity_playground/webui/activity/controller.py +127 -43
  11. geo_activity_playground/webui/activity/templates/activity/day.html.j2 +6 -2
  12. geo_activity_playground/webui/activity/templates/activity/lines.html.j2 +1 -1
  13. geo_activity_playground/webui/activity/templates/activity/name.html.j2 +3 -2
  14. geo_activity_playground/webui/activity/templates/activity/show.html.j2 +2 -2
  15. geo_activity_playground/webui/app.py +15 -3
  16. geo_activity_playground/webui/entry_controller.py +1 -1
  17. geo_activity_playground/webui/equipment/controller.py +1 -1
  18. geo_activity_playground/webui/explorer/templates/explorer/index.html.j2 +20 -44
  19. geo_activity_playground/webui/heatmap/blueprint.py +5 -2
  20. geo_activity_playground/webui/heatmap/heatmap_controller.py +14 -4
  21. geo_activity_playground/webui/heatmap/templates/heatmap/index.html.j2 +1 -1
  22. geo_activity_playground/webui/settings/blueprint.py +44 -33
  23. geo_activity_playground/webui/settings/templates/settings/color-schemes.html.j2 +11 -2
  24. geo_activity_playground/webui/settings/templates/settings/privacy-zones.html.j2 +1 -1
  25. geo_activity_playground/webui/square_planner/templates/square_planner/index.html.j2 +1 -1
  26. geo_activity_playground/webui/static/Leaflet.fullscreen.min.js +1 -0
  27. geo_activity_playground/webui/static/MarkerCluster.Default.css +60 -0
  28. geo_activity_playground/webui/static/MarkerCluster.css +14 -0
  29. geo_activity_playground/webui/static/bootstrap.min.css +6 -0
  30. geo_activity_playground/webui/static/fullscreen.png +0 -0
  31. geo_activity_playground/webui/static/fullscreen@2x.png +0 -0
  32. geo_activity_playground/webui/static/leaflet.css +661 -0
  33. geo_activity_playground/webui/static/leaflet.fullscreen.css +40 -0
  34. geo_activity_playground/webui/static/leaflet.js +6 -0
  35. geo_activity_playground/webui/static/leaflet.markercluster.js +3 -0
  36. geo_activity_playground/webui/static/table-sort.min.js +8 -0
  37. geo_activity_playground/webui/static/vega-embed@6 +7 -0
  38. geo_activity_playground/webui/static/vega-lite@4 +2 -0
  39. geo_activity_playground/webui/static/vega@5 +2 -0
  40. geo_activity_playground/webui/summary/controller.py +20 -25
  41. geo_activity_playground/webui/summary/templates/summary/index.html.j2 +18 -5
  42. geo_activity_playground/webui/templates/home.html.j2 +4 -3
  43. geo_activity_playground/webui/templates/page.html.j2 +14 -16
  44. geo_activity_playground/webui/tile/blueprint.py +3 -2
  45. geo_activity_playground/webui/tile/controller.py +7 -3
  46. geo_activity_playground/webui/{upload/controller.py → upload_blueprint.py} +41 -35
  47. {geo_activity_playground-0.31.0.dist-info → geo_activity_playground-0.34.1.dist-info}/METADATA +5 -6
  48. {geo_activity_playground-0.31.0.dist-info → geo_activity_playground-0.34.1.dist-info}/RECORD +53 -41
  49. geo_activity_playground/webui/upload/__init__.py +0 -0
  50. geo_activity_playground/webui/upload/blueprint.py +0 -44
  51. /geo_activity_playground/webui/{upload/templates → templates}/upload/index.html.j2 +0 -0
  52. /geo_activity_playground/webui/{upload/templates → templates}/upload/reload.html.j2 +0 -0
  53. {geo_activity_playground-0.31.0.dist-info → geo_activity_playground-0.34.1.dist-info}/LICENSE +0 -0
  54. {geo_activity_playground-0.31.0.dist-info → geo_activity_playground-0.34.1.dist-info}/WHEEL +0 -0
  55. {geo_activity_playground-0.31.0.dist-info → geo_activity_playground-0.34.1.dist-info}/entry_points.txt +0 -0
@@ -21,7 +21,7 @@ class SummaryController:
21
21
  def render(self) -> dict:
22
22
  kind_scale = make_kind_scale(self._repository.meta, self._config)
23
23
  df = embellished_activities(self._repository.meta)
24
- df = df.loc[df["consider_for_achievements"]]
24
+ # df = df.loc[df["consider_for_achievements"]]
25
25
 
26
26
  year_kind_total = (
27
27
  df[["year", "kind", "distance_km", "hours"]]
@@ -31,7 +31,7 @@ class SummaryController:
31
31
  )
32
32
 
33
33
  return {
34
- "plot_distance_heatmap": plot_distance_heatmap(df, self._config),
34
+ "plot_distance_heatmaps": plot_distance_heatmaps(df, self._config),
35
35
  "plot_monthly_distance": plot_monthly_distance(df, kind_scale),
36
36
  "plot_yearly_distance": plot_yearly_distance(year_kind_total, kind_scale),
37
37
  "plot_year_cumulative": plot_year_cumulative(df),
@@ -105,6 +105,7 @@ def embellished_activities(meta: pd.DataFrame) -> pd.DataFrame:
105
105
  df["month"] = [start.month for start in df["start"]]
106
106
  df["day"] = [start.day for start in df["start"]]
107
107
  df["week"] = [start.isocalendar().week for start in df["start"]]
108
+ df["iso_year"] = [start.isocalendar().year for start in df["start"]]
108
109
  df["hours"] = [
109
110
  elapsed_time.total_seconds() / 3600 for elapsed_time in df["elapsed_time"]
110
111
  ]
@@ -112,17 +113,10 @@ def embellished_activities(meta: pd.DataFrame) -> pd.DataFrame:
112
113
  return df
113
114
 
114
115
 
115
- def plot_distance_heatmap(meta: pd.DataFrame, config: Config) -> str:
116
- return (
117
- alt.Chart(
118
- meta.loc[
119
- (
120
- meta["start"]
121
- >= pd.to_datetime(
122
- datetime.datetime.now() - datetime.timedelta(days=2 * 365)
123
- )
124
- )
125
- ],
116
+ def plot_distance_heatmaps(meta: pd.DataFrame, config: Config) -> dict[int, str]:
117
+ return {
118
+ year: alt.Chart(
119
+ meta.loc[(meta["year"] == year)],
126
120
  title="Daily Distance Heatmap",
127
121
  )
128
122
  .mark_rect()
@@ -130,7 +124,7 @@ def plot_distance_heatmap(meta: pd.DataFrame, config: Config) -> str:
130
124
  alt.X("date(start):O", title="Day of month"),
131
125
  alt.Y(
132
126
  "yearmonth(start):O",
133
- scale=alt.Scale(reverse=True),
127
+ # scale=alt.Scale(reverse=True),
134
128
  title="Year and month",
135
129
  ),
136
130
  alt.Color(
@@ -146,7 +140,8 @@ def plot_distance_heatmap(meta: pd.DataFrame, config: Config) -> str:
146
140
  ],
147
141
  )
148
142
  .to_json(format="vega")
149
- )
143
+ for year in sorted(meta["year"].unique())
144
+ }
150
145
 
151
146
 
152
147
  def plot_monthly_distance(meta: pd.DataFrame, kind_scale: alt.Scale) -> str:
@@ -194,8 +189,8 @@ def plot_yearly_distance(year_kind_total: pd.DataFrame, kind_scale: alt.Scale) -
194
189
 
195
190
  def plot_year_cumulative(df: pd.DataFrame) -> str:
196
191
  year_cumulative = (
197
- df[["year", "week", "distance_km"]]
198
- .groupby("year")
192
+ df[["iso_year", "week", "distance_km"]]
193
+ .groupby("iso_year")
199
194
  .apply(
200
195
  lambda group: pd.DataFrame(
201
196
  {"week": group["week"], "distance_km": group["distance_km"].cumsum()}
@@ -211,10 +206,10 @@ def plot_year_cumulative(df: pd.DataFrame) -> str:
211
206
  .encode(
212
207
  alt.X("week", title="Week"),
213
208
  alt.Y("distance_km", title="Distance / km"),
214
- alt.Color("year:N", title="Year"),
209
+ alt.Color("iso_year:N", title="Year"),
215
210
  [
216
211
  alt.Tooltip("week", title="Week"),
217
- alt.Tooltip("year:N", title="Year"),
212
+ alt.Tooltip("iso_year:N", title="Year"),
218
213
  alt.Tooltip("distance_km", title="Distance / km"),
219
214
  ],
220
215
  )
@@ -240,26 +235,26 @@ def tabulate_year_kind_mean(df: pd.DataFrame) -> pd.DataFrame:
240
235
 
241
236
  def plot_weekly_distance(df: pd.DataFrame, kind_scale: alt.Scale) -> str:
242
237
  week_kind_total_distance = (
243
- df[["year", "week", "kind", "distance_km"]]
244
- .groupby(["year", "week", "kind"])
238
+ df[["iso_year", "week", "kind", "distance_km"]]
239
+ .groupby(["iso_year", "week", "kind"])
245
240
  .sum()
246
241
  .reset_index()
247
242
  )
248
243
  week_kind_total_distance["year_week"] = [
249
244
  f"{year}-{week:02d}"
250
245
  for year, week in zip(
251
- week_kind_total_distance["year"], week_kind_total_distance["week"]
246
+ week_kind_total_distance["iso_year"], week_kind_total_distance["week"]
252
247
  )
253
248
  ]
254
249
 
255
- last_year = week_kind_total_distance["year"].iloc[-1]
250
+ last_year = week_kind_total_distance["iso_year"].iloc[-1]
256
251
  last_week = week_kind_total_distance["week"].iloc[-1]
257
252
 
258
253
  return (
259
254
  alt.Chart(
260
255
  week_kind_total_distance.loc[
261
- (week_kind_total_distance["year"] == last_year)
262
- | (week_kind_total_distance["year"] == last_year - 1)
256
+ (week_kind_total_distance["iso_year"] == last_year)
257
+ | (week_kind_total_distance["iso_year"] == last_year - 1)
263
258
  & (week_kind_total_distance["week"] >= last_week)
264
259
  ],
265
260
  title="Weekly Distance",
@@ -76,13 +76,26 @@
76
76
  <p>Next we take one row per month, each column is a day-of-month. The brighter a box, the more distance you have covered
77
77
  on that day. This makes it easy to spot those days where you really covered a lot of distance!</p>
78
78
 
79
- <div class="row mb-3">
80
- <div class="col">
81
- {{ vega_direct("plot_distance_heatmap", plot_distance_heatmap) }}
79
+
80
+ <ul class="nav nav-pills mb-3" id="myTab" role="tablist">
81
+ {% for year, plot in plot_distance_heatmaps.items() %}
82
+ <li class="nav-item" role="presentation">
83
+ <button class="nav-link {% if loop.last %} active {% endif %}" id="heatmap-{{ year }}" data-bs-toggle="tab"
84
+ data-bs-target="#heatmap-{{ year }}-pane" type="button" role="tab" aria-controls="heatmap-{{ year }}-pane"
85
+ aria-selected="{{ loop.last }}">{{ year }}</button>
86
+ </li>
87
+ {% endfor %}
88
+ </ul>
89
+
90
+ <div class="tab-content mb-3" id="myTabContent">
91
+ {% for year, plot in plot_distance_heatmaps.items() %}
92
+ <div class="tab-pane fade {% if loop.last %} show active {% endif %}" id="heatmap-{{ year }}-pane" role="tabpanel"
93
+ aria-labelledby="heatmap-{{ year }}" tabindex="0">
94
+ {{ vega_direct("plot_distance_heatmap_%d"|format(year), plot) }}
82
95
  </div>
96
+ {% endfor %}
83
97
  </div>
84
98
 
85
-
86
99
  <h2>Hall of Fame</h2>
87
100
 
88
101
  <script>
@@ -92,7 +105,7 @@
92
105
  })
93
106
  L.tileLayer('/tile/color/{z}/{x}/{y}.png', {
94
107
  maxZoom: 19,
95
- attribution: '&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'
108
+ attribution: '{{ map_tile_attribution|safe }}'
96
109
  }).addTo(map)
97
110
 
98
111
  let geojson_layer = L.geoJSON(geojson).addTo(map)
@@ -26,7 +26,7 @@
26
26
  })
27
27
  L.tileLayer('/tile/color/{z}/{x}/{y}.png', {
28
28
  maxZoom: 19,
29
- attribution: '&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'
29
+ attribution: '{{ map_tile_attribution|safe }}'
30
30
  }).addTo(map)
31
31
 
32
32
  let geojson_layer = L.geoJSON(geojson).addTo(map)
@@ -58,8 +58,9 @@
58
58
  </div>
59
59
  {% endfor %}
60
60
  {% else %}
61
- <p>You don't have activities yet. Either put some files into a directory <tt>Activities</tt> or <a
62
- href="{{ url_for('settings.strava') }}">set up Strava API</a>.</p>
61
+ <p>You don't have activities yet. Either put some files into a directory <tt>Activities</tt>, <a
62
+ href="{{ url_for('upload.index') }}">upload activities</a> or <a href="{{ url_for('settings.strava') }}">set up
63
+ Strava API</a>.</p>
63
64
  {% endif %}
64
65
 
65
66
  {% endblock %}
@@ -8,33 +8,31 @@
8
8
  <title>Geo Activity Playground</title>
9
9
 
10
10
  <!-- Bootstrap CSS. -->
11
- <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet"
11
+ <link href="/static/bootstrap.min.css" rel="stylesheet"
12
12
  integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous">
13
13
 
14
14
  <!-- Leaflet for interactive maps. -->
15
- <link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"
16
- integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY=" crossorigin="" />
17
- <script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"
18
- integrity="sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo=" crossorigin=""></script>
15
+ <link rel="stylesheet" href="/static/leaflet.css" integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY="
16
+ crossorigin="" />
17
+ <script src="/static/leaflet.js" integrity="sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo="
18
+ crossorigin=""></script>
19
19
 
20
20
  <!-- Fullscreen button for Leaflet. -->
21
- <link href='https://api.mapbox.com/mapbox.js/plugins/leaflet-fullscreen/v1.0.1/leaflet.fullscreen.css'
22
- rel='stylesheet' />
23
- <script src='https://api.mapbox.com/mapbox.js/plugins/leaflet-fullscreen/v1.0.1/Leaflet.fullscreen.min.js'></script>
21
+ <link href='/static/leaflet.fullscreen.css' rel='stylesheet' />
22
+ <script src='/static/Leaflet.fullscreen.min.js'></script>
24
23
 
25
- <link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster@1.4.1/dist/MarkerCluster.css" crossorigin="" />
26
- <link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster@1.4.1/dist/MarkerCluster.Default.css"
27
- crossorigin="" />
28
- <script src="https://unpkg.com/leaflet.markercluster@1.4.1/dist/leaflet.markercluster.js"></script>
24
+ <link rel="stylesheet" href="/static/MarkerCluster.css" crossorigin="" />
25
+ <link rel="stylesheet" href="/static/MarkerCluster.Default.css" crossorigin="" />
26
+ <script src="/static/leaflet.markercluster.js"></script>
29
27
 
30
28
  <!-- Vega for plots.-->
31
- <script src="https://cdn.jsdelivr.net/npm/vega@5"></script>
32
- <script src="https://cdn.jsdelivr.net/npm/vega-lite@4"></script>
33
- <script src="https://cdn.jsdelivr.net/npm/vega-embed@6"></script>
29
+ <script src="/static/vega@5"></script>
30
+ <script src="/static/vega-lite@4"></script>
31
+ <script src="/static/vega-embed@6"></script>
34
32
 
35
33
  <script src="/static/bootstrap-dark-mode.js"></script>
36
34
 
37
- <script src="https://cdn.jsdelivr.net/npm/table-sort-js/table-sort.min.js"></script>
35
+ <script src="/static/table-sort.min.js"></script>
38
36
 
39
37
  <!-- Favicon. -->
40
38
  <link rel="apple-touch-icon" sizes="180x180" href="/static/apple-touch-icon.png">
@@ -2,12 +2,13 @@ from flask import Blueprint
2
2
  from flask import Response
3
3
 
4
4
  from .controller import TileController
5
+ from geo_activity_playground.core.config import Config
5
6
 
6
7
 
7
- def make_tile_blueprint() -> Blueprint:
8
+ def make_tile_blueprint(config: Config) -> Blueprint:
8
9
  blueprint = Blueprint("tiles", __name__, template_folder="templates")
9
10
 
10
- tile_controller = TileController()
11
+ tile_controller = TileController(config)
11
12
 
12
13
  @blueprint.route("/color/<z>/<x>/<y>.png")
13
14
  def tile_color(x: str, y: str, z: str):
@@ -3,18 +3,22 @@ import io
3
3
  import matplotlib.pyplot as pl
4
4
  import numpy as np
5
5
 
6
+ from geo_activity_playground.core.config import Config
6
7
  from geo_activity_playground.core.tiles import get_tile
7
8
 
8
9
 
9
10
  class TileController:
11
+ def __init__(self, config: Config):
12
+ self._config = config
13
+
10
14
  def render_color(self, x: int, y: int, z: int) -> bytes:
11
- map_tile = np.array(get_tile(z, x, y)) / 255
15
+ map_tile = np.array(get_tile(z, x, y, self._config.map_tile_url)) / 255
12
16
  f = io.BytesIO()
13
17
  pl.imsave(f, map_tile, format="png")
14
18
  return bytes(f.getbuffer())
15
19
 
16
20
  def render_grayscale(self, x: int, y: int, z: int) -> bytes:
17
- map_tile = np.array(get_tile(z, x, y)) / 255
21
+ map_tile = np.array(get_tile(z, x, y, self._config.map_tile_url)) / 255
18
22
  map_tile = np.sum(map_tile * [0.2126, 0.7152, 0.0722], axis=2) # to grayscale
19
23
  map_tile = np.dstack((map_tile, map_tile, map_tile)) # to rgb
20
24
  f = io.BytesIO()
@@ -22,7 +26,7 @@ class TileController:
22
26
  return bytes(f.getbuffer())
23
27
 
24
28
  def render_pastel(self, x: int, y: int, z: int) -> bytes:
25
- map_tile = np.array(get_tile(z, x, y)) / 255
29
+ map_tile = np.array(get_tile(z, x, y, self._config.map_tile_url)) / 255
26
30
  averaged_tile = np.sum(map_tile * [0.2126, 0.7152, 0.0722], axis=2)
27
31
  grayscale_tile = np.dstack((averaged_tile, averaged_tile, averaged_tile))
28
32
  factor = 0.7
@@ -1,53 +1,51 @@
1
- import logging
2
1
  import os
3
2
  import pathlib
4
3
 
4
+ from flask import Blueprint
5
5
  from flask import flash
6
6
  from flask import redirect
7
+ from flask import render_template
7
8
  from flask import request
8
- from flask import Response
9
9
  from flask import url_for
10
- from werkzeug.utils import secure_filename
11
10
 
12
- from geo_activity_playground.core.activities import ActivityRepository
13
- from geo_activity_playground.core.activities import build_activity_meta
11
+ from ..core.activities import ActivityRepository
12
+ from ..core.activities import build_activity_meta
13
+ from ..explorer.tile_visits import compute_tile_evolution
14
+ from ..explorer.tile_visits import compute_tile_visits_new
15
+ from ..explorer.tile_visits import TileVisitAccessor
14
16
  from geo_activity_playground.core.config import Config
15
17
  from geo_activity_playground.core.enrichment import enrich_activities
16
- from geo_activity_playground.explorer.tile_visits import compute_tile_evolution
17
- from geo_activity_playground.explorer.tile_visits import compute_tile_visits_new
18
- from geo_activity_playground.explorer.tile_visits import TileVisitAccessor
19
18
  from geo_activity_playground.importers.directory import get_file_hash
20
19
  from geo_activity_playground.importers.directory import import_from_directory
21
20
  from geo_activity_playground.importers.strava_api import import_from_strava_api
22
21
  from geo_activity_playground.importers.strava_checkout import (
23
22
  import_from_strava_checkout,
24
23
  )
24
+ from geo_activity_playground.webui.authenticator import Authenticator
25
+ from geo_activity_playground.webui.authenticator import needs_authentication
25
26
 
26
27
 
27
- logger = logging.getLogger(__name__)
28
-
29
-
30
- class UploadController:
31
- def __init__(
32
- self,
33
- repository: ActivityRepository,
34
- tile_visit_accessor: TileVisitAccessor,
35
- config: Config,
36
- ) -> None:
37
- self._repository = repository
38
- self._tile_visit_accessor = tile_visit_accessor
39
- self._config = config
28
+ def make_upload_blueprint(
29
+ repository: ActivityRepository,
30
+ tile_visit_accessor: TileVisitAccessor,
31
+ config: Config,
32
+ authenticator: Authenticator,
33
+ ) -> Blueprint:
34
+ blueprint = Blueprint("upload", __name__, template_folder="templates")
40
35
 
41
- def render_form(self) -> dict:
36
+ @blueprint.route("/")
37
+ @needs_authentication(authenticator)
38
+ def index():
39
+ pathlib.Path("Activities").mkdir(exist_ok=True, parents=True)
42
40
  directories = []
43
41
  for root, dirs, files in os.walk("Activities"):
44
42
  directories.append(root)
45
43
  directories.sort()
46
- return {
47
- "directories": directories,
48
- }
44
+ return render_template("upload/index.html.j2", directories=directories)
49
45
 
50
- def receive(self) -> Response:
46
+ @blueprint.route("/receive", methods=["POST"])
47
+ @needs_authentication(authenticator)
48
+ def receive():
51
49
  # check if the post request has the file part
52
50
  if "file" not in request.files:
53
51
  flash("No file could be found. Did you select a file?", "warning")
@@ -74,25 +72,34 @@ class UploadController:
74
72
  assert target_path.is_relative_to("Activities")
75
73
  file.save(target_path)
76
74
  scan_for_activities(
77
- self._repository,
78
- self._tile_visit_accessor,
79
- self._config,
75
+ repository,
76
+ tile_visit_accessor,
77
+ config,
80
78
  skip_strava=True,
81
79
  )
82
80
  activity_id = get_file_hash(target_path)
83
81
  flash(f"Activity was saved with ID {activity_id}.", "success")
84
82
  return redirect(f"/activity/{activity_id}")
85
83
 
86
- def execute_reload(self) -> None:
84
+ @blueprint.route("/refresh")
85
+ @needs_authentication(authenticator)
86
+ def reload():
87
+ return render_template("upload/reload.html.j2")
88
+
89
+ @blueprint.route("/execute-reload")
90
+ @needs_authentication(authenticator)
91
+ def execute_reload():
87
92
  scan_for_activities(
88
- self._repository,
89
- self._tile_visit_accessor,
90
- self._config,
93
+ repository,
94
+ tile_visit_accessor,
95
+ config,
91
96
  skip_strava=True,
92
97
  )
93
98
  flash("Scanned for new activities.", category="success")
94
99
  return redirect(url_for("index"))
95
100
 
101
+ return blueprint
102
+
96
103
 
97
104
  def scan_for_activities(
98
105
  repository: ActivityRepository,
@@ -102,8 +109,7 @@ def scan_for_activities(
102
109
  ) -> None:
103
110
  if pathlib.Path("Activities").exists():
104
111
  import_from_directory(
105
- config.metadata_extraction_regexes,
106
- config.num_processes,
112
+ config.metadata_extraction_regexes, config.num_processes, config
107
113
  )
108
114
  if pathlib.Path("Strava Export").exists():
109
115
  import_from_strava_checkout()
@@ -1,17 +1,17 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: geo-activity-playground
3
- Version: 0.31.0
3
+ Version: 0.34.1
4
4
  Summary: Analysis of geo data activities like rides, runs or hikes.
5
5
  License: MIT
6
6
  Author: Martin Ueding
7
7
  Author-email: mu@martin-ueding.de
8
- Requires-Python: >=3.10,<3.13
8
+ Requires-Python: >=3.10,<3.14
9
9
  Classifier: License :: OSI Approved :: MIT License
10
10
  Classifier: Programming Language :: Python :: 3
11
11
  Classifier: Programming Language :: Python :: 3.10
12
12
  Classifier: Programming Language :: Python :: 3.11
13
13
  Classifier: Programming Language :: Python :: 3.12
14
- Requires-Dist: Pillow (>=10.3.0,<11.0.0)
14
+ Requires-Dist: Pillow (>=11.0.0,<12.0.0)
15
15
  Requires-Dist: altair (>=5.1.2,<6.0.0)
16
16
  Requires-Dist: appdirs (>=1.4.4,<2.0.0)
17
17
  Requires-Dist: charset-normalizer (>=3.3.2,<4.0.0)
@@ -22,12 +22,11 @@ Requires-Dist: geojson (>=3.0.1,<4.0.0)
22
22
  Requires-Dist: gpxpy (>=1.5.0,<2.0.0)
23
23
  Requires-Dist: jinja2 (>=3.1.2,<4.0.0)
24
24
  Requires-Dist: matplotlib (>=3.6.3,<4.0.0)
25
- Requires-Dist: numpy (>=1.22.4,<2.0.0)
25
+ Requires-Dist: numpy (>=2.1.3,<3.0.0)
26
26
  Requires-Dist: pandas (>=2.2,<3.0)
27
- Requires-Dist: pyarrow (>=16.1.0,<17.0.0)
27
+ Requires-Dist: pyarrow (>=18.1.0,<19.0.0)
28
28
  Requires-Dist: python-dateutil (>=2.8.2,<3.0.0)
29
29
  Requires-Dist: requests (>=2.28.1,<3.0.0)
30
- Requires-Dist: scipy (>=1.8.1,<2.0.0)
31
30
  Requires-Dist: shapely (>=2.0.5,<3.0.0)
32
31
  Requires-Dist: stravalib (>=2.0,<3.0)
33
32
  Requires-Dist: tcxreader (>=0.4.5,<0.5.0)
@@ -1,43 +1,43 @@
1
1
  geo_activity_playground/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- geo_activity_playground/__main__.py,sha256=MBZn9K1m3PofiPNTtpsSTVCyB_Gz95TjVP-nb9v_-JE,3989
2
+ geo_activity_playground/__main__.py,sha256=qbKjs7IsJwF2gB3b0lh7tGt6uraPqq5w-xGBIxrgoHI,3988
3
3
  geo_activity_playground/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- geo_activity_playground/core/activities.py,sha256=soxMtdijnkZ1bYZU0q6wuM8NPNFoUpLwYp3IvBOaKJY,6927
5
- geo_activity_playground/core/config.py,sha256=3xSaPKmNT_h0MHDoYgqOtmqj-x831ETiUKdSFXqrzHs,4744
4
+ geo_activity_playground/core/activities.py,sha256=MiQev1L7NnSVnxgbArlT-FpWTESTwnKh7pyT1tcEHqU,6926
5
+ geo_activity_playground/core/config.py,sha256=uqiwk7CgcuGx8JemHSsRKjRwyNT1YTb7V0gX0OJhfaI,5109
6
6
  geo_activity_playground/core/coordinates.py,sha256=tDfr9mlXhK6E_MMIJ0vYWVCoH0Lq8uyuaqUgaa8i0jg,966
7
7
  geo_activity_playground/core/enrichment.py,sha256=fUmk6avy_rqePlHmJQFTQhAxjgIRaxxmq18N2OSXBBg,7771
8
8
  geo_activity_playground/core/heart_rate.py,sha256=IwMt58TpjOYqpAxtsj07zP2ttpN_J3GZeiv-qGhYyJc,1598
9
- geo_activity_playground/core/heatmap.py,sha256=bRLQHzmTEsQbX8XWeg85x_lRGk272UoYRiCnoxZ5da0,4189
9
+ geo_activity_playground/core/heatmap.py,sha256=iTxefUTjTToPrKpVbauJHXkqxpNppXOEK6vvKuNkHkk,5906
10
10
  geo_activity_playground/core/paths.py,sha256=RBeUi38riP_msTGPy1TsPRNiblzE-lFivaJSLULE8b0,2503
11
11
  geo_activity_playground/core/privacy_zones.py,sha256=4TumHsVUN1uW6RG3ArqTXDykPVipF98DCxVBe7YNdO8,512
12
12
  geo_activity_playground/core/similarity.py,sha256=Jo8jRViuORCxdIGvyaflgsQhwu9S_jn10a450FRL18A,3159
13
13
  geo_activity_playground/core/tasks.py,sha256=aMDBWJqp6ek2ao6G6Xa8GOSZbcQqXoWL74SGRowRPIk,2942
14
14
  geo_activity_playground/core/test_tiles.py,sha256=zce1FxNfsSpOQt66jMehdQRVoNdl-oiFydx6iVBHZXM,764
15
15
  geo_activity_playground/core/test_time_conversion.py,sha256=Sh6nZA3uCTOdZTZa3yOijtR0m74QtZu2mcWXsDNnyQI,984
16
- geo_activity_playground/core/tiles.py,sha256=KpzD-h3kNzZ2ieLt6f2xHilSF3lHyfaEXPnrGvlIAz0,3379
16
+ geo_activity_playground/core/tiles.py,sha256=qUe4h3rzHJb8xThAgUKSLElt8S6zID_OuaWXDkWLwAU,3539
17
17
  geo_activity_playground/core/time_conversion.py,sha256=x5mXG6Y4GtdX7CBmwucGNSWBp9JQJDbZ7u0JkdUY1Vs,379
18
18
  geo_activity_playground/explorer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
19
  geo_activity_playground/explorer/grid_file.py,sha256=k6j6KBEk2a2BY-onE8SV5TJsERGGyOrlY4as__meWpA,3304
20
20
  geo_activity_playground/explorer/tile_visits.py,sha256=CSHAjgzKWe1iB-zvaqgsR5Z_lFycpWqUfxnPCAWvYaU,14173
21
- geo_activity_playground/explorer/video.py,sha256=ROAmV9shfJyqTgnXVD41KFORiwnRgVpEWenIq4hMCRM,4389
21
+ geo_activity_playground/explorer/video.py,sha256=35-mMEvD8phnc2xbWdwCHhl_uMIUogHrnFwrTfk2Yj8,4392
22
22
  geo_activity_playground/importers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
23
  geo_activity_playground/importers/activity_parsers.py,sha256=XNQs0ziqAcVqIoiLAX5Ndmhb6v__29XdjUPvNvc7oBI,11082
24
24
  geo_activity_playground/importers/csv_parser.py,sha256=O1pP5GLhWhnWcy2Lsrr9g17Zspuibpt-GtZ3ZS5eZF4,2143
25
- geo_activity_playground/importers/directory.py,sha256=IPnr1xk3beznmPVjfWL6AQiEKA4WN5EDIfnzrM0Tzlc,5767
25
+ geo_activity_playground/importers/directory.py,sha256=CA-vFOMm8G4MSM_Q09OwQKduCApL2PWaxLTVxgw_xpw,5908
26
26
  geo_activity_playground/importers/strava_api.py,sha256=cJCZsLemhOlxTtZh0z_npidgae9SD5HyEUry2uvem_A,7775
27
- geo_activity_playground/importers/strava_checkout.py,sha256=N-uGTkhBJMC7cPYjRRXHOSLwpK3wc6aaSrY2RQfSitA,9419
27
+ geo_activity_playground/importers/strava_checkout.py,sha256=dAKW1wVqlA5zRw25SvpYZZrEikJtaUluInyhJ0RfsFc,10002
28
28
  geo_activity_playground/importers/test_csv_parser.py,sha256=LXqva7GuSAfXYE2zZQrg-69lCtfy5MxLSq6BRwL_VyI,1191
29
29
  geo_activity_playground/importers/test_directory.py,sha256=ljXokx7q0OgtHvEdHftcQYEmZJUDVv3OOF5opklxdT4,724
30
30
  geo_activity_playground/importers/test_strava_api.py,sha256=4vX7wDr1a9aRh8myxNrIq6RwDBbP8ZeoXXPc10CAbW4,431
31
31
  geo_activity_playground/webui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
32
  geo_activity_playground/webui/activity/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
- geo_activity_playground/webui/activity/blueprint.py,sha256=Ub2mC9S9TII7CJaaWahnbNtT76uOGKNDWE0-j2C56CA,3893
34
- geo_activity_playground/webui/activity/controller.py,sha256=iE9JILmfqOWgXWT4KgqrXLpQJ8xSqfiNKeJw6vnWDAc,19459
35
- geo_activity_playground/webui/activity/templates/activity/day.html.j2,sha256=o18e-TMtgCrY7iroInVhRA267l-o6uGNlstIwsvFnww,2735
33
+ geo_activity_playground/webui/activity/blueprint.py,sha256=2Fa_6a86Aa3Yr3hQdkRylQqqVusyyVzPd1x3il5ZXNk,4176
34
+ geo_activity_playground/webui/activity/controller.py,sha256=0HXQZAD9Muf62jV-GqQKJPq5qNgdbV-KEcPmHX_8iGo,21429
35
+ geo_activity_playground/webui/activity/templates/activity/day.html.j2,sha256=wkYmcnIsMlvE9wgKemYCNU6jwsk5IJvg8pcBA2OMh00,2795
36
36
  geo_activity_playground/webui/activity/templates/activity/edit.html.j2,sha256=ckcTTxcQOhmvvAGNTEOtWCUG4LhvO4HfQImlIa5qKs8,1530
37
- geo_activity_playground/webui/activity/templates/activity/lines.html.j2,sha256=5gB1aDjRgi_RventenRfC10_FtMT4ch_VuWvA9AMlBY,1121
38
- geo_activity_playground/webui/activity/templates/activity/name.html.j2,sha256=npciXBo7_94_tCE0X7RLFHws8mgHzs4VgbOnyA9rsOI,2451
39
- geo_activity_playground/webui/activity/templates/activity/show.html.j2,sha256=MndgjmSi6T2xbIietSI-5n1hi7E1tD4eCoQP0tD3Ing,6989
40
- geo_activity_playground/webui/app.py,sha256=zDpLVGa0-_uoy9KQDcY8Z52RENhziDOfxfWv744GQAw,4616
37
+ geo_activity_playground/webui/activity/templates/activity/lines.html.j2,sha256=_ZDg1ruW-9UMJfOudy1-uY_-IcSSaagq7tPCih5Bb8g,1079
38
+ geo_activity_playground/webui/activity/templates/activity/name.html.j2,sha256=tKviMqMouHEGv3xBQVIsJgwj_hjwAsmGVefM3UMqlYg,2437
39
+ geo_activity_playground/webui/activity/templates/activity/show.html.j2,sha256=bEx37UGSTeeJl7gN4fjyOpINFQwZ5Zm-HOKpLqcJGfs,6905
40
+ geo_activity_playground/webui/app.py,sha256=KghChBgJvRZ9Cx7Z5wmqx6X0Q6GH-2hi97eaKEE_Zvc,5118
41
41
  geo_activity_playground/webui/auth/blueprint.py,sha256=Lx-ZvMnfHLC1CMre1xPQI3k_pCtQoZvgRhtmafULzoE,812
42
42
  geo_activity_playground/webui/auth/templates/auth/index.html.j2,sha256=ILQ5HvTEYc3OrtOAIFt1VrqWorVD70V9DC342znmP70,579
43
43
  geo_activity_playground/webui/authenticator.py,sha256=k278OEVuOfAmTGT4F2X4pqSTwwkK_FA87EIhAeysEqc,1416
@@ -50,70 +50,82 @@ geo_activity_playground/webui/eddington/__init__.py,sha256=47DEQpj8HBSa-_TImW-5J
50
50
  geo_activity_playground/webui/eddington/blueprint.py,sha256=evIvueLfDWVTxJ9pRguqmZ9-Pybd2WmBRst_-7vX2QA,551
51
51
  geo_activity_playground/webui/eddington/controller.py,sha256=ly7JSkSS79kO4CL_xugB62uRuuWKVqOjbN-pheelv94,2910
52
52
  geo_activity_playground/webui/eddington/templates/eddington/index.html.j2,sha256=XHKeUymQMS5x00PLOVlg-nSRCz_jHB2pvD8QunULWJ4,1839
53
- geo_activity_playground/webui/entry_controller.py,sha256=kTEToBtR1T4l30cV3HkCK3KO2hVYfb22BSgcWLdLEXQ,2164
53
+ geo_activity_playground/webui/entry_controller.py,sha256=McxbyouKWHJ3a2R9agPazZoG7VHiFO1RvnkBr08dMH8,2168
54
54
  geo_activity_playground/webui/equipment/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
55
  geo_activity_playground/webui/equipment/blueprint.py,sha256=_NIhRJuJNbXpEd_nEPo01AqnUqPgo1vawFn7E3yoeng,636
56
- geo_activity_playground/webui/equipment/controller.py,sha256=Sx9i2RCK7m4W6FgpDfRMewcH64VBQfUhHJdTSCwMqOU,4079
56
+ geo_activity_playground/webui/equipment/controller.py,sha256=lMivui3EBUnkYZf9Lgv1kHZ0c7IxRAza-ox8YOz3ONY,4079
57
57
  geo_activity_playground/webui/equipment/templates/equipment/index.html.j2,sha256=fvRaDbCuiSZ8AzJTpu1dk8FTAGZ2yfsLhprtVYHFZWo,1802
58
58
  geo_activity_playground/webui/explorer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
59
59
  geo_activity_playground/webui/explorer/blueprint.py,sha256=EKnBs8llqT6Wy1uac18dF2epp3TebF9p3iGlSbj6Vl0,2337
60
60
  geo_activity_playground/webui/explorer/controller.py,sha256=pIzWh0TpLJgKQZlS325-QT7nA1q9ms7fRqQIp24PNfo,11705
61
- geo_activity_playground/webui/explorer/templates/explorer/index.html.j2,sha256=u2htecx-XwINRiINHFN6EZDaRXVtiape1OCUZexTBU8,7049
61
+ geo_activity_playground/webui/explorer/templates/explorer/index.html.j2,sha256=aGos75uUyjevDWKSyQwVyvuGHIY6qoGASMbgU6k71YU,6707
62
62
  geo_activity_playground/webui/heatmap/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
63
- geo_activity_playground/webui/heatmap/blueprint.py,sha256=bjQu-HL3QN5UpJ6tHOifhcLGlPr_hIKvaRu78md4JqM,1470
64
- geo_activity_playground/webui/heatmap/heatmap_controller.py,sha256=LMBglDOhcLjvkq-7hr1B6IhW_TiBDZ1NIFP5dqhLCC4,7503
65
- geo_activity_playground/webui/heatmap/templates/heatmap/index.html.j2,sha256=YLeu6P4djl8G4qAXR6DhetseqrbOodN7aN4coocknc4,1875
63
+ geo_activity_playground/webui/heatmap/blueprint.py,sha256=ZEImDIwT3uiDIKapqCU49llvyqG79n7ZEu1GHgoLZqo,1558
64
+ geo_activity_playground/webui/heatmap/heatmap_controller.py,sha256=Qw9MGW3TFWlG2JkA_r9RHgYq4hvPiJaZeAg5D9lIFC0,7821
65
+ geo_activity_playground/webui/heatmap/templates/heatmap/index.html.j2,sha256=BMjqbZ-btSFawuNDxgZxOkF5JvhD_p9DOBJ-4-1IKnU,1833
66
66
  geo_activity_playground/webui/plot_util.py,sha256=pTTQoqOCkLVjkgOit7mbry28kMruZIL8amZozSzEpxQ,283
67
67
  geo_activity_playground/webui/search/blueprint.py,sha256=7TDsiqEowMyHNlFImk-hCGso69KOieG4rfJnLRHpRz8,3300
68
68
  geo_activity_playground/webui/search/templates/search/index.html.j2,sha256=d39uhteoY6JOZePqhLIYLERqkckW3oghMnTUZa7X1J8,3798
69
- geo_activity_playground/webui/settings/blueprint.py,sha256=Jeh2MwRmCNF6BfwrHSUixLKOTPFlwZ4Mrb68Botr6Q8,9487
69
+ geo_activity_playground/webui/settings/blueprint.py,sha256=GIrCOBNw-uNWDmKj4uduYOiKpoTLEfFbGmUmXkoBqro,9405
70
70
  geo_activity_playground/webui/settings/controller.py,sha256=MIZVBfoGNvmJnB_ECV_x5eH2i6gDZvkWSQ4PcSKyLKs,9170
71
71
  geo_activity_playground/webui/settings/templates/settings/admin-password.html.j2,sha256=VYwddpObD1RpeTH5Dm4y7VtmT7kwURDCIjxyzJeq08c,495
72
- geo_activity_playground/webui/settings/templates/settings/color-schemes.html.j2,sha256=CaFbYkkU1yGTOlAzGq97u3tVgS79RIo7PEmiVjuZiBc,1226
72
+ geo_activity_playground/webui/settings/templates/settings/color-schemes.html.j2,sha256=iR91Wxd2_TMuIo9dBDZBrWSUGHNwTwzC6O8oNH-XBt4,1653
73
73
  geo_activity_playground/webui/settings/templates/settings/equipment-offsets.html.j2,sha256=ltaYwFe8S8Mi72ddmIp1vwqlu8MEXXjBGfbpN2WBTC4,1728
74
74
  geo_activity_playground/webui/settings/templates/settings/heart-rate.html.j2,sha256=UPT3MegRgSeff36lhCo0l3ZwhqNSIg5gM6h2s32GkCY,4255
75
75
  geo_activity_playground/webui/settings/templates/settings/index.html.j2,sha256=r7HBq91BKBrWT2_TNR7OcLokuOcUK-Czyi_zOjveIRk,5287
76
76
  geo_activity_playground/webui/settings/templates/settings/kind-renames.html.j2,sha256=yWVIMJq0XOpeTLglEqLxlQAG0mVhaCVw9j0Iu4nIrgI,757
77
77
  geo_activity_playground/webui/settings/templates/settings/kinds-without-achievements.html.j2,sha256=IdUfXon1Pu8zX3NirKb28ypshLHOvZRpz2T4bJrzrak,1067
78
78
  geo_activity_playground/webui/settings/templates/settings/metadata-extraction.html.j2,sha256=EUHZ-MWnSPAkiad0CHSj9UUkRUQwItTbKYJcZz9TVi0,2314
79
- geo_activity_playground/webui/settings/templates/settings/privacy-zones.html.j2,sha256=7BxFvCaVJOEqbImyK5vxCmhh-NGSFaRa9ARhqjZeYJ0,3093
79
+ geo_activity_playground/webui/settings/templates/settings/privacy-zones.html.j2,sha256=OBKHlOezJauaDerLpOAJYq7wL-KxsWMn-BpSKJ93I0c,3051
80
80
  geo_activity_playground/webui/settings/templates/settings/segmentation.html.j2,sha256=QV72TZcIxqql-vEsq2lKHzo5UxoxeeXkRA9se46GWKU,1187
81
81
  geo_activity_playground/webui/settings/templates/settings/sharepic.html.j2,sha256=qZkfEpd4CtKKMaSSVadqvNEgMRYLV-0X-pw5-nJvukk,678
82
82
  geo_activity_playground/webui/settings/templates/settings/strava.html.j2,sha256=FrXgT-m1PgvsQWo9kMKpk8QenKeifSDBCZFqKgsHRxQ,1827
83
83
  geo_activity_playground/webui/square_planner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
84
84
  geo_activity_playground/webui/square_planner/blueprint.py,sha256=r2VkSM547chX85g6c1BQ8NC-tkdqGdYp-2ZALBiiDTc,1320
85
85
  geo_activity_playground/webui/square_planner/controller.py,sha256=ML6ftOyr3tTh7D4DBcRP76CvkyTxqI5QWgMeG9wC8FE,3561
86
- geo_activity_playground/webui/square_planner/templates/square_planner/index.html.j2,sha256=aIB0ql5qW4HXfp0ENksYYOk9vTgBitwyHJX5W7bqkeY,6512
86
+ geo_activity_playground/webui/square_planner/templates/square_planner/index.html.j2,sha256=xFbYBQtkOl3U4WGkvIuU_5uazGHn8ObvQfNgPGq0Gqg,6469
87
+ geo_activity_playground/webui/static/Leaflet.fullscreen.min.js,sha256=MMWj_yFOercjzhk8wKIIKyDCK7olXrwk_7R7TjDhGYs,3677
88
+ geo_activity_playground/webui/static/MarkerCluster.Default.css,sha256=LWhzWaQGZRsWFrrJxg-6Zn8TT84k0_trtiHBc6qcGpY,1346
89
+ geo_activity_playground/webui/static/MarkerCluster.css,sha256=-bdWuWOXMFkX0v9Cvr3OWClPiYefDQz9GGZP_7xZxdc,886
87
90
  geo_activity_playground/webui/static/android-chrome-192x192.png,sha256=yxZgo8Jw4hrgOgrn3tvi9G0AXWGFD29kjCuxC07WoT4,17610
88
91
  geo_activity_playground/webui/static/android-chrome-512x512.png,sha256=Uiv62gQpUjMOdp9d6exzd6IyOi5zgQdgjIVVWYw5m98,38891
89
92
  geo_activity_playground/webui/static/apple-touch-icon.png,sha256=TNLa0YIS1mbWajvIQthC2bGve6ET3DbJzrAbs6Pf3Ps,13046
90
93
  geo_activity_playground/webui/static/bootstrap-dark-mode.js,sha256=XfyhxIFgjDc6aEj0kYgKpG5zjS5gvyhWCJmNfUG4HJY,2622
94
+ geo_activity_playground/webui/static/bootstrap.min.css,sha256=MBffSnbbXwHCuZtgPYiwMQbfE7z-GOZ7fBPCNB06Z98,232948
91
95
  geo_activity_playground/webui/static/browserconfig.xml,sha256=u5EvU6U1jKSDiXHW0i4rXrs0lT_tmS82otbJnvmccrk,253
92
96
  geo_activity_playground/webui/static/favicon-16x16.png,sha256=Yy8lRjGB7itDaeUI_l_Toq3OO0gzgPGnqIfM3CqcQy0,1419
93
97
  geo_activity_playground/webui/static/favicon-32x32.png,sha256=K52R99pLGgWHnjFPPkVieBm051Er-sTCiMvgLr9Alrg,2587
94
98
  geo_activity_playground/webui/static/favicon-48x48.png,sha256=NIIuC1OV1umv2pETJH2yDUZhhzJDk0TERsbwA5tQM9A,2008
95
99
  geo_activity_playground/webui/static/favicon.ico,sha256=zAkbToeh1fq8rh6osWyEjr-cgdX-ec5viI0vPAwLn7A,15086
96
100
  geo_activity_playground/webui/static/favicon.svg,sha256=gwESIDvoxOpg3tHvbiAc-wVEM4fY0pFzWnX_guQcv1c,52247
101
+ geo_activity_playground/webui/static/fullscreen.png,sha256=yDtz-dhjuAoo6q9xc00-_XNTrGwEWrN80pOneFdol4g,299
102
+ geo_activity_playground/webui/static/fullscreen@2x.png,sha256=HVi2guZO6sekf2NggilbzjUTvJDweXpSMBS81fhtnX0,420
103
+ geo_activity_playground/webui/static/leaflet.css,sha256=p4NxAoJBhIIN-hmNHrzRCf9tD_miZyoHS5obTRR9BMY,14806
104
+ geo_activity_playground/webui/static/leaflet.fullscreen.css,sha256=YTbhDGEH5amI_JfotPMN7IByFpsN9e4tCBnv5oNdvHU,994
105
+ geo_activity_playground/webui/static/leaflet.js,sha256=20nQCchB9co0qIjJZRGuk2_Z9VM-kNiyxNV1lvTlZBo,147552
106
+ geo_activity_playground/webui/static/leaflet.markercluster.js,sha256=WL6HHfYfbFEkZOFdsJQeY7lJG_E5airjvqbznghUzRw,33724
97
107
  geo_activity_playground/webui/static/mstile-150x150.png,sha256=j1ANUQJ1Xi1DR2sGqYZztob2ypfGw04eNtGpN9SxExA,11964
98
108
  geo_activity_playground/webui/static/site.webmanifest,sha256=G5wl5Ahfz6wyDt-Z7ea-ywG1WS1S7ZQ_QX9TM2ox6Lk,450
109
+ geo_activity_playground/webui/static/table-sort.min.js,sha256=sFeDrgkXTePr2ciJU9_mLh-Z8qtYhPIQMgOZtj0LwBY,8506
110
+ geo_activity_playground/webui/static/vega-embed@6,sha256=EtAqz74-xZ75o33UgiouBOKWG1u7Zxu-Zh0iIXFbmdo,60630
111
+ geo_activity_playground/webui/static/vega-lite@4,sha256=roXmcY9bUF91uB9V-eSEUHEgfwoXe6B1xoDPuIe5ou8,267999
112
+ geo_activity_playground/webui/static/vega@5,sha256=5DLHUaY2P0ph2mKSDMfX69E88J2ClJ-PSGJI-Acdw84,514536
99
113
  geo_activity_playground/webui/static/web-app-manifest-192x192.png,sha256=eEImN6iWfSv-EnSNPL5WbX84PKakse_8VZMBPWWye3o,13582
100
114
  geo_activity_playground/webui/static/web-app-manifest-512x512.png,sha256=vU9oQ4HnQerFDZVzcAT9twj4_Doc6_9v9wVvoRI-f_E,48318
101
115
  geo_activity_playground/webui/summary/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
102
116
  geo_activity_playground/webui/summary/blueprint.py,sha256=tfA2aPF19yKwkQOb5lPQBySoQYYhTn49Iuh0SYvsGP8,593
103
- geo_activity_playground/webui/summary/controller.py,sha256=cWn5szA1o5Vjht0DyhRwBjmwqJryrLcmm4FUdmVpUoo,9443
104
- geo_activity_playground/webui/summary/templates/summary/index.html.j2,sha256=S_kpXPldrxIAEBdlG0YlXlvMHI4dQc4QZtejhHM4_N8,4472
105
- geo_activity_playground/webui/templates/home.html.j2,sha256=EvEgvr_JeppGqLEJzcDc0kL-8e4OUV8aleWTP5eDeh8,2173
106
- geo_activity_playground/webui/templates/page.html.j2,sha256=znTbtD2NALrhmUN_Q-F1ElGlKtecoUv8vOCcUtojrdI,11134
117
+ geo_activity_playground/webui/summary/controller.py,sha256=FyPdC98maX0P5sJ4j5Z7-ZSiirLh_jmu_PszKXqTV8A,9425
118
+ geo_activity_playground/webui/summary/templates/summary/index.html.j2,sha256=ctOx3Qjx6nRDpUtFf1DlJhK_gtU77Vwx_S6euLz9-W4,5183
119
+ geo_activity_playground/webui/templates/home.html.j2,sha256=IdCqI_LLcYrpUjjCO-tbXR4s05XYrPOateiJ4idF3bo,2202
120
+ geo_activity_playground/webui/templates/page.html.j2,sha256=kAZaE9MwS0znjLXwqpfRXo75LOR799j8RSICPIAsCkg,10669
121
+ geo_activity_playground/webui/templates/upload/index.html.j2,sha256=I1Ix8tDS3YBdi-HdaNfjkzYXVVCjfUTe5PFTnap1ydc,775
122
+ geo_activity_playground/webui/templates/upload/reload.html.j2,sha256=YZWX5eDeNyqKJdQAywDBcU8DZBm22rRBbZqFjrFrCvQ,556
107
123
  geo_activity_playground/webui/tile/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
108
- geo_activity_playground/webui/tile/blueprint.py,sha256=cK0o2Z3BrLycgF9zw0F8s9qF-JaYDbF5Gog-GXDtUZ8,943
109
- geo_activity_playground/webui/tile/controller.py,sha256=PISh4vKs27b-LxFfTARtr5RAwHFresA1Kw1MDcERSRU,1221
110
- geo_activity_playground/webui/upload/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
111
- geo_activity_playground/webui/upload/blueprint.py,sha256=xX9scEmleN_dL03jfhWRh5yI1WsFyhxUFiS_Ul2HWy4,1428
112
- geo_activity_playground/webui/upload/controller.py,sha256=AUcDotTw-h30XgY5Te0kAqRfL7xXqK74iVO13g20pD0,4085
113
- geo_activity_playground/webui/upload/templates/upload/index.html.j2,sha256=I1Ix8tDS3YBdi-HdaNfjkzYXVVCjfUTe5PFTnap1ydc,775
114
- geo_activity_playground/webui/upload/templates/upload/reload.html.j2,sha256=YZWX5eDeNyqKJdQAywDBcU8DZBm22rRBbZqFjrFrCvQ,556
115
- geo_activity_playground-0.31.0.dist-info/LICENSE,sha256=4RpAwKO8bPkfXH2lnpeUW0eLkNWglyG4lbrLDU_MOwY,1070
116
- geo_activity_playground-0.31.0.dist-info/METADATA,sha256=YTQL13ygmlqQilK_3F8ycowxmDAkxGuPbVG6mI5IJOA,1612
117
- geo_activity_playground-0.31.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
118
- geo_activity_playground-0.31.0.dist-info/entry_points.txt,sha256=pbNlLI6IIZIp7nPYCfAtiSiz2oxJSCl7DODD6SPkLKk,81
119
- geo_activity_playground-0.31.0.dist-info/RECORD,,
124
+ geo_activity_playground/webui/tile/blueprint.py,sha256=q0sw_F8L367Df01yjZijikEIglFBgg9lN61sbTAEOKQ,1018
125
+ geo_activity_playground/webui/tile/controller.py,sha256=XjUTbyAMeQET1D3mFtT8r5-xMcMOaELPZWtQ1Xp7Cuw,1428
126
+ geo_activity_playground/webui/upload_blueprint.py,sha256=topLI9ytDUFkqCc9AlOqDkjhABUwnPJ1tX_7XrBPbxc,4412
127
+ geo_activity_playground-0.34.1.dist-info/LICENSE,sha256=4RpAwKO8bPkfXH2lnpeUW0eLkNWglyG4lbrLDU_MOwY,1070
128
+ geo_activity_playground-0.34.1.dist-info/METADATA,sha256=LC0PRFwXYo3m0M9fCW6O13ZbiuDqpQeodnxiUxTiaWU,1573
129
+ geo_activity_playground-0.34.1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
130
+ geo_activity_playground-0.34.1.dist-info/entry_points.txt,sha256=pbNlLI6IIZIp7nPYCfAtiSiz2oxJSCl7DODD6SPkLKk,81
131
+ geo_activity_playground-0.34.1.dist-info/RECORD,,
File without changes