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>
74 lines
2.3 KiB
Python
74 lines
2.3 KiB
Python
"""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)
|