Skip to content
Menu

Documentation

sandloom.sdk.tenant

Tenant binding and isolation, and the tenant kind (spec §7.1).

Public API 1.0 (spec §2.2, Appendix C).

from sandloom.sdk.tenant import <name>. Signatures in a terminal: sandloom docs <name>. Beginner names are the ones generated code and the examples use; any other name is advanced (mark its import line # sandloom: advanced <reason> in generated code and examples).

Advanced

Name Kind Summary
bind_tenant function Bind tenant_id for the duration of the block.
current_tenant_id function Return the tenant bound in the current context, or raise (fail closed).
current_tenant_id_optional function Return the bound tenant or None (does not raise).
scoped function Add a fail-closed tenant filter to stmt for model.
tenant_filter function A model.tenant_id == <current tenant> clause (raises if unbound).
tenant_kind async function The kind of tenant_id from authoritative sources only (spec §7.1), memoised per request: canonical under TENANCY_MODE=single, `pers...
TenantKind callable
unscoped function Disable tenant enforcement for deliberate admin/system work.

Advanced names

bind_tenant

def bind_tenant(tenant_id: uuid.UUID) -> Iterator[uuid.UUID]

Bind tenant_id for the duration of the block.

current_tenant_id

def current_tenant_id() -> uuid.UUID

Return the tenant bound in the current context, or raise (fail closed).

current_tenant_id_optional

def current_tenant_id_optional() -> uuid.UUID | None

Return the bound tenant or None (does not raise).

scoped

def scoped(stmt: Any, model: Any) -> Any

Add a fail-closed tenant filter to stmt for model.

scoped(select(Task), Task) is the explicit, hard-to-misuse read path: forgetting it is visible, and it raises rather than returning unscoped rows when no tenant is bound.

tenant_filter

def tenant_filter(model: Any) -> Any

A model.tenant_id == <current tenant> clause (raises if unbound).

tenant_kind

async def tenant_kind(tenant_id: UUID, *, ctx: AuthzContext | None = None) -> TenantKind

The kind of tenant_id from authoritative sources only (spec §7.1), memoised per request: canonical under TENANCY_MODE=single, personal when it is the caller's user id, organization when the membership contract confirms the caller's membership, else unknown. Without ctx it uses the request current_context authenticated.

TenantKind

def TenantKind(*args, **kwargs)

(no docstring)

unscoped

def unscoped() -> Iterator[None]

Disable tenant enforcement for deliberate admin/system work.