aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Schadt <kingdread@gmx.de>2026-09-30 17:31:40 +0200
committerDaniel Schadt <kingdread@gmx.de>2026-09-30 17:31:40 +0200
commit731cc2aeaed97dde06091f2600f6ffeacbf3eed3 (patch)
treece7c372d39c01011d93eac81a2cd465cbb981010
parent4653773ae29b75c07cec5b53a655d2c29a2bc135 (diff)
downloadfietsboek-731cc2aeaed97dde06091f2600f6ffeacbf3eed3.tar.gz
fietsboek-731cc2aeaed97dde06091f2600f6ffeacbf3eed3.tar.bz2
fietsboek-731cc2aeaed97dde06091f2600f6ffeacbf3eed3.zip
add a button to re-extract climbs
-rw-r--r--fietsboek/routes.py3
-rw-r--r--fietsboek/templates/details.jinja26
-rw-r--r--fietsboek/views/detail.py24
3 files changed, 32 insertions, 1 deletions
diff --git a/fietsboek/routes.py b/fietsboek/routes.py
index bf8db1a..2e1a171 100644
--- a/fietsboek/routes.py
+++ b/fietsboek/routes.py
@@ -41,6 +41,9 @@ def includeme(config):
"delete-track", "/track/{track_id}/delete", factory="fietsboek.models.Track.factory"
)
config.add_route(
+ "reclimb-track", "/track/{track_id}/reclimb", factory="fietsboek.models.Track.factory"
+ )
+ config.add_route(
"add-comment", "/track/{track_id}/comment", factory="fietsboek.models.Track.factory"
)
config.add_route(
diff --git a/fietsboek/templates/details.jinja2 b/fietsboek/templates/details.jinja2
index 0bbcd44..a800998 100644
--- a/fietsboek/templates/details.jinja2
+++ b/fietsboek/templates/details.jinja2
@@ -36,8 +36,14 @@
<div class="btn-group" role="group">
<a class="btn btn-success ui-element" href="{{ request.route_path('edit', track_id=track.id) }}"><i class="bi-pencil-square"></i> {{ _("page.details.edit") }}</a>
<button type="button" class="btn btn-info ui-element" id="showShareLink" data-bs-toggle="modal" data-bs-target="#shareLinkModal"><i class="bi-share"></i> {{ _("page.details.share") }}</button>
+ <button type="submit" class="btn btn-info ui-element" form="reclimbForm"><i class="bi bi-graph-up-arrow"></i> {{ _("page.details.reclimb") }}</button>
<button type="button" class="btn btn-danger ui-element" id="deleteLink" data-bs-toggle="modal" data-bs-target="#deleteModal"><i class="bi bi-trash"></i> {{ _("page.details.delete") }}</button>
</div>
+
+ <form id="reclimbForm" method="POST" action="{{ request.route_path('reclimb-track', track_id=track.id) }}">
+ {{ util.hidden_csrf_input() }}
+ </form>
+
<div class="modal fade" id="shareLinkModal" tabindex="-1" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
diff --git a/fietsboek/views/detail.py b/fietsboek/views/detail.py
index 9454b94..46e9f5f 100644
--- a/fietsboek/views/detail.py
+++ b/fietsboek/views/detail.py
@@ -5,6 +5,7 @@ import gzip
import io
import logging
from html.parser import HTMLParser
+from threading import Thread
from markupsafe import Markup
from pyramid.httpexceptions import (
@@ -18,7 +19,7 @@ from pyramid.response import FileResponse, Response
from pyramid.view import view_config
from sqlalchemy import select
-from .. import models, pdf, trackmap, util
+from .. import actions, models, pdf, trackmap, util
from ..models.track import Track, TrackWithMetadata
from .tileproxy import ITileRequester
@@ -195,6 +196,27 @@ def delete_track(request):
return HTTPFound(request.route_url("home"))
+@view_config(route_name="reclimb-track", request_method="POST", permission="track.edit")
+def reclimb_track(request):
+ track = request.context
+ track_id = track.id
+ loader: ITileRequester = request.registry.getUtility(ITileRequester)
+ layer = request.config.public_tile_layers()[0]
+ def _extract_climbs():
+ LOGGER.debug("Starting climb extraction for track %d", track_id)
+ request.redis.set(f"bg-tasks:track-{track_id}", 1)
+ session = request.registry["dbsession_factory"]()
+ track = session.get(Track, track_id)
+ with session:
+ actions.extract_climbs(session, track, loader, layer)
+ session.commit()
+ request.redis.delete(f"bg-tasks:track-{track_id}")
+ LOGGER.debug("Climb extraction done")
+ Thread(name=f"reclimb-{track_id}", target=_extract_climbs).start()
+
+ return HTTPFound(request.route_url("details", track_id=track_id))
+
+
@view_config(route_name="badge", http_cache=3600)
def badge(request):
"""Returns the image data associated with a badge.