d418f156fa
- 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>
DRK Blutspende – Arbeitsorte: Dokumentation
Developer/maintainer documentation for the Arbeitsorte-Logger, a small desktop app that records blood-drive work assignments (date + city + postal code) and plots them on an interactive map.
Context: built as a personal tool for a single user, running locally on a Linux Mint laptop. Ease of use for a non-technical user is the primary design constraint. There is no server, no multi-user story, and no network dependency beyond geocoding and the map tiles.
Documents
| File | Contents |
|---|---|
| overview.md | What the app does, feature by feature |
| architecture.md | Code structure, threading model, data flow |
| data-model.md | The orte.csv schema and how it is read/written |
| setup.md | git clone + ./install.sh on Linux Mint; how updates work |
| improvements.md | Prioritized review findings and suggested changes |
| changelog.md | What has changed, newest first |
| dev-notes.md | Assumptions that turned out wrong — read before editing |
At a glance
- Language / stack: Python 3, Tkinter via
ttkbootstrap - Single file:
app.py(~760 lines) - Storage: one CSV file,
data/orte.csv - Map: generated on demand as
data/karte.htmlwith Folium (Leaflet), opened in the default browser - Geocoding: OpenStreetMap Nominatim via
geopy, rate-limited to 1 request/second on a background thread - UI language: German; DRK-red header, enlarged font, colour-coded status bar, window position remembered
- Persistence: atomic CSV writes + rotating backups in
data/backups/; log atdata/app.log - Tests: non-GUI smoke checks only (not yet a committed
tests/suite) - Version control: git initialized 2026-09-07; in-app self-update (
gitfast-forward + restart) via the Hilfe menu