Source code for next.forms.markers
"""Dependency injection markers and provider for form parameters."""
from __future__ import annotations
import inspect
from typing import get_args, get_origin
from next.deps import DDependencyBase, RegisteredParameterProvider
[docs]
class DForm[FormT](DDependencyBase[FormT]):
r"""Annotation for injecting a form instance by class.
Use as `DForm[MyForm]` or `DForm["MyForm"]`.
"""
__slots__ = ()
[docs]
class FormProvider(RegisteredParameterProvider):
"""Inject a `form` instance matching the annotation or the parameter name `form`."""
priority = 40
[docs]
def can_handle(self, param: inspect.Parameter, context: object) -> bool:
"""Return True when context carries a form compatible with `param`."""
form = getattr(context, "form", None)
if form is None:
return False
if param.name == "form":
return True
ann = param.annotation
if ann is inspect.Parameter.empty:
return False
origin = get_origin(ann)
if origin is DForm:
args = get_args(ann)
if len(args) >= 1:
form_class = args[0]
if isinstance(form_class, type) and isinstance(form, form_class):
return True
return False
return isinstance(ann, type) and isinstance(form, ann)
[docs]
def resolve(self, _param: inspect.Parameter, context: object) -> object:
"""Return the form instance from context."""
return getattr(context, "form", None)
__all__ = ["DForm", "FormProvider"]