From 4f41f3bc47746d867feedbd4ab16d8a6b53fd4d2 Mon Sep 17 00:00:00 2001 From: Daniel Schadt Date: Fri, 26 Dec 2025 00:13:52 +0100 Subject: implement journey editing --- fietsboek/models/journey.py | 2 + fietsboek/models/track.py | 4 + fietsboek/routes.py | 3 + fietsboek/templates/journey_details.jinja2 | 53 +++++++ fietsboek/templates/journey_edit.jinja2 | 21 +++ fietsboek/templates/journey_form.jinja2 | 222 +++++++++++++++++++++++++++++ fietsboek/templates/journey_new.jinja2 | 203 +------------------------- fietsboek/views/journey.py | 33 +++++ 8 files changed, 342 insertions(+), 199 deletions(-) create mode 100644 fietsboek/templates/journey_edit.jinja2 create mode 100644 fietsboek/templates/journey_form.jinja2 diff --git a/fietsboek/models/journey.py b/fietsboek/models/journey.py index c403a61..512146f 100644 --- a/fietsboek/models/journey.py +++ b/fietsboek/models/journey.py @@ -137,6 +137,8 @@ class Journey(Base): :param track_ids: The IDs of the tracks that should be in this journey. """ session = inspect(self).session + stmt = delete(journey_track_assoc).where(journey_track_assoc.c.journey_id == self.id) + session.execute(stmt) for index, track_id in enumerate(track_ids, 1): stmt = insert(journey_track_assoc).values( journey_id=self.id, diff --git a/fietsboek/models/track.py b/fietsboek/models/track.py index cd99f4c..fc5a68b 100644 --- a/fietsboek/models/track.py +++ b/fietsboek/models/track.py @@ -581,6 +581,10 @@ class Track(Base): self.cache.start_time = self.date self.cache.end_time = self.date + datetime.timedelta(seconds=meta.duration) + def with_metadata(self) -> "TrackWithMetadata": + """Returns this track with attached path metadata.""" + return TrackWithMetadata(self) + def text_tags(self): """Returns a set of textual tags. diff --git a/fietsboek/routes.py b/fietsboek/routes.py index bafb4b3..c7bce62 100644 --- a/fietsboek/routes.py +++ b/fietsboek/routes.py @@ -65,6 +65,9 @@ def includeme(config): ) config.add_route("journey-gpx", "/journey/{journey_id}/gpx", factory="fietsboek.models.Journey.factory") config.add_route("journey-details", "/journey/{journey_id}/", factory="fietsboek.models.Journey.factory") + config.add_route("journey-edit", "/journey/{journey_id}/edit", factory="fietsboek.models.Journey.factory") + config.add_route("journey-invalidate-share", "/journey/{journey_id}/invalidate-link", factory="fietsboek.models.Journey.factory") + config.add_route("delete-journey", "/journey/{journey_id}/delete", factory="fietsboek.models.Journey.factory") config.add_route("journey-new", "/journey/new") config.add_route("badge", "/badge/{badge_id}", factory="fietsboek.models.Badge.factory") diff --git a/fietsboek/templates/journey_details.jinja2 b/fietsboek/templates/journey_details.jinja2 index 624f78c..bc8137e 100644 --- a/fietsboek/templates/journey_details.jinja2 +++ b/fietsboek/templates/journey_details.jinja2 @@ -1,8 +1,61 @@ {% extends "layout.jinja2" %} +{% import "util.jinja2" as util with context %} + {% block content %}

{{ journey.title }}

+ {% if show_edit_link %} +
+ {{ _("journey.edit") }} + + +
+ + + + {% endif %} + {% set gpx_url = request.route_path("journey-gpx", journey_id=journey.id) %}
- - - {% endblock %} {% block latescripts %} - +{{ form.journey_js() }} {% endblock %} diff --git a/fietsboek/views/journey.py b/fietsboek/views/journey.py index ee1a44e..2b14c22 100644 --- a/fietsboek/views/journey.py +++ b/fietsboek/views/journey.py @@ -35,12 +35,14 @@ def journey_details(request: Request): journey: Journey = request.context tracks = [TrackWithMetadata(track) for track in journey.tracks] movement_data = journey.path().movement_data() + show_edit_link = request.identity == journey.owner return { "journey": journey, "tracks": tracks, "movement_data": movement_data, "mps_to_kph": util.mps_to_kph, "md_to_html": util.safe_markdown, + "show_edit_link": show_edit_link, } @@ -100,3 +102,34 @@ def do_journey_new(request: Request): journey.set_track_ids(track_ids) return HTTPFound(request.route_url("journey-details", journey_id=journey.id)) + + +@view_config( + route_name="journey-edit", + renderer="fietsboek:templates/journey_edit.jinja2", + permission="journey.edit", +) +def journey_edit(request: Request): + journey: Journey = request.context + return { + "journey": journey, + } + + +@view_config( + route_name="journey-edit", + permission="journey.edit", + request_method="POST", +) +def do_journey_edit(request: Request): + journey: Journey = request.context + + journey.title = request.params.get("journeyTitle") + journey.description = request.params.get("journeyDescription") + + track_ids = [int(tid) for tid in request.params.getall("journeyTrack[]")] + journey.set_track_ids(track_ids) + + request.dbsession.add(journey) + + return HTTPFound(request.route_url("journey-details", journey_id=journey.id)) -- cgit v1.2.3