geo-activity-playground 1.4.1__py3-none-any.whl → 1.5.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.
- geo_activity_playground/core/datamodel.py +7 -0
- geo_activity_playground/importers/activity_parsers.py +2 -2
- geo_activity_playground/webui/app.py +1 -0
- geo_activity_playground/webui/blueprints/explorer_blueprint.py +85 -91
- geo_activity_playground/webui/blueprints/hall_of_fame_blueprint.py +2 -2
- geo_activity_playground/webui/blueprints/photo_blueprint.py +4 -1
- geo_activity_playground/webui/static/server-side-explorer.js +4 -0
- geo_activity_playground/webui/templates/explorer/server-side.html.j2 +38 -1
- {geo_activity_playground-1.4.1.dist-info → geo_activity_playground-1.5.1.dist-info}/METADATA +1 -1
- {geo_activity_playground-1.4.1.dist-info → geo_activity_playground-1.5.1.dist-info}/RECORD +13 -13
- {geo_activity_playground-1.4.1.dist-info → geo_activity_playground-1.5.1.dist-info}/LICENSE +0 -0
- {geo_activity_playground-1.4.1.dist-info → geo_activity_playground-1.5.1.dist-info}/WHEEL +0 -0
- {geo_activity_playground-1.4.1.dist-info → geo_activity_playground-1.5.1.dist-info}/entry_points.txt +0 -0
@@ -230,6 +230,13 @@ class Activity(DB.Model):
|
|
230
230
|
else:
|
231
231
|
return self.start
|
232
232
|
|
233
|
+
@property
|
234
|
+
def start_utc(self) -> Optional[datetime.datetime]:
|
235
|
+
if self.start:
|
236
|
+
return self.start.replace(microsecond=0, tzinfo=zoneinfo.ZoneInfo("UTC"))
|
237
|
+
else:
|
238
|
+
return None
|
239
|
+
|
233
240
|
|
234
241
|
class Tag(DB.Model):
|
235
242
|
__tablename__ = "tags"
|
@@ -8,7 +8,7 @@ from collections.abc import Iterator
|
|
8
8
|
import charset_normalizer
|
9
9
|
import dateutil.parser
|
10
10
|
import fitdecode.exceptions
|
11
|
-
import gpxpy
|
11
|
+
import gpxpy.gpx
|
12
12
|
import pandas as pd
|
13
13
|
import tcxreader.tcxreader
|
14
14
|
import xmltodict
|
@@ -40,7 +40,7 @@ def read_activity(path: pathlib.Path) -> tuple[Activity, pd.DataFrame]:
|
|
40
40
|
if file_type == ".gpx":
|
41
41
|
try:
|
42
42
|
timeseries = read_gpx_activity(path, opener)
|
43
|
-
except gpxpy.gpx.
|
43
|
+
except gpxpy.gpx.GPXException as e:
|
44
44
|
raise ActivityParseError(f"Syntax error while parsing GPX file") from e
|
45
45
|
except UnicodeDecodeError as e:
|
46
46
|
raise ActivityParseError(f"Encoding issue") from e
|
@@ -256,6 +256,7 @@ def web_ui_main(
|
|
256
256
|
# "search_query_favorites": search_query_history.prepare_favorites(),
|
257
257
|
# "search_query_last": search_query_history.prepare_last(),
|
258
258
|
"request_url": urllib.parse.quote_plus(request.url),
|
259
|
+
"host_url": request.host_url,
|
259
260
|
}
|
260
261
|
variables["equipments_avail"] = DB.session.scalars(
|
261
262
|
sqlalchemy.select(Equipment).order_by(Equipment.name)
|
@@ -4,6 +4,7 @@ import hashlib
|
|
4
4
|
import io
|
5
5
|
import logging
|
6
6
|
from collections.abc import Iterable
|
7
|
+
from typing import Optional
|
7
8
|
from typing import Union
|
8
9
|
|
9
10
|
import altair as alt
|
@@ -53,9 +54,7 @@ def blend_color(
|
|
53
54
|
|
54
55
|
class ColorStrategy(abc.ABC):
|
55
56
|
@abc.abstractmethod
|
56
|
-
def
|
57
|
-
self, tile_xy: tuple[int, int], grayscale: np.ndarray
|
58
|
-
) -> np.ndarray:
|
57
|
+
def _color(self, tile_xy: tuple[int, int]) -> Optional[np.ndarray]:
|
59
58
|
pass
|
60
59
|
|
61
60
|
|
@@ -68,18 +67,15 @@ class MaxClusterColorStrategy(ColorStrategy):
|
|
68
67
|
key=len,
|
69
68
|
)
|
70
69
|
|
71
|
-
def
|
72
|
-
self, tile_xy: tuple[int, int], grayscale: np.ndarray
|
73
|
-
) -> np.ndarray:
|
70
|
+
def _color(self, tile_xy: tuple[int, int]) -> Optional[np.ndarray]:
|
74
71
|
if tile_xy in self.max_cluster_members:
|
75
|
-
|
72
|
+
return np.array([[[55, 126, 184, 70]]]) / 255
|
76
73
|
elif tile_xy in self.evolution_state.memberships:
|
77
|
-
|
74
|
+
return np.array([[[77, 175, 74, 70]]]) / 255
|
78
75
|
elif tile_xy in self.tile_visits:
|
79
|
-
|
76
|
+
return np.array([[[0, 0, 0, 70]]]) / 255
|
80
77
|
else:
|
81
|
-
|
82
|
-
return np.broadcast_to(color, grayscale.shape)
|
78
|
+
return None
|
83
79
|
|
84
80
|
|
85
81
|
class ColorfulClusterColorStrategy(ColorStrategy):
|
@@ -92,20 +88,17 @@ class ColorfulClusterColorStrategy(ColorStrategy):
|
|
92
88
|
)
|
93
89
|
self._cmap = matplotlib.colormaps["hsv"]
|
94
90
|
|
95
|
-
def
|
96
|
-
self, tile_xy: tuple[int, int], grayscale: np.ndarray
|
97
|
-
) -> np.ndarray:
|
91
|
+
def _color(self, tile_xy: tuple[int, int]) -> Optional[np.ndarray]:
|
98
92
|
if tile_xy in self.evolution_state.memberships:
|
99
93
|
cluster_id = self.evolution_state.memberships[tile_xy]
|
100
94
|
m = hashlib.sha256()
|
101
95
|
m.update(str(cluster_id).encode())
|
102
96
|
d = int(m.hexdigest(), base=16) / (256.0**m.digest_size)
|
103
|
-
|
97
|
+
return np.array([[self._cmap(d)[:3] + (0.5,)]])
|
104
98
|
elif tile_xy in self.tile_visits:
|
105
|
-
|
99
|
+
return np.array([[[0, 0, 0, 70]]]) / 255
|
106
100
|
else:
|
107
|
-
|
108
|
-
return np.broadcast_to(color, grayscale.shape)
|
101
|
+
return None
|
109
102
|
|
110
103
|
|
111
104
|
class VisitTimeColorStrategy(ColorStrategy):
|
@@ -113,9 +106,7 @@ class VisitTimeColorStrategy(ColorStrategy):
|
|
113
106
|
self.tile_visits = tile_visits
|
114
107
|
self.use_first = use_first
|
115
108
|
|
116
|
-
def
|
117
|
-
self, tile_xy: tuple[int, int], grayscale: np.ndarray
|
118
|
-
) -> np.ndarray:
|
109
|
+
def _color(self, tile_xy: tuple[int, int]) -> Optional[np.ndarray]:
|
119
110
|
if tile_xy in self.tile_visits:
|
120
111
|
today = datetime.date.today()
|
121
112
|
cmap = matplotlib.colormaps["plasma"]
|
@@ -124,31 +115,39 @@ class VisitTimeColorStrategy(ColorStrategy):
|
|
124
115
|
tile_info["first_time"] if self.use_first else tile_info["last_time"]
|
125
116
|
)
|
126
117
|
if pd.isna(relevant_time):
|
127
|
-
color = np.array([[[0, 0, 0, 70]]]) /
|
118
|
+
color = np.array([[[0, 0, 0, 70]]]) / 255
|
128
119
|
else:
|
129
120
|
last_age_days = (today - relevant_time.date()).days
|
130
121
|
color = cmap(max(1 - last_age_days / (2 * 365), 0.0))
|
131
122
|
color = np.array([[color[:3] + (0.5,)]])
|
123
|
+
return color
|
132
124
|
else:
|
133
|
-
|
134
|
-
return np.broadcast_to(color, grayscale.shape)
|
125
|
+
return None
|
135
126
|
|
136
127
|
|
137
128
|
class NumVisitsColorStrategy(ColorStrategy):
|
138
129
|
def __init__(self, tile_visits):
|
139
130
|
self.tile_visits = tile_visits
|
140
131
|
|
141
|
-
def
|
142
|
-
self, tile_xy: tuple[int, int], grayscale: np.ndarray
|
143
|
-
) -> np.ndarray:
|
132
|
+
def _color(self, tile_xy: tuple[int, int]) -> Optional[np.ndarray]:
|
144
133
|
if tile_xy in self.tile_visits:
|
145
134
|
cmap = matplotlib.colormaps["viridis"]
|
146
135
|
tile_info = self.tile_visits[tile_xy]
|
147
136
|
color = cmap(min(len(tile_info["activity_ids"]) / 50, 1.0))
|
148
|
-
|
137
|
+
return np.array([[color[:3] + (0.5,)]])
|
149
138
|
else:
|
150
|
-
|
151
|
-
|
139
|
+
return None
|
140
|
+
|
141
|
+
|
142
|
+
class MissingColorStrategy(ColorStrategy):
|
143
|
+
def __init__(self, tile_visits):
|
144
|
+
self.tile_visits = tile_visits
|
145
|
+
|
146
|
+
def _color(self, tile_xy: tuple[int, int]) -> Optional[np.ndarray]:
|
147
|
+
if tile_xy in self.tile_visits:
|
148
|
+
return None
|
149
|
+
else:
|
150
|
+
return np.array([[[0, 0, 0, 70]]]) / 255
|
152
151
|
|
153
152
|
|
154
153
|
def make_explorer_blueprint(
|
@@ -294,6 +293,8 @@ def make_explorer_blueprint(
|
|
294
293
|
color_strategy = VisitTimeColorStrategy(tile_visits, use_first=False)
|
295
294
|
case "visits":
|
296
295
|
color_strategy = NumVisitsColorStrategy(tile_visits)
|
296
|
+
case "missing":
|
297
|
+
color_strategy = MissingColorStrategy(tile_visits)
|
297
298
|
case _:
|
298
299
|
raise ValueError("Unsupported color strategy.")
|
299
300
|
|
@@ -302,7 +303,11 @@ def make_explorer_blueprint(
|
|
302
303
|
tile_x = x // factor
|
303
304
|
tile_y = y // factor
|
304
305
|
tile_xy = (tile_x, tile_y)
|
305
|
-
|
306
|
+
color = color_strategy._color(tile_xy)
|
307
|
+
if color is None:
|
308
|
+
result = grayscale
|
309
|
+
else:
|
310
|
+
result = np.broadcast_to(color, grayscale.shape)
|
306
311
|
|
307
312
|
if x % factor == 0:
|
308
313
|
result[:, 0, :] = 0.5
|
@@ -356,73 +361,62 @@ def make_explorer_blueprint(
|
|
356
361
|
tile_x = x * factor + xo
|
357
362
|
tile_y = y * factor + yo
|
358
363
|
tile_xy = (tile_x, tile_y)
|
359
|
-
|
364
|
+
color = color_strategy._color(tile_xy)
|
365
|
+
if color is not None:
|
360
366
|
result[
|
361
367
|
yo * width : (yo + 1) * width, xo * width : (xo + 1) * width
|
362
|
-
] =
|
363
|
-
|
364
|
-
|
368
|
+
] = color
|
369
|
+
|
370
|
+
if (
|
371
|
+
evolution_state.square_x is not None
|
372
|
+
and evolution_state.square_y is not None
|
373
|
+
):
|
374
|
+
if (
|
375
|
+
tile_x == evolution_state.square_x
|
376
|
+
and evolution_state.square_y
|
377
|
+
<= tile_y
|
378
|
+
< evolution_state.square_y + evolution_state.max_square_size
|
379
|
+
):
|
380
|
+
result[
|
365
381
|
yo * width : (yo + 1) * width,
|
382
|
+
xo * width : xo * width + square_line_width,
|
383
|
+
] = square_color
|
384
|
+
if (
|
385
|
+
tile_y == evolution_state.square_y
|
386
|
+
and evolution_state.square_x
|
387
|
+
<= tile_x
|
388
|
+
< evolution_state.square_x + evolution_state.max_square_size
|
389
|
+
):
|
390
|
+
result[
|
391
|
+
yo * width : yo * width + square_line_width,
|
366
392
|
xo * width : (xo + 1) * width,
|
367
|
-
]
|
368
|
-
)
|
393
|
+
] = square_color
|
369
394
|
|
370
395
|
if (
|
371
|
-
|
372
|
-
|
396
|
+
tile_x + 1
|
397
|
+
== evolution_state.square_x
|
398
|
+
+ evolution_state.max_square_size
|
399
|
+
and evolution_state.square_y
|
400
|
+
<= tile_y
|
401
|
+
< evolution_state.square_y + evolution_state.max_square_size
|
373
402
|
):
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
):
|
392
|
-
result[
|
393
|
-
yo * width : yo * width + square_line_width,
|
394
|
-
xo * width : (xo + 1) * width,
|
395
|
-
] = square_color
|
396
|
-
|
397
|
-
if (
|
398
|
-
tile_x + 1
|
399
|
-
== evolution_state.square_x
|
400
|
-
+ evolution_state.max_square_size
|
401
|
-
and evolution_state.square_y
|
402
|
-
<= tile_y
|
403
|
-
< evolution_state.square_y
|
404
|
-
+ evolution_state.max_square_size
|
405
|
-
):
|
406
|
-
result[
|
407
|
-
yo * width : (yo + 1) * width,
|
408
|
-
(xo + 1) * width
|
409
|
-
- square_line_width : (xo + 1) * width,
|
410
|
-
] = square_color
|
411
|
-
|
412
|
-
if (
|
413
|
-
tile_y + 1
|
414
|
-
== evolution_state.square_y
|
415
|
-
+ evolution_state.max_square_size
|
416
|
-
and evolution_state.square_x
|
417
|
-
<= tile_x
|
418
|
-
< evolution_state.square_x
|
419
|
-
+ evolution_state.max_square_size
|
420
|
-
):
|
421
|
-
result[
|
422
|
-
(yo + 1) * width
|
423
|
-
- square_line_width : (yo + 1) * width,
|
424
|
-
xo * width : (xo + 1) * width,
|
425
|
-
] = square_color
|
403
|
+
result[
|
404
|
+
yo * width : (yo + 1) * width,
|
405
|
+
(xo + 1) * width - square_line_width : (xo + 1) * width,
|
406
|
+
] = square_color
|
407
|
+
|
408
|
+
if (
|
409
|
+
tile_y + 1
|
410
|
+
== evolution_state.square_y
|
411
|
+
+ evolution_state.max_square_size
|
412
|
+
and evolution_state.square_x
|
413
|
+
<= tile_x
|
414
|
+
< evolution_state.square_x + evolution_state.max_square_size
|
415
|
+
):
|
416
|
+
result[
|
417
|
+
(yo + 1) * width - square_line_width : (yo + 1) * width,
|
418
|
+
xo * width : (xo + 1) * width,
|
419
|
+
] = square_color
|
426
420
|
if width >= 64:
|
427
421
|
result[yo * width, :, :] = 0.5
|
428
422
|
result[:, xo * width, :] = 0.5
|
@@ -79,11 +79,11 @@ def _nominate_activities_inner(
|
|
79
79
|
if variable in meta.columns and not pd.isna(meta[variable]).all():
|
80
80
|
try:
|
81
81
|
i = meta[variable].idxmax()
|
82
|
-
except
|
82
|
+
except (KeyError, TypeError):
|
83
83
|
print(meta[variable].tolist())
|
84
84
|
print(f"{meta[variable].dtype=}")
|
85
85
|
logger.error(f"Trying to work with {variable=}.")
|
86
|
-
|
86
|
+
raise
|
87
87
|
else:
|
88
88
|
value = meta.loc[i, variable]
|
89
89
|
format_applied = format_str.format(value)
|
@@ -143,7 +143,10 @@ def make_photo_blueprint(
|
|
143
143
|
.order_by(Activity.start.desc())
|
144
144
|
.limit(1)
|
145
145
|
)
|
146
|
-
if
|
146
|
+
if (
|
147
|
+
activity is None
|
148
|
+
or activity.start_utc + activity.elapsed_time < time
|
149
|
+
):
|
147
150
|
flasher.flash_message(
|
148
151
|
f"Your image '{file.filename}' is from {time} but no activity could be found. Please first upload an activity or fix the time in the photo.",
|
149
152
|
FlashTypes.DANGER,
|
@@ -44,6 +44,10 @@ let overlay_maps = {
|
|
44
44
|
maxZoom: 19,
|
45
45
|
attribution: map_tile_attribution
|
46
46
|
}),
|
47
|
+
"Mising": L.tileLayer(`/explorer/${zoom}/tile/{z}/{x}/{y}.png?color_strategy=missing`, {
|
48
|
+
maxZoom: 19,
|
49
|
+
attribution: map_tile_attribution
|
50
|
+
}),
|
47
51
|
"Heatmap": L.tileLayer("/heatmap/tile/{z}/{x}/{y}.png", {
|
48
52
|
maxZoom: 19,
|
49
53
|
attribution: map_tile_attribution
|
@@ -42,7 +42,7 @@
|
|
42
42
|
</div>
|
43
43
|
</div>
|
44
44
|
|
45
|
-
<div class="
|
45
|
+
<div class="row mb-3">
|
46
46
|
<div class="col">
|
47
47
|
<h2>Tile history</h2>
|
48
48
|
</div>
|
@@ -66,5 +66,42 @@
|
|
66
66
|
</div>
|
67
67
|
</div>
|
68
68
|
|
69
|
+
<h2 class="mb-3">Tile URLs</h2>
|
70
|
+
|
71
|
+
<p>You can use the overlay tiles with other services like <a href="https://bikerouter.de/" target="_blank">Bike
|
72
|
+
Router</a>. See <a href="https://martin-ueding.github.io/geo-activity-playground/using-maps-as-overlays/"
|
73
|
+
target="_blank">the documentation for this feature</a>. For your server, use the following URLs:</p>
|
74
|
+
|
75
|
+
<code><pre>
|
76
|
+
{{ host_url }}tile/grayscale/{z}/{x}/{y}.png
|
77
|
+
{{ host_url }}tile/pastel/{z}/{x}/{y}.png
|
78
|
+
{{ host_url }}tile/color/{z}/{x}/{y}.png
|
79
|
+
{{ host_url }}tile/inverse_grayscale/{z}/{x}/{y}.png
|
80
|
+
</pre></code>
|
81
|
+
|
82
|
+
<p>For the explorer tiles, you can use these:</p>
|
83
|
+
|
84
|
+
<code><pre>
|
85
|
+
{{ host_url }}explorer/14/tile/{z}/{x}/{y}.png?color_strategy=colorful_cluster
|
86
|
+
{{ host_url }}explorer/14/tile/{z}/{x}/{y}.png?color_strategy=max_cluster
|
87
|
+
{{ host_url }}explorer/14/tile/{z}/{x}/{y}.png?color_strategy=first
|
88
|
+
{{ host_url }}explorer/14/tile/{z}/{x}/{y}.png?color_strategy=last
|
89
|
+
{{ host_url }}explorer/14/tile/{z}/{x}/{y}.png?color_strategy=visits
|
90
|
+
{{ host_url }}explorer/14/tile/{z}/{x}/{y}.png?color_strategy=missing
|
91
|
+
|
92
|
+
{{ host_url }}explorer/17/tile/{z}/{x}/{y}.png?color_strategy=colorful_cluster
|
93
|
+
{{ host_url }}explorer/17/tile/{z}/{x}/{y}.png?color_strategy=max_cluster
|
94
|
+
{{ host_url }}explorer/17/tile/{z}/{x}/{y}.png?color_strategy=first
|
95
|
+
{{ host_url }}explorer/17/tile/{z}/{x}/{y}.png?color_strategy=last
|
96
|
+
{{ host_url }}explorer/17/tile/{z}/{x}/{y}.png?color_strategy=visits
|
97
|
+
{{ host_url }}explorer/17/tile/{z}/{x}/{y}.png?color_strategy=missing
|
98
|
+
</pre></code>
|
99
|
+
|
100
|
+
<p>And for the heatmap, you can use this:</p>
|
101
|
+
|
102
|
+
<code><pre>
|
103
|
+
{{ host_url }}heatmap/tile/{z}/{x}/{y}.png
|
104
|
+
</pre></code>
|
105
|
+
|
69
106
|
{% endif %}
|
70
107
|
{% endblock %}
|
@@ -21,7 +21,7 @@ geo_activity_playground/core/activities.py,sha256=apP_-Rg1ub3lh7RARMGXf2BOmJTiah
|
|
21
21
|
geo_activity_playground/core/config.py,sha256=mmdMQ5iCLNGnAlriT1ETEVS-gM6Aq_9sg22QECHj4n8,5358
|
22
22
|
geo_activity_playground/core/coordinates.py,sha256=rW_OmMRpTUyIsQwrT6mgT9Y6uPGuwqTo5XDDMS7mGuo,1140
|
23
23
|
geo_activity_playground/core/copernicus_dem.py,sha256=t6Bc9fsyGyx1awdePXvlN-Zc-tiT2eGSJ80SV5B1Z9A,2944
|
24
|
-
geo_activity_playground/core/datamodel.py,sha256=
|
24
|
+
geo_activity_playground/core/datamodel.py,sha256=PRqxKlExXxRXkHYIJeNsRr1DZQmdzAwa3PLyivJoix8,15983
|
25
25
|
geo_activity_playground/core/enrichment.py,sha256=pw9VEyDAtdNbjQ1HOPYyXCXT8SLL5i3Cp6KWjKK7puM,8708
|
26
26
|
geo_activity_playground/core/export.py,sha256=ayOmhWL72263oP9NLIZRYCg_Db0GLUFhgNIL_MCrV-E,4435
|
27
27
|
geo_activity_playground/core/heart_rate.py,sha256=-S3WAhS7AOywrw_Lk5jfuo_fu6zvZQ1VtjwEKSycWpU,1542
|
@@ -52,7 +52,7 @@ geo_activity_playground/explorer/tile_visits.py,sha256=NUzC4jNb_vQExAIALrO2H1MiN
|
|
52
52
|
geo_activity_playground/explorer/video.py,sha256=7j6Qv3HG6On7Tn7xh7Olwrx_fbQnfzS7CeRg3TEApHg,4397
|
53
53
|
geo_activity_playground/heatmap_video.py,sha256=I8i1uVvbbPUXVtvLAROaLy58nQoUPnuMCZkERWNkQjg,3318
|
54
54
|
geo_activity_playground/importers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
55
|
-
geo_activity_playground/importers/activity_parsers.py,sha256=
|
55
|
+
geo_activity_playground/importers/activity_parsers.py,sha256=kL0PcS5eIjRokphQqkWs3ETNj-xdFkYLP7kdQW8y23o,11430
|
56
56
|
geo_activity_playground/importers/csv_parser.py,sha256=O1pP5GLhWhnWcy2Lsrr9g17Zspuibpt-GtZ3ZS5eZF4,2143
|
57
57
|
geo_activity_playground/importers/directory.py,sha256=ucnB5sPBvXzLdaza2v8GVU75ArfGG4E7d5OXrCgoFq4,3562
|
58
58
|
geo_activity_playground/importers/strava_api.py,sha256=Fiqlc-VeuzsvgDcWt71JoPMri221cMjkeL4SH80gC5s,8426
|
@@ -61,7 +61,7 @@ geo_activity_playground/importers/test_csv_parser.py,sha256=nOTVTdlzIY0TDcbWp7xN
|
|
61
61
|
geo_activity_playground/importers/test_directory.py,sha256=_fn_-y98ZyElbG0BRxAmGFdtGobUShPU86SdEOpuv-A,691
|
62
62
|
geo_activity_playground/importers/test_strava_api.py,sha256=7b8bl5Rh2BctCmvTPEhCadxtUOq3mfzuadD6F5XxRio,398
|
63
63
|
geo_activity_playground/webui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
64
|
-
geo_activity_playground/webui/app.py,sha256=
|
64
|
+
geo_activity_playground/webui/app.py,sha256=F1gHR2BtiMizwACxFrR_Egm2cNL_cAhWEEToP5H9EEg,10695
|
65
65
|
geo_activity_playground/webui/authenticator.py,sha256=dhREYOu_TCD_nzFNuSlHIbf5K6TmwKdXtr1wxD8fBcc,1491
|
66
66
|
geo_activity_playground/webui/blueprints/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
67
67
|
geo_activity_playground/webui/blueprints/activity_blueprint.py,sha256=tFy0GpOBhIP8xlmYc9PF4kAng-0MosXMJudVupGz2Yw,26771
|
@@ -71,11 +71,11 @@ geo_activity_playground/webui/blueprints/calendar_blueprint.py,sha256=SmOu5AfNNo
|
|
71
71
|
geo_activity_playground/webui/blueprints/eddington_blueprints.py,sha256=Ya5GJxfVESwmRlgMTYe9g75g8JHHTAAvYFmSD-3Uz4Q,8987
|
72
72
|
geo_activity_playground/webui/blueprints/entry_views.py,sha256=SDCzpUSb1FAb84tM0SnmrZQvtaTlO-Rqdj94hyIMDSc,2936
|
73
73
|
geo_activity_playground/webui/blueprints/equipment_blueprint.py,sha256=8L_7NZGErvu4jyigi2gg7HN_gegZRdsSFahUH7Dz6Lw,5727
|
74
|
-
geo_activity_playground/webui/blueprints/explorer_blueprint.py,sha256=
|
74
|
+
geo_activity_playground/webui/blueprints/explorer_blueprint.py,sha256=4sJcSwqyh5WxOU22IxpxkGTNWyq5MCgNeUKrCgotRcU,20828
|
75
75
|
geo_activity_playground/webui/blueprints/export_blueprint.py,sha256=C9yFH5gEJs2YtWE-EhcGDEyGwwaLgC1umybgIRi6duE,1036
|
76
|
-
geo_activity_playground/webui/blueprints/hall_of_fame_blueprint.py,sha256=
|
76
|
+
geo_activity_playground/webui/blueprints/hall_of_fame_blueprint.py,sha256=9CfcXE7v-p6IDR4L6ccBmSXlt89xTwitYetSF8xxI9g,3138
|
77
77
|
geo_activity_playground/webui/blueprints/heatmap_blueprint.py,sha256=5LlYKMeOMIE7c3xGRZ52ld4Jxtdc3GNcb6lvt3v7NVA,8435
|
78
|
-
geo_activity_playground/webui/blueprints/photo_blueprint.py,sha256=
|
78
|
+
geo_activity_playground/webui/blueprints/photo_blueprint.py,sha256=ql8gfJ-HYgy99PXPHGdbF_sp5wHsxjePQjWJipfpw1A,7250
|
79
79
|
geo_activity_playground/webui/blueprints/plot_builder_blueprint.py,sha256=nGtYblRTJ0rasJvl_L35cs1Iry4LONPy_9TY4ytXB-Q,3838
|
80
80
|
geo_activity_playground/webui/blueprints/search_blueprint.py,sha256=Sv_KL1Cdai26y51qVfI-5jZLhtElREsEar1dbR_VAC4,2275
|
81
81
|
geo_activity_playground/webui/blueprints/settings_blueprint.py,sha256=cwes3QmRrC_HMP1g-Yc-x2BJycF4jF3StJl75v9acWo,20377
|
@@ -120,7 +120,7 @@ geo_activity_playground/webui/static/leaflet/leaflet.css,sha256=p4NxAoJBhIIN-hmN
|
|
120
120
|
geo_activity_playground/webui/static/leaflet/leaflet.fullscreen.css,sha256=YTbhDGEH5amI_JfotPMN7IByFpsN9e4tCBnv5oNdvHU,994
|
121
121
|
geo_activity_playground/webui/static/leaflet/leaflet.js,sha256=20nQCchB9co0qIjJZRGuk2_Z9VM-kNiyxNV1lvTlZBo,147552
|
122
122
|
geo_activity_playground/webui/static/leaflet/leaflet.markercluster.js,sha256=WL6HHfYfbFEkZOFdsJQeY7lJG_E5airjvqbznghUzRw,33724
|
123
|
-
geo_activity_playground/webui/static/server-side-explorer.js,sha256=
|
123
|
+
geo_activity_playground/webui/static/server-side-explorer.js,sha256=AZ1ikH0NrVWcf6QBwPp2NC6LkIY2T8T0HKVhyVrtT-A,3426
|
124
124
|
geo_activity_playground/webui/static/table-sort.min.js,sha256=sFeDrgkXTePr2ciJU9_mLh-Z8qtYhPIQMgOZtj0LwBY,8506
|
125
125
|
geo_activity_playground/webui/static/vega/vega-embed@6.js,sha256=EtAqz74-xZ75o33UgiouBOKWG1u7Zxu-Zh0iIXFbmdo,60630
|
126
126
|
geo_activity_playground/webui/static/vega/vega-lite@4.js,sha256=roXmcY9bUF91uB9V-eSEUHEgfwoXe6B1xoDPuIe5ou8,267999
|
@@ -139,7 +139,7 @@ geo_activity_playground/webui/templates/eddington/distance.html.j2,sha256=9cLlIr
|
|
139
139
|
geo_activity_playground/webui/templates/eddington/elevation_gain.html.j2,sha256=h2mI1Uc1-P7rN_SeCVP_uadpQqX09ZpBG3Z6N8QWNLw,4723
|
140
140
|
geo_activity_playground/webui/templates/elevation_eddington/index.html.j2,sha256=WjquRFWaMzIZrvByhRIuhJbSCUW2HTfMck6THQHZI-I,4743
|
141
141
|
geo_activity_playground/webui/templates/equipment/index.html.j2,sha256=6pzSCJACMXA1fKgsO_KrCTvpumAKlelzj5f9dReey14,1742
|
142
|
-
geo_activity_playground/webui/templates/explorer/server-side.html.j2,sha256=
|
142
|
+
geo_activity_playground/webui/templates/explorer/server-side.html.j2,sha256=jQHJBSqWp5iZpO0cw8fArpca_Ec9cyDFqvN1r5mxt8E,4173
|
143
143
|
geo_activity_playground/webui/templates/export/index.html.j2,sha256=vxqpAm9KnT405Qz7q0_td-HZ4mCjcPR4Lp6EnIEWisg,1652
|
144
144
|
geo_activity_playground/webui/templates/hall_of_fame/index.html.j2,sha256=P15fVPjXf0Wf6K_hd_lCMuw6-Q8_qfNqsBOWNpMfoXw,1804
|
145
145
|
geo_activity_playground/webui/templates/heatmap/index.html.j2,sha256=Q99v4LP5EnuvDYKayL52qujWaIroLsD89ly2cM2YvTI,1420
|
@@ -174,8 +174,8 @@ geo_activity_playground/webui/templates/summary/vega-chart.html.j2,sha256=mw8Hti
|
|
174
174
|
geo_activity_playground/webui/templates/time_zone_fixer/index.html.j2,sha256=s9r6BJMXmd7kLSyjkvH4xLi6e01S5bpGRcMgMMJyCAE,1760
|
175
175
|
geo_activity_playground/webui/templates/upload/index.html.j2,sha256=I1Ix8tDS3YBdi-HdaNfjkzYXVVCjfUTe5PFTnap1ydc,775
|
176
176
|
geo_activity_playground/webui/templates/upload/reload.html.j2,sha256=YZWX5eDeNyqKJdQAywDBcU8DZBm22rRBbZqFjrFrCvQ,556
|
177
|
-
geo_activity_playground-1.
|
178
|
-
geo_activity_playground-1.
|
179
|
-
geo_activity_playground-1.
|
180
|
-
geo_activity_playground-1.
|
181
|
-
geo_activity_playground-1.
|
177
|
+
geo_activity_playground-1.5.1.dist-info/LICENSE,sha256=4RpAwKO8bPkfXH2lnpeUW0eLkNWglyG4lbrLDU_MOwY,1070
|
178
|
+
geo_activity_playground-1.5.1.dist-info/METADATA,sha256=xrB1_Ang0OELXJlnj1VnI69mgmNXDPESp1gf5btX0U0,1890
|
179
|
+
geo_activity_playground-1.5.1.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
|
180
|
+
geo_activity_playground-1.5.1.dist-info/entry_points.txt,sha256=pbNlLI6IIZIp7nPYCfAtiSiz2oxJSCl7DODD6SPkLKk,81
|
181
|
+
geo_activity_playground-1.5.1.dist-info/RECORD,,
|
File without changes
|
File without changes
|
{geo_activity_playground-1.4.1.dist-info → geo_activity_playground-1.5.1.dist-info}/entry_points.txt
RENAMED
File without changes
|