diff --git a/fastapi/dependencies.py b/fastapi/dependencies.py index 4a62ab58..4835c74c 100644 --- a/fastapi/dependencies.py +++ b/fastapi/dependencies.py @@ -43,6 +43,12 @@ def authenticated_partner_impl() -> Partner: See the fastapi_endpoint_demo for an example""" +def optionally_authenticated_partner_impl() -> Partner | None: + """This method has to be overriden when you create your fastapi app + and you need to get an optional authenticated partner into your endpoint. + """ + + def authenticated_partner_env( partner: Annotated[Partner, Depends(authenticated_partner_impl)] ) -> Environment: @@ -50,6 +56,18 @@ def authenticated_partner_env( return partner.with_context(authenticated_partner_id=partner.id).env +def optionally_authenticated_partner_env( + partner: Annotated[Partner | None, Depends(optionally_authenticated_partner_impl)], + env: Annotated[Environment, Depends(odoo_env)], +) -> Environment: + """Return an environment with the authenticated partner id in the context if + the partner is not None + """ + if partner: + return partner.with_context(authenticated_partner_id=partner.id).env + return env + + def authenticated_partner( partner: Annotated[Partner, Depends(authenticated_partner_impl)], partner_env: Annotated[Environment, Depends(authenticated_partner_env)], @@ -66,6 +84,22 @@ def authenticated_partner( return partner_env["res.partner"].browse(partner.id) +def optionally_authenticated_partner( + partner: Annotated[Partner | None, Depends(optionally_authenticated_partner_impl)], + partner_env: Annotated[Environment, Depends(optionally_authenticated_partner_env)], +) -> Partner | None: + """If you need to get access to the authenticated partner if the call is + authenticated, you can add a dependency into the endpoint definition on this + method. + + This method defer from authenticated_partner by the fact that it returns + None if the partner is not authenticated . + """ + if partner: + return partner_env["res.partner"].browse(partner.id) + return None + + def paging( page: Annotated[int, Query(gte=1)] = 1, page_size: Annotated[int, Query(gte=1)] = 80 ) -> Paging: diff --git a/fastapi/tests/common.py b/fastapi/tests/common.py index 33e7581b..2ae0dcf4 100644 --- a/fastapi/tests/common.py +++ b/fastapi/tests/common.py @@ -15,7 +15,10 @@ from fastapi.testclient import TestClient from ..context import odoo_env_ctx -from ..dependencies import authenticated_partner_impl +from ..dependencies import ( + authenticated_partner_impl, + optionally_authenticated_partner_impl, +) @tagged("post_install", "-at_install") @@ -106,6 +109,15 @@ def _create_test_client( ) if partner or authenticated_partner_impl not in dependencies: dependencies[authenticated_partner_impl] = partial(lambda a: a, partner) + if partner and optionally_authenticated_partner_impl in dependencies: + raise ValueError( + "You cannot provide an override for the optionally_authenticated_partner_impl " + "dependency when creating a test client with a partner." + ) + if partner or optionally_authenticated_partner_impl not in dependencies: + dependencies[optionally_authenticated_partner_impl] = partial( + lambda a: a, partner + ) app = app or self.default_fastapi_app or FastAPI() router = router or self.default_fastapi_router if router: