Files
certain/backend/app/routers/settings.py
T
ScarriffleandClaude Opus 5 0a790fd45a feat: Nur die Waehrungen zeigen, die man braucht – und auf dem Telefon lesbar
Drei Sachen, die beim Benutzen aufgefallen sind.

ANGEBOTENE WAEHRUNGEN. In den Einstellungen steht jetzt, welche Waehrungen in
den Auswahlfeldern erscheinen (Vorgabe EUR, CHF, USD). Dass dreissig
unterstuetzt werden, ist gut; dreissig Zeilen in einem Feld zu sehen, wenn man
drei davon braucht, ist es nicht.

Die Einstellung beschraenkt nur die ANZEIGE. Gueltig bleibt alles mit
EZB-Kurs, und die gerade gesetzte Waehrung steht IMMER im Feld – sonst stuende
ein Konto in Dollar vor einem Feld ohne Dollar und wechselte beim naechsten
Speichern stillschweigend die Waehrung. Der Saldo waere danach still falsch.
Die Hauptwaehrung laesst sich nicht abwaehlen.

ZEICHEN STATT KUERZEL, wo es hilft: "€ EUR", "$ USD", "£ GBP". CHF steht
bewusst ohne: "Fr." ist weniger gelaeufig als CHF selbst. Mehrfach belegte
Zeichen bleiben ebenfalls draussen – "US$" von "CA$" zu unterscheiden ist
Raetselraten.

AUF DEM TELEFON. Die Vertragszeile quetschte vier Spalten in 375 Pixel; vom
Namen blieb "Sal..." uebrig und von der Kategorie ein Punkt. Sie ist jetzt ein
Gitter: Unter 620 Pixel rutscht der Betrag unter den Namen, die Knoepfe
bleiben rechts. Der Name bekommt die volle Breite – auf dem Telefon ist er das
Einzige, woran man die Zeile erkennt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-07 16:16:45 +02:00

74 lines
2.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""Anzeige-/Verhaltens-Einstellungen je Benutzer (Schlüssel-Wert).
Jeder Benutzer hat seine eigenen Einstellungen. Unbekannte Schlüssel werden
ebenfalls gespeichert; die hier bekannten liefern sinnvolle Vorgaben.
"""
from fastapi import APIRouter, Depends
from sqlalchemy.orm import Session
from ..config import get_settings
from ..database import get_db
from ..deps import get_current_user
from ..models import User, UserSetting
from ..schemas import SettingOut
router = APIRouter(prefix="/settings", tags=["settings"])
BASE_CURRENCY_KEY = "base_currency"
BUDGET_START_DAY_KEY = "budget_start_day"
LOCALE_KEY = "locale"
THEME_KEY = "theme"
DATE_FORMAT_KEY = "date_format"
# Welche Waehrungen in Auswahlfeldern erscheinen (Komma-getrennt).
# Beschraenkt nur die ANZEIGE: Gueltig bleibt alles, was einen
# EZB-Referenzkurs hat – sonst verloere ein Konto seine Waehrung,
# nur weil sie hier gerade nicht angehakt ist.
ACTIVE_CURRENCIES_KEY = "active_currencies"
def known_defaults() -> dict[str, str]:
return {
BASE_CURRENCY_KEY: get_settings().default_base_currency,
BUDGET_START_DAY_KEY: "1",
LOCALE_KEY: "de",
THEME_KEY: "system",
DATE_FORMAT_KEY: "de",
ACTIVE_CURRENCIES_KEY: "EUR,CHF,USD",
}
def get_user_setting(db: Session, user: User, key: str) -> str | None:
row = db.get(UserSetting, (user.id, key))
if row is not None and row.value is not None:
return row.value
return known_defaults().get(key)
@router.get("", response_model=list[SettingOut])
def list_settings(
db: Session = Depends(get_db), user: User = Depends(get_current_user)
) -> list[SettingOut]:
rows = db.query(UserSetting).filter(UserSetting.user_id == user.id).all()
merged: dict[str, str | None] = dict(known_defaults())
for r in rows:
merged[r.key] = r.value
return [SettingOut(key=k, value=v) for k, v in merged.items()]
@router.put("/{key}", response_model=SettingOut)
def set_setting(
key: str,
value: str,
db: Session = Depends(get_db),
user: User = Depends(get_current_user),
) -> SettingOut:
row = db.get(UserSetting, (user.id, key))
if row is None:
row = UserSetting(user_id=user.id, key=key, value=value)
db.add(row)
else:
row.value = value
db.commit()
return SettingOut(key=key, value=value)