compliance/api/dsr_routes.py (1176 LOC) -> 369 LOC thin routes +
469-line DsrService + 487-line DsrWorkflowService + 101-line schemas.
Two-service split for Data Subject Request (DSGVO Art. 15-22):
- dsr_service.py: CRUD, list, stats, export, audit log
- dsr_workflow_service.py: identity verification, processing,
portability, escalation
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
102 lines
2.3 KiB
Python
102 lines
2.3 KiB
Python
"""
|
|
DSR (Data Subject Request) schemas — Betroffenenanfragen nach DSGVO Art. 15-21.
|
|
|
|
Phase 1 Step 4: extracted from ``compliance.api.dsr_routes``.
|
|
"""
|
|
|
|
from typing import Any, Dict, List, Optional
|
|
|
|
from pydantic import BaseModel
|
|
|
|
|
|
class DSRCreate(BaseModel):
|
|
request_type: str = "access"
|
|
requester_name: str
|
|
requester_email: str
|
|
requester_phone: Optional[str] = None
|
|
requester_address: Optional[str] = None
|
|
requester_customer_id: Optional[str] = None
|
|
source: str = "email"
|
|
source_details: Optional[str] = None
|
|
request_text: Optional[str] = None
|
|
priority: Optional[str] = "normal"
|
|
notes: Optional[str] = None
|
|
|
|
|
|
class DSRUpdate(BaseModel):
|
|
priority: Optional[str] = None
|
|
notes: Optional[str] = None
|
|
internal_notes: Optional[str] = None
|
|
assigned_to: Optional[str] = None
|
|
request_text: Optional[str] = None
|
|
affected_systems: Optional[List[str]] = None
|
|
erasure_checklist: Optional[List[Dict[str, Any]]] = None
|
|
rectification_details: Optional[Dict[str, Any]] = None
|
|
objection_details: Optional[Dict[str, Any]] = None
|
|
|
|
|
|
class StatusChange(BaseModel):
|
|
status: str
|
|
comment: Optional[str] = None
|
|
|
|
|
|
class VerifyIdentity(BaseModel):
|
|
method: str
|
|
notes: Optional[str] = None
|
|
document_ref: Optional[str] = None
|
|
|
|
|
|
class AssignRequest(BaseModel):
|
|
assignee_id: str
|
|
|
|
|
|
class ExtendDeadline(BaseModel):
|
|
reason: str
|
|
days: Optional[int] = 60
|
|
|
|
|
|
class CompleteDSR(BaseModel):
|
|
summary: Optional[str] = None
|
|
result_data: Optional[Dict[str, Any]] = None
|
|
|
|
|
|
class RejectDSR(BaseModel):
|
|
reason: str
|
|
legal_basis: Optional[str] = None
|
|
|
|
|
|
class SendCommunication(BaseModel):
|
|
communication_type: str = "outgoing"
|
|
channel: str = "email"
|
|
subject: Optional[str] = None
|
|
content: str
|
|
template_used: Optional[str] = None
|
|
|
|
|
|
class UpdateExceptionCheck(BaseModel):
|
|
applies: bool
|
|
notes: Optional[str] = None
|
|
|
|
|
|
class CreateTemplateVersion(BaseModel):
|
|
version: str = "1.0"
|
|
language: Optional[str] = "de"
|
|
subject: str
|
|
body_html: str
|
|
body_text: Optional[str] = None
|
|
|
|
|
|
__all__ = [
|
|
"DSRCreate",
|
|
"DSRUpdate",
|
|
"StatusChange",
|
|
"VerifyIdentity",
|
|
"AssignRequest",
|
|
"ExtendDeadline",
|
|
"CompleteDSR",
|
|
"RejectDSR",
|
|
"SendCommunication",
|
|
"UpdateExceptionCheck",
|
|
"CreateTemplateVersion",
|
|
]
|