feat: Kontenreihenfolge selbst bestimmen

Die Liste stand in der Anlegereihenfolge, die selten die gewuenschte ist.
Neuer Endpunkt PUT /accounts/order nimmt die IDs in der gewuenschten Folge
und schreibt die Position; er muss vor /{account_id} stehen, sonst faengt
die ID-Route den Pfad ab. Fremde IDs werden abgewiesen.

In der Kontenliste zwei Pfeile je Zeile, optimistisch sortiert, damit die
Liste beim Klicken nicht springt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Guido
2026-08-21 20:36:59 +02:00
co-authored by Claude Opus 5
parent ff897c196b
commit 9642901e4e
8 changed files with 79 additions and 5 deletions
+19 -2
View File
@@ -2,13 +2,13 @@
from datetime import date
from fastapi import APIRouter, Depends, status
from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy.orm import Session
from ..database import get_db
from ..deps import get_current_user, get_owned
from ..models import Account, AccountIdentifier, IdentifierKind, Transaction, TxnType, User
from ..schemas import AccountCreate, AccountIdentifierOut, AccountOut, AccountUpdate
from ..schemas import AccountCreate, AccountIdentifierOut, AccountOrder, AccountOut, AccountUpdate
from ..services import balances, currency
from ..services.csv_import import normalize_text
from .settings import BASE_CURRENCY_KEY, get_user_setting
@@ -146,6 +146,23 @@ def update_account(
return to_out(db, acc, base_currency(db, user), date.today())
@router.put("/order", status_code=status.HTTP_204_NO_CONTENT)
def set_account_order(
payload: AccountOrder, db: Session = Depends(get_db), user: User = Depends(get_current_user)
):
"""Reihenfolge der Konten setzen (Liste der IDs in der gewünschten Folge).
Muss vor ``/{account_id}`` stehen, sonst fängt die ID-Route den Pfad ab.
"""
konten = {a.id: a for a in db.query(Account).filter(Account.owner_id == user.id)}
fremd = [i for i in payload.ids if i not in konten]
if fremd:
raise HTTPException(status_code=404, detail=f"Unbekanntes Konto: {fremd[0]}")
for platz, konto_id in enumerate(payload.ids):
konten[konto_id].position = platz
db.commit()
def _entkoppele_uebertraege(db: Session, acc: Account) -> None:
"""Überträge lösen, bevor das Konto verschwindet.