from __future__ import annotations from datetime import datetime from typing import Any, Literal from pydantic import BaseModel, Field StructureKind = Literal["hierarchy", "network", "membership", "classification"] AuditDetailLevel = Literal["summary", "standard", "full"] class OrganizationSettingsItem(BaseModel): id: str | None = None tenant_id: str allow_tenant_model_customization: bool require_model_change_requests: bool audit_detail_level: AuditDetailLevel change_retention_days: int | None = None settings: dict[str, Any] created_at: datetime | None = None updated_at: datetime | None = None class OrganizationSettingsUpdateRequest(BaseModel): allow_tenant_model_customization: bool | None = None require_model_change_requests: bool | None = None audit_detail_level: AuditDetailLevel | None = None change_retention_days: int | None = Field(default=None, ge=0) settings: dict[str, Any] | None = None 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) change_request_id: str | None = None 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 change_request_id: str | 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) change_request_id: str | None = None 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 change_request_id: str | 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) change_request_id: str | None = None 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 change_request_id: str | None = None