Skip to content

Commit 95d68c1

Browse files
authored
use batching in email queryset and attachment queryset (#449)
* use batch in email queryset and attachment queryset * not batching attachament * update * fix error * fix * revert back to batch attachments delete in different flow
1 parent cc0182f commit 95d68c1

File tree

1 file changed

+18
-12
lines changed

1 file changed

+18
-12
lines changed

post_office/utils.py

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -146,23 +146,29 @@ def cleanup_expired_mails(cutoff_date, delete_attachments=True, batch_size=1000)
146146
Optionally also delete pending attachments.
147147
Return the number of deleted emails and attachments.
148148
"""
149-
expired_emails_ids = Email.objects.filter(created__lt=cutoff_date).values_list('id', flat=True)
150-
email_id_batches = split_emails(expired_emails_ids, batch_size)
151149
total_deleted_emails = 0
152-
153-
for email_ids in email_id_batches:
154-
# Delete email and incr total_deleted_emails counter
150+
151+
while True:
152+
email_ids = Email.objects.filter(created__lt=cutoff_date).values_list('id', flat=True)[:batch_size]
153+
if not email_ids:
154+
break
155+
155156
_, deleted_data = Email.objects.filter(id__in=email_ids).delete()
156157
if deleted_data:
157158
total_deleted_emails += deleted_data['post_office.Email']
158159

160+
attachments_count = 0
159161
if delete_attachments:
160-
attachments = Attachment.objects.filter(emails=None)
161-
for attachment in attachments:
162-
# Delete the actual file
163-
attachment.file.delete()
164-
attachments_count, _ = attachments.delete()
165-
else:
166-
attachments_count = 0
162+
while True:
163+
attachments = Attachment.objects.filter(emails=None)[:batch_size]
164+
if not attachments:
165+
break
166+
attachment_ids = set()
167+
for attachment in attachments:
168+
# Delete the actual file
169+
attachment.file.delete()
170+
attachment_ids.add(attachment.id)
171+
deleted_count, _ = Attachment.objects.filter(id__in=attachment_ids).delete()
172+
attachments_count += deleted_count
167173

168174
return total_deleted_emails, attachments_count

0 commit comments

Comments
 (0)