lazyflat/web/routes
EiSiMo fe43a402d8 feat(wohnungen): "Rausgefilterte Wohnungen" section with reason chips
Below "Abgelehnte Wohnungen", surface flats that survived the time
filter and aren't rejected but failed at least one of the user's
filters. Same collapsed-card style. Action buttons are replaced by
chips naming each failed dimension — "Zimmer", "Preis", "Größe",
"WBS", "Bezirk" — so it's obvious which constraint to relax.

Refactored matching: flat_matches_filter now delegates to a new
flat_filter_failures(flat, f) that returns the failed-dimension
labels (empty list = full match). rooms_min and rooms_max collapse
to a single "Zimmer" chip; reasons emit in stable _REASON_ORDER for
consistent rendering. The section is suppressed entirely when the
user has no filters set, since "everything matches" makes the chips
meaningless.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 11:27:49 +02:00
..
__init__.py refactor: split web/app.py into routers 2026-04-21 19:27:12 +02:00
admin.py refactor: rename wohnungsdidi → lazyflat 2026-04-23 09:26:12 +02:00
auth.py refactor: split web/app.py into routers 2026-04-21 19:27:12 +02:00
bewerbungen.py refactor: rename wohnungsdidi → lazyflat 2026-04-23 09:26:12 +02:00
einstellungen.py feat(filter): Berlin-Bezirk filter in Einstellungen 2026-04-23 10:05:55 +02:00
internal.py fix(notifications): district filter silently dropped every match 2026-04-23 10:18:04 +02:00
wohnungen.py feat(wohnungen): "Rausgefilterte Wohnungen" section with reason chips 2026-04-23 11:27:49 +02:00