diff options
| author | Daniel Schadt <kingdread@gmx.de> | 2026-09-30 18:05:38 +0200 |
|---|---|---|
| committer | Daniel Schadt <kingdread@gmx.de> | 2026-09-30 18:05:38 +0200 |
| commit | 8f5bd60f507b695ccdc881fdda59e60d121606eb (patch) | |
| tree | 782aa6947c4f33bf3ad88642be1689860d255d2c | |
| parent | 731cc2aeaed97dde06091f2600f6ffeacbf3eed3 (diff) | |
| download | fietsboek-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.py | 28 | ||||
| -rw-r--r-- | fietsboek/views/detail.py | 18 | ||||
| -rw-r--r-- | fietsboek/views/upload.py | 17 |
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)) |
