Files
drk-blutspende-orte/docs/changelog.md
T
Paddy 1bed723363 Add in-app self-update via git (Hilfe menu)
New Updater class + "Hilfe" menubar:
- "Nach Update suchen": git fetch + count of new upstream commits.
- Quiet background check on start; surfaces via status bar + menu label.
- Install: git merge --ff-only, pip install if requirements.txt changed,
  then restart via os.execv. data/ is git-ignored and untouched.
- Fast-forward only; diverged history or offline -> clear message, no action.
- Inert unless run from a git clone with git on PATH.

Also: "Version…" menu item shows the installed commit.

Verified against throwaway git repos (check / ff-update / diverged / no-op /
non-clone) and via GUI build on Python 3.14 / Tk 9.

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

102 lines
4.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Changelog
Notable changes to the app. Newest first.
## 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](improvements.md#uiux-review-2026-09-07)).
- **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
<kbd>Delete</kbd> 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](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](dev-notes.md).