Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
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
40 changes: 38 additions & 2 deletions notifications/tasks.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import itertools
from calendar import monthrange
from datetime import date
from datetime import date, timedelta
from django.db import connection
from django.utils import timezone
from django.core.validators import EmailValidator
Expand All @@ -11,7 +11,7 @@

from framework.postcommit_tasks.handlers import run_postcommit
from osf.models import OSFUser, Notification, NotificationTypeEnum, EmailTask, RegistrationProvider, \
CollectionProvider, AbstractProvider
CollectionProvider, AbstractProvider, NotificationCampaign, NotificationCampaignRecipient
from framework.sentry import log_message
from osf.registrations.utils import get_registration_provider_submissions_url
from osf.utils.permissions import ADMIN
Expand Down Expand Up @@ -544,3 +544,39 @@ def delete_batch(
logger.info(f'Deleted {deleted} rows from {model_name}')

delete_batch.delay(app_label, model_name, filters, order_field, batch_size)


@celery_app.task(
bind=True,
name='notifications.tasks.delete_notification_campaign_recipients',
)
def delete_notification_campaign_recipients(self):
"""Delete recipients for old notification campaigns."""

cutoff = timezone.now() - timedelta(days=90)
Comment thread
Ostap-Zherebetskyi marked this conversation as resolved.
Outdated

campaigns = NotificationCampaign.objects.filter(
completed_at__lt=cutoff,
).values_list('id', flat=True)

for campaign_id in campaigns.iterator():
total_deleted = 0
while True:
recipient_ids = list(
NotificationCampaignRecipient.objects
.filter(campaign_id=campaign_id)
.values_list('id', flat=True)[:5000]
)

if not recipient_ids:
break

deleted, _ = NotificationCampaignRecipient.objects.filter(
id__in=recipient_ids,
).delete()

total_deleted += deleted

logger.info(f'Deleted {deleted} recipients for campaign {campaign_id}')
Comment thread
Ostap-Zherebetskyi marked this conversation as resolved.
Outdated

return
4 changes: 4 additions & 0 deletions website/settings/defaults.py
Original file line number Diff line number Diff line change
Expand Up @@ -712,6 +712,10 @@ class CeleryConfig:
'schedule': crontab(minute=0, hour=7), # Daily 2 a.m
'kwargs': {'dry_run': False},
},
'delete_notification_campaign_recipients': {
'task': 'notifications.tasks.delete_notification_campaign_recipients',
'schedule': crontab(minute=0, hour=3, day_of_month=1),
},
'clear_expired_sessions': {
'task': 'osf.management.commands.clear_expired_sessions',
'schedule': crontab(minute=0, hour=5), # Daily 12 a.m
Expand Down
Loading