aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Schadt <kingdread@gmx.de>2025-05-10 23:39:01 +0200
committerDaniel Schadt <kingdread@gmx.de>2025-05-10 23:39:01 +0200
commit8160afe6faf004aa0bc5478a0642a14eded3a914 (patch)
tree30a9e522a6c147624e18e3eb964fe4416ada3f88
parente699dba84378b71d4e0cd3de6f30a3a13b25a68d (diff)
downloadfietsboek-8160afe6faf004aa0bc5478a0642a14eded3a914.tar.gz
fietsboek-8160afe6faf004aa0bc5478a0642a14eded3a914.tar.bz2
fietsboek-8160afe6faf004aa0bc5478a0642a14eded3a914.zip
add button to exchange GPX track
-rw-r--r--fietsboek/convert.py18
-rw-r--r--fietsboek/locale/de/LC_MESSAGES/messages.mobin17734 -> 17805 bytes
-rw-r--r--fietsboek/locale/de/LC_MESSAGES/messages.po22
-rw-r--r--fietsboek/locale/en/LC_MESSAGES/messages.mobin16661 -> 16726 bytes
-rw-r--r--fietsboek/locale/en/LC_MESSAGES/messages.po22
-rw-r--r--fietsboek/locale/fietslog.pot22
-rw-r--r--fietsboek/templates/edit.jinja24
-rw-r--r--fietsboek/views/edit.py31
-rw-r--r--fietsboek/views/upload.py3
9 files changed, 91 insertions, 31 deletions
diff --git a/fietsboek/convert.py b/fietsboek/convert.py
index 3c8208b..d3bfb22 100644
--- a/fietsboek/convert.py
+++ b/fietsboek/convert.py
@@ -49,4 +49,20 @@ def from_fit(data: bytes) -> GPX:
return gpx
-__all__ = ["from_fit"]
+def smart_convert(data: bytes) -> bytes:
+ """Tries to be smart in converting the input bytes.
+
+ This function automatically applies the correct conversion if possible.
+
+ Note that this function is not guaranteed to return valid GPX bytes. In the worst case,
+ invalid bytes are simply passed through.
+
+ :param data: The input bytes.
+ :return: The converted content.
+ """
+ if len(data) > 11 and data[9:12] == b"FIT":
+ return from_fit(data).to_xml().encode("utf-8")
+ return data
+
+
+__all__ = ["from_fit", "smart_convert"]
diff --git a/fietsboek/locale/de/LC_MESSAGES/messages.mo b/fietsboek/locale/de/LC_MESSAGES/messages.mo
index a4bf218..5ddd7f3 100644
--- a/fietsboek/locale/de/LC_MESSAGES/messages.mo
+++ b/fietsboek/locale/de/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/fietsboek/locale/de/LC_MESSAGES/messages.po b/fietsboek/locale/de/LC_MESSAGES/messages.po
index 2fbb199..6736e5a 100644
--- a/fietsboek/locale/de/LC_MESSAGES/messages.po
+++ b/fietsboek/locale/de/LC_MESSAGES/messages.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2025-05-10 22:16+0200\n"
+"POT-Creation-Date: 2025-05-10 23:36+0200\n"
"PO-Revision-Date: 2022-07-02 17:35+0200\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: de\n"
@@ -494,11 +494,15 @@ msgstr "Absenden"
msgid "page.edit.title"
msgstr "Strecke Bearbeiten"
-#: fietsboek/templates/edit.jinja2:16
+#: fietsboek/templates/edit.jinja2:14
+msgid "page.edit.form.new_track"
+msgstr "Neue Streckendatei auswählen"
+
+#: fietsboek/templates/edit.jinja2:20
msgid "page.edit.form.submit"
msgstr "Speichern"
-#: fietsboek/templates/edit.jinja2:17
+#: fietsboek/templates/edit.jinja2:21
msgid "page.edit.form.cancel"
msgstr "Abbrechen"
@@ -1058,19 +1062,19 @@ msgstr "Passwort aktualisiert"
msgid "flash.track_deleted"
msgstr "Strecke gelöscht"
+#: fietsboek/views/edit.py:100 fietsboek/views/upload.py:66
+msgid "flash.invalid_file"
+msgstr "Ungültige GPX-Datei gesendet"
+
#: fietsboek/views/upload.py:54
msgid "flash.no_file_selected"
msgstr "Keine Datei ausgewählt"
-#: fietsboek/views/upload.py:67
-msgid "flash.invalid_file"
-msgstr "Ungültige GPX-Datei gesendet"
-
-#: fietsboek/views/upload.py:195
+#: fietsboek/views/upload.py:194
msgid "flash.upload_success"
msgstr "Hochladen erfolgreich"
-#: fietsboek/views/upload.py:214
+#: fietsboek/views/upload.py:213
msgid "flash.upload_cancelled"
msgstr "Hochladen abgebrochen"
diff --git a/fietsboek/locale/en/LC_MESSAGES/messages.mo b/fietsboek/locale/en/LC_MESSAGES/messages.mo
index 6dc4ec3..00a8b9c 100644
--- a/fietsboek/locale/en/LC_MESSAGES/messages.mo
+++ b/fietsboek/locale/en/LC_MESSAGES/messages.mo
Binary files differ
diff --git a/fietsboek/locale/en/LC_MESSAGES/messages.po b/fietsboek/locale/en/LC_MESSAGES/messages.po
index a528046..f2f7583 100644
--- a/fietsboek/locale/en/LC_MESSAGES/messages.po
+++ b/fietsboek/locale/en/LC_MESSAGES/messages.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2025-05-10 22:16+0200\n"
+"POT-Creation-Date: 2025-05-10 23:36+0200\n"
"PO-Revision-Date: 2023-04-03 20:42+0200\n"
"Last-Translator: \n"
"Language: en\n"
@@ -490,11 +490,15 @@ msgstr "Submit"
msgid "page.edit.title"
msgstr "Edit Track"
-#: fietsboek/templates/edit.jinja2:16
+#: fietsboek/templates/edit.jinja2:14
+msgid "page.edit.form.new_track"
+msgstr "New file for this track"
+
+#: fietsboek/templates/edit.jinja2:20
msgid "page.edit.form.submit"
msgstr "Save"
-#: fietsboek/templates/edit.jinja2:17
+#: fietsboek/templates/edit.jinja2:21
msgid "page.edit.form.cancel"
msgstr "Cancel"
@@ -1047,19 +1051,19 @@ msgstr "Password has been updated"
msgid "flash.track_deleted"
msgstr "Track has been deleted"
+#: fietsboek/views/edit.py:100 fietsboek/views/upload.py:66
+msgid "flash.invalid_file"
+msgstr "Invalid GPX file selected"
+
#: fietsboek/views/upload.py:54
msgid "flash.no_file_selected"
msgstr "No file selected"
-#: fietsboek/views/upload.py:67
-msgid "flash.invalid_file"
-msgstr "Invalid GPX file selected"
-
-#: fietsboek/views/upload.py:195
+#: fietsboek/views/upload.py:194
msgid "flash.upload_success"
msgstr "Upload successful"
-#: fietsboek/views/upload.py:214
+#: fietsboek/views/upload.py:213
msgid "flash.upload_cancelled"
msgstr "Upload cancelled"
diff --git a/fietsboek/locale/fietslog.pot b/fietsboek/locale/fietslog.pot
index e58676f..02fdb37 100644
--- a/fietsboek/locale/fietslog.pot
+++ b/fietsboek/locale/fietslog.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2025-05-10 22:16+0200\n"
+"POT-Creation-Date: 2025-05-10 23:36+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -484,11 +484,15 @@ msgstr ""
msgid "page.edit.title"
msgstr ""
-#: fietsboek/templates/edit.jinja2:16
+#: fietsboek/templates/edit.jinja2:14
+msgid "page.edit.form.new_track"
+msgstr ""
+
+#: fietsboek/templates/edit.jinja2:20
msgid "page.edit.form.submit"
msgstr ""
-#: fietsboek/templates/edit.jinja2:17
+#: fietsboek/templates/edit.jinja2:21
msgid "page.edit.form.cancel"
msgstr ""
@@ -1030,19 +1034,19 @@ msgstr ""
msgid "flash.track_deleted"
msgstr ""
-#: fietsboek/views/upload.py:54
-msgid "flash.no_file_selected"
+#: fietsboek/views/edit.py:100 fietsboek/views/upload.py:66
+msgid "flash.invalid_file"
msgstr ""
-#: fietsboek/views/upload.py:67
-msgid "flash.invalid_file"
+#: fietsboek/views/upload.py:54
+msgid "flash.no_file_selected"
msgstr ""
-#: fietsboek/views/upload.py:195
+#: fietsboek/views/upload.py:194
msgid "flash.upload_success"
msgstr ""
-#: fietsboek/views/upload.py:214
+#: fietsboek/views/upload.py:213
msgid "flash.upload_cancelled"
msgstr ""
diff --git a/fietsboek/templates/edit.jinja2 b/fietsboek/templates/edit.jinja2
index 6347ae6..26c520f 100644
--- a/fietsboek/templates/edit.jinja2
+++ b/fietsboek/templates/edit.jinja2
@@ -10,6 +10,10 @@
<noscript><p>{{ _("page.noscript") }}<p></noscript>
</div>
<form method="POST" enctype="multipart/form-data">
+ <div class="mb-3">
+ <label class="form-label ui-element" for="newGpx">{{ _("page.edit.form.new_track") }}</label>
+ <input id="newGpx" name="gpx" type="file" class="form-control ui-element">
+ </div>
{{ edit_form.edit_track(track.title, track.date_raw, track.date_tz or 0, track.visibility, track.type, track.description, track.text_tags(), badges, track.tagged_people, images) }}
{{ util.hidden_csrf_input() }}
<div class="btn-group" role="group">
diff --git a/fietsboek/views/edit.py b/fietsboek/views/edit.py
index c3a4fc5..3e512e4 100644
--- a/fietsboek/views/edit.py
+++ b/fietsboek/views/edit.py
@@ -4,11 +4,13 @@ import datetime
import logging
from collections import namedtuple
+import gpxpy
from pyramid.httpexceptions import HTTPBadRequest, HTTPFound
+from pyramid.i18n import TranslationString as _
from pyramid.view import view_config
from sqlalchemy import select
-from .. import actions, models, util
+from .. import actions, convert, models, util
from ..data import TrackDataDir
from ..models.track import TrackType, Visibility
@@ -84,6 +86,25 @@ def do_edit(request):
tz_offset = datetime.timedelta(minutes=int(request.params["date-tz"]))
date = datetime.datetime.fromisoformat(request.params["date"])
with data, data.lock():
+ redo_cache = False
+ try:
+ gpx_bytes = request.POST["gpx"].file.read()
+ except AttributeError:
+ pass
+ else:
+ LOGGER.info("Setting new track for %s", track.id)
+ gpx_bytes = convert.smart_convert(gpx_bytes)
+ try:
+ gpxpy.parse(gpx_bytes)
+ except Exception as exc:
+ request.session.flash(request.localizer.translate(_("flash.invalid_file")))
+ LOGGER.info("Could not parse updated gpx: %s", exc)
+ return HTTPFound(request.route_url("edit", track_id=track.id))
+ data.compress_gpx(gpx_bytes)
+ data.backup()
+ track.transformers = []
+ redo_cache = True
+
track.date = date.replace(tzinfo=datetime.timezone(tz_offset))
track.tagged_people = tagged_people
@@ -105,6 +126,14 @@ def do_edit(request):
gpx=gpx,
)
+ # actions.execute_transformers automatically rebuilds the cache, so we only need to do
+ # this if execute_transformers didn't do it
+ if redo_cache and gpx is None:
+ LOGGER.info("New file detected, rebuilding cache for %s", track.id)
+ track.cache = None
+ track.ensure_cache(gpx_bytes)
+ request.dbsession.add(track.cache)
+
return HTTPFound(request.route_url("details", track_id=track.id))
diff --git a/fietsboek/views/upload.py b/fietsboek/views/upload.py
index 06efb04..3eb1099 100644
--- a/fietsboek/views/upload.py
+++ b/fietsboek/views/upload.py
@@ -54,8 +54,7 @@ def do_upload(request):
request.session.flash(request.localizer.translate(_("flash.no_file_selected")))
return HTTPFound(request.route_url("upload"))
- if len(gpx) > 11 and gpx[9:12] == b"FIT":
- gpx = convert.from_fit(gpx).to_xml().encode("utf-8")
+ gpx = convert.smart_convert(gpx)
# Before we do anything, we check if we can parse the file.
# gpxpy might throw different exceptions, so we simply catch `Exception`