Add IDM assignment lifecycle worker contract

This commit is contained in:
2026-07-31 18:07:36 +02:00
parent 5ee85d07d6
commit 50a8d459e7
3 changed files with 184 additions and 0 deletions
+34
View File
@@ -9,6 +9,7 @@ from typing import Literal, Protocol, runtime_checkable
IDM_MODULE_ID = "idm"
CAPABILITY_IDM_DIRECTORY = "idm.directory"
CAPABILITY_IDM_FUNCTION_ASSIGNMENTS = "idm.function_assignments"
CAPABILITY_IDM_ASSIGNMENT_LIFECYCLE = "idm.assignmentLifecycle"
IdmStatus = Literal["active", "inactive", "suspended"]
OrganizationFunctionAssignmentSource = Literal["direct", "delegated", "acting_for", "directory", "governance", "system"]
@@ -106,3 +107,36 @@ class IdmFunctionAssignmentDirectory(Protocol):
effective_at: datetime | None = None,
) -> Mapping[str, OrganizationFunctionIncumbencyRef]:
...
@runtime_checkable
class IdmAssignmentLifecycle(Protocol):
"""Worker boundary for time-driven function-assignment transitions."""
def process_expired(
self,
session: object,
*,
tenant_id: str | None = None,
effective_at: datetime | None = None,
limit: int = 100,
) -> Mapping[str, object]:
...
def idm_assignment_lifecycle(
registry: object | None,
) -> IdmAssignmentLifecycle | None:
if (
registry is None
or not hasattr(registry, "has_capability")
or not hasattr(registry, "capability")
or not registry.has_capability(CAPABILITY_IDM_ASSIGNMENT_LIFECYCLE)
):
return None
capability = registry.capability(CAPABILITY_IDM_ASSIGNMENT_LIFECYCLE)
return (
capability
if isinstance(capability, IdmAssignmentLifecycle)
else None
)