diff options
-rw-r--r-- | fietsboek/convert.py | 18 | ||||
-rw-r--r-- | fietsboek/locale/de/LC_MESSAGES/messages.mo | bin | 17734 -> 17805 bytes | |||
-rw-r--r-- | fietsboek/locale/de/LC_MESSAGES/messages.po | 22 | ||||
-rw-r--r-- | fietsboek/locale/en/LC_MESSAGES/messages.mo | bin | 16661 -> 16726 bytes | |||
-rw-r--r-- | fietsboek/locale/en/LC_MESSAGES/messages.po | 22 | ||||
-rw-r--r-- | fietsboek/locale/fietslog.pot | 22 | ||||
-rw-r--r-- | fietsboek/templates/edit.jinja2 | 4 | ||||
-rw-r--r-- | fietsboek/views/edit.py | 31 | ||||
-rw-r--r-- | fietsboek/views/upload.py | 3 |
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 Binary files differindex a4bf218..5ddd7f3 100644 --- a/fietsboek/locale/de/LC_MESSAGES/messages.mo +++ b/fietsboek/locale/de/LC_MESSAGES/messages.mo 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 Binary files differindex 6dc4ec3..00a8b9c 100644 --- a/fietsboek/locale/en/LC_MESSAGES/messages.mo +++ b/fietsboek/locale/en/LC_MESSAGES/messages.mo 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` |