Files
drk-blutspende-orte/docs/changelog.md
T
Paddy 5eb60ec2d3 Map tiles: switch to Esri World Light Gray (OSM 403s file://)
tiles="OpenStreetMap" returned HTTP 403 "referer is required by tile usage
policy" in the target browser — OSM graylists refererless requests and a
karte.html opened via file:// sends no Referer. Esri's Canvas/World_Light_Gray
base + reference layers need neither a key nor a Referer and keep the muted
look. New MAP_TILES / MAP_TILES_LABELS / MAP_TILES_ATTR constants; generate_map
adds them as explicit TileLayers.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-07 22:37:41 +02:00

6.2 KiB
Raw Blame History

Changelog

Notable changes to the app. Newest first.

2026-09-07 — map tiles → Esri (OSM 403s local files)

The switch to tiles="OpenStreetMap" worked on the dev machine but the target laptop's browser got HTTP 403 "referer is required by tile usage policy" — OSM's CDN blocks refererless requests, and a karte.html opened as file:// sends no Referer. Switched to Esri "World Light Gray" (base + labels overlay, server.arcgisonline.com): no key, no Referer check, muted look similar to the old positron. Constants MAP_TILES / MAP_TILES_LABELS / MAP_TILES_ATTR.

2026-09-07 — install split for non-admin users

The target account has no sudo, so install is two scripts:

  • install-system.sh admin runs once: apt install python3-tk python3-venv git.
  • install.sh user runs, no sudo: checks the system packages, creates .venv + installs requirements.txt, writes the .desktop menu entry. If a package is missing and the account can't sudo, it prints the exact admin command and stops.

2026-09-07 — one-command install + launcher

  • install.sh Linux Mint setup: .venv + requirements.txt, and a .desktop menu entry with correct absolute paths.
  • run.sh launches the app from .venv; the menu entry calls this.
  • icon.png bundled red-cross launcher/window icon (256×256); the app now prefers this over the runtime-drawn one.
  • requirements.txt fully pinned (direct + transitive), tested on Python 3.12. numpy capped at 2.2.6 so it still installs on Python 3.10.

2026-09-07 — built-in self-update

New Hilfe menu:

  • Nach Update suchen git fetch + count of new commits on the server.
  • Version… shows the installed commit (<hash> · <date>).

On start, a quiet background check runs; if updates exist the status bar says so and the menu item becomes "Update installieren (N verfügbar)".

Installing runs git merge --ff-only (fast-forward only never an automatic merge), re-runs pip install -r requirements.txt if that file changed, then restarts the app via os.execv. User data (data/) is git-ignored and untouched. If the local checkout has diverged or the network is down, it shows a clear message and does nothing.

Only active when the app runs from a git clone with git installed; otherwise the menu just shows "Version: unbekannt". New Updater class, app.py.

2026-09-07 — map tiles switched to OpenStreetMap

folium.Map(tiles="CartoDB positron") began showing an "API KEY REQUIRED" watermark (Carto moved its basemaps behind a key). Switched to tiles="OpenStreetMap" via a new MAP_TILES constant — no key required. OSM standard tiles are more colourful than positron was; MAP_TILES makes swapping the provider a one-line change.

2026-09-07 — UI/UX pass

A round of usability improvements aimed at the non-technical user (see improvements.md).

  • Larger UI font (UI_FONT_SIZE = 11) applied to all default fonts, menus, dialogs and the Treeview (taller rows).
  • DRK-red header bar with the app name; window title shows the total count ("… · 142 Einsätze"); simple red-cross window icon drawn at runtime (also written to data/icon.png for the launcher).
  • Status bar is now colour-coded by severity (grey/green/orange/red), and transient messages auto-clear after 8 s back to a neutral state; queue-count messages stay put.
  • Tab 1: more spacing in the form; PLZ field accepts digits only; "+ Hinzufügen" is a solid button; explicit "Auswahl entfernen" button and Delete key for queue rows; "Warteschlange leeren" now asks for confirmation; duplicate save shows a modal (list + "trotzdem speichern?") instead of a transient hint.
  • Tab 2: the raw lat/lon columns are replaced by a single "Karte" column ( / red fehlt); active sort column shows a ▲/▼ arrow; the hint line always shows the saved-entry count.
  • "Karte öffnen" with no coordinates now shows a dialog, not just a status line.
  • Window size & position are remembered between sessions (data/window.json).

2026-09-07 — data safety, robustness, easier input

Addressed the top three findings from improvements.md.

Data safety (DataStore)

  • All writes (append / update / delete) now rebuild the full DataFrame and go through _save_csv: rotating backup to data/backups/ (startup + before every change, keep 20, skip if unchanged) then atomic write (tmp + fsync + os.replace).
  • orte.csv missing / empty (EmptyDataError) / unreadable now falls back to an empty table or the newest backup instead of crashing.

Geocoder robustness (GeocoderWorker, geocode_city)

  • Each queue item runs inside try/except; a failing lookup or callback logs a traceback and the worker keeps going (previously an unexpected error killed the thread and silently froze all further geocoding).
  • geocode_city raises GeocodingUnavailable when every query failed on a service/network error. After 3 in a row the app shows a one-time "Standortdienst nicht erreichbar" dialog; entries still save without coordinates.

Easier, safer input

  • Date fields (entry form + edit dialog) are now ttkbootstrap.DateEntry calendar pickers, validated/normalized to ISO by parse_date() (also accepts TT.MM.JJJJ). Invalid dates are rejected with a dialog.
  • Edit dialog has manual Breitengrad / Längengrad fields for fixing coordinates by hand.
  • Tab 2: rows without coordinates shown in red, "Nur ohne Koordinaten" filter, count in the hint line, right-click Koordinaten suchen.

Housekeeping

  • git init + .gitignore.
  • Rotating log file at data/app.log (_setup_logging).
  • Shared helpers filter_locations / split_city_plz / parse_coord replace duplicated combobox code.
  • Config constants: GEOCODE_REGIONS, MAP_DEFAULT_CENTER, MAP_DEFAULT_ZOOM, MAX_BACKUPS.
  • generate_map fits the view to the markers.

Verification

Non-GUI smoke tests (helpers, DataStore backup/atomic/recovery, geocoder resilience) pass. The GUI now can be built and driven on the dev Mac via a Homebrew Python with Tk 9 — see dev-notes.md.