Move on_after_register to manager

This commit is contained in:
François Voron
2021-09-14 15:02:17 +02:00
parent 8967138375
commit 38d4aed817
9 changed files with 79 additions and 101 deletions

View File

@@ -64,21 +64,12 @@ class FastAPIUsers(Generic[models.U, models.UC, models.UU, models.UD]):
self.get_user_manager = get_user_manager
self.current_user = self.authenticator.current_user
def get_register_router(
self,
after_register: Optional[Callable[[models.UD, Request], None]] = None,
) -> APIRouter:
"""
Return a router with a register route.
:param after_register: Optional function called
after a successful registration.
"""
def get_register_router(self) -> APIRouter:
"""Return a router with a register route."""
return get_register_router(
self.get_user_manager,
self._user_model,
self._user_create_model,
after_register,
)
def get_verify_router(

View File

@@ -1,8 +1,8 @@
from typing import Any, Callable, Dict, Generic, Optional, Type, Union
from pydantic.types import UUID4
from fastapi import Request
from fastapi.security import OAuth2PasswordRequestForm
from pydantic.types import UUID4
from fastapi_users import models, password
from fastapi_users.db import BaseUserDatabase
@@ -67,7 +67,9 @@ class BaseUserManager(Generic[models.UC, models.UD]):
return user
async def create(self, user: models.UC, safe: bool = False) -> models.UD:
async def create(
self, user: models.UC, safe: bool = False, request: Optional[Request] = None
) -> models.UD:
await self.validate_password(user.password, user)
existing_user = await self.user_db.get_by_email(user.email)
@@ -79,7 +81,12 @@ class BaseUserManager(Generic[models.UC, models.UD]):
user.create_update_dict() if safe else user.create_update_dict_superuser()
)
db_user = self.user_db_model(**user_dict, hashed_password=hashed_password)
return await self.user_db.create(db_user)
created_user = await self.user_db.create(db_user)
await self.on_after_register(created_user, request)
return created_user
async def verify(self, user: models.UD) -> models.UD:
if user.is_verified:
@@ -105,6 +112,11 @@ class BaseUserManager(Generic[models.UC, models.UD]):
) -> None:
return # pragma: no cover
async def on_after_register(
self, user: models.UD, request: Optional[Request] = None
) -> None:
return # pragma: no cover
async def authenticate(
self, credentials: OAuth2PasswordRequestForm
) -> Optional[models.UD]:

View File

@@ -1,22 +1,21 @@
from typing import Callable, Optional, Type
from typing import Type
from fastapi import APIRouter, Depends, HTTPException, Request, status
from fastapi_users import models
from fastapi_users.manager import (
BaseUserManager,
InvalidPasswordException,
UserAlreadyExists,
BaseUserManager,
UserManagerDependency,
)
from fastapi_users.router.common import ErrorCode, run_handler
from fastapi_users.router.common import ErrorCode
def get_register_router(
get_user_manager: UserManagerDependency[models.UC, models.UD],
user_model: Type[models.U],
user_create_model: Type[models.UC],
after_register: Optional[Callable[[models.UD, Request], None]] = None,
) -> APIRouter:
"""Generate a router with the register route."""
router = APIRouter()
@@ -30,7 +29,7 @@ def get_register_router(
user_manager: BaseUserManager[models.UC, models.UD] = Depends(get_user_manager),
):
try:
created_user = await user_manager.create(user, safe=True)
created_user = await user_manager.create(user, safe=True, request=request)
except UserAlreadyExists:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
@@ -45,9 +44,6 @@ def get_register_router(
},
)
if after_register:
await run_handler(after_register, created_user, request)
return created_user
return router

View File

@@ -7,8 +7,8 @@ from pydantic import UUID4, EmailStr
from fastapi_users import models
from fastapi_users.jwt import SecretType, decode_jwt, generate_jwt
from fastapi_users.manager import (
InvalidPasswordException,
BaseUserManager,
InvalidPasswordException,
UserManagerDependency,
UserNotExists,
)

View File

@@ -6,9 +6,9 @@ from pydantic import UUID4
from fastapi_users import models
from fastapi_users.authentication import Authenticator
from fastapi_users.manager import (
BaseUserManager,
InvalidPasswordException,
UserAlreadyExists,
BaseUserManager,
UserManagerDependency,
UserNotExists,
)

View File

@@ -7,8 +7,8 @@ from pydantic import UUID4, EmailStr
from fastapi_users import models
from fastapi_users.jwt import SecretType, decode_jwt, generate_jwt
from fastapi_users.manager import (
UserAlreadyVerified,
BaseUserManager,
UserAlreadyVerified,
UserManagerDependency,
UserNotExists,
)