Alex Ermolin
05/09/2023, 4:43 PMCharith (Cerbos)
05/09/2023, 5:03 PMAlex Ermolin
05/09/2023, 7:53 PMfrom enum import Enum
from typing import Generic, TypeVar
from pydantic.generics import GenericModel
class ResourceActions(Enum):
pass
T = TypeVar("T", bound=ResourceActions)
class ResourceType(GenericModel, Generic[T]):
kind: str
actions: type[T]
schemas/authorization/resources.py:
from typing import TypeVar
from schemas.authorization.base import ResourceType, ResourceActions
class MyResourceActions(ResourceActions):
read = "read"
write = "write"
my_resource_type = ResourceType[MyResourceActions](
kind="MyResource",
actions=MyResourceActions,
)
class AnotherResourceActions(ResourceActions):
copy = "copy"
another_resource_type = ResourceType[AnotherResourceActions](
kind="AnotherResource",
actions=AnotherResourceActions,
)
print(my_resource_type.actions.read) # You get autocomplete for .red and .write
X = TypeVar("X")
def do_actions_on_resource_type(resource_type: ResourceType[X], actions: list[X]):
for action in actions:
print(f"Performing {action} on resource type {resource_type.kind}")
do_actions_on_resource_type(
my_resource_type,
[my_resource_type.actions.read, my_resource_type.actions.write],
)
do_actions_on_resource_type(another_resource_type, [another_resource_type.actions.copy])
# This runs but pycharm highlights it a warning
do_actions_on_resource_type(another_resource_type, [my_resource_type.actions.read])