Phase 9: Code-Hygiene - alle pyflakes-Issues fixen
15 pyflakes-Warnings entfernt: - src/audit.py: HTTPException (in router import statt helper, war hier ungenutzt) - src/routers/auth.py: status (FastAPI-status ungenutzt) - src/routers/audit.py: HTTPException (ungenutzt) - src/routers/users.py: MAGIC_LINK_EXPIRE_MINUTES (ungenutzt) - src/routers/sources.py: row_to_dict, _extract_domain, _detect_category, urlparse, status (alle ungenutzt - status.HTTP_* wird nirgendwo aufgerufen) - src/routers/sources.py: 2x f-string ohne Placeholder (URL aktualisiert, Verbindung fehlgeschlagen) zu normalen Strings - src/routers/sources.py: except httpx.ConnectError as e -> e ungenutzt, weg - src/database.py: os ungenutzt - src/models.py: EmailStr ungenutzt Audit-Coverage geprueft: alle write-Endpoints in users.py rufen _toggle_field() auf, das die log_action-Aufrufe macht. Keine Audit-Luecken. Alle anderen Routers (organizations/licenses/dashboard/token_usage) hatten bereits saubere Audit-Coverage. Mojibake-Diagnose ueber alle src/*.py: 0 Treffer.
Dieser Commit ist enthalten in:
@@ -1,6 +1,5 @@
|
|||||||
"""Datenbankverbindung (geteilte DB mit OSINT-Monitor)."""
|
"""Datenbankverbindung (geteilte DB mit OSINT-Monitor)."""
|
||||||
import aiosqlite
|
import aiosqlite
|
||||||
import os
|
|
||||||
from config import DB_PATH
|
from config import DB_PATH
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
"""Pydantic Models für das Verwaltungsportal."""
|
"""Pydantic Models für das Verwaltungsportal."""
|
||||||
from pydantic import BaseModel, EmailStr, Field
|
from pydantic import BaseModel, Field
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
from fastapi import APIRouter, Depends, HTTPException
|
from fastapi import APIRouter, Depends
|
||||||
from auth import get_current_admin
|
from auth import get_current_admin
|
||||||
from database import db_dependency
|
from database import db_dependency
|
||||||
import aiosqlite
|
import aiosqlite
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
"""Magic-Link-Authentifizierung."""
|
"""Magic-Link-Authentifizierung."""
|
||||||
import logging
|
import logging
|
||||||
from datetime import datetime, timedelta, timezone
|
from datetime import datetime, timedelta, timezone
|
||||||
from fastapi import APIRouter, Depends, HTTPException, Request, status
|
from fastapi import APIRouter, Depends, HTTPException, Request
|
||||||
import aiosqlite
|
import aiosqlite
|
||||||
|
|
||||||
from auth import generate_magic_token, create_token
|
from auth import generate_magic_token, create_token
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
import logging
|
import logging
|
||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
from fastapi import APIRouter, Depends, HTTPException, status, Request
|
from fastapi import APIRouter, Depends, HTTPException, Request
|
||||||
from fastapi.responses import StreamingResponse
|
from fastapi.responses import StreamingResponse
|
||||||
from pydantic import BaseModel, Field
|
from pydantic import BaseModel, Field
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
@@ -10,15 +10,13 @@ import aiosqlite
|
|||||||
|
|
||||||
from auth import get_current_admin
|
from auth import get_current_admin
|
||||||
from database import db_dependency
|
from database import db_dependency
|
||||||
from audit import log_action, get_client_ip, row_to_dict
|
from audit import log_action, get_client_ip
|
||||||
from source_meta import get_meta
|
from source_meta import get_meta
|
||||||
from config import HEALTH_CHECK_USER_AGENT, HEALTH_CHECK_TIMEOUT_S
|
from config import HEALTH_CHECK_USER_AGENT, HEALTH_CHECK_TIMEOUT_S
|
||||||
from shared.source_rules import (
|
from shared.source_rules import (
|
||||||
discover_source,
|
discover_source,
|
||||||
discover_all_feeds,
|
discover_all_feeds,
|
||||||
evaluate_feeds_with_claude,
|
evaluate_feeds_with_claude,
|
||||||
_extract_domain,
|
|
||||||
_detect_category,
|
|
||||||
domain_to_display_name,
|
domain_to_display_name,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -683,7 +681,7 @@ async def update_suggestion(
|
|||||||
new_url = data.get("url")
|
new_url = data.get("url")
|
||||||
if source_id and new_url:
|
if source_id and new_url:
|
||||||
await db.execute("UPDATE sources SET url = ? WHERE id = ?", (new_url, source_id))
|
await db.execute("UPDATE sources SET url = ? WHERE id = ?", (new_url, source_id))
|
||||||
result_action = f"URL aktualisiert"
|
result_action = "URL aktualisiert"
|
||||||
|
|
||||||
# Auto-Reject: Wenn fix_url oder add_source akzeptiert wird,
|
# Auto-Reject: Wenn fix_url oder add_source akzeptiert wird,
|
||||||
# zugehörige deactivate_source-Vorschläge automatisch ablehnen
|
# zugehörige deactivate_source-Vorschläge automatisch ablehnen
|
||||||
@@ -741,7 +739,6 @@ async def run_health_check_stream(
|
|||||||
"""Health-Check mit Fortschrittsanzeige (SSE-Stream)."""
|
"""Health-Check mit Fortschrittsanzeige (SSE-Stream)."""
|
||||||
import json as _json
|
import json as _json
|
||||||
import asyncio
|
import asyncio
|
||||||
from urllib.parse import urlparse
|
|
||||||
|
|
||||||
# Quellen laden
|
# Quellen laden
|
||||||
cursor = await db.execute(
|
cursor = await db.execute(
|
||||||
@@ -806,8 +803,8 @@ async def run_health_check_stream(
|
|||||||
"message": f"Feed OK ({len(feed.entries)} Eintr.)"})
|
"message": f"Feed OK ({len(feed.entries)} Eintr.)"})
|
||||||
except httpx.TimeoutException:
|
except httpx.TimeoutException:
|
||||||
checks.append({"type": "reachability", "status": "error", "message": "Timeout (15s)"})
|
checks.append({"type": "reachability", "status": "error", "message": "Timeout (15s)"})
|
||||||
except httpx.ConnectError as e:
|
except httpx.ConnectError:
|
||||||
checks.append({"type": "reachability", "status": "error", "message": f"Verbindung fehlgeschlagen"})
|
checks.append({"type": "reachability", "status": "error", "message": "Verbindung fehlgeschlagen"})
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
checks.append({"type": "reachability", "status": "error", "message": f"{type(e).__name__}"})
|
checks.append({"type": "reachability", "status": "error", "message": f"{type(e).__name__}"})
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ from models import UserCreate, UserResponse
|
|||||||
from auth import get_current_admin
|
from auth import get_current_admin
|
||||||
from database import db_dependency
|
from database import db_dependency
|
||||||
from audit import log_action, get_client_ip, row_to_dict
|
from audit import log_action, get_client_ip, row_to_dict
|
||||||
from config import MAGIC_LINK_BASE_URL, MAGIC_LINK_EXPIRE_MINUTES
|
from config import MAGIC_LINK_BASE_URL
|
||||||
import aiosqlite
|
import aiosqlite
|
||||||
|
|
||||||
router = APIRouter(prefix="/api/users", tags=["users"])
|
router = APIRouter(prefix="/api/users", tags=["users"])
|
||||||
|
|||||||
In neuem Issue referenzieren
Einen Benutzer sperren