Files
breakpilot-compliance/backend-compliance/compliance/schemas/dsr.py
Sharang Parnerkar 07d470edee refactor(backend/api): extract DSR services (Step 4 — file 15 of 18)
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>
2026-04-09 20:34:48 +02:00

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",
]