Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 11 additions & 11 deletions src/utils/privacy.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
"""GDPR compliance and user data privacy system."""

from typing import Dict, List, Optional
from datetime import datetime
from datetime import datetime, timezone
from cryptography.fernet import Fernet
import os

Expand Down Expand Up @@ -41,7 +41,7 @@ def set_user_consent(
"data_processing": data_processing,
"marketing": marketing,
"analytics": analytics,
"consented_at": datetime.utcnow().isoformat(),
"consented_at": datetime.now(timezone.utc).isoformat(),
}
self.user_consent[user_id] = consent
self._log_audit(f"Consent updated for user {user_id}")
Expand All @@ -53,13 +53,13 @@ def get_user_consent(self, user_id: str) -> Optional[Dict]:

def request_data_export(self, user_id: str) -> Dict:
"""Create a user data export request (Right to Data Portability)."""
request_id = f"export_{user_id}_{datetime.utcnow().timestamp()}"
request_id = f"export_{user_id}_{datetime.now(timezone.utc).timestamp()}"
request = {
"request_id": request_id,
"user_id": user_id,
"type": "data_export",
"status": "pending",
"requested_at": datetime.utcnow().isoformat(),
"requested_at": datetime.now(timezone.utc).isoformat(),
"completed_at": None,
"data_url": None,
}
Expand All @@ -69,13 +69,13 @@ def request_data_export(self, user_id: str) -> Dict:

def request_data_deletion(self, user_id: str) -> Dict:
"""Create a user data deletion request (Right to be Forgotten)."""
request_id = f"delete_{user_id}_{datetime.utcnow().timestamp()}"
request_id = f"delete_{user_id}_{datetime.now(timezone.utc).timestamp()}"
request = {
"request_id": request_id,
"user_id": user_id,
"type": "data_deletion",
"status": "pending",
"requested_at": datetime.utcnow().isoformat(),
"requested_at": datetime.now(timezone.utc).isoformat(),
"completed_at": None,
}
self.data_requests[request_id] = request
Expand All @@ -91,7 +91,7 @@ def complete_data_export(

request = self.data_requests[request_id]
request["status"] = "completed"
request["completed_at"] = datetime.utcnow().isoformat()
request["completed_at"] = datetime.now(timezone.utc).isoformat()
request["data_url"] = f"/api/privacy/export/{request_id}/download"

self._log_audit(f"Data export completed for {request['user_id']}")
Expand All @@ -104,7 +104,7 @@ def complete_data_deletion(self, request_id: str) -> Dict:

request = self.data_requests[request_id]
request["status"] = "completed"
request["completed_at"] = datetime.utcnow().isoformat()
request["completed_at"] = datetime.now(timezone.utc).isoformat()

self._log_audit(f"Data deletion completed for {request['user_id']}")
return request
Expand All @@ -131,7 +131,7 @@ def _log_audit(self, message: str):
"""Log privacy audit event."""
self.audit_log.append(
{
"timestamp": datetime.utcnow().isoformat(),
"timestamp": datetime.now(timezone.utc).isoformat(),
"message": message,
}
)
Expand All @@ -151,14 +151,14 @@ def set_data_retention_policy(self, days: int = 365) -> Dict:
return {
"retention_days": days,
"policy_active": True,
"effective_from": datetime.utcnow().isoformat(),
"effective_from": datetime.now(timezone.utc).isoformat(),
}

def anonymize_user_data(self, user_id: str) -> Dict:
"""Anonymize user data for privacy."""
return {
"user_id": user_id,
"anonymized": True,
"anonymized_at": datetime.utcnow().isoformat(),
"anonymized_at": datetime.now(timezone.utc).isoformat(),
"original_data_deleted": True,
}
Loading