geo-activity-playground 0.38.1__py3-none-any.whl → 0.39.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.
Files changed (113) hide show
  1. geo_activity_playground/__main__.py +5 -47
  2. geo_activity_playground/alembic/README +1 -0
  3. geo_activity_playground/alembic/env.py +76 -0
  4. geo_activity_playground/alembic/script.py.mako +26 -0
  5. geo_activity_playground/alembic/versions/451e7836b53d_add_square_planner_bookmark.py +33 -0
  6. geo_activity_playground/alembic/versions/63d3b7f6f93c_initial_version.py +73 -0
  7. geo_activity_playground/alembic/versions/ab83b9d23127_add_upstream_id.py +28 -0
  8. geo_activity_playground/alembic/versions/b03491c593f6_add_crop_indices.py +30 -0
  9. geo_activity_playground/alembic/versions/e02e27876deb_add_square_planner_bookmark_name.py +28 -0
  10. geo_activity_playground/alembic/versions/script.py.mako +28 -0
  11. geo_activity_playground/core/activities.py +50 -136
  12. geo_activity_playground/core/config.py +3 -3
  13. geo_activity_playground/core/datamodel.py +257 -0
  14. geo_activity_playground/core/enrichment.py +90 -92
  15. geo_activity_playground/core/heart_rate.py +1 -2
  16. geo_activity_playground/core/paths.py +6 -7
  17. geo_activity_playground/core/raster_map.py +43 -4
  18. geo_activity_playground/core/similarity.py +1 -2
  19. geo_activity_playground/core/tasks.py +2 -2
  20. geo_activity_playground/core/test_meta_search.py +3 -3
  21. geo_activity_playground/core/test_summary_stats.py +1 -1
  22. geo_activity_playground/explorer/grid_file.py +2 -2
  23. geo_activity_playground/explorer/tile_visits.py +8 -10
  24. geo_activity_playground/heatmap_video.py +7 -8
  25. geo_activity_playground/importers/activity_parsers.py +2 -2
  26. geo_activity_playground/importers/directory.py +9 -10
  27. geo_activity_playground/importers/strava_api.py +9 -9
  28. geo_activity_playground/importers/strava_checkout.py +12 -13
  29. geo_activity_playground/importers/test_csv_parser.py +3 -3
  30. geo_activity_playground/importers/test_directory.py +1 -1
  31. geo_activity_playground/importers/test_strava_api.py +1 -1
  32. geo_activity_playground/webui/app.py +94 -86
  33. geo_activity_playground/webui/authenticator.py +1 -1
  34. geo_activity_playground/webui/{activity/controller.py → blueprints/activity_blueprint.py} +246 -108
  35. geo_activity_playground/webui/{auth_blueprint.py → blueprints/auth_blueprint.py} +1 -1
  36. geo_activity_playground/webui/blueprints/bubble_chart_blueprint.py +61 -0
  37. geo_activity_playground/webui/{calendar/controller.py → blueprints/calendar_blueprint.py} +19 -19
  38. geo_activity_playground/webui/{eddington_blueprint.py → blueprints/eddington_blueprint.py} +9 -5
  39. geo_activity_playground/webui/blueprints/entry_views.py +68 -0
  40. geo_activity_playground/webui/{equipment_blueprint.py → blueprints/equipment_blueprint.py} +58 -4
  41. geo_activity_playground/webui/{explorer/controller.py → blueprints/explorer_blueprint.py} +88 -54
  42. geo_activity_playground/webui/blueprints/heatmap_blueprint.py +233 -0
  43. geo_activity_playground/webui/{search_blueprint.py → blueprints/search_blueprint.py} +7 -11
  44. geo_activity_playground/webui/blueprints/settings_blueprint.py +446 -0
  45. geo_activity_playground/webui/{square_planner_blueprint.py → blueprints/square_planner_blueprint.py} +31 -6
  46. geo_activity_playground/webui/{summary_blueprint.py → blueprints/summary_blueprint.py} +21 -26
  47. geo_activity_playground/webui/blueprints/tile_blueprint.py +27 -0
  48. geo_activity_playground/webui/{upload_blueprint.py → blueprints/upload_blueprint.py} +13 -18
  49. geo_activity_playground/webui/flasher.py +26 -0
  50. geo_activity_playground/webui/plot_util.py +1 -1
  51. geo_activity_playground/webui/search_util.py +4 -6
  52. geo_activity_playground/webui/static/images/layers-2x.png +0 -0
  53. geo_activity_playground/webui/static/images/layers.png +0 -0
  54. geo_activity_playground/webui/static/images/marker-icon-2x.png +0 -0
  55. geo_activity_playground/webui/static/images/marker-icon.png +0 -0
  56. geo_activity_playground/webui/static/images/marker-shadow.png +0 -0
  57. geo_activity_playground/webui/templates/activity/day.html.j2 +81 -0
  58. geo_activity_playground/webui/templates/activity/edit.html.j2 +38 -0
  59. geo_activity_playground/webui/{activity/templates → templates}/activity/name.html.j2 +29 -27
  60. geo_activity_playground/webui/{activity/templates → templates}/activity/show.html.j2 +60 -36
  61. geo_activity_playground/webui/templates/activity/trim.html.j2 +68 -0
  62. geo_activity_playground/webui/templates/bubble_chart/index.html.j2 +26 -0
  63. geo_activity_playground/webui/templates/calendar/index.html.j2 +48 -0
  64. geo_activity_playground/webui/templates/calendar/month.html.j2 +57 -0
  65. geo_activity_playground/webui/templates/equipment/index.html.j2 +7 -0
  66. geo_activity_playground/webui/templates/home.html.j2 +6 -6
  67. geo_activity_playground/webui/templates/page.html.j2 +2 -1
  68. geo_activity_playground/webui/{settings/templates → templates}/settings/index.html.j2 +9 -20
  69. geo_activity_playground/webui/templates/settings/manage-equipments.html.j2 +49 -0
  70. geo_activity_playground/webui/templates/settings/manage-kinds.html.j2 +48 -0
  71. geo_activity_playground/webui/{settings/templates → templates}/settings/metadata-extraction.html.j2 +1 -1
  72. geo_activity_playground/webui/{settings/templates → templates}/settings/privacy-zones.html.j2 +2 -0
  73. geo_activity_playground/webui/{settings/templates → templates}/settings/strava.html.j2 +2 -0
  74. geo_activity_playground/webui/templates/square_planner/index.html.j2 +63 -13
  75. {geo_activity_playground-0.38.1.dist-info → geo_activity_playground-0.39.0.dist-info}/METADATA +5 -1
  76. geo_activity_playground-0.39.0.dist-info/RECORD +133 -0
  77. geo_activity_playground/__init__.py +0 -0
  78. geo_activity_playground/core/__init__.py +0 -0
  79. geo_activity_playground/explorer/__init__.py +0 -0
  80. geo_activity_playground/importers/__init__.py +0 -0
  81. geo_activity_playground/webui/__init__.py +0 -0
  82. geo_activity_playground/webui/activity/__init__.py +0 -0
  83. geo_activity_playground/webui/activity/blueprint.py +0 -109
  84. geo_activity_playground/webui/activity/templates/activity/day.html.j2 +0 -80
  85. geo_activity_playground/webui/activity/templates/activity/edit.html.j2 +0 -42
  86. geo_activity_playground/webui/calendar/__init__.py +0 -0
  87. geo_activity_playground/webui/calendar/blueprint.py +0 -23
  88. geo_activity_playground/webui/calendar/templates/calendar/index.html.j2 +0 -46
  89. geo_activity_playground/webui/calendar/templates/calendar/month.html.j2 +0 -55
  90. geo_activity_playground/webui/entry_controller.py +0 -63
  91. geo_activity_playground/webui/explorer/__init__.py +0 -0
  92. geo_activity_playground/webui/explorer/blueprint.py +0 -62
  93. geo_activity_playground/webui/heatmap/__init__.py +0 -0
  94. geo_activity_playground/webui/heatmap/blueprint.py +0 -51
  95. geo_activity_playground/webui/heatmap/heatmap_controller.py +0 -216
  96. geo_activity_playground/webui/settings/blueprint.py +0 -262
  97. geo_activity_playground/webui/settings/controller.py +0 -272
  98. geo_activity_playground/webui/settings/templates/settings/equipment-offsets.html.j2 +0 -44
  99. geo_activity_playground/webui/settings/templates/settings/kind-renames.html.j2 +0 -25
  100. geo_activity_playground/webui/settings/templates/settings/kinds-without-achievements.html.j2 +0 -30
  101. geo_activity_playground/webui/tile_blueprint.py +0 -42
  102. geo_activity_playground-0.38.1.dist-info/RECORD +0 -129
  103. /geo_activity_playground/webui/{activity/templates → templates}/activity/lines.html.j2 +0 -0
  104. /geo_activity_playground/webui/{explorer/templates → templates}/explorer/index.html.j2 +0 -0
  105. /geo_activity_playground/webui/{heatmap/templates → templates}/heatmap/index.html.j2 +0 -0
  106. /geo_activity_playground/webui/{settings/templates → templates}/settings/admin-password.html.j2 +0 -0
  107. /geo_activity_playground/webui/{settings/templates → templates}/settings/color-schemes.html.j2 +0 -0
  108. /geo_activity_playground/webui/{settings/templates → templates}/settings/heart-rate.html.j2 +0 -0
  109. /geo_activity_playground/webui/{settings/templates → templates}/settings/segmentation.html.j2 +0 -0
  110. /geo_activity_playground/webui/{settings/templates → templates}/settings/sharepic.html.j2 +0 -0
  111. {geo_activity_playground-0.38.1.dist-info → geo_activity_playground-0.39.0.dist-info}/LICENSE +0 -0
  112. {geo_activity_playground-0.38.1.dist-info → geo_activity_playground-0.39.0.dist-info}/WHEEL +0 -0
  113. {geo_activity_playground-0.38.1.dist-info → geo_activity_playground-0.39.0.dist-info}/entry_points.txt +0 -0
@@ -64,6 +64,7 @@
64
64
  <ul class="dropdown-menu">
65
65
  <li><a class="dropdown-item" href="{{ url_for('calendar.index') }}">Calendar</a></li>
66
66
  <li><a class="dropdown-item" href="{{ url_for('search.index') }}">Overview & Search</a>
67
+ <li><a class="dropdown-item" href="{{ url_for('bubble_chart.index') }}">Bubble Chart</a>
67
68
  </li>
68
69
  </ul>
69
70
  </li>
@@ -195,7 +196,7 @@
195
196
 
196
197
  <div class="row border-top py-3 my-4">
197
198
  <ul class="nav col-4">
198
- <li class="nav-item text-muted px-2 nav-link">Version {{ version }}</li>
199
+ <li class="nav-item px-2 nav-link"><a href="https://github.com/martin-ueding/geo-activity-playground/blob/main/docs/changelog.md" class="nav-link px-2 text-muted" target="_blank">Version {{ version }}</a></li>
199
200
  </ul>
200
201
  <ul class="nav col-8 justify-content-end">
201
202
  <li class="nav-item"><a href="https://github.com/martin-ueding/geo-activity-playground"
@@ -32,38 +32,27 @@
32
32
  <div class="col">
33
33
  <div class="card">
34
34
  <div class="card-body">
35
- <h5 class="card-title">Equipment offsets</h5>
36
- <p class="card-text">Not all activities with a given equipment are recorded? Just set an offset.</p>
37
- <a href="{{ url_for('.equipment_offsets') }}" class="btn btn-primary">Set up equipment offsets</a>
35
+ <h5 class="card-title">Equipment</h5>
36
+ <p class="card-text">Manage your equipments here.</p>
37
+ <a href="{{ url_for('.manage_equipments') }}" class="btn btn-primary">Manage equipments</a>
38
38
  </div>
39
39
  </div>
40
40
  </div>
41
41
  <div class="col">
42
42
  <div class="card">
43
43
  <div class="card-body">
44
- <h5 class="card-title">Heart rate</h5>
45
- <p class="card-text">Specify maximum heart rate to derive heart rate zones.</p>
46
- <a href="{{ url_for('.heart_rate') }}" class="btn btn-primary">Set up heart rate</a>
47
- </div>
48
- </div>
49
- </div>
50
- <div class="col">
51
- <div class="card">
52
- <div class="card-body">
53
- <h5 class="card-title">Kind renames</h5>
54
- <p class="card-text">Bulk rename activity kinds</p>
55
- <a href="{{ url_for('.kind_renames') }}" class="btn btn-primary">Set up kind renames</a>
44
+ <h5 class="card-title">Kinds</h5>
45
+ <p class="card-text">Manage your activity kinds here.</p>
46
+ <a href="{{ url_for('.manage_kinds') }}" class="btn btn-primary">Manage kinds</a>
56
47
  </div>
57
48
  </div>
58
49
  </div>
59
50
  <div class="col">
60
51
  <div class="card">
61
52
  <div class="card-body">
62
- <h5 class="card-title">Kinds without achievements</h5>
63
- <p class="card-text">Recorded car rides that shouldn't count towards the explorer tiles? Exempt
64
- activity kinds from consideration.</p>
65
- <a href="{{ url_for('.kinds_without_achievements') }}" class="btn btn-primary">Set up kinds without
66
- achievements</a>
53
+ <h5 class="card-title">Heart rate</h5>
54
+ <p class="card-text">Specify maximum heart rate to derive heart rate zones.</p>
55
+ <a href="{{ url_for('.heart_rate') }}" class="btn btn-primary">Set up heart rate</a>
67
56
  </div>
68
57
  </div>
69
58
  </div>
@@ -0,0 +1,49 @@
1
+ {% extends "page.html.j2" %}
2
+
3
+ {% block container %}
4
+
5
+ <h1 class="mb-3">Equipments</h1>
6
+
7
+ <p>If you record every activity with an equipment but haven't started from the beginning, you might have a certain
8
+ distance that is not accounted for. In order to have this reflected in the equipment overview, you can enter offsets
9
+ here.</p>
10
+
11
+ <form method="POST">
12
+ <div class="row g-3 mb-1">
13
+ <div class="col">
14
+ <label class="form-label">Equipment</label>
15
+ </div>
16
+ <div class="col">
17
+ <label class="form-label">Offset / km</label>
18
+ </div>
19
+ </div>
20
+ {% for equipment in equipments %}
21
+ <div class="row g-3 mb-1">
22
+ <input type="hidden" name="id" value="{{ equipment.id }}" />
23
+ <div class="col">
24
+
25
+ <input type="text" class="form-control" id="name_{{ loop.index }}" name="name"
26
+ value="{{ equipment.name }}" />
27
+ </div>
28
+ <div class="col">
29
+ <input type="number" class="form-control" id="offset_km_{{ loop.index }}" name="offset_km"
30
+ value="{{ equipment.offset_km }}" />
31
+ </div>
32
+ </div>
33
+ {% endfor %}
34
+
35
+ <div class="row g-3 mb-3 mt-2">
36
+ <input type="hidden" name="id" value="" />
37
+ <div class="col">
38
+ <input type="text" class="form-control" id="name_new" name="name" />
39
+ </div>
40
+ <div class="col">
41
+ <input type="number" class="form-control" id="offset_km_new" name="offset_km" />
42
+ </div>
43
+ </div>
44
+
45
+ <button type="submit" class="btn btn-primary">Save</button>
46
+ </form>
47
+
48
+
49
+ {% endblock %}
@@ -0,0 +1,48 @@
1
+ {% extends "page.html.j2" %}
2
+
3
+ {% block container %}
4
+
5
+ <h1 class="mb-3">Kinds</h1>
6
+
7
+ <p>Apart from bicycle rides and runs, you might also record your car and train rides. If you don't want to include these
8
+ for achievements like explorer tiles, you can enter the activity kinds that should not be considered here.</p>
9
+
10
+ <form method="POST">
11
+ <div class="row g-3 mb-1">
12
+ <div class="col">
13
+ <label class="form-label">Kind</label>
14
+ </div>
15
+ <div class="col">
16
+ <label class="form-label">Consider for Achievements</label>
17
+ </div>
18
+ </div>
19
+ {% for kind in kinds %}
20
+ <div class="row g-3 mb-1">
21
+ <input type="hidden" name="id" value="{{ kind.id }}" />
22
+ <div class="col">
23
+
24
+ <input type="text" class="form-control" name="name" value="{{ kind.name }}" />
25
+ </div>
26
+ <div class="col">
27
+ <input type="checkbox" class="form-check-input" name="consider_for_achievements" value="{{ kind.id }}" {% if
28
+ kind.consider_for_achievements %} checked {% endif %} />
29
+ </div>
30
+ </div>
31
+ {% endfor %}
32
+
33
+ <div class="row g-3 mb-3 mt-2">
34
+ <input type="hidden" name="id" value="" />
35
+ <div class="col">
36
+ <input type="text" class="form-control" id="name_new" name="name" />
37
+ </div>
38
+ <div class="col">
39
+ <input type="checkbox" class="form-check-input" id="consider_for_achievements_new"
40
+ name="consider_for_achievements" value="new" />
41
+ </div>
42
+ </div>
43
+
44
+ <button type="submit" class="btn btn-primary">Save</button>
45
+ </form>
46
+
47
+
48
+ {% endblock %}
@@ -42,7 +42,7 @@
42
42
  </div>
43
43
 
44
44
  <p>Have a look at the documentation
45
- <a href="https://martin-ueding.github.io/geo-activity-playground/getting-started/advanced-metadata-extraction">Advanced Metadata Extraction</a>
45
+ <a href="https://martin-ueding.github.io/geo-activity-playground/advanced-metadata-extraction">Advanced Metadata Extraction</a>
46
46
  for explanations and examples.</p>
47
47
  </div>
48
48
  </div>
@@ -13,6 +13,8 @@
13
13
  <p>You can change the name on an existing privacy zone. To delete a zone, delete the name or the GeoJSON. Zones without
14
14
  a name will be deleted.</p>
15
15
 
16
+ <p>For more information about how to use this feature see <a href="https://martin-ueding.github.io/geo-activity-playground/create-a-privacy-zone/" target="_blank">this page in the documentation</a></p>
17
+
16
18
  <script>
17
19
  function add_map(id, geojson) {
18
20
  let map = L.map(`map-${id}`, {
@@ -14,6 +14,8 @@
14
14
  href="https://www.strava.com/settings/api">Strava API page</a> and create your own app. Then fill in
15
15
  "client ID" and "client secret" in the form.</p>
16
16
 
17
+ <p>For more information about how to use this feature see <a href="https://martin-ueding.github.io/geo-activity-playground/connect-strava-api/" target="_blank">this page in the documentation</a> For initial import of activities consider <a href="https://martin-ueding.github.io/geo-activity-playground/moving-from-strava/" target="_blank">importing a Strava Archive</a>.</p>
18
+
17
19
  <p>
18
20
  Status:
19
21
  {% if strava_client_code %}
@@ -13,16 +13,16 @@
13
13
  <tr>
14
14
  <td>
15
15
  <a class="btn btn-primary"
16
- href="/square-planner/{{ zoom }}/{{ square_x-1 }}/{{ square_y-1 }}/{{ square_size+1 }}">↖</a>
16
+ href="/square-planner/{{ zoom }}/{{ square_x-1 }}/{{ square_y-1 }}/{{ square_size+1 }}">↖&#xFE0E;</a>
17
17
  <a class="btn btn-primary"
18
- href="/square-planner/{{ zoom }}/{{ square_x+1 }}/{{ square_y+1 }}/{{ square_size-1 }}">↘</a>
18
+ href="/square-planner/{{ zoom }}/{{ square_x+1 }}/{{ square_y+1 }}/{{ square_size-1 }}">↘&#xFE0E;</a>
19
19
  </td>
20
20
  <td></td>
21
21
  <td>
22
22
  <a class="btn btn-primary"
23
- href="/square-planner/{{ zoom }}/{{ square_x }}/{{ square_y+1 }}/{{ square_size-1 }}">↙</a>
23
+ href="/square-planner/{{ zoom }}/{{ square_x }}/{{ square_y+1 }}/{{ square_size-1 }}">↙&#xFE0E;</a>
24
24
  <a class="btn btn-primary"
25
- href="/square-planner/{{ zoom }}/{{ square_x }}/{{ square_y-1 }}/{{ square_size+1 }}">↗</a>
25
+ href="/square-planner/{{ zoom }}/{{ square_x }}/{{ square_y-1 }}/{{ square_size+1 }}">↗&#xFE0E;</a>
26
26
  </td>
27
27
  </tr>
28
28
  <tr>
@@ -32,7 +32,7 @@
32
32
  <tr>
33
33
  <td>
34
34
  <a class="btn btn-primary"
35
- href="/square-planner/{{ zoom }}/{{ square_x-1 }}/{{ square_y-1 }}/{{ square_size }}">↖</a>
35
+ href="/square-planner/{{ zoom }}/{{ square_x-1 }}/{{ square_y-1 }}/{{ square_size }}">↖&#xFE0E;</a>
36
36
  </td>
37
37
  <td>
38
38
  <a class="btn btn-primary"
@@ -40,7 +40,7 @@
40
40
  </td>
41
41
  <td>
42
42
  <a class="btn btn-primary"
43
- href="/square-planner/{{ zoom }}/{{ square_x+1 }}/{{ square_y-1 }}/{{ square_size }}">↗</a>
43
+ href="/square-planner/{{ zoom }}/{{ square_x+1 }}/{{ square_y-1 }}/{{ square_size }}">↗&#xFE0E;</a>
44
44
  </td>
45
45
  </tr>
46
46
  <tr>
@@ -57,7 +57,7 @@
57
57
  <tr>
58
58
  <td>
59
59
  <a class="btn btn-primary"
60
- href="/square-planner/{{ zoom }}/{{ square_x-1 }}/{{ square_y+1 }}/{{ square_size }}">↙</a>
60
+ href="/square-planner/{{ zoom }}/{{ square_x-1 }}/{{ square_y+1 }}/{{ square_size }}">↙&#xFE0E;</a>
61
61
  </td>
62
62
  <td>
63
63
  <a class="btn btn-primary"
@@ -65,7 +65,7 @@
65
65
  </td>
66
66
  <td>
67
67
  <a class="btn btn-primary"
68
- href="/square-planner/{{ zoom }}/{{ square_x+1 }}/{{ square_y+1 }}/{{ square_size }}">↘</a>
68
+ href="/square-planner/{{ zoom }}/{{ square_x+1 }}/{{ square_y+1 }}/{{ square_size }}">↘&#xFE0E;</a>
69
69
  </td>
70
70
  </tr>
71
71
  </table>
@@ -75,16 +75,16 @@
75
75
  <tr>
76
76
  <td>
77
77
  <a class="btn btn-primary"
78
- href="/square-planner/{{ zoom }}/{{ square_x-1 }}/{{ square_y }}/{{ square_size+1 }}">↙</a>
78
+ href="/square-planner/{{ zoom }}/{{ square_x-1 }}/{{ square_y }}/{{ square_size+1 }}">↙&#xFE0E;</a>
79
79
  <a class="btn btn-primary"
80
- href="/square-planner/{{ zoom }}/{{ square_x+1 }}/{{ square_y }}/{{ square_size-1 }}">↗</a>
80
+ href="/square-planner/{{ zoom }}/{{ square_x+1 }}/{{ square_y }}/{{ square_size-1 }}">↗&#xFE0E;</a>
81
81
  </td>
82
82
  <td></td>
83
83
  <td>
84
84
  <a class="btn btn-primary"
85
- href="/square-planner/{{ zoom }}/{{ square_x }}/{{ square_y }}/{{ square_size-1 }}">↖</a>
85
+ href="/square-planner/{{ zoom }}/{{ square_x }}/{{ square_y }}/{{ square_size-1 }}">↖&#xFE0E;</a>
86
86
  <a class="btn btn-primary"
87
- href="/square-planner/{{ zoom }}/{{ square_x }}/{{ square_y }}/{{ square_size+1 }}">↘</a>
87
+ href="/square-planner/{{ zoom }}/{{ square_x }}/{{ square_y }}/{{ square_size+1 }}">↘&#xFE0E;</a>
88
88
  </td>
89
89
  </tr>
90
90
  </table>
@@ -145,7 +145,57 @@
145
145
  </div>
146
146
  </div>
147
147
 
148
- <p class="mb-3">This feature was developed in memory of Natenom who unfortunately didn't live to enjoy it for more tile
148
+
149
+ <form class="row row-cols-lg-auto g-3 align-items-center bm-3 mb-3" method="POST"
150
+ action="{{ url_for('.save_bookmark', zoom=zoom, x=square_x, y=square_y, size=square_size) }}">
151
+ <div class="col-12">
152
+ <label class="visually-hidden" for="inlineFormInputGroupUsername">Name</label>
153
+ <input type="text" class="form-control" id="inlineFormInputGroupUsername" placeholder="Name" name="name">
154
+ </div>
155
+
156
+ <div class="col-12">
157
+ <button type="submit" class="btn btn-primary">Create bookmark</button>
158
+ </div>
159
+ </form>
160
+
161
+
162
+ {% if bookmarks %}
163
+ <h2 class="mb-3">Bookmarks</h2>
164
+ <table class="table mb-3">
165
+ <thead>
166
+ <tr>
167
+ <th>Name</th>
168
+ <th>Zoom</th>
169
+ <th>X</th>
170
+ <th>Y</th>
171
+ <th>Size</th>
172
+ <th>Actions</th>
173
+ </tr>
174
+ </thead>
175
+ <tbody>
176
+ {% for bookmark in bookmarks %}
177
+ <tr>
178
+ <td>{{ bookmark.name }}</td>
179
+ <td>{{ bookmark.zoom }}</td>
180
+ <td>{{ bookmark.x }}</td>
181
+ <td>{{ bookmark.y }}</td>
182
+ <td>{{ bookmark.size }}</td>
183
+ <td>
184
+ <a class="btn btn-small btn-primary"
185
+ href="{{ url_for('.index', zoom=bookmark.zoom, x=bookmark.x, y=bookmark.y, size=bookmark.size) }}">Open</a>
186
+ <a class="btn btn-small btn-danger" href="{{ url_for('.delete_bookmark', id=bookmark.id) }}"
187
+ onclick="if(!confirm('Are you sure to Delete This?')){ event.preventDefault() }">Delete</a>
188
+ </td>
189
+ </tr>
190
+ {% endfor %}
191
+ </tbody>
192
+ </table>
193
+ {% endif %}
194
+
195
+ <hr />
196
+
197
+ <p class="mb-3">This feature was developed in memory of Natenom who unfortunately didn't live to enjoy it for more
198
+ tile
149
199
  exploring.</p>
150
200
 
151
201
  {% endblock %}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: geo-activity-playground
3
- Version: 0.38.1
3
+ Version: 0.39.0
4
4
  Summary: Analysis of geo data activities like rides, runs or hikes.
5
5
  License: MIT
6
6
  Author: Martin Ueding
@@ -12,12 +12,15 @@ Classifier: Programming Language :: Python :: 3.10
12
12
  Classifier: Programming Language :: Python :: 3.11
13
13
  Classifier: Programming Language :: Python :: 3.12
14
14
  Requires-Dist: Pillow (>=11.0.0,<12.0.0)
15
+ Requires-Dist: alembic (>=1.15.2,<2.0.0)
15
16
  Requires-Dist: altair (>=5.5.0,<6.0.0)
16
17
  Requires-Dist: appdirs (>=1.4.4,<2.0.0)
17
18
  Requires-Dist: charset-normalizer (>=3.3.2,<4.0.0)
18
19
  Requires-Dist: coloredlogs (>=15.0.1,<16.0.0)
19
20
  Requires-Dist: fitdecode (>=0.10.0,<0.11.0)
20
21
  Requires-Dist: flask (>=3.0.0,<4.0.0)
22
+ Requires-Dist: flask-alembic (>=3.1.1,<4.0.0)
23
+ Requires-Dist: flask-sqlalchemy (>=3.1.1,<4.0.0)
21
24
  Requires-Dist: geojson (>=3.0.1,<4.0.0)
22
25
  Requires-Dist: gpxpy (>=1.5.0,<2.0.0)
23
26
  Requires-Dist: jinja2 (>=3.1.2,<4.0.0)
@@ -28,6 +31,7 @@ Requires-Dist: pyarrow (>=19.0.1,<20.0.0)
28
31
  Requires-Dist: python-dateutil (>=2.8.2,<3.0.0)
29
32
  Requires-Dist: requests (>=2.28.1,<3.0.0)
30
33
  Requires-Dist: shapely (>=2.0.5,<3.0.0)
34
+ Requires-Dist: sqlalchemy (>=2.0.40,<3.0.0)
31
35
  Requires-Dist: stravalib (>=2.0,<3.0)
32
36
  Requires-Dist: tcxreader (>=0.4.5,<0.5.0)
33
37
  Requires-Dist: tomli (>=2.0.1,<3.0.0) ; python_version < "3.11"
@@ -0,0 +1,133 @@
1
+ geo_activity_playground/__main__.py,sha256=eL7NlKydYrzi4ikTvvKmlwkEFxx0V6CXOHOhRtazmd8,2907
2
+ geo_activity_playground/alembic/README,sha256=MVlc9TYmr57RbhXET6QxgyCcwWP7w-vLkEsirENqiIQ,38
3
+ geo_activity_playground/alembic/env.py,sha256=46oMzwSROaAsYuYWTd46txFdRLD3adm_SCn01A_ex8Q,2081
4
+ geo_activity_playground/alembic/script.py.mako,sha256=MEqL-2qATlST9TAOeYgscMn1uy6HUS9NFvDgl93dMj8,635
5
+ geo_activity_playground/alembic/versions/451e7836b53d_add_square_planner_bookmark.py,sha256=WrmlDllnJECg6cSOeS05wYCa977_SXbJUV5khDSzntw,1082
6
+ geo_activity_playground/alembic/versions/63d3b7f6f93c_initial_version.py,sha256=YTnnENkQ8WqLz7PFof7tUWNkWcoHGkAfAM52x1N9umo,3029
7
+ geo_activity_playground/alembic/versions/ab83b9d23127_add_upstream_id.py,sha256=Wz02lBP2r7-09DjuQP8u8i7ypQ2SZU5RUc422-_ZBDk,851
8
+ geo_activity_playground/alembic/versions/b03491c593f6_add_crop_indices.py,sha256=1pt7aes0PWJXZ98HxqeDK-ehaU9KLApjCmZYoqCa8V0,975
9
+ geo_activity_playground/alembic/versions/e02e27876deb_add_square_planner_bookmark_name.py,sha256=Y0OMxp5z_-CQ83rww6GEBFRawXu0J0pLrLArgSjJ7wQ,866
10
+ geo_activity_playground/alembic/versions/script.py.mako,sha256=3qBrHBf7F7ChKDUIdiNItiSXrDpgQdM7sR0YKzpaC50,689
11
+ geo_activity_playground/core/activities.py,sha256=7Z8xiT0juLdo1nQ3fPqWKtSp6MjRkSzd-_FYrzb-Tpg,5360
12
+ geo_activity_playground/core/config.py,sha256=eGWWbNfHa6H64AHCnFYTsAJ7-pWi-PhyxL4hjZ4u03U,5256
13
+ geo_activity_playground/core/coordinates.py,sha256=tDfr9mlXhK6E_MMIJ0vYWVCoH0Lq8uyuaqUgaa8i0jg,966
14
+ geo_activity_playground/core/datamodel.py,sha256=cbVNvvHLYHYBg-Gaabm3bewfro8uQ4Sqdq_0mujcos0,8693
15
+ geo_activity_playground/core/enrichment.py,sha256=LWAKF6mAKtiZcIF8ptAgpt8fYTYZAnSuXGHuX5TTO6o,7220
16
+ geo_activity_playground/core/heart_rate.py,sha256=-S3WAhS7AOywrw_Lk5jfuo_fu6zvZQ1VtjwEKSycWpU,1542
17
+ geo_activity_playground/core/meta_search.py,sha256=naErjAC7ZCFhOF6d492kbegZxCdzbpGcJvjQLJTE4xE,5016
18
+ geo_activity_playground/core/paths.py,sha256=aUXGuNn9hBvGPQWPoUJeImHN0PB0fS1tja1tm2eq8mA,2595
19
+ geo_activity_playground/core/privacy_zones.py,sha256=4TumHsVUN1uW6RG3ArqTXDykPVipF98DCxVBe7YNdO8,512
20
+ geo_activity_playground/core/raster_map.py,sha256=Cq8dNLdxVQg3Agzn2bmXVu0-8kZf56QrSe-LKNn3jaU,7994
21
+ geo_activity_playground/core/similarity.py,sha256=L2de3DPRdDeDY5AxZwLDcH7FjHWRWklr41VNU06q9kQ,3117
22
+ geo_activity_playground/core/summary_stats.py,sha256=v5FtWnE1imDF5axI6asVN55wCrlD73oZ6lvqzxsTN2c,1006
23
+ geo_activity_playground/core/tasks.py,sha256=-_9cxekoHSWzCW4XblNeqrwi2tTqr5AE7_-p8fdqhwc,2886
24
+ geo_activity_playground/core/test_meta_search.py,sha256=zhuD343Xce-4Fkznw81DHQ7pK5eyX5UbcyCHuYRKsr8,3091
25
+ geo_activity_playground/core/test_summary_stats.py,sha256=qH_45mPRFD2H-Rr0Ku-RYc67vhC7qKxbPr7J2F36uV8,3081
26
+ geo_activity_playground/core/test_tiles.py,sha256=zce1FxNfsSpOQt66jMehdQRVoNdl-oiFydx6iVBHZXM,764
27
+ geo_activity_playground/core/test_time_conversion.py,sha256=Sh6nZA3uCTOdZTZa3yOijtR0m74QtZu2mcWXsDNnyQI,984
28
+ geo_activity_playground/core/tiles.py,sha256=lV6X1Uc9XQecu2LALIvxpnMcLsVtWx7JczJ5a_S1eZE,2139
29
+ geo_activity_playground/core/time_conversion.py,sha256=x5mXG6Y4GtdX7CBmwucGNSWBp9JQJDbZ7u0JkdUY1Vs,379
30
+ geo_activity_playground/explorer/grid_file.py,sha256=YNL_c4O1-kxaajATJwj4ZLywCL5Hpj9qy2h-F7rk8Yg,3260
31
+ geo_activity_playground/explorer/tile_visits.py,sha256=C8IpAGmrjMGYhyTVK-tl2ptM9-CXF2mwibhJYn7gLf8,13905
32
+ geo_activity_playground/explorer/video.py,sha256=7j6Qv3HG6On7Tn7xh7Olwrx_fbQnfzS7CeRg3TEApHg,4397
33
+ geo_activity_playground/heatmap_video.py,sha256=I8i1uVvbbPUXVtvLAROaLy58nQoUPnuMCZkERWNkQjg,3318
34
+ geo_activity_playground/importers/activity_parsers.py,sha256=DL11K2KFcESo7SC4CrvV4u1RALT5TbUJ22oOp7f1aG0,11058
35
+ geo_activity_playground/importers/csv_parser.py,sha256=O1pP5GLhWhnWcy2Lsrr9g17Zspuibpt-GtZ3ZS5eZF4,2143
36
+ geo_activity_playground/importers/directory.py,sha256=4Q7UAFa7ztkgqf4FvPbH2LlrO-7a8Fu7tkYPHOpHm1g,5210
37
+ geo_activity_playground/importers/strava_api.py,sha256=J0-VXNrLq22fhTcWkQPE5AVrzy5aegC7SBi-UXFtAy4,7576
38
+ geo_activity_playground/importers/strava_checkout.py,sha256=EixNFXXnxkopqUs0qe6iShYTbGu_o_g2_1lxuUIsz4E,9679
39
+ geo_activity_playground/importers/test_csv_parser.py,sha256=nOTVTdlzIY0TDcbWp7xNyNaIO6Mkeu55hVziVl22QE4,1092
40
+ geo_activity_playground/importers/test_directory.py,sha256=_fn_-y98ZyElbG0BRxAmGFdtGobUShPU86SdEOpuv-A,691
41
+ geo_activity_playground/importers/test_strava_api.py,sha256=7b8bl5Rh2BctCmvTPEhCadxtUOq3mfzuadD6F5XxRio,398
42
+ geo_activity_playground/webui/app.py,sha256=K-xZsNjorxPhVl9_z-W1MX0_s3gTjZ8XU7P56SFhwDk,6872
43
+ geo_activity_playground/webui/authenticator.py,sha256=jtQqvpVHa_eLTAulmvvJgDRoCWOEege49G9zn3MfYk8,1394
44
+ geo_activity_playground/webui/blueprints/activity_blueprint.py,sha256=ERYcUqvaG-hQqOr6uKEIZzGk1WelNKDHwvecsfu2c3c,24328
45
+ geo_activity_playground/webui/blueprints/auth_blueprint.py,sha256=_VZeP3VN626BoOOZUkNVnuw9v-cEOrkHz5lhFPmxqMY,784
46
+ geo_activity_playground/webui/blueprints/bubble_chart_blueprint.py,sha256=tiqDf-DZLdjm8faatZ5fqbh7gkII2KmBPRtkcKqoLIA,2194
47
+ geo_activity_playground/webui/blueprints/calendar_blueprint.py,sha256=L6R8xieYYXeEMDzJs-MjWax1JAHhppWy3r3U8MyCOAk,2585
48
+ geo_activity_playground/webui/blueprints/eddington_blueprint.py,sha256=DHvq1gY8-C7xsHp5LxqM3eN2eAOwbyLyBH3J8E0zXps,6937
49
+ geo_activity_playground/webui/blueprints/entry_views.py,sha256=-CRrE5b9QYyrmQhLYSW0qo20XRY9RDDJUepJCwFoKOs,2322
50
+ geo_activity_playground/webui/blueprints/equipment_blueprint.py,sha256=juQ5L2BlrECb00LBbiY2yc0b8W_B9Y3fPwtbiaRfgpo,5634
51
+ geo_activity_playground/webui/blueprints/explorer_blueprint.py,sha256=ZNDRwtmYvWGyqDe3fszGp0DR5qzRRxRss32ZGPRuXsY,12469
52
+ geo_activity_playground/webui/blueprints/heatmap_blueprint.py,sha256=iHI5YJYhX7ZOlzTgzl2efIRDzt3UMYCx7X4-LVd0MWk,8702
53
+ geo_activity_playground/webui/blueprints/search_blueprint.py,sha256=Sv_KL1Cdai26y51qVfI-5jZLhtElREsEar1dbR_VAC4,2275
54
+ geo_activity_playground/webui/blueprints/settings_blueprint.py,sha256=UUv63BDQFnBPq8fLDdlWHd5mxL5qIgcGUuqQRFemyEA,16108
55
+ geo_activity_playground/webui/blueprints/square_planner_blueprint.py,sha256=xVaxJxmt8Dysl3UL9f2y__LVLtTH2Np1Ust4OSXKRAk,4746
56
+ geo_activity_playground/webui/blueprints/summary_blueprint.py,sha256=g7j0wmqk3PwPJ-zQrSEJMcke1SUsrSkiOBhOfzaIP1A,9126
57
+ geo_activity_playground/webui/blueprints/tile_blueprint.py,sha256=YzZf9OrNdjhc1_j4MtO1DMcw1uCv29ueNsYd-mWqgbg,837
58
+ geo_activity_playground/webui/blueprints/upload_blueprint.py,sha256=_VeGu08vlRZlRn5J4t7VdBk2TTW5GXB4JUcge9mbX9Y,4111
59
+ geo_activity_playground/webui/flasher.py,sha256=Covc1D9cO_jjokRWnvyiXCc2tfp3aZ8XkNqFdA1AXtk,500
60
+ geo_activity_playground/webui/plot_util.py,sha256=5Uesjj-xcMskQX2z9viDZYHSxLGrH2a5dHA1ogsJW9U,261
61
+ geo_activity_playground/webui/search_util.py,sha256=uAxnN9Tdei8IKV6Lqx4z5UIJf0_HKLd9NG9meiu5u4s,2202
62
+ geo_activity_playground/webui/static/Leaflet.fullscreen.min.js,sha256=MMWj_yFOercjzhk8wKIIKyDCK7olXrwk_7R7TjDhGYs,3677
63
+ geo_activity_playground/webui/static/MarkerCluster.Default.css,sha256=LWhzWaQGZRsWFrrJxg-6Zn8TT84k0_trtiHBc6qcGpY,1346
64
+ geo_activity_playground/webui/static/MarkerCluster.css,sha256=-bdWuWOXMFkX0v9Cvr3OWClPiYefDQz9GGZP_7xZxdc,886
65
+ geo_activity_playground/webui/static/android-chrome-192x192.png,sha256=yxZgo8Jw4hrgOgrn3tvi9G0AXWGFD29kjCuxC07WoT4,17610
66
+ geo_activity_playground/webui/static/android-chrome-512x512.png,sha256=Uiv62gQpUjMOdp9d6exzd6IyOi5zgQdgjIVVWYw5m98,38891
67
+ geo_activity_playground/webui/static/apple-touch-icon.png,sha256=TNLa0YIS1mbWajvIQthC2bGve6ET3DbJzrAbs6Pf3Ps,13046
68
+ geo_activity_playground/webui/static/bootstrap-dark-mode.js,sha256=XfyhxIFgjDc6aEj0kYgKpG5zjS5gvyhWCJmNfUG4HJY,2622
69
+ geo_activity_playground/webui/static/bootstrap.bundle.min.js,sha256=gvZPYrsDwbwYJLD5yeBfcNujPhRoGOY831wwbIzz3t0,80663
70
+ geo_activity_playground/webui/static/bootstrap.min.css,sha256=MBffSnbbXwHCuZtgPYiwMQbfE7z-GOZ7fBPCNB06Z98,232948
71
+ geo_activity_playground/webui/static/browserconfig.xml,sha256=u5EvU6U1jKSDiXHW0i4rXrs0lT_tmS82otbJnvmccrk,253
72
+ geo_activity_playground/webui/static/favicon-16x16.png,sha256=Yy8lRjGB7itDaeUI_l_Toq3OO0gzgPGnqIfM3CqcQy0,1419
73
+ geo_activity_playground/webui/static/favicon-32x32.png,sha256=K52R99pLGgWHnjFPPkVieBm051Er-sTCiMvgLr9Alrg,2587
74
+ geo_activity_playground/webui/static/favicon-48x48.png,sha256=NIIuC1OV1umv2pETJH2yDUZhhzJDk0TERsbwA5tQM9A,2008
75
+ geo_activity_playground/webui/static/favicon.ico,sha256=zAkbToeh1fq8rh6osWyEjr-cgdX-ec5viI0vPAwLn7A,15086
76
+ geo_activity_playground/webui/static/favicon.svg,sha256=gwESIDvoxOpg3tHvbiAc-wVEM4fY0pFzWnX_guQcv1c,52247
77
+ geo_activity_playground/webui/static/fullscreen.png,sha256=yDtz-dhjuAoo6q9xc00-_XNTrGwEWrN80pOneFdol4g,299
78
+ geo_activity_playground/webui/static/fullscreen@2x.png,sha256=HVi2guZO6sekf2NggilbzjUTvJDweXpSMBS81fhtnX0,420
79
+ geo_activity_playground/webui/static/images/layers-2x.png,sha256=Bm2sqFDY_77wB68AsG6sABVyje4nnFHzy2xxbffELt8,1259
80
+ geo_activity_playground/webui/static/images/layers.png,sha256=Hbvp0CjikvNvy6j4s6KNXokydU_CIVuaxp5M3s9RB8Y,696
81
+ geo_activity_playground/webui/static/images/marker-icon-2x.png,sha256=ABecTB7oMNOhCEEq4NKU9Vd2z-sIXGASmjmqb8SuJSg,2464
82
+ geo_activity_playground/webui/static/images/marker-icon.png,sha256=V0w6XMqF9BFAhbaEFZbWLwDXyJLHsD8oy_owHesdxDc,1466
83
+ geo_activity_playground/webui/static/images/marker-shadow.png,sha256=Jk9cZAM58ELdcpBiz8BMF_jqDymIK1OOOEjtjxDttNo,618
84
+ geo_activity_playground/webui/static/leaflet.css,sha256=p4NxAoJBhIIN-hmNHrzRCf9tD_miZyoHS5obTRR9BMY,14806
85
+ geo_activity_playground/webui/static/leaflet.fullscreen.css,sha256=YTbhDGEH5amI_JfotPMN7IByFpsN9e4tCBnv5oNdvHU,994
86
+ geo_activity_playground/webui/static/leaflet.js,sha256=20nQCchB9co0qIjJZRGuk2_Z9VM-kNiyxNV1lvTlZBo,147552
87
+ geo_activity_playground/webui/static/leaflet.markercluster.js,sha256=WL6HHfYfbFEkZOFdsJQeY7lJG_E5airjvqbznghUzRw,33724
88
+ geo_activity_playground/webui/static/mstile-150x150.png,sha256=j1ANUQJ1Xi1DR2sGqYZztob2ypfGw04eNtGpN9SxExA,11964
89
+ geo_activity_playground/webui/static/site.webmanifest,sha256=G5wl5Ahfz6wyDt-Z7ea-ywG1WS1S7ZQ_QX9TM2ox6Lk,450
90
+ geo_activity_playground/webui/static/table-sort.min.js,sha256=sFeDrgkXTePr2ciJU9_mLh-Z8qtYhPIQMgOZtj0LwBY,8506
91
+ geo_activity_playground/webui/static/vega-embed@6,sha256=EtAqz74-xZ75o33UgiouBOKWG1u7Zxu-Zh0iIXFbmdo,60630
92
+ geo_activity_playground/webui/static/vega-lite@4,sha256=roXmcY9bUF91uB9V-eSEUHEgfwoXe6B1xoDPuIe5ou8,267999
93
+ geo_activity_playground/webui/static/vega@5,sha256=5DLHUaY2P0ph2mKSDMfX69E88J2ClJ-PSGJI-Acdw84,514536
94
+ geo_activity_playground/webui/static/web-app-manifest-192x192.png,sha256=eEImN6iWfSv-EnSNPL5WbX84PKakse_8VZMBPWWye3o,13582
95
+ geo_activity_playground/webui/static/web-app-manifest-512x512.png,sha256=vU9oQ4HnQerFDZVzcAT9twj4_Doc6_9v9wVvoRI-f_E,48318
96
+ geo_activity_playground/webui/templates/activity/day.html.j2,sha256=CHEvxlZralCm3-kTbZsGn0xj9VdSv9V5zalPSoAluus,2810
97
+ geo_activity_playground/webui/templates/activity/edit.html.j2,sha256=9HDFjYfUQBB6HAgeIZppFPlpiJ1vDZWcGyP7uYG_Hnw,1369
98
+ geo_activity_playground/webui/templates/activity/lines.html.j2,sha256=_ZDg1ruW-9UMJfOudy1-uY_-IcSSaagq7tPCih5Bb8g,1079
99
+ geo_activity_playground/webui/templates/activity/name.html.j2,sha256=7Wbh3IrVL5lMRve467H0P10Shn5FzGpaXLhV0H-X4Hk,2725
100
+ geo_activity_playground/webui/templates/activity/show.html.j2,sha256=OjgD8uM1L8nO12yPcHAhqMPFOtA2k2iUNkCT3EhHBg8,8318
101
+ geo_activity_playground/webui/templates/activity/trim.html.j2,sha256=3oAXQab6QqWjGBC9KCvWNOVn8uRmxoDLj3hx_O63TXc,1836
102
+ geo_activity_playground/webui/templates/auth/index.html.j2,sha256=ILQ5HvTEYc3OrtOAIFt1VrqWorVD70V9DC342znmP70,579
103
+ geo_activity_playground/webui/templates/bubble_chart/index.html.j2,sha256=pqyafhIgL97FuD4_-lMb8lRWC3rejwrjawbmfp17XFY,1143
104
+ geo_activity_playground/webui/templates/calendar/index.html.j2,sha256=8dV9yeDwfv0Mm81mhiPHN5r3hdPUWl1Yye03x0Rqbo8,1601
105
+ geo_activity_playground/webui/templates/calendar/month.html.j2,sha256=IEhGqknL69okX5brMzTgZdnmrgUQLmGGkDE5zd7RG7s,2008
106
+ geo_activity_playground/webui/templates/eddington/index.html.j2,sha256=_3oxzHhC_s9ATtvGmuIWKqvjIQYJNvdCxmYnOyN9QnY,3716
107
+ geo_activity_playground/webui/templates/equipment/index.html.j2,sha256=wwrGmfCCBn-5CzMymi80hg3lNMZ7J1fAWWl_2zHeiMc,1845
108
+ geo_activity_playground/webui/templates/explorer/index.html.j2,sha256=3t9ikAF6oMvEaVlS3Kb1tj9ngomIQlatzqPnqVsEDKA,6908
109
+ geo_activity_playground/webui/templates/heatmap/index.html.j2,sha256=kTVvEt-GmSNebDlVMa6zwyIuP0mJcZQFuqj-IY8JV5U,1359
110
+ geo_activity_playground/webui/templates/home.html.j2,sha256=vQp9uMn7BLY7pexWJVpQVWN8ZbbtWZvkW_hYSkYQeZs,2212
111
+ geo_activity_playground/webui/templates/page.html.j2,sha256=TSNEZNLFzJ76G_22dDIXoTozfdWjmKk03qZl6exsdCQ,11043
112
+ geo_activity_playground/webui/templates/search/index.html.j2,sha256=_kxTgsdbT8o-4ryW0pvyWE7a-rOs7xzGUpdSPp8Q1is,1320
113
+ geo_activity_playground/webui/templates/search_form.html.j2,sha256=TG9xIql0HnhsXtbHZxl3GLBt6cGYjA8jPeBq11syQ3A,6512
114
+ geo_activity_playground/webui/templates/settings/admin-password.html.j2,sha256=VYwddpObD1RpeTH5Dm4y7VtmT7kwURDCIjxyzJeq08c,495
115
+ geo_activity_playground/webui/templates/settings/color-schemes.html.j2,sha256=iR91Wxd2_TMuIo9dBDZBrWSUGHNwTwzC6O8oNH-XBt4,1653
116
+ geo_activity_playground/webui/templates/settings/heart-rate.html.j2,sha256=UPT3MegRgSeff36lhCo0l3ZwhqNSIg5gM6h2s32GkCY,4255
117
+ geo_activity_playground/webui/templates/settings/index.html.j2,sha256=3a62-F3EWZpY-n0zB8sBgQSx_HUyr_2OWOa5neln94o,4648
118
+ geo_activity_playground/webui/templates/settings/manage-equipments.html.j2,sha256=vPGGlwyG_xMZc4a6JdajwWMJBfN1lBNBtDSt6QPJBiY,1585
119
+ geo_activity_playground/webui/templates/settings/manage-kinds.html.j2,sha256=382VW-cEe0iPJ8TNL2jrcRtVYb_RFdzDyeC1ncpWZ9M,1616
120
+ geo_activity_playground/webui/templates/settings/metadata-extraction.html.j2,sha256=0g9RlHFKipN45RaH_FANWnY1lfXUkKjtc_9B-vJ19LQ,2298
121
+ geo_activity_playground/webui/templates/settings/privacy-zones.html.j2,sha256=KpTMhzl-m6v5WQSHzWB3KaR7uMNg9Sd3R06twkJ1Zg4,3254
122
+ geo_activity_playground/webui/templates/settings/segmentation.html.j2,sha256=QV72TZcIxqql-vEsq2lKHzo5UxoxeeXkRA9se46GWKU,1187
123
+ geo_activity_playground/webui/templates/settings/sharepic.html.j2,sha256=qZkfEpd4CtKKMaSSVadqvNEgMRYLV-0X-pw5-nJvukk,678
124
+ geo_activity_playground/webui/templates/settings/strava.html.j2,sha256=GCE5gskQ6xJ8AM1qGrrUVLDOiuqg510mWzzsZjia0gk,2211
125
+ geo_activity_playground/webui/templates/square_planner/index.html.j2,sha256=-OnY2nQCgZCslOzf28ogZwFykwF8tZm7PgFwOE3eBDk,8176
126
+ geo_activity_playground/webui/templates/summary/index.html.j2,sha256=bM89LdumssVvmuI0EeI8mnzMYxSzNjWY_XWfzn-f6nI,5377
127
+ geo_activity_playground/webui/templates/upload/index.html.j2,sha256=I1Ix8tDS3YBdi-HdaNfjkzYXVVCjfUTe5PFTnap1ydc,775
128
+ geo_activity_playground/webui/templates/upload/reload.html.j2,sha256=YZWX5eDeNyqKJdQAywDBcU8DZBm22rRBbZqFjrFrCvQ,556
129
+ geo_activity_playground-0.39.0.dist-info/LICENSE,sha256=4RpAwKO8bPkfXH2lnpeUW0eLkNWglyG4lbrLDU_MOwY,1070
130
+ geo_activity_playground-0.39.0.dist-info/METADATA,sha256=jughq9g1K5BCZKW7diQ6A8p9Lmp1CJk3vlQhDUcYmc0,1758
131
+ geo_activity_playground-0.39.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
132
+ geo_activity_playground-0.39.0.dist-info/entry_points.txt,sha256=pbNlLI6IIZIp7nPYCfAtiSiz2oxJSCl7DODD6SPkLKk,81
133
+ geo_activity_playground-0.39.0.dist-info/RECORD,,
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -1,109 +0,0 @@
1
- import json
2
- import urllib.parse
3
-
4
- from flask import Blueprint
5
- from flask import redirect
6
- from flask import render_template
7
- from flask import request
8
- from flask import Response
9
- from flask import url_for
10
-
11
- from geo_activity_playground.core.activities import ActivityRepository
12
- from geo_activity_playground.core.paths import activity_meta_override_dir
13
- from geo_activity_playground.webui.activity.controller import ActivityController
14
- from geo_activity_playground.webui.authenticator import Authenticator
15
- from geo_activity_playground.webui.authenticator import needs_authentication
16
-
17
-
18
- def make_activity_blueprint(
19
- activity_controller: ActivityController,
20
- repository: ActivityRepository,
21
- authenticator: Authenticator,
22
- ) -> Blueprint:
23
- blueprint = Blueprint("activity", __name__, template_folder="templates")
24
-
25
- @blueprint.route("/all")
26
- def all():
27
- return render_template(
28
- "activity/lines.html.j2", **activity_controller.render_all()
29
- )
30
-
31
- @blueprint.route("/<id>")
32
- def show(id: str):
33
- return render_template(
34
- "activity/show.html.j2", **activity_controller.render_activity(int(id))
35
- )
36
-
37
- @blueprint.route("/<id>/sharepic.png")
38
- def sharepic(id: str):
39
- return Response(
40
- activity_controller.render_sharepic(int(id)),
41
- mimetype="image/png",
42
- )
43
-
44
- @blueprint.route("/day/<year>/<month>/<day>")
45
- def day(year: str, month: str, day: str):
46
- return render_template(
47
- "activity/day.html.j2",
48
- **activity_controller.render_day(int(year), int(month), int(day)),
49
- )
50
-
51
- @blueprint.route("/day-sharepic/<year>/<month>/<day>/sharepic.png")
52
- def day_sharepic(year: str, month: str, day: str):
53
- return Response(
54
- activity_controller.render_day_sharepic(int(year), int(month), int(day)),
55
- mimetype="image/png",
56
- )
57
-
58
- @blueprint.route("/name/<name>")
59
- def name(name: str):
60
- return render_template(
61
- "activity/name.html.j2",
62
- **activity_controller.render_name(urllib.parse.unquote(name)),
63
- )
64
-
65
- @blueprint.route("/edit/<id>", methods=["GET", "POST"])
66
- @needs_authentication(authenticator)
67
- def edit(id: str):
68
- activity_id = int(id)
69
- activity = repository.get_activity_by_id(activity_id)
70
- override_file = activity_meta_override_dir() / f"{activity_id}.json"
71
- if override_file.exists():
72
- with open(override_file) as f:
73
- override = json.load(f)
74
- else:
75
- override = {}
76
-
77
- if request.method == "POST":
78
- override = {}
79
- if value := request.form.get("name"):
80
- override["name"] = value
81
- repository.meta.loc[activity_id, "name"] = value
82
- if value := request.form.get("kind"):
83
- override["kind"] = value
84
- repository.meta.loc[activity_id, "kind"] = value
85
- if value := request.form.get("equipment"):
86
- override["equipment"] = value
87
- repository.meta.loc[activity_id, "equipment"] = value
88
- if value := request.form.get("commute"):
89
- override["commute"] = True
90
- repository.meta.loc[activity_id, "commute"] = True
91
- if value := request.form.get("consider_for_achievements"):
92
- override["consider_for_achievements"] = True
93
- repository.meta.loc[activity_id, "consider_for_achievements"] = True
94
-
95
- with open(override_file, "w") as f:
96
- json.dump(override, f, ensure_ascii=False, indent=4, sort_keys=True)
97
-
98
- repository.save()
99
-
100
- return redirect(url_for(".show", id=activity_id))
101
-
102
- return render_template(
103
- "activity/edit.html.j2",
104
- activity_id=activity_id,
105
- activity=activity,
106
- override=override,
107
- )
108
-
109
- return blueprint