Coverage for src / lexigram / admin / gdpr / export.py: 0%
8 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-08-11 02:25 +0800
« prev ^ index » next coverage.py v7.13.5, created at 2026-08-11 02:25 +0800
1"""SAR export helpers."""
3from __future__ import annotations
5from typing import TYPE_CHECKING
7import lexigram.serialization as json
9if TYPE_CHECKING:
10 from lexigram.admin.gdpr.models import SubjectAccessRequest
13def export_sar_json(sar: SubjectAccessRequest) -> str:
14 """Serialize an SAR to a portable JSON string for delivery.
16 Args:
17 sar: Completed :class:`SubjectAccessRequest`.
19 Returns:
20 JSON string suitable for download or email attachment.
21 """
22 payload = {
23 "sar_id": sar.sar_id,
24 "subject_id": sar.subject_id,
25 "subject_email": sar.subject_email,
26 "status": sar.status.value,
27 "requested_at": sar.requested_at.isoformat(),
28 "completed_at": sar.completed_at.isoformat() if sar.completed_at else None,
29 "data": sar.data_snapshot,
30 }
31 result = json.dumps(payload, indent=2, default=str)
32 return result if isinstance(result, str) else result.decode()
35__all__ = [
36 "export_sar_json",
37]