Promote develop → main (2026-05-02 22:53 UTC)

This commit was merged in pull request #13.
Dieser Commit ist enthalten in:
2026-05-03 00:53:32 +02:00
Commit d7711711aa
2 geänderte Dateien mit 26 neuen und 1 gelöschten Zeilen

Datei anzeigen

@@ -1,7 +1,13 @@
"""Auth-Router: Magic-Link-Login und Nutzerverwaltung.""" """Auth-Router: Magic-Link-Login und Nutzerverwaltung."""
import logging import logging
import os
from datetime import datetime, timedelta from datetime import datetime, timedelta
from fastapi import APIRouter, Depends, HTTPException, Request, status from fastapi import APIRouter, Depends, HTTPException, Request, status
def _staging_mode() -> bool:
"""STAGING_MODE Env-Flag (vgl. services.license_service)."""
return os.environ.get("STAGING_MODE", "").lower() in ("1", "true", "yes")
from models import ( from models import (
MagicLinkRequest, MagicLinkRequest,
MagicLinkResponse, MagicLinkResponse,
@@ -203,6 +209,11 @@ async def get_me(
credits_remaining = max(0, int(credits_total - credits_used)) credits_remaining = max(0, int(credits_total - credits_used))
credits_percent_used = round((credits_used / credits_total) * 100, 1) if credits_total > 0 else 0 credits_percent_used = round((credits_used / credits_total) * 100, 1) if credits_total > 0 else 0
# STAGING_MODE: Org-Switcher im Frontend deaktivieren
is_global_admin_response = current_user.get("is_global_admin", False)
if _staging_mode():
is_global_admin_response = False
return UserMeResponse( return UserMeResponse(
id=current_user["id"], id=current_user["id"],
username=current_user["username"], username=current_user["username"],
@@ -219,7 +230,7 @@ async def get_me(
read_only=license_info.get("read_only", False), read_only=license_info.get("read_only", False),
read_only_reason=license_info.get("read_only_reason"), read_only_reason=license_info.get("read_only_reason"),
unlimited_budget=unlimited_budget, unlimited_budget=unlimited_budget,
is_global_admin=current_user.get("is_global_admin", False), is_global_admin=is_global_admin_response,
) )

Datei anzeigen

@@ -1,5 +1,6 @@
"""Lizenz-Verwaltung und -Pruefung.""" """Lizenz-Verwaltung und -Pruefung."""
import logging import logging
import os
from datetime import datetime from datetime import datetime
from config import TIMEZONE from config import TIMEZONE
import aiosqlite import aiosqlite
@@ -7,6 +8,15 @@ import aiosqlite
logger = logging.getLogger("osint.license") logger = logging.getLogger("osint.license")
def _staging_mode() -> bool:
"""Staging-Mode aktiv? Wenn ja, gilt: immer unlimited Budget, kein Hard-Stop.
Wird ueber ENV-Variable STAGING_MODE=1 (oder true) aktiviert.
Nur in Staging-.env gesetzt; Live-.env hat das Flag nicht.
"""
return os.environ.get("STAGING_MODE", "").lower() in ("1", "true", "yes")
async def check_license(db: aiosqlite.Connection, organization_id: int) -> dict: async def check_license(db: aiosqlite.Connection, organization_id: int) -> dict:
"""Prueft den Lizenzstatus einer Organisation. """Prueft den Lizenzstatus einer Organisation.
@@ -50,6 +60,10 @@ async def check_license(db: aiosqlite.Connection, organization_id: int) -> dict:
credits_total = lic_dict.get("credits_total") credits_total = lic_dict.get("credits_total")
credits_used = lic_dict.get("credits_used") or 0 credits_used = lic_dict.get("credits_used") or 0
# STAGING_MODE: kein Token-Budget-Hard-Stop, immer unlimited
if _staging_mode():
unlimited_budget = True
# Ablauf pruefen # Ablauf pruefen
now = datetime.now(TIMEZONE) now = datetime.now(TIMEZONE)
valid_until = license_row["valid_until"] valid_until = license_row["valid_until"]