Add organizations module surface

This commit is contained in:
2026-07-10 17:33:53 +02:00
parent 34133ba9cd
commit ad2561b50f
22 changed files with 3284 additions and 35 deletions

View File

@@ -0,0 +1,275 @@
from __future__ import annotations
from datetime import datetime
from typing import Any, Literal
from pydantic import BaseModel, Field
StructureKind = Literal["hierarchy", "network", "membership", "classification"]
class OrganizationUnitTypeItem(BaseModel):
id: str
tenant_id: str
slug: str
name: str
description: str | None = None
is_active: bool
settings: dict[str, Any]
created_at: datetime
updated_at: datetime
class OrganizationStructureItem(BaseModel):
id: str
tenant_id: str
slug: str
name: str
description: str | None = None
structure_kind: str
is_active: bool
settings: dict[str, Any]
created_at: datetime
updated_at: datetime
class OrganizationRelationTypeItem(BaseModel):
id: str
tenant_id: str
structure_id: str | None = None
slug: str
name: str
description: str | None = None
source_unit_type_id: str | None = None
target_unit_type_id: str | None = None
is_hierarchical: bool
allow_cycles: bool
is_active: bool
settings: dict[str, Any]
created_at: datetime
updated_at: datetime
class OrganizationUnitItem(BaseModel):
id: str
tenant_id: str
unit_type_id: str | None = None
parent_id: str | None = None
slug: str
name: str
description: str | None = None
is_active: bool
settings: dict[str, Any]
created_at: datetime
updated_at: datetime
class OrganizationRelationItem(BaseModel):
id: str
tenant_id: str
structure_id: str
relation_type_id: str
source_unit_id: str
target_unit_id: str
valid_from: datetime | None = None
valid_until: datetime | None = None
is_active: bool
settings: dict[str, Any]
created_at: datetime
updated_at: datetime
class OrganizationFunctionTypeItem(BaseModel):
id: str
tenant_id: str
slug: str
name: str
description: str | None = None
organization_unit_type_id: str | None = None
delegable: bool
act_in_place_allowed: bool
is_active: bool
settings: dict[str, Any]
created_at: datetime
updated_at: datetime
class OrganizationFunctionItem(BaseModel):
id: str
tenant_id: str
function_type_id: str | None = None
organization_unit_id: str
slug: str
name: str
description: str | None = None
delegable: bool
act_in_place_allowed: bool
is_active: bool
settings: dict[str, Any]
created_at: datetime
updated_at: datetime
class OrganizationFunctionAssignmentItem(BaseModel):
id: str
tenant_id: str
identity_id: str
account_id: str | None = None
function_id: str
organization_unit_id: str
applies_to_subunits: bool
source: str
delegated_from_assignment_id: str | None = None
acting_for_account_id: str | None = None
valid_from: datetime | None = None
valid_until: datetime | None = None
is_active: bool
settings: dict[str, Any]
created_at: datetime
updated_at: datetime
class OrganizationModelResponse(BaseModel):
unit_types: list[OrganizationUnitTypeItem]
structures: list[OrganizationStructureItem]
relation_types: list[OrganizationRelationTypeItem]
units: list[OrganizationUnitItem]
relations: list[OrganizationRelationItem]
function_types: list[OrganizationFunctionTypeItem]
functions: list[OrganizationFunctionItem]
function_assignments: list[OrganizationFunctionAssignmentItem]
class SluggedCreateRequest(BaseModel):
slug: str | None = Field(default=None, max_length=100)
name: str = Field(min_length=1, max_length=255)
description: str | None = None
is_active: bool = True
settings: dict[str, Any] = Field(default_factory=dict)
class SluggedUpdateRequest(BaseModel):
slug: str | None = Field(default=None, max_length=100)
name: str | None = Field(default=None, max_length=255)
description: str | None = None
is_active: bool | None = None
settings: dict[str, Any] | None = None
class UnitTypeCreateRequest(SluggedCreateRequest):
pass
class UnitTypeUpdateRequest(SluggedUpdateRequest):
pass
class StructureCreateRequest(SluggedCreateRequest):
structure_kind: StructureKind = "hierarchy"
class StructureUpdateRequest(SluggedUpdateRequest):
structure_kind: StructureKind | None = None
class RelationTypeCreateRequest(SluggedCreateRequest):
structure_id: str | None = None
source_unit_type_id: str | None = None
target_unit_type_id: str | None = None
is_hierarchical: bool = True
allow_cycles: bool = False
class RelationTypeUpdateRequest(SluggedUpdateRequest):
structure_id: str | None = None
source_unit_type_id: str | None = None
target_unit_type_id: str | None = None
is_hierarchical: bool | None = None
allow_cycles: bool | None = None
class UnitCreateRequest(SluggedCreateRequest):
unit_type_id: str | None = None
parent_id: str | None = None
class UnitUpdateRequest(SluggedUpdateRequest):
unit_type_id: str | None = None
parent_id: str | None = None
class RelationCreateRequest(BaseModel):
structure_id: str
relation_type_id: str
source_unit_id: str
target_unit_id: str
valid_from: datetime | None = None
valid_until: datetime | None = None
is_active: bool = True
settings: dict[str, Any] = Field(default_factory=dict)
class RelationUpdateRequest(BaseModel):
structure_id: str | None = None
relation_type_id: str | None = None
source_unit_id: str | None = None
target_unit_id: str | None = None
valid_from: datetime | None = None
valid_until: datetime | None = None
is_active: bool | None = None
settings: dict[str, Any] | None = None
class FunctionTypeCreateRequest(SluggedCreateRequest):
organization_unit_type_id: str | None = None
delegable: bool = False
act_in_place_allowed: bool = False
class FunctionTypeUpdateRequest(SluggedUpdateRequest):
organization_unit_type_id: str | None = None
delegable: bool | None = None
act_in_place_allowed: bool | None = None
class FunctionCreateRequest(SluggedCreateRequest):
organization_unit_id: str
function_type_id: str | None = None
delegable: bool | None = None
act_in_place_allowed: bool | None = None
class FunctionUpdateRequest(SluggedUpdateRequest):
organization_unit_id: str | None = None
function_type_id: str | None = None
delegable: bool | None = None
act_in_place_allowed: bool | None = None
class FunctionAssignmentCreateRequest(BaseModel):
identity_id: str
function_id: str
account_id: str | None = None
applies_to_subunits: bool = False
source: str = "direct"
delegated_from_assignment_id: str | None = None
acting_for_account_id: str | None = None
valid_from: datetime | None = None
valid_until: datetime | None = None
is_active: bool = True
settings: dict[str, Any] = Field(default_factory=dict)
class FunctionAssignmentUpdateRequest(BaseModel):
identity_id: str | None = None
function_id: str | None = None
account_id: str | None = None
applies_to_subunits: bool | None = None
source: str | None = None
delegated_from_assignment_id: str | None = None
acting_for_account_id: str | None = None
valid_from: datetime | None = None
valid_until: datetime | None = None
is_active: bool | None = None
settings: dict[str, Any] | None = None