56 lines
2.0 KiB
Python
56 lines
2.0 KiB
Python
"""
|
|
Management command to cleanup old notifications.
|
|
|
|
Deletes notifications older than 30 days (configurable).
|
|
Run via cron or celery beat daily.
|
|
|
|
Usage:
|
|
python manage.py cleanup_notifications
|
|
python manage.py cleanup_notifications --days=30
|
|
python manage.py cleanup_notifications --dry-run
|
|
"""
|
|
|
|
from django.core.management.base import BaseCommand
|
|
from django.utils import timezone
|
|
from datetime import timedelta
|
|
|
|
from apps.notifications.models import UserNotification
|
|
|
|
|
|
class Command(BaseCommand):
|
|
help = "Cleanup old notifications (default: 30 days)"
|
|
|
|
def add_arguments(self, parser):
|
|
parser.add_argument("--days", type=int, default=30, help="Number of days to keep notifications (default: 30)")
|
|
parser.add_argument(
|
|
"--dry-run", action="store_true", help="Show what would be deleted without actually deleting"
|
|
)
|
|
|
|
def handle(self, *args, **options):
|
|
days = options["days"]
|
|
dry_run = options["dry_run"]
|
|
|
|
cutoff_date = timezone.now() - timedelta(days=days)
|
|
|
|
# Get notifications to delete (both read and unread, older than cutoff)
|
|
notifications_to_delete = UserNotification.objects.filter(created_at__lt=cutoff_date)
|
|
|
|
count = notifications_to_delete.count()
|
|
|
|
if dry_run:
|
|
self.stdout.write(
|
|
self.style.WARNING(f"[DRY RUN] Would delete {count} notifications older than {days} days")
|
|
)
|
|
# Show sample of what would be deleted
|
|
sample = notifications_to_delete[:5]
|
|
for n in sample:
|
|
self.stdout.write(f" - {n.title} ({n.created_at})")
|
|
if count > 5:
|
|
self.stdout.write(f" ... and {count - 5} more")
|
|
else:
|
|
if count > 0:
|
|
notifications_to_delete.delete()
|
|
self.stdout.write(self.style.SUCCESS(f"Deleted {count} notifications older than {days} days"))
|
|
else:
|
|
self.stdout.write(self.style.SUCCESS("No notifications to delete"))
|