The log had 6.45M rows, of which 434 were actual actions: every mail x every non-matching rule wrote "Keine Übereinstimmung" (5.3M rows, ~1 GB), plus "keine neuen Mails" per rule every 30s and a "Poll gestartet" row. Free-text searches took 50-70s. - Routine entries are only written with LOG_VERBOSE=true; the poll summary is logged only when there were new mails, actions or errors. "Why didn't my rule match" is now answered by the rule tester. - The scheduler commits every 25 evaluated mails and after each rule, since the dropped log calls used to be the implicit commit points. - Migration rebuilds filter_logs without the routine rows (live: 6.45M -> ~38k) via copy instead of DELETE. - /api/logs: keyset pagination (before_id) instead of OFFSET, count capped at 1000, since/until range, multi-level filter, per-field filters; ordner: also matches the move target stored in details. - New log page: one search field with shortcuts (von:, betreff:, regel:, ordner:, text:), live search with debounce and abort, active filters as removable chips, click on rule/sender/folder in a row to filter, time range (default 7 days), level quick filter, expandable row details, "Ältere laden", filters kept in the URL. - Disable Pico's colour transition on segmented buttons (they briefly flashed in the primary colour on load). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
20 lines
587 B
Python
20 lines
587 B
Python
from pathlib import Path
|
|
|
|
from pydantic_settings import BaseSettings
|
|
|
|
|
|
class Settings(BaseSettings):
|
|
database_url: str = "sqlite:///data/mailfilter.db"
|
|
yaml_config_path: str = "config/filters.yaml"
|
|
encryption_key: str = ""
|
|
yaml_sync_on_startup: bool = True
|
|
log_level: str = "INFO"
|
|
# Ausführliches Verarbeitungslog (jede Nicht-Übereinstimmung, jede Regel pro
|
|
# Poll). Erzeugt Millionen Einträge — nur zur Fehlersuche einschalten.
|
|
log_verbose: bool = False
|
|
|
|
model_config = {"env_file": ".env", "env_file_encoding": "utf-8"}
|
|
|
|
|
|
settings = Settings()
|