Source code for piccolo_api.crud.hooks
import inspect
import typing as t
from enum import Enum
from piccolo.table import Table
from starlette.requests import Request
[docs]
class HookType(Enum):
"""
When the hook should be applied.
"""
pre_save = "pre_save"
pre_patch = "pre_patch"
pre_delete = "pre_delete"
[docs]
class Hook:
def __init__(self, hook_type: HookType, callable: t.Callable) -> None:
self.hook_type = hook_type
self.callable = callable
async def execute_post_hooks(
hooks: t.Dict[HookType, t.List[Hook]],
hook_type: HookType,
row: Table,
request: Request,
):
for hook in hooks.get(hook_type, []):
signature = inspect.signature(hook.callable)
kwargs: t.Dict[str, t.Any] = dict(row=row)
# Include request in hook call arguments if possible
if {i for i in signature.parameters.keys()}.intersection(
{"kwargs", "request"}
):
kwargs.update(request=request)
if inspect.iscoroutinefunction(hook.callable):
row = await hook.callable(**kwargs)
else:
row = hook.callable(**kwargs)
return row
async def execute_patch_hooks(
hooks: t.Dict[HookType, t.List[Hook]],
hook_type: HookType,
row_id: t.Any,
values: t.Dict[t.Any, t.Any],
request: Request,
) -> t.Dict[t.Any, t.Any]:
for hook in hooks.get(hook_type, []):
signature = inspect.signature(hook.callable)
kwargs = dict(row_id=row_id, values=values)
# Include request in hook call arguments if possible
if {i for i in signature.parameters.keys()}.intersection(
{"kwargs", "request"}
):
kwargs.update(request=request)
if inspect.iscoroutinefunction(hook.callable):
values = await hook.callable(**kwargs)
else:
values = hook.callable(**kwargs)
return values
async def execute_delete_hooks(
hooks: t.Dict[HookType, t.List[Hook]],
hook_type: HookType,
row_id: t.Any,
request: Request,
):
for hook in hooks.get(hook_type, []):
signature = inspect.signature(hook.callable)
kwargs = dict(row_id=row_id)
# Include request in hook call arguments if possible
if {i for i in signature.parameters.keys()}.intersection(
{"kwargs", "request"}
):
kwargs.update(request=request)
if inspect.iscoroutinefunction(hook.callable):
await hook.callable(**kwargs)
else:
hook.callable(**kwargs)