from __future__ import annotations from typing import Any, Literal from pydantic import BaseModel, ConfigDict, Field from govoplan_core.privacy.schemas import PrivacyRetentionPolicyItem, PrivacyRetentionPolicyPatchItem class PolicySourceStepItem(BaseModel): scope_type: str scope_id: str | None = None path: str label: str applied_fields: list[str] = Field(default_factory=list) policy: dict[str, Any] = Field(default_factory=dict) class PrivacyRetentionPolicyScopeRequest(BaseModel): model_config = ConfigDict(extra="forbid") policy: PrivacyRetentionPolicyPatchItem = Field(default_factory=PrivacyRetentionPolicyPatchItem) change_request_id: str | None = None class PrivacyRetentionPolicyScopeResponse(BaseModel): scope_type: Literal["system", "tenant", "user", "group", "campaign"] scope_id: str | None = None policy: dict[str, Any] effective_policy: PrivacyRetentionPolicyItem parent_policy: PrivacyRetentionPolicyItem | None = None effective_policy_sources: list[PolicySourceStepItem] = Field(default_factory=list) parent_policy_sources: list[PolicySourceStepItem] = Field(default_factory=list) class PolicyDecisionItem(BaseModel): allowed: bool reason: str | None = None source_path: list[PolicySourceStepItem] = Field(default_factory=list) requirements: list[str] = Field(default_factory=list) details: dict[str, Any] = Field(default_factory=dict) class PrivacyRetentionPolicyExplainResponse(BaseModel): scope_type: Literal["system", "tenant", "user", "group", "campaign"] scope_id: str | None = None decision: PolicyDecisionItem effective_policy: PrivacyRetentionPolicyItem parent_policy: PrivacyRetentionPolicyItem | None = None effective_policy_sources: list[PolicySourceStepItem] = Field(default_factory=list) parent_policy_sources: list[PolicySourceStepItem] = Field(default_factory=list) blocked_fields: list[str] = Field(default_factory=list) class PrivacyRetentionPolicySimulationResponse(BaseModel): scope_type: Literal["system", "tenant", "user", "group", "campaign"] scope_id: str | None = None simulation: dict[str, Any] class RetentionRunRequest(BaseModel): model_config = ConfigDict(extra="forbid") dry_run: bool = True class RetentionRunResponse(BaseModel): result: dict[str, Any]