German date display + optional street address for precise geocoding

- Date pickers (entry form + edit dialog) now display TT.MM.JJJJ instead of
  ISO (DATE_DISPLAY_FORMAT). Storage stays YYYY-MM-DD; parse_date() already
  accepted both formats, so existing data and the self-updater are unaffected.
- New optional "Straße" field (street + house number) in the entry form and
  edit dialog, backed by a new `street` CSV column. geocode_city() and
  GeocoderWorker.enqueue() gained a street parameter: when set, a full-address
  query is tried first for a much more precise map point, falling back
  automatically to the existing city/PLZ search if it doesn't resolve.
- Tab 2 and the entry queue show a Straße column; Tab 2 search now also
  matches on street.
- Fix: pandas turns a blank CSV cell into NaN even for a dtype=str column, so
  every existing (blank-street) row would have shown literal "nan" in Tab 2.
  DataStore._load now does street.fillna("") after every read.

Verified with a non-GUI test suite (date parsing, query construction, CSV
round-trip incl. the NaN case) and a full GUI build/drive test on Python
3.12/Tk 9. Docs updated (changelog, overview, architecture, data-model,
dev-notes, improvements).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-12 11:15:37 +02:00
parent 0b6ed854dc
commit d418f156fa
7 changed files with 185 additions and 61 deletions
+22
View File
@@ -2,6 +2,28 @@
Notable changes to the app. Newest first.
## 2026-09-12 — German date display + optional street address for geocoding
- **Date fields now display `TT.MM.JJJJ`** (e.g. `12.09.2026`) instead of ISO,
in both the entry form and the edit dialog (`DATE_DISPLAY_FORMAT`). Storage on
disk is unchanged (`YYYY-MM-DD`) — `parse_date()` still accepts either format
when typed, so nothing about existing data changes.
- **New optional "Straße" field** (street + house number) on the entry form and
in the edit dialog, and a new `street` CSV column. When set, geocoding tries
the full address first for a much more precise map point, falling back to the
existing city/PLZ search if the address doesn't resolve — see
[overview.md](overview.md#geocoding-behaviour). `geocode_city()` and
`GeocoderWorker.enqueue()` both gained a `street` parameter.
- Tab 2 and the entry queue both show a **Straße** column; the Tab 2 search box
now also matches on street.
- Fixed a bug this surfaced immediately: pandas turns a **blank CSV cell into
`NaN`, even for a column forced to `dtype=str`** — every pre-existing row (all
blank on `street`) would have displayed the literal text `nan`. `DataStore._load`
now does `self.df["street"] = self.df["street"].fillna("")`. See
[dev-notes.md](dev-notes.md#pandas-turns-blank-csv-cells-into-nan-even-with-dtypestr).
- `find_duplicates` intentionally still ignores `street` (unchanged: date + city
+ PLZ only).
## 2026-09-07 — fix: right-click context menu instantly triggered its first item
On Linux the Tab 2 (and queue) right-click menu flashed and immediately ran