geo-activity-playground 1.11.0__py3-none-any.whl → 1.12.0__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.
@@ -25,6 +25,10 @@ class Config:
25
25
  color_scheme_for_counts: str = "teals"
26
26
  color_scheme_for_kind: str = "category10"
27
27
  color_scheme_for_heatmap: str = "hot"
28
+ color_strategy_max_cluster_color: str = "#377eb84d"
29
+ color_strategy_max_cluster_other_color: str = "#4daf4a4d"
30
+ color_strategy_visited_color: str = "#0000004d"
31
+ color_strategy_cmap_opacity: float = 0.5
28
32
  equipment_offsets: dict[str, float] = dataclasses.field(default_factory=dict)
29
33
  explorer_zoom_levels: list[int] = dataclasses.field(
30
34
  default_factory=lambda: [14, 17]
@@ -226,6 +226,7 @@ def web_ui_main(
226
226
  config_accessor,
227
227
  tile_getter,
228
228
  image_transforms,
229
+ config,
229
230
  ),
230
231
  "/export": make_export_blueprint(authenticator),
231
232
  "/hall-of-fame": make_hall_of_fame_blueprint(repository, search_query_history),
@@ -1,7 +1,9 @@
1
1
  import abc
2
2
  import datetime
3
+ import functools
3
4
  import hashlib
4
5
  import io
6
+ import itertools
5
7
  import logging
6
8
  from collections.abc import Iterable
7
9
  from typing import Any
@@ -24,6 +26,7 @@ from flask import Response
24
26
  from flask import url_for
25
27
  from flask.typing import ResponseReturnValue
26
28
 
29
+ from ...core.config import Config
27
30
  from ...core.config import ConfigAccessor
28
31
  from ...core.coordinates import Bounds
29
32
  from ...core.datamodel import Activity
@@ -55,6 +58,15 @@ def blend_color(
55
58
  return (1 - opacity) * base + opacity * addition
56
59
 
57
60
 
61
+ @functools.cache
62
+ def hex_color_to_float(color: str) -> np.ndarray:
63
+ values = [int("".join(x), base=16) / 255 for x in itertools.batched(color[1:], 2)]
64
+ assert (
65
+ min(values) >= 0.0 and max(values) <= 1.0
66
+ ), f"All {values=} must be within 0.0 and 1.0."
67
+ return np.array([[values]])
68
+
69
+
58
70
  class ColorStrategy(abc.ABC):
59
71
  @abc.abstractmethod
60
72
  def _color(self, tile_xy: tuple[int, int]) -> Optional[np.ndarray]:
@@ -62,27 +74,32 @@ class ColorStrategy(abc.ABC):
62
74
 
63
75
 
64
76
  class MaxClusterColorStrategy(ColorStrategy):
65
- def __init__(self, evolution_state, tile_visits):
77
+ def __init__(self, evolution_state, tile_visits, config: Config):
66
78
  self.evolution_state = evolution_state
67
79
  self.tile_visits = tile_visits
68
80
  self.max_cluster_members = max(
69
81
  evolution_state.clusters.values(),
70
82
  key=len,
71
83
  )
84
+ self._config = config
72
85
 
73
86
  def _color(self, tile_xy: tuple[int, int]) -> Optional[np.ndarray]:
74
87
  if tile_xy in self.max_cluster_members:
75
- return np.array([[[55, 126, 184, 70]]]) / 255
88
+ return hex_color_to_float(self._config.color_strategy_max_cluster_color)
76
89
  elif tile_xy in self.evolution_state.memberships:
77
- return np.array([[[77, 175, 74, 70]]]) / 255
90
+ return hex_color_to_float(
91
+ self._config.color_strategy_max_cluster_other_color
92
+ )
78
93
  elif tile_xy in self.tile_visits:
79
- return np.array([[[0, 0, 0, 70]]]) / 255
94
+ return hex_color_to_float(self._config.color_strategy_visited_color)
80
95
  else:
81
96
  return None
82
97
 
83
98
 
84
99
  class ColorfulClusterColorStrategy(ColorStrategy):
85
- def __init__(self, evolution_state: TileEvolutionState, tile_visits):
100
+ def __init__(
101
+ self, evolution_state: TileEvolutionState, tile_visits, config: Config
102
+ ):
86
103
  self.evolution_state = evolution_state
87
104
  self.tile_visits = tile_visits
88
105
  self.max_cluster_members = max(
@@ -90,6 +107,7 @@ class ColorfulClusterColorStrategy(ColorStrategy):
90
107
  key=len,
91
108
  )
92
109
  self._cmap = matplotlib.colormaps["hsv"]
110
+ self._config = config
93
111
 
94
112
  def _color(self, tile_xy: tuple[int, int]) -> Optional[np.ndarray]:
95
113
  if tile_xy in self.evolution_state.memberships:
@@ -97,17 +115,20 @@ class ColorfulClusterColorStrategy(ColorStrategy):
97
115
  m = hashlib.sha256()
98
116
  m.update(str(cluster_id).encode())
99
117
  d = int(m.hexdigest(), base=16) / (256.0**m.digest_size)
100
- return np.array([[self._cmap(d)[:3] + (0.5,)]])
118
+ return np.array(
119
+ [[self._cmap(d)[:3] + (self._config.color_strategy_cmap_opacity,)]]
120
+ )
101
121
  elif tile_xy in self.tile_visits:
102
- return np.array([[[0, 0, 0, 70]]]) / 255
122
+ return hex_color_to_float(self._config.color_strategy_visited_color)
103
123
  else:
104
124
  return None
105
125
 
106
126
 
107
127
  class VisitTimeColorStrategy(ColorStrategy):
108
- def __init__(self, tile_visits, use_first=True):
128
+ def __init__(self, tile_visits, config: Config, use_first=True):
109
129
  self.tile_visits = tile_visits
110
130
  self.use_first = use_first
131
+ self._config = config
111
132
 
112
133
  def _color(self, tile_xy: tuple[int, int]) -> Optional[np.ndarray]:
113
134
  if tile_xy in self.tile_visits:
@@ -118,39 +139,43 @@ class VisitTimeColorStrategy(ColorStrategy):
118
139
  tile_info["first_time"] if self.use_first else tile_info["last_time"]
119
140
  )
120
141
  if pd.isna(relevant_time):
121
- color = np.array([[[0, 0, 0, 70]]]) / 255
142
+ color = hex_color_to_float(self._config.color_strategy_visited_color)
122
143
  else:
123
144
  last_age_days = (today - relevant_time.date()).days
124
145
  color = cmap(max(1 - last_age_days / (2 * 365), 0.0))
125
- color = np.array([[color[:3] + (0.5,)]])
146
+ color = np.array(
147
+ [[color[:3] + (self._config.color_strategy_cmap_opacity,)]]
148
+ )
126
149
  return color
127
150
  else:
128
151
  return None
129
152
 
130
153
 
131
154
  class NumVisitsColorStrategy(ColorStrategy):
132
- def __init__(self, tile_visits):
155
+ def __init__(self, tile_visits, config: Config):
133
156
  self.tile_visits = tile_visits
157
+ self._config = config
134
158
 
135
159
  def _color(self, tile_xy: tuple[int, int]) -> Optional[np.ndarray]:
136
160
  if tile_xy in self.tile_visits:
137
161
  cmap = matplotlib.colormaps["viridis"]
138
162
  tile_info = self.tile_visits[tile_xy]
139
163
  color = cmap(min(len(tile_info["activity_ids"]) / 50, 1.0))
140
- return np.array([[color[:3] + (0.5,)]])
164
+ return np.array([[color[:3] + (self._config.color_strategy_cmap_opacity,)]])
141
165
  else:
142
166
  return None
143
167
 
144
168
 
145
169
  class MissingColorStrategy(ColorStrategy):
146
- def __init__(self, tile_visits):
170
+ def __init__(self, tile_visits, config: Config):
147
171
  self.tile_visits = tile_visits
172
+ self._config = config
148
173
 
149
174
  def _color(self, tile_xy: tuple[int, int]) -> Optional[np.ndarray]:
150
175
  if tile_xy in self.tile_visits:
151
176
  return None
152
177
  else:
153
- return np.array([[[0, 0, 0, 70]]]) / 255
178
+ return hex_color_to_float(self._config.color_strategy_visited_color)
154
179
 
155
180
 
156
181
  def make_explorer_blueprint(
@@ -159,6 +184,7 @@ def make_explorer_blueprint(
159
184
  config_accessor: ConfigAccessor,
160
185
  tile_getter: TileGetter,
161
186
  image_transforms: dict[str, ImageTransform],
187
+ config: Config,
162
188
  ) -> Blueprint:
163
189
  blueprint = Blueprint("explorer", __name__, template_folder="templates")
164
190
 
@@ -255,6 +281,7 @@ def make_explorer_blueprint(
255
281
  continue
256
282
  bookmarks.append(
257
283
  {
284
+ "id": bookmark.id,
258
285
  "name": bookmark.name,
259
286
  "bbox": geojson_bounding_box_for_tile_collection(cluster, zoom),
260
287
  "size": len(cluster),
@@ -307,19 +334,25 @@ def make_explorer_blueprint(
307
334
  color_strategy_name = config_accessor().cluster_color_strategy
308
335
  match color_strategy_name:
309
336
  case "max_cluster":
310
- color_strategy = MaxClusterColorStrategy(evolution_state, tile_visits)
337
+ color_strategy = MaxClusterColorStrategy(
338
+ evolution_state, tile_visits, config
339
+ )
311
340
  case "colorful_cluster":
312
341
  color_strategy = ColorfulClusterColorStrategy(
313
- evolution_state, tile_visits
342
+ evolution_state, tile_visits, config
314
343
  )
315
344
  case "first":
316
- color_strategy = VisitTimeColorStrategy(tile_visits, use_first=True)
345
+ color_strategy = VisitTimeColorStrategy(
346
+ tile_visits, config, use_first=True
347
+ )
317
348
  case "last":
318
- color_strategy = VisitTimeColorStrategy(tile_visits, use_first=False)
349
+ color_strategy = VisitTimeColorStrategy(
350
+ tile_visits, config, use_first=False
351
+ )
319
352
  case "visits":
320
- color_strategy = NumVisitsColorStrategy(tile_visits)
353
+ color_strategy = NumVisitsColorStrategy(tile_visits, config)
321
354
  case "missing":
322
- color_strategy = MissingColorStrategy(tile_visits)
355
+ color_strategy = MissingColorStrategy(tile_visits, config)
323
356
  case _:
324
357
  raise ValueError("Unsupported color strategy.")
325
358
 
@@ -134,6 +134,15 @@ def make_settings_blueprint(
134
134
  tile_y=request.args["tile_y"],
135
135
  )
136
136
 
137
+ @blueprint.route("/cluster-bookmarks/delete/<int:id>")
138
+ @needs_authentication(authenticator)
139
+ def cluster_bookmark_delete(id: int):
140
+ bookmark = DB.session.get_one(ExplorerTileBookmark, id)
141
+ flasher.flash_message(f"Bookmark {bookmark.name} deleted.", FlashTypes.SUCCESS)
142
+ DB.session.delete(bookmark)
143
+ DB.session.commit()
144
+ return redirect(request.referrer)
145
+
137
146
  @blueprint.route("/color-schemes", methods=["GET", "POST"])
138
147
  @needs_authentication(authenticator)
139
148
  def color_schemes():
@@ -175,6 +184,33 @@ def make_settings_blueprint(
175
184
  color_scheme_for_heatmap_avail=MATPLOTLIB_COLOR_SCHEMES_CONTINUOUS,
176
185
  )
177
186
 
187
+ @blueprint.route("/color-strategy", methods=["GET", "POST"])
188
+ @needs_authentication(authenticator)
189
+ def color_strategy():
190
+ if request.method == "POST":
191
+ config_accessor().color_strategy_max_cluster_color = request.form[
192
+ "color_strategy_max_cluster_color"
193
+ ]
194
+ config_accessor().color_strategy_max_cluster_other_color = request.form[
195
+ "color_strategy_max_cluster_other_color"
196
+ ]
197
+ config_accessor().color_strategy_visited_color = request.form[
198
+ "color_strategy_visited_color"
199
+ ]
200
+ config_accessor().color_strategy_cmap_opacity = float(
201
+ request.form["color_strategy_cmap_opacity"]
202
+ )
203
+ config_accessor.save()
204
+ flash("Updated color strategy values.", category="success")
205
+
206
+ return render_template(
207
+ "settings/color-strategy.html.j2",
208
+ color_strategy_max_cluster_color=config_accessor().color_strategy_max_cluster_color,
209
+ color_strategy_max_cluster_other_color=config_accessor().color_strategy_max_cluster_other_color,
210
+ color_strategy_visited_color=config_accessor().color_strategy_visited_color,
211
+ color_strategy_cmap_opacity=config_accessor().color_strategy_cmap_opacity,
212
+ )
213
+
178
214
  @blueprint.route("/manage-equipments", methods=["GET", "POST"])
179
215
  @needs_authentication(authenticator)
180
216
  def manage_equipments():
@@ -44,7 +44,7 @@ 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`, {
47
+ "Missing": L.tileLayer(`/explorer/${zoom}/tile/{z}/{x}/{y}.png?color_strategy=missing`, {
48
48
  maxZoom: 19,
49
49
  attribution: map_tile_attribution
50
50
  }),
@@ -84,7 +84,12 @@ 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
+ if (data.new_bookmark_url === undefined) {
88
+ console.error("Somehow we got a cluster that doesn't have a proper URL. This is the data that we got in response:")
89
+ console.error(data)
90
+ } else {
91
+ lines.push(`<dt>Bookmark</dt><dd><a href="${data.new_bookmark_url}">Create cluster bookmark</a></dd>`)
92
+ }
88
93
  }
89
94
 
90
95
  L.popup()
@@ -26,9 +26,9 @@
26
26
 
27
27
  {% if bookmarks %}
28
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>
29
+ <button type="button" class="btn" onclick='centerOn({{ center.bbox | safe }})'>Biggest</button>
30
30
  {% for bookmark in bookmarks %}
31
- <button type="button" class="btn btn-primary" onclick='centerOn({{ bookmark.bbox | safe }})'>{{ bookmark.name
31
+ <button type="button" class="btn" onclick='centerOn({{ bookmark.bbox | safe }})'>{{ bookmark.name
32
32
  }}</button>
33
33
  {% endfor %}
34
34
  </div>
@@ -52,6 +52,7 @@
52
52
  </div>
53
53
  </div>
54
54
 
55
+ <p><a href="{{ url_for('settings.color_strategy') }}">Modify color values</a>.</p>
55
56
 
56
57
  {% if bookmarks %}
57
58
  <h2 class="mb-3">Bookmarked cluster sizes</h2>
@@ -65,11 +66,20 @@
65
66
  </tr>
66
67
  </thead>
67
68
  <tbody>
69
+ <tr>
70
+ <td>Max Cluster</td>
71
+ <td>{{ max_cluster_size }}</td>
72
+ <td></td>
73
+ <td></td>
74
+ </tr>
68
75
  {% for bookmark in bookmarks %}
69
76
  <tr>
70
77
  <td>{{ bookmark.name }}</td>
71
78
  <td>{{ bookmark.size }}</td>
72
79
  <td>{{ '%.1f'|format(bookmark.size / max_cluster_size * 100) }} %</td>
80
+ <td><a class="btn btn-danger btn-sm"
81
+ href="{{ url_for('settings.cluster_bookmark_delete', id=bookmark.id) }}"
82
+ onclick="if(!confirm('Are you sure to Delete This?')){ event.preventDefault() }">Delete</a></td>
73
83
  </tr>
74
84
  {% endfor %}
75
85
  </tbody>
@@ -0,0 +1,38 @@
1
+ {% extends "page.html.j2" %}
2
+
3
+ {% block container %}
4
+
5
+ <h1 class="mb-3">Color Strategy Values</h1>
6
+
7
+ <form method="POST">
8
+ <div class="mb-3">
9
+ <label for="color_strategy_max_cluster_color" class="form-label">Max cluster</label>
10
+ <input type="color" alpha class="form-control" id="color_strategy_max_cluster_color"
11
+ name="color_strategy_max_cluster_color" value="{{ color_strategy_max_cluster_color }}" />
12
+ </div>
13
+
14
+ <div class="mb-3">
15
+ <label for="color_strategy_max_cluster_other_color" class="form-label">Other clusters besides the maximum
16
+ one</label>
17
+ <input type="color" alpha class="form-control" id="color_strategy_max_cluster_other_color"
18
+ name="color_strategy_max_cluster_other_color" value="{{ color_strategy_max_cluster_other_color }}" />
19
+ </div>
20
+
21
+ <div class="mb-3">
22
+ <label for="color_strategy_visited_color" class="form-label">Visited tiles that are not part of a
23
+ cluster</label>
24
+ <input type="color" alpha class="form-control" id="color_strategy_visited_color"
25
+ name="color_strategy_visited_color" value="{{ color_strategy_visited_color }}" />
26
+ </div>
27
+
28
+ <div class="mb-3">
29
+ <label for="color_strategy_cmap_opacity" class="form-label">Color map opacity</label>
30
+ <input type="number" class="form-control" id="color_strategy_cmap_opacity" name="color_strategy_cmap_opacity"
31
+ value="{{ color_strategy_cmap_opacity }}" min="0.0" max="1.0" step="0.05" />
32
+ </div>
33
+
34
+ <button type="submit" class="btn btn-primary">Save</button>
35
+ </form>
36
+
37
+
38
+ {% endblock %}
@@ -24,11 +24,20 @@
24
24
  <div class="card">
25
25
  <div class="card-body">
26
26
  <h5 class="card-title">Color schemes</h5>
27
- <p class="card-text">Don't like the colors in the plots?</p>
27
+ <p class="card-text">Don't like the colors in the statistics plots?</p>
28
28
  <a href="{{ url_for('.color_schemes') }}" class="btn btn-primary">Set up color schemes</a>
29
29
  </div>
30
30
  </div>
31
31
  </div>
32
+ <div class="col">
33
+ <div class="card">
34
+ <div class="card-body">
35
+ <h5 class="card-title">Color strategy</h5>
36
+ <p class="card-text">Don't like the cluster colors in the explorer tile map?</p>
37
+ <a href="{{ url_for('.color_strategy') }}" class="btn btn-primary">Modify color strategies</a>
38
+ </div>
39
+ </div>
40
+ </div>
32
41
  <div class="col">
33
42
  <div class="card">
34
43
  <div class="card-body">
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: geo-activity-playground
3
- Version: 1.11.0
3
+ Version: 1.12.0
4
4
  Summary: Analysis of geo data activities like rides, runs or hikes.
5
5
  License: MIT
6
6
  Author: Martin Ueding
@@ -19,7 +19,7 @@ geo_activity_playground/alembic/versions/f2f50843be2d_make_all_fields_in_activit
19
19
  geo_activity_playground/alembic/versions/script.py.mako,sha256=3qBrHBf7F7ChKDUIdiNItiSXrDpgQdM7sR0YKzpaC50,689
20
20
  geo_activity_playground/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
21
  geo_activity_playground/core/activities.py,sha256=-Sgf981kG0QfDNZc0c1hB4StZJd_ONRCpV4l3a0LqCA,4690
22
- geo_activity_playground/core/config.py,sha256=mmdMQ5iCLNGnAlriT1ETEVS-gM6Aq_9sg22QECHj4n8,5358
22
+ geo_activity_playground/core/config.py,sha256=sLC9OLpvOjjOuyhhw1tS-KjHiUuZJp3BNkprR9YB3Wc,5573
23
23
  geo_activity_playground/core/coordinates.py,sha256=rW_OmMRpTUyIsQwrT6mgT9Y6uPGuwqTo5XDDMS7mGuo,1140
24
24
  geo_activity_playground/core/copernicus_dem.py,sha256=t6Bc9fsyGyx1awdePXvlN-Zc-tiT2eGSJ80SV5B1Z9A,2944
25
25
  geo_activity_playground/core/datamodel.py,sha256=JXyXg0szPOk4dn7DSrJTbX-RScZIrOe9aDGT-Tw7d_E,17242
@@ -62,7 +62,7 @@ geo_activity_playground/importers/test_csv_parser.py,sha256=nOTVTdlzIY0TDcbWp7xN
62
62
  geo_activity_playground/importers/test_directory.py,sha256=_fn_-y98ZyElbG0BRxAmGFdtGobUShPU86SdEOpuv-A,691
63
63
  geo_activity_playground/importers/test_strava_api.py,sha256=7b8bl5Rh2BctCmvTPEhCadxtUOq3mfzuadD6F5XxRio,398
64
64
  geo_activity_playground/webui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
65
- geo_activity_playground/webui/app.py,sha256=YxzUhvAgmSHiUfIEmvbey1PNStgB5Wcdj-b734OehdY,11087
65
+ geo_activity_playground/webui/app.py,sha256=Z1P0Asfr3R-NVuAAzrinE4HRwv4tkOErooILvC2biRI,11107
66
66
  geo_activity_playground/webui/authenticator.py,sha256=dhREYOu_TCD_nzFNuSlHIbf5K6TmwKdXtr1wxD8fBcc,1491
67
67
  geo_activity_playground/webui/blueprints/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
68
68
  geo_activity_playground/webui/blueprints/activity_blueprint.py,sha256=TAiuGfPj01dtcW83vsPhbcKlbw8X-vg95RzH0azUCOQ,26813
@@ -72,14 +72,14 @@ geo_activity_playground/webui/blueprints/calendar_blueprint.py,sha256=rJTJGKn68E
72
72
  geo_activity_playground/webui/blueprints/eddington_blueprints.py,sha256=s5o_U1rqGE4wrE9my7quDyMeUpGu-R5Nuc1cf1seSeM,8521
73
73
  geo_activity_playground/webui/blueprints/entry_views.py,sha256=slGyYokGattdG-e5Ef9s_ys4ohVVAkFLFclEQS5fEr4,2954
74
74
  geo_activity_playground/webui/blueprints/equipment_blueprint.py,sha256=6u81Hestr4FP6mix_avQp9jaK0In4WNdYaSwKL5cJDs,5757
75
- geo_activity_playground/webui/blueprints/explorer_blueprint.py,sha256=cxA6H8xIRKuWtyOzjtsw4Z26tgY9LrTCps4ZhYIceRk,22273
75
+ geo_activity_playground/webui/blueprints/explorer_blueprint.py,sha256=3LoRK0SGK-6MZZ1I1X-i5frbmLSElLiBhz7SRtL0ZIs,23491
76
76
  geo_activity_playground/webui/blueprints/export_blueprint.py,sha256=Rppuyk_TkP1GeDplxgKnRkyujDR-hGhD3oWRnNNCEjc,1102
77
77
  geo_activity_playground/webui/blueprints/hall_of_fame_blueprint.py,sha256=NGVk8Xgwpt-YNX5_zgGWTMRctN_N4NCnMq10DSDteVg,3121
78
78
  geo_activity_playground/webui/blueprints/heatmap_blueprint.py,sha256=prERVBOxq2xvmgyH_dwtLwMMMFILeu-6yZE9h9U_T9g,8418
79
79
  geo_activity_playground/webui/blueprints/photo_blueprint.py,sha256=i4-AS9icK6pDypTdl-coTZyKldXtpukGiNbKsihfpl0,7299
80
80
  geo_activity_playground/webui/blueprints/plot_builder_blueprint.py,sha256=SttkVghm4msPmEbSmxZj3e1Q-e2-YdhH6zjZGaiYEQg,3844
81
81
  geo_activity_playground/webui/blueprints/search_blueprint.py,sha256=hY3hfGTip24AEf7NVTPtQt2hj7MEAcG3gbJd42NY3Ic,2258
82
- geo_activity_playground/webui/blueprints/settings_blueprint.py,sha256=CcyrUKa7BanmsZ5EYCX2Kvf1REGKRVX3747FuuVgWjM,21304
82
+ geo_activity_playground/webui/blueprints/settings_blueprint.py,sha256=qR7TE-XxjMMSMBUjmSaHLf1qSBOtdrUnNdHX1AxYZJM,23031
83
83
  geo_activity_playground/webui/blueprints/square_planner_blueprint.py,sha256=xVaxJxmt8Dysl3UL9f2y__LVLtTH2Np1Ust4OSXKRAk,4746
84
84
  geo_activity_playground/webui/blueprints/summary_blueprint.py,sha256=giVLJttJ2myJ6n5Xg5aq3hFvfu7MPo1euyYZGVAaBBk,6746
85
85
  geo_activity_playground/webui/blueprints/tile_blueprint.py,sha256=YzZf9OrNdjhc1_j4MtO1DMcw1uCv29ueNsYd-mWqgbg,837
@@ -122,7 +122,7 @@ geo_activity_playground/webui/static/leaflet/leaflet.css,sha256=p4NxAoJBhIIN-hmN
122
122
  geo_activity_playground/webui/static/leaflet/leaflet.fullscreen.css,sha256=YTbhDGEH5amI_JfotPMN7IByFpsN9e4tCBnv5oNdvHU,994
123
123
  geo_activity_playground/webui/static/leaflet/leaflet.js,sha256=20nQCchB9co0qIjJZRGuk2_Z9VM-kNiyxNV1lvTlZBo,147552
124
124
  geo_activity_playground/webui/static/leaflet/leaflet.markercluster.js,sha256=WL6HHfYfbFEkZOFdsJQeY7lJG_E5airjvqbznghUzRw,33724
125
- geo_activity_playground/webui/static/server-side-explorer.js,sha256=grLBpPbM17Hkv5sn4TuvqU6m1SHPGg3Z7I3898d7DVc,3622
125
+ geo_activity_playground/webui/static/server-side-explorer.js,sha256=xTtMLGKWqBMNa0z8rWw_D-Ftdu8rLUGBgph4Mbc49k4,3905
126
126
  geo_activity_playground/webui/static/table-sort.min.js,sha256=sFeDrgkXTePr2ciJU9_mLh-Z8qtYhPIQMgOZtj0LwBY,8506
127
127
  geo_activity_playground/webui/static/vega/vega-embed@6.js,sha256=EtAqz74-xZ75o33UgiouBOKWG1u7Zxu-Zh0iIXFbmdo,60630
128
128
  geo_activity_playground/webui/static/vega/vega-lite@4.js,sha256=roXmcY9bUF91uB9V-eSEUHEgfwoXe6B1xoDPuIe5ou8,267999
@@ -141,7 +141,7 @@ geo_activity_playground/webui/templates/eddington/distance.html.j2,sha256=9cLlIr
141
141
  geo_activity_playground/webui/templates/eddington/elevation_gain.html.j2,sha256=h2mI1Uc1-P7rN_SeCVP_uadpQqX09ZpBG3Z6N8QWNLw,4723
142
142
  geo_activity_playground/webui/templates/elevation_eddington/index.html.j2,sha256=WjquRFWaMzIZrvByhRIuhJbSCUW2HTfMck6THQHZI-I,4743
143
143
  geo_activity_playground/webui/templates/equipment/index.html.j2,sha256=6pzSCJACMXA1fKgsO_KrCTvpumAKlelzj5f9dReey14,1742
144
- geo_activity_playground/webui/templates/explorer/server-side.html.j2,sha256=quEYNmx4LNSWoaUz-HBjFa2Acas7Hd7OgQKhk6XqyCQ,5068
144
+ geo_activity_playground/webui/templates/explorer/server-side.html.j2,sha256=N9QNNufL4xl2sx5yKh-oQ9BIJ41vjs_Ypf9lxzJTAwc,5534
145
145
  geo_activity_playground/webui/templates/export/index.html.j2,sha256=vxqpAm9KnT405Qz7q0_td-HZ4mCjcPR4Lp6EnIEWisg,1652
146
146
  geo_activity_playground/webui/templates/hall_of_fame/index.html.j2,sha256=P15fVPjXf0Wf6K_hd_lCMuw6-Q8_qfNqsBOWNpMfoXw,1804
147
147
  geo_activity_playground/webui/templates/heatmap/index.html.j2,sha256=Q99v4LP5EnuvDYKayL52qujWaIroLsD89ly2cM2YvTI,1420
@@ -158,8 +158,9 @@ geo_activity_playground/webui/templates/search_form.html.j2,sha256=BBxT2aAUlOZ41
158
158
  geo_activity_playground/webui/templates/settings/admin-password.html.j2,sha256=VYwddpObD1RpeTH5Dm4y7VtmT7kwURDCIjxyzJeq08c,495
159
159
  geo_activity_playground/webui/templates/settings/cluster-bookmarks-new.html.j2,sha256=aV2tulI3GpGUG1SCxx0itKd4uyNsjD5--ijKqVLsMA0,969
160
160
  geo_activity_playground/webui/templates/settings/color-schemes.html.j2,sha256=iR91Wxd2_TMuIo9dBDZBrWSUGHNwTwzC6O8oNH-XBt4,1653
161
+ geo_activity_playground/webui/templates/settings/color-strategy.html.j2,sha256=pl0Dwa4N262OfLkbzPaKWylvdVnd_g2mbnwvlPHaCsg,1604
161
162
  geo_activity_playground/webui/templates/settings/heart-rate.html.j2,sha256=UPT3MegRgSeff36lhCo0l3ZwhqNSIg5gM6h2s32GkCY,4255
162
- geo_activity_playground/webui/templates/settings/index.html.j2,sha256=mapSC1TTS_cFg7K0eNuTbENTMg2EFb1atPdIj14xU_c,5468
163
+ geo_activity_playground/webui/templates/settings/index.html.j2,sha256=F2Eg2bM5kT4ByFDoY-qCFnGZq5yw0DFuf-bH_r987Ro,5912
163
164
  geo_activity_playground/webui/templates/settings/manage-equipments.html.j2,sha256=vPGGlwyG_xMZc4a6JdajwWMJBfN1lBNBtDSt6QPJBiY,1585
164
165
  geo_activity_playground/webui/templates/settings/manage-kinds.html.j2,sha256=382VW-cEe0iPJ8TNL2jrcRtVYb_RFdzDyeC1ncpWZ9M,1616
165
166
  geo_activity_playground/webui/templates/settings/metadata-extraction.html.j2,sha256=0g9RlHFKipN45RaH_FANWnY1lfXUkKjtc_9B-vJ19LQ,2298
@@ -177,8 +178,8 @@ geo_activity_playground/webui/templates/summary/vega-chart.html.j2,sha256=mw8Hti
177
178
  geo_activity_playground/webui/templates/time_zone_fixer/index.html.j2,sha256=s9r6BJMXmd7kLSyjkvH4xLi6e01S5bpGRcMgMMJyCAE,1760
178
179
  geo_activity_playground/webui/templates/upload/index.html.j2,sha256=5W2gpm4eSvidOyJOCSZZbvTZaTkSWNrOWux3-oIm0zI,784
179
180
  geo_activity_playground/webui/templates/upload/reload.html.j2,sha256=YZWX5eDeNyqKJdQAywDBcU8DZBm22rRBbZqFjrFrCvQ,556
180
- geo_activity_playground-1.11.0.dist-info/LICENSE,sha256=4RpAwKO8bPkfXH2lnpeUW0eLkNWglyG4lbrLDU_MOwY,1070
181
- geo_activity_playground-1.11.0.dist-info/METADATA,sha256=t6e_mp3gsgeme9fncmP8Q8lFgjIgsGCb0bklcm-pKYg,1938
182
- geo_activity_playground-1.11.0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
183
- geo_activity_playground-1.11.0.dist-info/entry_points.txt,sha256=pbNlLI6IIZIp7nPYCfAtiSiz2oxJSCl7DODD6SPkLKk,81
184
- geo_activity_playground-1.11.0.dist-info/RECORD,,
181
+ geo_activity_playground-1.12.0.dist-info/LICENSE,sha256=4RpAwKO8bPkfXH2lnpeUW0eLkNWglyG4lbrLDU_MOwY,1070
182
+ geo_activity_playground-1.12.0.dist-info/METADATA,sha256=ATODXHNXPU82mJb3PQI81AhcVbdatXvI5Bku4_L7ejY,1938
183
+ geo_activity_playground-1.12.0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
184
+ geo_activity_playground-1.12.0.dist-info/entry_points.txt,sha256=pbNlLI6IIZIp7nPYCfAtiSiz2oxJSCl7DODD6SPkLKk,81
185
+ geo_activity_playground-1.12.0.dist-info/RECORD,,