geo-activity-playground 0.35.1__py3-none-any.whl → 0.36.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 (36) hide show
  1. geo_activity_playground/core/activities.py +21 -13
  2. geo_activity_playground/core/raster_map.py +9 -13
  3. geo_activity_playground/importers/directory.py +6 -15
  4. geo_activity_playground/webui/app.py +27 -35
  5. geo_activity_playground/webui/{auth/blueprint.py → auth_blueprint.py} +1 -1
  6. geo_activity_playground/webui/{eddington/controller.py → eddington_blueprint.py} +17 -13
  7. geo_activity_playground/webui/heatmap/blueprint.py +36 -10
  8. geo_activity_playground/webui/heatmap/heatmap_controller.py +142 -60
  9. geo_activity_playground/webui/heatmap/templates/heatmap/index.html.j2 +30 -12
  10. geo_activity_playground/webui/{search/blueprint.py → search_blueprint.py} +1 -1
  11. geo_activity_playground/webui/settings/blueprint.py +1 -2
  12. geo_activity_playground/webui/square_planner_blueprint.py +118 -0
  13. geo_activity_playground/webui/{summary/controller.py → summary_blueprint.py} +23 -23
  14. geo_activity_playground/webui/templates/page.html.j2 +17 -11
  15. geo_activity_playground/webui/tile_blueprint.py +42 -0
  16. geo_activity_playground/webui/upload_blueprint.py +1 -3
  17. {geo_activity_playground-0.35.1.dist-info → geo_activity_playground-0.36.1.dist-info}/METADATA +1 -1
  18. {geo_activity_playground-0.35.1.dist-info → geo_activity_playground-0.36.1.dist-info}/RECORD +26 -34
  19. geo_activity_playground/webui/eddington/__init__.py +0 -0
  20. geo_activity_playground/webui/eddington/blueprint.py +0 -16
  21. geo_activity_playground/webui/square_planner/__init__.py +0 -0
  22. geo_activity_playground/webui/square_planner/blueprint.py +0 -38
  23. geo_activity_playground/webui/square_planner/controller.py +0 -101
  24. geo_activity_playground/webui/summary/__init__.py +0 -0
  25. geo_activity_playground/webui/summary/blueprint.py +0 -14
  26. geo_activity_playground/webui/tile/__init__.py +0 -0
  27. geo_activity_playground/webui/tile/blueprint.py +0 -29
  28. geo_activity_playground/webui/tile/controller.py +0 -36
  29. /geo_activity_playground/webui/{auth/templates → templates}/auth/index.html.j2 +0 -0
  30. /geo_activity_playground/webui/{eddington/templates → templates}/eddington/index.html.j2 +0 -0
  31. /geo_activity_playground/webui/{search/templates → templates}/search/index.html.j2 +0 -0
  32. /geo_activity_playground/webui/{square_planner/templates → templates}/square_planner/index.html.j2 +0 -0
  33. /geo_activity_playground/webui/{summary/templates → templates}/summary/index.html.j2 +0 -0
  34. {geo_activity_playground-0.35.1.dist-info → geo_activity_playground-0.36.1.dist-info}/LICENSE +0 -0
  35. {geo_activity_playground-0.35.1.dist-info → geo_activity_playground-0.36.1.dist-info}/WHEEL +0 -0
  36. {geo_activity_playground-0.35.1.dist-info → geo_activity_playground-0.36.1.dist-info}/entry_points.txt +0 -0
@@ -7,20 +7,38 @@
7
7
  </div>
8
8
  </div>
9
9
 
10
- <div class="row mb-3">
11
- <div class="col">
12
- <form action="" method="GET">
10
+ <form action="" method="GET">
11
+
12
+ <div class="row mb-3">
13
+ <label class="col-sm-2 col-form-label">Kinds</label>
14
+
15
+ <div class="col-sm-10">
13
16
  {% for kind in available_kinds %}
14
- <div class="form-check form-check-inline form-switch">
15
- <input class="form-check-input" type="checkbox" role="switch" id="{{ kind }}" name="kind"
16
- value="{{ kind }}" {{ 'checked' if kind in kinds else '' }} />
17
- <label class="form-check-label" for="{{ kind }}">{{ kind }}</label>
17
+ <div class="form-check form-check-inline form-switch ">
18
+ <input class="form-check-input" type="checkbox" role="switch" id="kind{{ loop.index0 }}" name="kind"
19
+ value="{{ loop.index0 }}" {{ 'checked' if loop.index0 in kinds else '' }} />
20
+ <label class="form-check-label" for="kind{{ loop.index0 }}">{{ kind }}</label>
18
21
  </div>
19
22
  {% endfor %}
20
- <button type="submit" class="btn btn-primary">Show selected kinds</button>
21
- </form>
23
+ </div>
22
24
  </div>
23
- </div>
25
+
26
+ <div class="row mb-3">
27
+ <label class="col-sm-2 col-form-label">Date range</label>
28
+ <div class="col-sm-5">
29
+ <input type="date" id="date-start" name="date-start" value="{{ date_start }}" />
30
+ <label for="date-start" class="form-label">Start date</label>
31
+ </div>
32
+ <div class="col-sm-5">
33
+ <input type="date" id="date-end" name="date-end" value="{{ date_end }}" />
34
+ <label for="date-start" class="form-label">End date</label>
35
+ </div>
36
+ </div>
37
+
38
+ <div class="mb-3">
39
+ <button type="submit" class="btn btn-primary">Filter heatmap</button>
40
+ </div>
41
+ </form>
24
42
 
25
43
  <div class="row mb-3">
26
44
  <div class="col">
@@ -33,7 +51,7 @@
33
51
  center: [{{ center.latitude }}, {{ center.longitude }}],
34
52
  zoom: 12
35
53
  });
36
- L.tileLayer('/heatmap/tile/{z}/{x}/{y}/{{ kinds_str }}.png', {
54
+ L.tileLayer('/heatmap/tile/{z}/{x}/{y}.png?{{ extra_args|safe }}', {
37
55
  maxZoom: 19,
38
56
  attribution: '{{ map_tile_attribution|safe }}'
39
57
  }).addTo(map)
@@ -47,7 +65,7 @@
47
65
  function downloadAs() {
48
66
  bounds = map.getBounds()
49
67
  window.location.href =
50
- `/heatmap/download/${bounds.getNorth()}/${bounds.getEast()}/${bounds.getSouth()}/${bounds.getWest()}/{{ kinds_str }}`
68
+ `/heatmap/download/${bounds.getNorth()}/${bounds.getEast()}/${bounds.getSouth()}/${bounds.getWest()}/heatmap.png?{{ extra_args|safe }}`
51
69
  }
52
70
  </script>
53
71
  </div>
@@ -7,7 +7,7 @@ from flask import render_template
7
7
  from flask import request
8
8
  from flask import Response
9
9
 
10
- from ...core.activities import ActivityRepository
10
+ from ..core.activities import ActivityRepository
11
11
 
12
12
 
13
13
  def reduce_or(selections):
@@ -58,8 +58,7 @@ def int_or_none(s: str) -> Optional[int]:
58
58
  return int(s)
59
59
  except ValueError as e:
60
60
  flash(f"Cannot parse integer from {s}: {e}", category="danger")
61
- else:
62
- return None
61
+ return None
63
62
 
64
63
 
65
64
  def make_settings_blueprint(
@@ -0,0 +1,118 @@
1
+ import geojson
2
+ from flask import Blueprint
3
+ from flask import redirect
4
+ from flask import render_template
5
+ from flask import Response
6
+ from flask import url_for
7
+
8
+ from geo_activity_playground.explorer.grid_file import make_explorer_rectangle
9
+ from geo_activity_playground.explorer.grid_file import make_explorer_tile
10
+ from geo_activity_playground.explorer.grid_file import make_grid_file_geojson
11
+ from geo_activity_playground.explorer.grid_file import make_grid_file_gpx
12
+ from geo_activity_playground.explorer.grid_file import make_grid_points
13
+ from geo_activity_playground.explorer.tile_visits import TileVisitAccessor
14
+
15
+
16
+ def make_square_planner_blueprint(tile_visit_accessor: TileVisitAccessor) -> Blueprint:
17
+ tile_visits = tile_visit_accessor.tile_state["tile_visits"]
18
+
19
+ blueprint = Blueprint("square_planner", __name__, template_folder="templates")
20
+
21
+ @blueprint.route("/<int:zoom>")
22
+ def landing(zoom: int):
23
+ explored = tile_visit_accessor.tile_state["evolution_state"][zoom]
24
+ return redirect(
25
+ url_for(
26
+ "square_planner.index",
27
+ zoom=zoom,
28
+ x=explored.square_x,
29
+ y=explored.square_y,
30
+ size=explored.max_square_size,
31
+ )
32
+ )
33
+
34
+ @blueprint.route("/<int:zoom>/<int:x>/<int:y>/<int:size>")
35
+ def index(zoom: int, x: int, y: int, size: int):
36
+ square_geojson = geojson.dumps(
37
+ geojson.FeatureCollection(
38
+ features=[
39
+ make_explorer_rectangle(
40
+ x,
41
+ y,
42
+ x + size,
43
+ y + size,
44
+ zoom,
45
+ )
46
+ ]
47
+ )
48
+ )
49
+
50
+ missing_geojson = geojson.dumps(
51
+ geojson.FeatureCollection(
52
+ features=[
53
+ make_explorer_tile(
54
+ tile_x,
55
+ tile_y,
56
+ {},
57
+ zoom,
58
+ )
59
+ for tile_x in range(x, x + size)
60
+ for tile_y in range(y, y + size)
61
+ if (tile_x, tile_y) not in set(tile_visits[zoom].keys())
62
+ ]
63
+ )
64
+ )
65
+
66
+ return render_template(
67
+ "square_planner/index.html.j2",
68
+ explored_geojson=_get_explored_geojson(tile_visits[zoom].keys(), zoom),
69
+ missing_geojson=missing_geojson,
70
+ square_geojson=square_geojson,
71
+ zoom=zoom,
72
+ square_x=x,
73
+ square_y=y,
74
+ square_size=size,
75
+ )
76
+
77
+ @blueprint.route("/<int:zoom>/<int:x>/<int:y>/<int:size>/missing.<suffix>")
78
+ def square_planner_missing(zoom: int, x: int, y: int, size: int, suffix: str):
79
+ points = make_grid_points(
80
+ (
81
+ (tile_x, tile_y)
82
+ for tile_x in range(x, x + size)
83
+ for tile_y in range(y, y + size)
84
+ if (tile_x, tile_y) not in set(tile_visits[zoom].keys())
85
+ ),
86
+ zoom,
87
+ )
88
+ if suffix == "geojson":
89
+ response = make_grid_file_geojson(points)
90
+ elif suffix == "gpx":
91
+ response = make_grid_file_gpx(points)
92
+ else:
93
+ raise RuntimeError(f"Unsupported suffix {suffix}.")
94
+
95
+ mimetypes = {"geojson": "application/json", "gpx": "application/xml"}
96
+ return Response(
97
+ response,
98
+ mimetype=mimetypes[suffix],
99
+ headers={"Content-disposition": "attachment"},
100
+ )
101
+
102
+ return blueprint
103
+
104
+
105
+ def _get_explored_geojson(tile_visits: list[tuple[int, int]], zoom: int) -> str:
106
+ return geojson.dumps(
107
+ geojson.FeatureCollection(
108
+ features=[
109
+ make_explorer_tile(
110
+ tile_x,
111
+ tile_y,
112
+ {},
113
+ zoom,
114
+ )
115
+ for tile_x, tile_y in tile_visits
116
+ ]
117
+ )
118
+ )
@@ -1,9 +1,10 @@
1
1
  import collections
2
2
  import datetime
3
- import functools
4
3
 
5
4
  import altair as alt
6
5
  import pandas as pd
6
+ from flask import Blueprint
7
+ from flask import render_template
7
8
 
8
9
  from geo_activity_playground.core.activities import ActivityRepository
9
10
  from geo_activity_playground.core.activities import make_geojson_from_time_series
@@ -11,15 +12,13 @@ from geo_activity_playground.core.config import Config
11
12
  from geo_activity_playground.webui.plot_util import make_kind_scale
12
13
 
13
14
 
14
- class SummaryController:
15
- def __init__(self, repository: ActivityRepository, config: Config) -> None:
16
- self._repository = repository
17
- self._config = config
15
+ def make_summary_blueprint(repository: ActivityRepository, config: Config) -> Blueprint:
16
+ blueprint = Blueprint("summary", __name__, template_folder="templates")
18
17
 
19
- @functools.cache
20
- def render(self) -> dict:
21
- kind_scale = make_kind_scale(self._repository.meta, self._config)
22
- df = embellished_activities(self._repository.meta)
18
+ @blueprint.route("/")
19
+ def index():
20
+ kind_scale = make_kind_scale(repository.meta, config)
21
+ df = embellished_activities(repository.meta)
23
22
  # df = df.loc[df["consider_for_achievements"]]
24
23
 
25
24
  year_kind_total = (
@@ -29,28 +28,29 @@ class SummaryController:
29
28
  .reset_index()
30
29
  )
31
30
 
32
- return {
33
- "plot_distance_heatmaps": plot_distance_heatmaps(df, self._config),
34
- "plot_monthly_distance": plot_monthly_distance(df, kind_scale),
35
- "plot_yearly_distance": plot_yearly_distance(year_kind_total, kind_scale),
36
- "plot_year_cumulative": plot_year_cumulative(df),
37
- "tabulate_year_kind_mean": tabulate_year_kind_mean(df)
31
+ return render_template(
32
+ "summary/index.html.j2",
33
+ plot_distance_heatmaps=plot_distance_heatmaps(df, config),
34
+ plot_monthly_distance=plot_monthly_distance(df, kind_scale),
35
+ plot_yearly_distance=plot_yearly_distance(year_kind_total, kind_scale),
36
+ plot_year_cumulative=plot_year_cumulative(df),
37
+ tabulate_year_kind_mean=tabulate_year_kind_mean(df)
38
38
  .reset_index()
39
39
  .to_dict(orient="split"),
40
- "plot_weekly_distance": plot_weekly_distance(df, kind_scale),
41
- "nominations": [
40
+ plot_weekly_distance=plot_weekly_distance(df, kind_scale),
41
+ nominations=[
42
42
  (
43
- self._repository.get_activity_by_id(activity_id),
43
+ repository.get_activity_by_id(activity_id),
44
44
  reasons,
45
45
  make_geojson_from_time_series(
46
- self._repository.get_time_series(activity_id)
46
+ repository.get_time_series(activity_id)
47
47
  ),
48
48
  )
49
- for activity_id, reasons in nominate_activities(
50
- self._repository.meta
51
- ).items()
49
+ for activity_id, reasons in nominate_activities(repository.meta).items()
52
50
  ],
53
- }
51
+ )
52
+
53
+ return blueprint
54
54
 
55
55
 
56
56
  def nominate_activities(meta: pd.DataFrame) -> dict[int, list[str]]:
@@ -8,21 +8,18 @@
8
8
  <title>Geo Activity Playground</title>
9
9
 
10
10
  <!-- Bootstrap CSS. -->
11
- <link href="/static/bootstrap.min.css" rel="stylesheet"
12
- integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous">
11
+ <link href="/static/bootstrap.min.css" rel="stylesheet">
13
12
 
14
13
  <!-- Leaflet for interactive maps. -->
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>
14
+ <link rel="stylesheet" href="/static/leaflet.css" />
15
+ <script src="/static/leaflet.js"></script>
19
16
 
20
17
  <!-- Fullscreen button for Leaflet. -->
21
18
  <link href='/static/leaflet.fullscreen.css' rel='stylesheet' />
22
19
  <script src='/static/Leaflet.fullscreen.min.js'></script>
23
20
 
24
- <link rel="stylesheet" href="/static/MarkerCluster.css" crossorigin="" />
25
- <link rel="stylesheet" href="/static/MarkerCluster.Default.css" crossorigin="" />
21
+ <link rel="stylesheet" href="/static/MarkerCluster.css" />
22
+ <link rel="stylesheet" href="/static/MarkerCluster.Default.css" />
26
23
  <script src="/static/leaflet.markercluster.js"></script>
27
24
 
28
25
  <!-- Vega for plots.-->
@@ -97,6 +94,17 @@
97
94
  Tiles (Zoom 14)</a></li>
98
95
  <li><a class="dropdown-item" href="{{ url_for('explorer.map', zoom=17) }}">Squadratinhos
99
96
  (Zoom 17)</a></li>
97
+
98
+ <li>
99
+ <hr class="dropdown-divider">
100
+ </li>
101
+
102
+ <li><a class="dropdown-item"
103
+ href="{{ url_for('square_planner.landing', zoom=14) }}">Square Planner
104
+ (Zoom 14)</a></li>
105
+ <li><a class="dropdown-item"
106
+ href="{{ url_for('square_planner.landing', zoom=17) }}">Square Planner
107
+ (Zoom 17)</a></li>
100
108
  </ul>
101
109
  </li>
102
110
 
@@ -204,9 +212,7 @@
204
212
  </div>
205
213
  </div>
206
214
 
207
- <script src="/static/bootstrap.bundle.min.js"
208
- integrity="sha384-C6RzsynM9kWDrMNeT87bh95OGNyZPhcTNXj1NW7RuBCsyN/o0jlpcV8Qyq46cDfL"
209
- crossorigin="anonymous"></script>
215
+ <script src="/static/bootstrap.bundle.min.js"></script>
210
216
  </body>
211
217
 
212
218
  </html>
@@ -0,0 +1,42 @@
1
+ import io
2
+
3
+ import matplotlib.pyplot as pl
4
+ import numpy as np
5
+ from flask import Blueprint
6
+ from flask import Response
7
+
8
+ from geo_activity_playground.core.config import Config
9
+ from geo_activity_playground.core.raster_map import get_tile
10
+
11
+
12
+ def make_tile_blueprint(config: Config) -> Blueprint:
13
+ blueprint = Blueprint("tiles", __name__, template_folder="templates")
14
+
15
+ @blueprint.route("/color/<int:z>/<int:x>/<int:y>.png")
16
+ def tile_color(x: int, y: int, z: int):
17
+ map_tile = np.array(get_tile(z, x, y, config.map_tile_url)) / 255
18
+ f = io.BytesIO()
19
+ pl.imsave(f, map_tile, format="png")
20
+ return Response(bytes(f.getbuffer()), mimetype="image/png")
21
+
22
+ @blueprint.route("/grayscale/<int:z>/<int:x>/<int:y>.png")
23
+ def tile_grayscale(x: int, y: int, z: int):
24
+ map_tile = np.array(get_tile(z, x, y, config.map_tile_url)) / 255
25
+ map_tile = np.sum(map_tile * [0.2126, 0.7152, 0.0722], axis=2) # to grayscale
26
+ map_tile = np.dstack((map_tile, map_tile, map_tile)) # to rgb
27
+ f = io.BytesIO()
28
+ pl.imsave(f, map_tile, format="png")
29
+ return Response(bytes(f.getbuffer()), mimetype="image/png")
30
+
31
+ @blueprint.route("/pastel/<int:z>/<int:x>/<int:y>.png")
32
+ def tile_pastel(x: int, y: int, z: int):
33
+ map_tile = np.array(get_tile(z, x, y, config.map_tile_url)) / 255
34
+ averaged_tile = np.sum(map_tile * [0.2126, 0.7152, 0.0722], axis=2)
35
+ grayscale_tile = np.dstack((averaged_tile, averaged_tile, averaged_tile))
36
+ factor = 0.7
37
+ pastel_tile = factor * grayscale_tile + (1 - factor) * map_tile
38
+ f = io.BytesIO()
39
+ pl.imsave(f, pastel_tile, format="png")
40
+ return Response(bytes(f.getbuffer()), mimetype="image/png")
41
+
42
+ return blueprint
@@ -108,9 +108,7 @@ def scan_for_activities(
108
108
  skip_strava: bool = False,
109
109
  ) -> None:
110
110
  if pathlib.Path("Activities").exists():
111
- import_from_directory(
112
- config.metadata_extraction_regexes, config.num_processes, config
113
- )
111
+ import_from_directory(config.metadata_extraction_regexes, config)
114
112
  if pathlib.Path("Strava Export").exists():
115
113
  import_from_strava_checkout()
116
114
  if config.strava_client_code and not skip_strava:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: geo-activity-playground
3
- Version: 0.35.1
3
+ Version: 0.36.1
4
4
  Summary: Analysis of geo data activities like rides, runs or hikes.
5
5
  License: MIT
6
6
  Author: Martin Ueding
@@ -1,14 +1,14 @@
1
1
  geo_activity_playground/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  geo_activity_playground/__main__.py,sha256=vFKB0Jjk8ImDHqok6Fddb5CRWHEnxyn5r4Zs0A1EsCQ,4585
3
3
  geo_activity_playground/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- geo_activity_playground/core/activities.py,sha256=MiQev1L7NnSVnxgbArlT-FpWTESTwnKh7pyT1tcEHqU,6926
4
+ geo_activity_playground/core/activities.py,sha256=CYIr7bw9IJ7QQjjt1AWMGXcjZwl7PT-4gaxBOmuO2Qg,7197
5
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
9
  geo_activity_playground/core/paths.py,sha256=RBeUi38riP_msTGPy1TsPRNiblzE-lFivaJSLULE8b0,2503
10
10
  geo_activity_playground/core/privacy_zones.py,sha256=4TumHsVUN1uW6RG3ArqTXDykPVipF98DCxVBe7YNdO8,512
11
- geo_activity_playground/core/raster_map.py,sha256=yoq5s883BEA2v5C6EYVynkOwynJMka9d2rmoa-W1uIE,7178
11
+ geo_activity_playground/core/raster_map.py,sha256=RrbpotWIIT1friSewSxRczk4FY6v8ofOO6kO1ERMWvM,6962
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
@@ -23,7 +23,7 @@ geo_activity_playground/heatmap_video.py,sha256=Oc3EAAsW27zhG28Rmy3i2GoN1rjm1UFg
23
23
  geo_activity_playground/importers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
24
  geo_activity_playground/importers/activity_parsers.py,sha256=5MvtjmXruPAoUO1KlDycoj677NeETgODiyxsFjXNppg,11103
25
25
  geo_activity_playground/importers/csv_parser.py,sha256=O1pP5GLhWhnWcy2Lsrr9g17Zspuibpt-GtZ3ZS5eZF4,2143
26
- geo_activity_playground/importers/directory.py,sha256=CA-vFOMm8G4MSM_Q09OwQKduCApL2PWaxLTVxgw_xpw,5908
26
+ geo_activity_playground/importers/directory.py,sha256=v9YC65cSXMmZBDW094HHUfTC-4H98sEkatRZJ38OHos,5454
27
27
  geo_activity_playground/importers/strava_api.py,sha256=cJCZsLemhOlxTtZh0z_npidgae9SD5HyEUry2uvem_A,7775
28
28
  geo_activity_playground/importers/strava_checkout.py,sha256=dAKW1wVqlA5zRw25SvpYZZrEikJtaUluInyhJ0RfsFc,10002
29
29
  geo_activity_playground/importers/test_csv_parser.py,sha256=LXqva7GuSAfXYE2zZQrg-69lCtfy5MxLSq6BRwL_VyI,1191
@@ -38,19 +38,15 @@ geo_activity_playground/webui/activity/templates/activity/edit.html.j2,sha256=ck
38
38
  geo_activity_playground/webui/activity/templates/activity/lines.html.j2,sha256=_ZDg1ruW-9UMJfOudy1-uY_-IcSSaagq7tPCih5Bb8g,1079
39
39
  geo_activity_playground/webui/activity/templates/activity/name.html.j2,sha256=tKviMqMouHEGv3xBQVIsJgwj_hjwAsmGVefM3UMqlYg,2437
40
40
  geo_activity_playground/webui/activity/templates/activity/show.html.j2,sha256=bEx37UGSTeeJl7gN4fjyOpINFQwZ5Zm-HOKpLqcJGfs,6905
41
- geo_activity_playground/webui/app.py,sha256=MXjd5iOYY7q_wGYgMKOj0T2z7cJ9KxpevVGHD5V95ws,6521
42
- geo_activity_playground/webui/auth/blueprint.py,sha256=Lx-ZvMnfHLC1CMre1xPQI3k_pCtQoZvgRhtmafULzoE,812
43
- geo_activity_playground/webui/auth/templates/auth/index.html.j2,sha256=ILQ5HvTEYc3OrtOAIFt1VrqWorVD70V9DC342znmP70,579
41
+ geo_activity_playground/webui/app.py,sha256=eXF7reuw6bX-Ez3hDK3nPacePrD4XRcElp0gBRdyWoI,5440
42
+ geo_activity_playground/webui/auth_blueprint.py,sha256=sERpBU6cXdBuVjMMiRQBGJMibFZCfrUXMPj4ukzd_Ug,783
44
43
  geo_activity_playground/webui/authenticator.py,sha256=k278OEVuOfAmTGT4F2X4pqSTwwkK_FA87EIhAeysEqc,1416
45
44
  geo_activity_playground/webui/calendar/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
45
  geo_activity_playground/webui/calendar/blueprint.py,sha256=Kjyx9lkJoM5tL8vNba0Y7HhJuFRVId4F-ONZsXpKyyg,721
47
46
  geo_activity_playground/webui/calendar/controller.py,sha256=QpSAkR2s1sbLSu6P_fNNTccgGglOzEH2PIv1XwKxeVY,2778
48
47
  geo_activity_playground/webui/calendar/templates/calendar/index.html.j2,sha256=xoR6R4cUgTQNRHQv3m3f4Bc-yCjJEsJj5d4_CWlJsRo,1427
49
48
  geo_activity_playground/webui/calendar/templates/calendar/month.html.j2,sha256=sRIiNo_Rp9CHary6e-lnpKJKOuAonoDEBvKMxzbTLQE,1802
50
- geo_activity_playground/webui/eddington/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
51
- geo_activity_playground/webui/eddington/blueprint.py,sha256=2VUiH0HXqp4hK86PmcyOtZ2WTlunJqmsArOYRpVLaAc,452
52
- geo_activity_playground/webui/eddington/controller.py,sha256=ly7JSkSS79kO4CL_xugB62uRuuWKVqOjbN-pheelv94,2910
53
- geo_activity_playground/webui/eddington/templates/eddington/index.html.j2,sha256=XHKeUymQMS5x00PLOVlg-nSRCz_jHB2pvD8QunULWJ4,1839
49
+ geo_activity_playground/webui/eddington_blueprint.py,sha256=70Jyrlv9s2HAbspJ-7JAOZsH02PrIbMCRL28wNomVgk,3084
54
50
  geo_activity_playground/webui/entry_controller.py,sha256=McxbyouKWHJ3a2R9agPazZoG7VHiFO1RvnkBr08dMH8,2168
55
51
  geo_activity_playground/webui/equipment/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
56
52
  geo_activity_playground/webui/equipment/blueprint.py,sha256=kJhCSdakke_UhT2RIP-fMoAMaC1oFttRoCPeiAIaB6g,491
@@ -61,13 +57,12 @@ geo_activity_playground/webui/explorer/blueprint.py,sha256=iLmdayavR7B1_l67VvkMG
61
57
  geo_activity_playground/webui/explorer/controller.py,sha256=pIzWh0TpLJgKQZlS325-QT7nA1q9ms7fRqQIp24PNfo,11705
62
58
  geo_activity_playground/webui/explorer/templates/explorer/index.html.j2,sha256=3t9ikAF6oMvEaVlS3Kb1tj9ngomIQlatzqPnqVsEDKA,6908
63
59
  geo_activity_playground/webui/heatmap/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
64
- geo_activity_playground/webui/heatmap/blueprint.py,sha256=ZEImDIwT3uiDIKapqCU49llvyqG79n7ZEu1GHgoLZqo,1558
65
- geo_activity_playground/webui/heatmap/heatmap_controller.py,sha256=sUTfM-wwQXe4B4tyuQka9s9bfXLVyexaF0yyM8_q2xk,7728
66
- geo_activity_playground/webui/heatmap/templates/heatmap/index.html.j2,sha256=BMjqbZ-btSFawuNDxgZxOkF5JvhD_p9DOBJ-4-1IKnU,1833
60
+ geo_activity_playground/webui/heatmap/blueprint.py,sha256=-Cd-b2_3uU-6tBDsqlbyrVacftDod8SoIZnDRsIC5H8,2548
61
+ geo_activity_playground/webui/heatmap/heatmap_controller.py,sha256=kO9IrRdaIcCuTu6d5lSOi8rLbBl_gqbht9psGtPzbIk,10709
62
+ geo_activity_playground/webui/heatmap/templates/heatmap/index.html.j2,sha256=lO3WdD7CkLSnTuQeQMvCkuFpJbL_TDp7Zocbwbug0wg,2512
67
63
  geo_activity_playground/webui/plot_util.py,sha256=pTTQoqOCkLVjkgOit7mbry28kMruZIL8amZozSzEpxQ,283
68
- geo_activity_playground/webui/search/blueprint.py,sha256=7TDsiqEowMyHNlFImk-hCGso69KOieG4rfJnLRHpRz8,3300
69
- geo_activity_playground/webui/search/templates/search/index.html.j2,sha256=d39uhteoY6JOZePqhLIYLERqkckW3oghMnTUZa7X1J8,3798
70
- geo_activity_playground/webui/settings/blueprint.py,sha256=GIrCOBNw-uNWDmKj4uduYOiKpoTLEfFbGmUmXkoBqro,9405
64
+ geo_activity_playground/webui/search_blueprint.py,sha256=3EBj70BHxEj8ZInK0Fj04p3JJMcHByj-xwOISmaj_4E,3299
65
+ geo_activity_playground/webui/settings/blueprint.py,sha256=l5H9kxjwMpqPQoF8moIp3r6oU-RQmuWr38yiHUZYU00,9391
71
66
  geo_activity_playground/webui/settings/controller.py,sha256=MIZVBfoGNvmJnB_ECV_x5eH2i6gDZvkWSQ4PcSKyLKs,9170
72
67
  geo_activity_playground/webui/settings/templates/settings/admin-password.html.j2,sha256=VYwddpObD1RpeTH5Dm4y7VtmT7kwURDCIjxyzJeq08c,495
73
68
  geo_activity_playground/webui/settings/templates/settings/color-schemes.html.j2,sha256=iR91Wxd2_TMuIo9dBDZBrWSUGHNwTwzC6O8oNH-XBt4,1653
@@ -81,10 +76,7 @@ geo_activity_playground/webui/settings/templates/settings/privacy-zones.html.j2,
81
76
  geo_activity_playground/webui/settings/templates/settings/segmentation.html.j2,sha256=QV72TZcIxqql-vEsq2lKHzo5UxoxeeXkRA9se46GWKU,1187
82
77
  geo_activity_playground/webui/settings/templates/settings/sharepic.html.j2,sha256=qZkfEpd4CtKKMaSSVadqvNEgMRYLV-0X-pw5-nJvukk,678
83
78
  geo_activity_playground/webui/settings/templates/settings/strava.html.j2,sha256=FrXgT-m1PgvsQWo9kMKpk8QenKeifSDBCZFqKgsHRxQ,1827
84
- geo_activity_playground/webui/square_planner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
85
- geo_activity_playground/webui/square_planner/blueprint.py,sha256=r2VkSM547chX85g6c1BQ8NC-tkdqGdYp-2ZALBiiDTc,1320
86
- geo_activity_playground/webui/square_planner/controller.py,sha256=ML6ftOyr3tTh7D4DBcRP76CvkyTxqI5QWgMeG9wC8FE,3561
87
- geo_activity_playground/webui/square_planner/templates/square_planner/index.html.j2,sha256=xFbYBQtkOl3U4WGkvIuU_5uazGHn8ObvQfNgPGq0Gqg,6469
79
+ geo_activity_playground/webui/square_planner_blueprint.py,sha256=A-bTwSsT1JpMyQ6qVlXoitAW1u4OXAoNAbA61RrGgow,3975
88
80
  geo_activity_playground/webui/static/Leaflet.fullscreen.min.js,sha256=MMWj_yFOercjzhk8wKIIKyDCK7olXrwk_7R7TjDhGYs,3677
89
81
  geo_activity_playground/webui/static/MarkerCluster.Default.css,sha256=LWhzWaQGZRsWFrrJxg-6Zn8TT84k0_trtiHBc6qcGpY,1346
90
82
  geo_activity_playground/webui/static/MarkerCluster.css,sha256=-bdWuWOXMFkX0v9Cvr3OWClPiYefDQz9GGZP_7xZxdc,886
@@ -114,20 +106,20 @@ geo_activity_playground/webui/static/vega-lite@4,sha256=roXmcY9bUF91uB9V-eSEUHEg
114
106
  geo_activity_playground/webui/static/vega@5,sha256=5DLHUaY2P0ph2mKSDMfX69E88J2ClJ-PSGJI-Acdw84,514536
115
107
  geo_activity_playground/webui/static/web-app-manifest-192x192.png,sha256=eEImN6iWfSv-EnSNPL5WbX84PKakse_8VZMBPWWye3o,13582
116
108
  geo_activity_playground/webui/static/web-app-manifest-512x512.png,sha256=vU9oQ4HnQerFDZVzcAT9twj4_Doc6_9v9wVvoRI-f_E,48318
117
- geo_activity_playground/webui/summary/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
118
- geo_activity_playground/webui/summary/blueprint.py,sha256=7Yc8aQ9zTy8Rd0-yI_jV3cvQi5cwSe_Wn5O1JSvHq0s,416
119
- geo_activity_playground/webui/summary/controller.py,sha256=CJZKGaVXJenuoIbypzbH_MwMKBICGr_F4Adu9LMWtPU,9397
120
- geo_activity_playground/webui/summary/templates/summary/index.html.j2,sha256=ctOx3Qjx6nRDpUtFf1DlJhK_gtU77Vwx_S6euLz9-W4,5183
109
+ geo_activity_playground/webui/summary_blueprint.py,sha256=FrPQgx6-lOX3DiaCveJu_n0a_mSTt-XUMxWVcHNkUUU,9399
110
+ geo_activity_playground/webui/templates/auth/index.html.j2,sha256=ILQ5HvTEYc3OrtOAIFt1VrqWorVD70V9DC342znmP70,579
111
+ geo_activity_playground/webui/templates/eddington/index.html.j2,sha256=XHKeUymQMS5x00PLOVlg-nSRCz_jHB2pvD8QunULWJ4,1839
121
112
  geo_activity_playground/webui/templates/home.html.j2,sha256=IdCqI_LLcYrpUjjCO-tbXR4s05XYrPOateiJ4idF3bo,2202
122
- geo_activity_playground/webui/templates/page.html.j2,sha256=Mt1M0hw1V7sPnQmo6kRO_e49B4to30eDkAf-J35xXas,10624
113
+ geo_activity_playground/webui/templates/page.html.j2,sha256=CHRvO2HGHjBnMNffX7a-C-pm2544wErKOcW66lghKos,10785
114
+ geo_activity_playground/webui/templates/search/index.html.j2,sha256=d39uhteoY6JOZePqhLIYLERqkckW3oghMnTUZa7X1J8,3798
115
+ geo_activity_playground/webui/templates/square_planner/index.html.j2,sha256=xFbYBQtkOl3U4WGkvIuU_5uazGHn8ObvQfNgPGq0Gqg,6469
116
+ geo_activity_playground/webui/templates/summary/index.html.j2,sha256=ctOx3Qjx6nRDpUtFf1DlJhK_gtU77Vwx_S6euLz9-W4,5183
123
117
  geo_activity_playground/webui/templates/upload/index.html.j2,sha256=I1Ix8tDS3YBdi-HdaNfjkzYXVVCjfUTe5PFTnap1ydc,775
124
118
  geo_activity_playground/webui/templates/upload/reload.html.j2,sha256=YZWX5eDeNyqKJdQAywDBcU8DZBm22rRBbZqFjrFrCvQ,556
125
- geo_activity_playground/webui/tile/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
126
- geo_activity_playground/webui/tile/blueprint.py,sha256=WTkqeOhagnDCquyBtOsZQLzI41arIEdGBe46jnMEkNg,934
127
- geo_activity_playground/webui/tile/controller.py,sha256=UY_dVQrjSYCXTkVjgQwQumltPPIUOQfdnN8nJv1m54I,1433
128
- geo_activity_playground/webui/upload_blueprint.py,sha256=topLI9ytDUFkqCc9AlOqDkjhABUwnPJ1tX_7XrBPbxc,4412
129
- geo_activity_playground-0.35.1.dist-info/LICENSE,sha256=4RpAwKO8bPkfXH2lnpeUW0eLkNWglyG4lbrLDU_MOwY,1070
130
- geo_activity_playground-0.35.1.dist-info/METADATA,sha256=tXXmYUBsCfdgXnO_D5nXqvc8xIv237xH0Upkgdw6r_A,1573
131
- geo_activity_playground-0.35.1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
132
- geo_activity_playground-0.35.1.dist-info/entry_points.txt,sha256=pbNlLI6IIZIp7nPYCfAtiSiz2oxJSCl7DODD6SPkLKk,81
133
- geo_activity_playground-0.35.1.dist-info/RECORD,,
119
+ geo_activity_playground/webui/tile_blueprint.py,sha256=QU8YRjhMf-lhPJGqrCjV49QBX0ATgTny96GYhqJwwyI,1755
120
+ geo_activity_playground/webui/upload_blueprint.py,sha256=Ha3H5Dsl6YS6YYmFouXamU8viEpLIj1YIE9XJVCiakY,4368
121
+ geo_activity_playground-0.36.1.dist-info/LICENSE,sha256=4RpAwKO8bPkfXH2lnpeUW0eLkNWglyG4lbrLDU_MOwY,1070
122
+ geo_activity_playground-0.36.1.dist-info/METADATA,sha256=FPKNfpP12TAxEuUWa2UBvlP7JWpBc7gculCSzOnPyP8,1573
123
+ geo_activity_playground-0.36.1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
124
+ geo_activity_playground-0.36.1.dist-info/entry_points.txt,sha256=pbNlLI6IIZIp7nPYCfAtiSiz2oxJSCl7DODD6SPkLKk,81
125
+ geo_activity_playground-0.36.1.dist-info/RECORD,,
File without changes
@@ -1,16 +0,0 @@
1
- from flask import Blueprint
2
- from flask import render_template
3
-
4
- from .controller import EddingtonController
5
-
6
-
7
- def make_eddington_blueprint(eddington_controller: EddingtonController) -> Blueprint:
8
- blueprint = Blueprint("eddington", __name__, template_folder="templates")
9
-
10
- @blueprint.route("/")
11
- def index():
12
- return render_template(
13
- "eddington/index.html.j2", **eddington_controller.render()
14
- )
15
-
16
- return blueprint
File without changes
@@ -1,38 +0,0 @@
1
- from flask import Blueprint
2
- from flask import render_template
3
- from flask import Response
4
-
5
- from ...core.activities import ActivityRepository
6
- from ...explorer.tile_visits import TileVisitAccessor
7
- from .controller import SquarePlannerController
8
-
9
-
10
- def make_square_planner_blueprint(
11
- repository: ActivityRepository, tile_visit_accessor: TileVisitAccessor
12
- ) -> Blueprint:
13
- blueprint = Blueprint("square_planner", __name__, template_folder="templates")
14
- controller = SquarePlannerController(repository, tile_visit_accessor)
15
-
16
- @blueprint.route("/<zoom>/<x>/<y>/<size>")
17
- def index(zoom, x, y, size):
18
- return render_template(
19
- "square_planner/index.html.j2",
20
- **controller.action_planner(int(zoom), int(x), int(y), int(size))
21
- )
22
-
23
- @blueprint.route("/<zoom>/<x>/<y>/<size>/missing.<suffix>")
24
- def square_planner_missing(zoom, x, y, size, suffix: str):
25
- mimetypes = {"geojson": "application/json", "gpx": "application/xml"}
26
- return Response(
27
- controller.export_missing_tiles(
28
- int(zoom),
29
- int(x),
30
- int(y),
31
- int(size),
32
- suffix,
33
- ),
34
- mimetype=mimetypes[suffix],
35
- headers={"Content-disposition": "attachment"},
36
- )
37
-
38
- return blueprint