47f7a85510
Die Ampel-Nachruestung deckte 317/337 vorbestehende ruff-Verstoesse im ganzen Repo auf. Aufgeraeumt: - ruff.toml: intentionale Muster als Projekt-Politik ausgenommen (BLE001 blind-except, S110/S112 try-except-pass/continue, PLW1510 subprocess-best-effort, B008 FastAPI- Depends/File-Idiom, EXE001 Shebang, + wenige Stil-Regeln). __init__.py-Re-Exports geschuetzt (F401). - ruff --fix: 128 mechanische (Import-Sortierung, PEP585/604-Annotationen, tote Imports, ueberfluessige noqa) auto-behoben. - 12 echte Reste von Hand: PERF402/102, PLC3002 (Lambda->walrus), ISC004 (String-Concat geklammert), F841/RUF059 (ungenutzte Vars), PIE810 (startswith-Tuple), UP031 (f-string), UP035 (veraltete typing-Imports). Ergebnis: 'ruff check .' = 0, 'compileall' grün. Kein Verhaltenswechsel (nur Stil/Modernisierung). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
64 lines
1.9 KiB
Python
64 lines
1.9 KiB
Python
"""Auftragsbuch-Endpoints (Vorschlags-Inbox) — dünner REST-Layer über services/auftragsbuch.py.
|
|
LAN-only wie alle MC2-Endpoints; das Gate ist der Klick des Commanders."""
|
|
|
|
from fastapi import APIRouter, HTTPException
|
|
from pydantic import BaseModel
|
|
from services import auftragsbuch
|
|
|
|
router = APIRouter(prefix="/api")
|
|
|
|
|
|
class BranchIn(BaseModel):
|
|
branch: str
|
|
repo: str = "mc2" # "mc2" (Box-Stack) oder "lucy" (Desktop-App, Annahme baut am PC)
|
|
grund: str = "" # nur beim Ablehnen: optionaler Grund → Lern-Gedächtnis des Kreislaufs
|
|
|
|
|
|
class KandidatIn(BaseModel):
|
|
file: str
|
|
|
|
|
|
@router.get("/auftragsbuch")
|
|
def list_proposals() -> dict:
|
|
return auftragsbuch.list_proposals()
|
|
|
|
|
|
@router.get("/auftragsbuch/diff")
|
|
def diff(branch: str, repo: str = "mc2") -> dict:
|
|
res = auftragsbuch.diff_of(branch, repo)
|
|
if not res.get("ok"):
|
|
raise HTTPException(400, res.get("error", "Diff nicht verfügbar."))
|
|
return res
|
|
|
|
|
|
@router.post("/auftragsbuch/annehmen")
|
|
def accept(body: BranchIn) -> dict:
|
|
res = auftragsbuch.accept(body.branch, body.repo)
|
|
if not res.get("ok"):
|
|
raise HTTPException(400, res.get("error", "Annehmen fehlgeschlagen."))
|
|
return res
|
|
|
|
|
|
@router.post("/auftragsbuch/ablehnen")
|
|
def reject(body: BranchIn) -> dict:
|
|
res = auftragsbuch.reject(body.branch, body.repo, body.grund)
|
|
if not res.get("ok"):
|
|
raise HTTPException(400, res.get("error", "Ablehnen fehlgeschlagen."))
|
|
return res
|
|
|
|
|
|
@router.post("/auftragsbuch/skill/annehmen")
|
|
def skill_accept(body: KandidatIn) -> dict:
|
|
res = auftragsbuch.skill_accept(body.file)
|
|
if not res.get("ok"):
|
|
raise HTTPException(400, res.get("error", "Beauftragen fehlgeschlagen."))
|
|
return res
|
|
|
|
|
|
@router.post("/auftragsbuch/skill/ablehnen")
|
|
def skill_reject(body: KandidatIn) -> dict:
|
|
res = auftragsbuch.skill_reject(body.file)
|
|
if not res.get("ok"):
|
|
raise HTTPException(400, res.get("error", "Verwerfen fehlgeschlagen."))
|
|
return res
|