refactor: Code-Review-Fixes (Reuse/Simplification/Efficiency) aus dieser Session
4 parallele Review-Agenten (Reuse/Simplification/Efficiency/Altitude) gegen den Diff dieser Session (c7dd47f...HEAD) laufen lassen, echte Funde angewendet: - lager.py: 5x wiederholtes "db.get(...) or 404 raisen" durch _get_or_404()- Helper ersetzt - akte.py: zwei Queries für Geräte-Instanzen (erst Positions-IDs, dann Geräte) zu einer Query mit Subquery zusammengefasst - akte.py: manuelle Feld-für-Feld-Rekonstruktion von ObjektRead/HistorieRead durch model_validate()+model_copy() ersetzt (HistorieRead.benutzer_name bekommt dafür einen Default, harmlos für den bestehenden Endpunkt) - vorlagen.py: doppelte "Positionen löschen + flush"-Logik (Vorlage-Löschen und Positionen-Ersetzen) in loesche_alle_positionen() zusammengeführt Bewusst nicht angewendet: - Zentrale Session-Rollback-Vereinheitlichung für die drei Pre-Check-Stellen (objekte.py Selbstbezug, geraet_instanz.py SN-Duplikat, lager.py Eltern- Selbstbezug) - der Altitude-Review schlug das vor, aber get_db() rollt in Produktion bei jeder Exception bereits korrekt zurück (jede Anfrage hat eine eigene Session); das PendingRollbackError-Problem trat nur in der geteilten Test-Session auf und wurde bereits gezielt per Pre-Check vermieden - eine zusätzliche zentrale Rollback-Schicht würde nichts mehr reparieren, was nicht schon repariert ist. - Postgres-Cluster-Encoding (template1) auf beiden Hosts fixen, nicht nur in CI/für die eine migrierte DB - echter Infra-Eingriff, braucht Rücksprache. - LagerSection.tsx "inkonsistente" Formular-Resets - beim genaueren Hinsehen gewolltes UX (Ort/Typ bleiben ausgewählt für mehrere Anlagen hintereinander). 140 Tests weiterhin grün. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
This commit is contained in:
@@ -78,29 +78,19 @@ async def akte_fuer_objekt(db: AsyncSession, objekt_id: int) -> AkteRead | None:
|
||||
select(Dokument).where(Dokument.entitaet_typ == "objekt", Dokument.entitaet_id == str(objekt_id))
|
||||
)
|
||||
|
||||
positions_result = await db.execute(
|
||||
select(Objektposition.id).where(Objektposition.objekt_id == objekt_id)
|
||||
)
|
||||
position_ids = [row[0] for row in positions_result.all()]
|
||||
geraete: list[GeraetInstanz] = []
|
||||
if position_ids:
|
||||
geraete_result = await db.execute(
|
||||
select(GeraetInstanz).where(GeraetInstanz.objektposition_id.in_(position_ids))
|
||||
geraete_result = await db.execute(
|
||||
select(GeraetInstanz).where(
|
||||
GeraetInstanz.objektposition_id.in_(
|
||||
select(Objektposition.id).where(Objektposition.objekt_id == objekt_id)
|
||||
)
|
||||
)
|
||||
geraete = list(geraete_result.scalars().all())
|
||||
)
|
||||
geraete = list(geraete_result.scalars().all())
|
||||
|
||||
maengel_result = await db.execute(select(Mangel).where(Mangel.objekt_id == objekt_id))
|
||||
|
||||
objekt_read = ObjektRead(
|
||||
id=objekt.id,
|
||||
code=objekt.code,
|
||||
name=objekt.name,
|
||||
objekttyp_id=objekt.objekttyp_id,
|
||||
vorlage_id=objekt.vorlage_id,
|
||||
standort_id=objekt.standort_id,
|
||||
status=objekt.status,
|
||||
fahrzeug_id=objekt.fahrzeug_id,
|
||||
letzte_kontrolle_am=letzte_map.get(objekt_id),
|
||||
objekt_read = ObjektRead.model_validate(objekt).model_copy(
|
||||
update={"letzte_kontrolle_am": letzte_map.get(objekt_id)}
|
||||
)
|
||||
|
||||
return AkteRead(
|
||||
@@ -114,18 +104,7 @@ async def akte_fuer_objekt(db: AsyncSession, objekt_id: int) -> AkteRead | None:
|
||||
],
|
||||
letzte_kontrolle_am=letzte_map.get(objekt_id),
|
||||
historie=[
|
||||
HistorieRead(
|
||||
id=eintrag.id,
|
||||
zeitpunkt=eintrag.zeitpunkt,
|
||||
benutzer_id=eintrag.benutzer_id,
|
||||
benutzer_name=benutzer_name,
|
||||
ereignistyp=eintrag.ereignistyp,
|
||||
entitaet_typ=eintrag.entitaet_typ,
|
||||
entitaet_id=eintrag.entitaet_id,
|
||||
alter_wert=eintrag.alter_wert,
|
||||
neuer_wert=eintrag.neuer_wert,
|
||||
begruendung=eintrag.begruendung,
|
||||
)
|
||||
HistorieRead.model_validate(eintrag).model_copy(update={"benutzer_name": benutzer_name})
|
||||
for eintrag, benutzer_name in historie_result.all()
|
||||
],
|
||||
dokumente=[DokumentRead.model_validate(d) for d in dokumente_result.scalars().all()],
|
||||
|
||||
Reference in New Issue
Block a user