Coverage for src/lexigram/admin/gdpr/export.py: 0%

8 statements  

« prev     ^ index     » next       coverage.py v7.15.4, created at 2026-08-24 23:18 +0800

1"""SAR export helpers.""" 

2 

3from __future__ import annotations 

4 

5from typing import TYPE_CHECKING 

6 

7import lexigram.serialization as json 

8 

9if TYPE_CHECKING: 

10 from lexigram.admin.gdpr.models import SubjectAccessRequest 

11 

12 

13def export_sar_json(sar: SubjectAccessRequest) -> str: 

14 """Serialize an SAR to a portable JSON string for delivery. 

15 

16 Args: 

17 sar: Completed :class:`SubjectAccessRequest`. 

18 

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() 

33 

34 

35__all__ = [ 

36 "export_sar_json", 

37]