Drop Pydantic v1 support

This commit is contained in:
François Voron
2025-10-25 08:27:54 +02:00
parent fcf9a2041a
commit cd53bb8c5e
10 changed files with 21 additions and 65 deletions

View File

@ -8,7 +8,6 @@ from fastapi_users.authentication.transport.base import (
TransportLogoutNotSupportedError,
)
from fastapi_users.openapi import OpenAPIResponseType
from fastapi_users.schemas import model_dump
class BearerResponse(BaseModel):
@ -24,7 +23,7 @@ class BearerTransport(Transport):
async def get_login_response(self, token: str) -> Response:
bearer_response = BearerResponse(access_token=token, token_type="bearer")
return JSONResponse(model_dump(bearer_response))
return JSONResponse(bearer_response.model_dump())
async def get_logout_response(self) -> Response:
raise TransportLogoutNotSupportedError()

View File

@ -265,6 +265,6 @@ def get_oauth_associate_router(
request,
)
return schemas.model_validate(user_schema, user)
return user_schema.model_validate(user)
return router

View File

@ -69,6 +69,6 @@ def get_register_router(
},
)
return schemas.model_validate(user_schema, created_user)
return user_schema.model_validate(created_user)
return router

View File

@ -46,7 +46,7 @@ def get_users_router(
async def me(
user: models.UP = Depends(get_current_active_user),
):
return schemas.model_validate(user_schema, user)
return user_schema.model_validate(user)
@router.patch(
"/me",
@ -94,7 +94,7 @@ def get_users_router(
user = await user_manager.update(
user_update, user, safe=True, request=request
)
return schemas.model_validate(user_schema, user)
return user_schema.model_validate(user)
except exceptions.InvalidPasswordException as e:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
@ -127,7 +127,7 @@ def get_users_router(
},
)
async def get_user(user=Depends(get_user_or_404)):
return schemas.model_validate(user_schema, user)
return user_schema.model_validate(user)
@router.patch(
"/{id}",
@ -181,7 +181,7 @@ def get_users_router(
user = await user_manager.update(
user_update, user, safe=False, request=request
)
return schemas.model_validate(user_schema, user)
return user_schema.model_validate(user)
except exceptions.InvalidPasswordException as e:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,

View File

@ -68,7 +68,7 @@ def get_verify_router(
):
try:
user = await user_manager.verify(token, request)
return schemas.model_validate(user_schema, user)
return user_schema.model_validate(user)
except (exceptions.InvalidVerifyToken, exceptions.UserNotExists):
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,

View File

@ -1,35 +1,15 @@
from typing import Any, Generic, TypeVar
from typing import Generic, TypeVar
from pydantic import BaseModel, ConfigDict, EmailStr
from pydantic.version import VERSION as PYDANTIC_VERSION
from fastapi_users import models
PYDANTIC_V2 = PYDANTIC_VERSION.startswith("2.")
SCHEMA = TypeVar("SCHEMA", bound=BaseModel)
if PYDANTIC_V2: # pragma: no cover
def model_dump(model: BaseModel, *args, **kwargs) -> dict[str, Any]:
return model.model_dump(*args, **kwargs) # type: ignore
def model_validate(schema: type[SCHEMA], obj: Any, *args, **kwargs) -> SCHEMA:
return schema.model_validate(obj, *args, **kwargs) # type: ignore
else: # pragma: no cover # type: ignore
def model_dump(model: BaseModel, *args, **kwargs) -> dict[str, Any]:
return model.dict(*args, **kwargs) # type: ignore
def model_validate(schema: type[SCHEMA], obj: Any, *args, **kwargs) -> SCHEMA:
return schema.from_orm(obj) # type: ignore
class CreateUpdateDictModel(BaseModel):
def create_update_dict(self):
return model_dump(
self,
return self.model_dump(
exclude_unset=True,
exclude={
"id",
@ -41,7 +21,7 @@ class CreateUpdateDictModel(BaseModel):
)
def create_update_dict_superuser(self):
return model_dump(self, exclude_unset=True, exclude={"id"})
return self.model_dump(exclude_unset=True, exclude={"id"})
class BaseUser(CreateUpdateDictModel, Generic[models.ID]):
@ -53,12 +33,7 @@ class BaseUser(CreateUpdateDictModel, Generic[models.ID]):
is_superuser: bool = False
is_verified: bool = False
if PYDANTIC_V2: # pragma: no cover
model_config = ConfigDict(from_attributes=True) # type: ignore
else: # pragma: no cover
class Config:
orm_mode = True
model_config = ConfigDict(from_attributes=True)
class BaseUserCreate(CreateUpdateDictModel):
@ -93,12 +68,7 @@ class BaseOAuthAccount(BaseModel, Generic[models.ID]):
account_id: str
account_email: str
if PYDANTIC_V2: # pragma: no cover
model_config = ConfigDict(from_attributes=True) # type: ignore
else: # pragma: no cover
class Config:
orm_mode = True
model_config = ConfigDict(from_attributes=True)
class BaseOAuthAccountMixin(BaseModel):