Files
MABEA/backend/app/services/zustaendigkeit.py
T
patrickandClaude Sonnet 5 b9cf195a63
CI / backend-tests (push) Failing after 0s
Sprint 1: Stammdaten-Modelle/-Endpunkte, Admin-Benutzerverwaltung, Zuständigkeits-Vererbung (E2)
- ORM-Modelle: Bereich, Kategorie, Standort, Objekttyp, Material (Prompt 06/07),
  minimales Objekt-Modell (voll ausgebaut erst Sprint 2), Zustaendigkeit/
  Kontrollverantwortung
- Admin-API 7a: GET/POST Stammdaten-Endpunkte, PATCH Material, Benutzerverwaltung
  (anlegen/Rollen ändern), Zuständigkeits-/Kontrollverantwortungs-CRUD
- Vererbungslogik E2 als eigener Service (app/services/zustaendigkeit.py):
  Standort-Zuordnung vererbt sich auf alle Objekte, Objekt-Zeile ist Vereinigung
  statt Ersatz - GET /zustaendigkeiten/benutzer/{id}/objekte exponiert das
- Tests: Stammdaten-CRUD + Rollenrechte, Benutzerverwaltung (inkl. 409 bei
  Login-Duplikat), E2-Vererbungslogik (Standort-only, Standort+Objekt-Vereinigung,
  End-to-End über den Endpunkt)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L85hmKbvX7Cqkq47KnQhFt
2026-09-03 23:12:49 +02:00

29 lines
1.1 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.
from sqlalchemy import or_, select
from sqlalchemy.ext.asyncio import AsyncSession
from app.models.objekt import Objekt
from app.models.zustaendigkeit import Zustaendigkeit
async def zustaendige_objekte(db: AsyncSession, benutzer_id: int) -> list[Objekt]:
"""Karte 04 / Sprintplan E2: ein Benutzer ist für ein Objekt zuständig, wenn
ENTWEDER eine Standort-Zeile für dessen Standort ODER eine Objekt-Zeile für
das Objekt selbst existiert (Vereinigung, keine Überschreibung eine
objektspezifische Zuordnung ergänzt die Standort-Vererbung, ersetzt sie nicht)."""
standort_ids_subq = (
select(Zustaendigkeit.standort_id)
.where(Zustaendigkeit.benutzer_id == benutzer_id, Zustaendigkeit.standort_id.is_not(None))
)
objekt_ids_subq = (
select(Zustaendigkeit.objekt_id)
.where(Zustaendigkeit.benutzer_id == benutzer_id, Zustaendigkeit.objekt_id.is_not(None))
)
stmt = select(Objekt).where(
or_(
Objekt.standort_id.in_(standort_ids_subq),
Objekt.id.in_(objekt_ids_subq),
)
)
result = await db.execute(stmt)
return list(result.scalars().all())