1bed723363
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>
102 lines
4.7 KiB
Markdown
102 lines
4.7 KiB
Markdown
# 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).
|