| """ |
| DataExport model β GDPR data portability requests. |
| |
| Maps to AGENT.md DBML: `data_exports` table (Lines 442-451). |
| """ |
| from django.conf import settings |
| from django.db import models |
|
|
| from core.models import BaseModel |
|
|
|
|
| class DataExport(BaseModel): |
| """ |
| Tracks a user's data export request (GDPR Article 20). |
| |
| Goes through: pending β processing β completed β expired. |
| """ |
|
|
| class Status(models.TextChoices): |
| PENDING = "pending", "Pending" |
| PROCESSING = "processing", "Processing" |
| COMPLETED = "completed", "Completed" |
| FAILED = "failed", "Failed" |
| EXPIRED = "expired", "Expired" |
|
|
| user = models.ForeignKey( |
| settings.AUTH_USER_MODEL, |
| on_delete=models.CASCADE, |
| related_name="data_exports", |
| ) |
| org = models.ForeignKey( |
| "organizations.Organization", |
| on_delete=models.SET_NULL, |
| null=True, |
| blank=True, |
| related_name="data_exports", |
| ) |
| status = models.CharField( |
| max_length=20, |
| choices=Status.choices, |
| default=Status.PENDING, |
| ) |
| file_path = models.CharField(max_length=500, blank=True, default="") |
| requested_at = models.DateTimeField(auto_now_add=True) |
| completed_at = models.DateTimeField(null=True, blank=True) |
| expires_at = models.DateTimeField(null=True, blank=True) |
|
|
| class Meta: |
| db_table = "data_exports" |
| ordering = ["-requested_at"] |
|
|
| def __str__(self) -> str: |
| return f"Export {self.pk} ({self.get_status_display()})" |
|
|