From 884bae9fc4eeb3662572ee4ccf9a21b6dcf68f5c Mon Sep 17 00:00:00 2001 From: 9qeklajc Date: Sun, 26 Apr 2026 22:57:31 +0200 Subject: [PATCH] fix: migrate FastAPI-bound BaseModels to pydantic v2 to fix login --- routstr/balance.py | 2 +- routstr/core/admin.py | 8 ++++---- routstr/lightning.py | 2 +- routstr/payment/models.py | 3 ++- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/routstr/balance.py b/routstr/balance.py index c8fc516b..7128916d 100644 --- a/routstr/balance.py +++ b/routstr/balance.py @@ -6,7 +6,7 @@ from typing import Annotated, NoReturn from fastapi import APIRouter, Depends, Header, HTTPException from fastapi.responses import JSONResponse -from pydantic.v1 import BaseModel +from pydantic import BaseModel from sqlmodel import col, select, update from .auth import get_billing_key, validate_bearer_key diff --git a/routstr/core/admin.py b/routstr/core/admin.py index b268f954..923e597f 100644 --- a/routstr/core/admin.py +++ b/routstr/core/admin.py @@ -5,7 +5,7 @@ from datetime import datetime, timezone from pathlib import Path from fastapi import APIRouter, Depends, HTTPException, Query, Request -from pydantic.v1 import BaseModel +from pydantic import BaseModel, RootModel from sqlmodel import select from ..payment.models import _row_to_model, list_models @@ -142,8 +142,8 @@ async def get_settings(request: Request) -> dict: return data -class SettingsUpdate(BaseModel): - __root__: dict[str, object] +class SettingsUpdate(RootModel[dict[str, object]]): + pass class PasswordUpdate(BaseModel): @@ -154,7 +154,7 @@ class PasswordUpdate(BaseModel): @admin_router.patch("/api/settings", dependencies=[Depends(require_admin_api)]) async def update_settings(request: Request, update: SettingsUpdate) -> dict: # Remove sensitive fields from general settings update - settings_data = update.__root__.copy() + settings_data = update.root.copy() sensitive_fields = ["admin_password", "upstream_api_key", "nsec"] for field in sensitive_fields: if field in settings_data: diff --git a/routstr/lightning.py b/routstr/lightning.py index 064489f8..aecbb48f 100644 --- a/routstr/lightning.py +++ b/routstr/lightning.py @@ -3,7 +3,7 @@ import secrets import time from fastapi import APIRouter, Depends, HTTPException -from pydantic.v1 import BaseModel, Field +from pydantic import BaseModel, Field from sqlmodel import select from sqlmodel.ext.asyncio.session import AsyncSession diff --git a/routstr/payment/models.py b/routstr/payment/models.py index afed3238..6250cc3a 100644 --- a/routstr/payment/models.py +++ b/routstr/payment/models.py @@ -4,6 +4,7 @@ import random import httpx from fastapi import APIRouter, Depends +from pydantic import BaseModel as V2BaseModel from pydantic.v1 import BaseModel from sqlmodel.ext.asyncio.session import AsyncSession @@ -405,7 +406,7 @@ async def update_sats_pricing() -> None: logger.error(f"Error updating sats pricing: {e}") -class ModelTestRequest(BaseModel): +class ModelTestRequest(V2BaseModel): model_id: str endpoint_type: str request_data: dict