aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Schadt <kingdread@gmx.de>2026-09-30 18:05:38 +0200
committerDaniel Schadt <kingdread@gmx.de>2026-09-30 18:05:38 +0200
commit8f5bd60f507b695ccdc881fdda59e60d121606eb (patch)
tree782aa6947c4f33bf3ad88642be1689860d255d2c
parent731cc2aeaed97dde06091f2600f6ffeacbf3eed3 (diff)
downloadfietsboek-8f5bd60f507b695ccdc881fdda59e60d121606eb.tar.gz
fietsboek-8f5bd60f507b695ccdc881fdda59e60d121606eb.tar.bz2
fietsboek-8f5bd60f507b695ccdc881fdda59e60d121606eb.zip
move common background code to actions
at some point, this would probably be worth its own module (e.g. if we also want to do heatmap generation after an upload)
-rw-r--r--fietsboek/actions.py28
-rw-r--r--fietsboek/views/detail.py18
-rw-r--r--fietsboek/views/upload.py17
3 files changed, 30 insertions, 33 deletions
diff --git a/fietsboek/actions.py b/fietsboek/actions.py
index bcde0e4..0c28268 100644
--- a/fietsboek/actions.py
+++ b/fietsboek/actions.py
@@ -11,6 +11,7 @@ import gzip
import io
import logging
import re
+from threading import Thread
from typing import Optional
from pyramid.i18n import TranslationString as _
@@ -26,7 +27,7 @@ from .data import DataManager, TrackDataDir
from .geo import Path
from .models.track import TrackType, Visibility
from .models.user import TokenType
-from .views.tileproxy import TileRequester
+from .views.tileproxy import ITileRequester, TileRequester
LOGGER = logging.getLogger(__name__)
@@ -346,4 +347,29 @@ def extract_climbs(
dbsession.add(climb)
+def extract_climbs_background(request: Request, track_id: int):
+ """Re-extracts the climbs of the given track in the background.
+
+ This spawns a new thread that calls :func:`extract_climbs` in a new thread.
+
+ :param request: The request.
+ :param track_id: The track's 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(models.Track, track_id)
+ with session:
+ 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"climbs-{track_id}", target=_extract_climbs).start()
+
+
__all__ = ["add_track", "edit_images", "execute_transformers", "send_verification_token", "extract_climbs"]
diff --git a/fietsboek/views/detail.py b/fietsboek/views/detail.py
index 46e9f5f..44000c3 100644
--- a/fietsboek/views/detail.py
+++ b/fietsboek/views/detail.py
@@ -5,7 +5,6 @@ import gzip
import io
import logging
from html.parser import HTMLParser
-from threading import Thread
from markupsafe import Markup
from pyramid.httpexceptions import (
@@ -198,22 +197,7 @@ def delete_track(request):
@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()
-
+ actions.extract_climbs_background(request, request.context.id)
return HTTPFound(request.route_url("details", track_id=track_id))
diff --git a/fietsboek/views/upload.py b/fietsboek/views/upload.py
index 610847c..dde1c6c 100644
--- a/fietsboek/views/upload.py
+++ b/fietsboek/views/upload.py
@@ -2,7 +2,6 @@
import datetime
import logging
-from threading import Thread
from pyramid.httpexceptions import HTTPBadRequest, HTTPFound
from pyramid.i18n import TranslationString as _
@@ -11,7 +10,7 @@ from pyramid.view import view_config
from sqlalchemy import select
from .. import actions, convert, models, transformers, util
-from ..models.track import Track, TrackType, Visibility
+from ..models.track import TrackType, Visibility
from ..views.tileproxy import ITileRequester
LOGGER = logging.getLogger(__name__)
@@ -184,19 +183,7 @@ def do_finish_upload(request):
request.tm.commit()
request.tm.begin()
- 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"upload-{track_id}", target=_extract_climbs).start()
+ actions.extract_climbs_background(request, track_id)
return HTTPFound(request.route_url("details", track_id=track_id))