forked from CGM_Public/pretix_original
Sendmail: Chunk query to prevent high memory load (Z#23217167) (#5699)
This commit is contained in:
@@ -47,6 +47,14 @@ from pretix.celery_app import app
|
|||||||
from pretix.helpers.format import format_map
|
from pretix.helpers.format import format_map
|
||||||
|
|
||||||
|
|
||||||
|
def _chunks(lst, n):
|
||||||
|
"""
|
||||||
|
Yield successive n-sized chunks from lst.
|
||||||
|
"""
|
||||||
|
for i in range(0, len(lst), n):
|
||||||
|
yield lst[i:i + n]
|
||||||
|
|
||||||
|
|
||||||
@app.task(base=ProfiledEventTask, acks_late=True)
|
@app.task(base=ProfiledEventTask, acks_late=True)
|
||||||
def send_mails_to_orders(event: Event, user: int, subject: dict, message: dict, objects: list, items: list,
|
def send_mails_to_orders(event: Event, user: int, subject: dict, message: dict, objects: list, items: list,
|
||||||
subevent: int, subevents_from: datetime, subevents_to: datetime,
|
subevent: int, subevents_from: datetime, subevents_to: datetime,
|
||||||
@@ -55,12 +63,11 @@ def send_mails_to_orders(event: Event, user: int, subject: dict, message: dict,
|
|||||||
attach_ical: bool = False) -> None:
|
attach_ical: bool = False) -> None:
|
||||||
failures = []
|
failures = []
|
||||||
user = User.objects.get(pk=user) if user else None
|
user = User.objects.get(pk=user) if user else None
|
||||||
orders = Order.objects.filter(pk__in=objects, event=event)
|
|
||||||
subject = LazyI18nString(subject)
|
subject = LazyI18nString(subject)
|
||||||
message = LazyI18nString(message)
|
message = LazyI18nString(message)
|
||||||
attachments_for_log = [cf.filename for cf in CachedFile.objects.filter(pk__in=attachments)] if attachments else []
|
attachments_for_log = [cf.filename for cf in CachedFile.objects.filter(pk__in=attachments)] if attachments else []
|
||||||
|
|
||||||
for o in orders:
|
def _send_to_order(o):
|
||||||
send_to_order = recipients in ('both', 'orders')
|
send_to_order = recipients in ('both', 'orders')
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@@ -179,6 +186,11 @@ def send_mails_to_orders(event: Event, user: int, subject: dict, message: dict,
|
|||||||
except SendMailException:
|
except SendMailException:
|
||||||
failures.append(o.email)
|
failures.append(o.email)
|
||||||
|
|
||||||
|
for chunk in _chunks(objects, 1000):
|
||||||
|
orders = Order.objects.filter(pk__in=chunk, event=event)
|
||||||
|
for o in orders:
|
||||||
|
_send_to_order(o)
|
||||||
|
|
||||||
|
|
||||||
@app.task(base=ProfiledEventTask, acks_late=True)
|
@app.task(base=ProfiledEventTask, acks_late=True)
|
||||||
def send_mails_to_waitinglist(event: Event, user: int, subject: dict, message: dict, objects: list,
|
def send_mails_to_waitinglist(event: Event, user: int, subject: dict, message: dict, objects: list,
|
||||||
|
|||||||
Reference in New Issue
Block a user