aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/man/fietsctl.rst17
-rw-r--r--fietsboek/scripts/fietsctl.py44
2 files changed, 60 insertions, 1 deletions
diff --git a/doc/man/fietsctl.rst b/doc/man/fietsctl.rst
index 4d3683f..67cbed4 100644
--- a/doc/man/fietsctl.rst
+++ b/doc/man/fietsctl.rst
@@ -11,7 +11,7 @@ SYNPOSIS
.. code-block:: text
fietsctl maintenance-mode
- fietsctl track list
+ fietsctl track {del|list}
fietsctl user {add|del|hittekaart|list|modify|passwd}
fietsctl version
@@ -181,6 +181,21 @@ For each track, the following information is shown:
* The track's owner (both name and email address)
* The track's title.
+REMOVING A TRACK
+################
+
+.. code-block:: text
+
+ fietsctl track del [-c CONFIG] -i/--id ID [-f/--force]
+
+Deletes the specified track. The right ID can be found via the ``track list``
+command, or via the web interface.
+
+This command deletes the track including its pictures and comments.
+
+By default, the command will ask for confirmation. You can specify the
+``-f``/``--force`` flag to override this check.
+
MAINTENANCE MODE
****************
diff --git a/fietsboek/scripts/fietsctl.py b/fietsboek/scripts/fietsctl.py
index 4950f7e..59462df 100644
--- a/fietsboek/scripts/fietsctl.py
+++ b/fietsboek/scripts/fietsctl.py
@@ -1,5 +1,6 @@
"""Script to do maintenance work on a Fietsboek instance."""
# pylint: disable=too-many-arguments
+import logging
from typing import Optional
import click
@@ -12,6 +13,8 @@ from .. import __VERSION__, hittekaart, models, util
from ..data import DataManager
from . import config_option
+LOGGER = logging.getLogger("fietsctl")
+
EXIT_OKAY = 0
EXIT_FAILURE = 1
@@ -361,6 +364,47 @@ def cmd_track_list(config: str):
)
+@cmd_track.command("del")
+@config_option
+@click.option("--force", "-f", help="Override the safety check.", is_flag=True)
+@click.option("--id", "-i", "id_", help="Database ID of the track.", type=int, required=True)
+@click.pass_context
+def cmd_track_del(
+ ctx: click.Context,
+ config: str,
+ force: bool,
+ id_: Optional[int],
+):
+ """Delete a track.
+
+ This command deletes the track as well as any images and comments
+ associated with it.
+
+ This command is destructive and irreversibly deletes data.
+ """
+ env = setup(config)
+ query = select(models.Track).filter_by(id=id_)
+ with env["request"].tm:
+ dbsession = env["request"].dbsession
+ track = dbsession.execute(query).scalar_one_or_none()
+ if track is None:
+ click.echo("Error: No such track found.", err=True)
+ ctx.exit(EXIT_FAILURE)
+ click.secho(track.title, fg=FG_TRACK_TITLE)
+ if not force:
+ if not click.confirm("Really delete this track?"):
+ click.echo("Aborted by user.")
+ ctx.exit(EXIT_FAILURE)
+ try:
+ data = env["request"].data_manager.open(track.id)
+ except FileNotFoundError:
+ LOGGER.warning("Data directory not found for track - ignoring")
+ else:
+ data.purge()
+ dbsession.delete(track)
+ click.echo("Track deleted")
+
+
@cli.command("maintenance-mode")
@config_option
@click.option("--disable", help="Disable the maintenance mode.", is_flag=True)