aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--fietsboek/scripts/fietscron.py33
1 files changed, 31 insertions, 2 deletions
diff --git a/fietsboek/scripts/fietscron.py b/fietsboek/scripts/fietscron.py
index 7687e12..621821b 100644
--- a/fietsboek/scripts/fietscron.py
+++ b/fietsboek/scripts/fietscron.py
@@ -6,6 +6,7 @@ import logging.config
from pathlib import Path
import click
+import gpxpy
import pyramid.paster
import redis as mod_redis
from redis import Redis
@@ -14,10 +15,11 @@ from sqlalchemy.engine import Engine
from sqlalchemy.orm import Session
from .. import config as mod_config
-from .. import hittekaart, models
+from .. import hittekaart, models, trackmap
from ..config import Config
from ..data import DataManager
from ..models.user import TOKEN_LIFETIME
+from ..views.tileproxy import TileRequester
from . import config_option
LOGGER = logging.getLogger(__name__)
@@ -33,6 +35,7 @@ def cli(config):
\b
* Deletes pending uploads that are older than 24 hours.
* Rebuilds the cache for missing tracks.
+ * Builds preview images for tracks.
* (optional) Runs ``hittekaart`` to generate heatmaps
"""
logging.config.fileConfig(config)
@@ -47,14 +50,15 @@ def cli(config):
return
engine = create_engine(config.sqlalchemy_url)
+ redis = mod_redis.from_url(config.redis_url)
LOGGER.debug("Starting maintenance tasks")
remove_old_uploads(engine)
remove_old_tokens(engine)
rebuild_cache(engine, data_manager)
+ build_previews(engine, data_manager, redis, config)
if config.hittekaart_autogenerate:
- redis = mod_redis.from_url(config.redis_url)
run_hittekaart(engine, data_manager, redis, config)
@@ -95,6 +99,31 @@ def rebuild_cache(engine: Engine, data_manager: DataManager):
session.commit()
+def build_previews(
+ engine: Engine,
+ data_manager: DataManager,
+ redis: Redis,
+ config: mod_config.Config,
+):
+ """Builds track preview images if they are missing."""
+ LOGGER.info("Building track preview images")
+ session = Session(engine)
+ tile_requester = TileRequester(redis)
+ layer = config.public_tile_layers()[0]
+ tracks = select(models.Track)
+ for track in session.execute(tracks).scalars():
+ track_dir = data_manager.open(track.id)
+ if track_dir.preview_path().exists():
+ continue
+
+ LOGGER.debug("Building preview for %s", track.id)
+ gpx = gpxpy.parse(track_dir.decompress_gpx())
+ preview = trackmap.render(gpx, layer, tile_requester)
+ with track_dir.lock():
+ with open(track_dir.preview_path(), "wb") as preview_file:
+ preview.save(preview_file, "PNG")
+
+
def run_hittekaart(engine: Engine, data_manager: DataManager, redis: Redis, config: Config):
"""Run outstanding hittekaart requests."""
# The logic here is as follows: