def start_sending(self):
from .tasks import send_mail
with transaction.atomic():
# Then, handle all ignored emails (optouts)
now = timezone.now()
for i in self.mails.not_legit_for(self):
MailStatus.objects.create(
mail=i, status=MailStatus.IGNORED,
creation_date=timezone.now(),
raw_msg='Ignored because of previous optout {}'.format(
i.get_related_optout()))
# Then, handle the legit ones
if not self.send_date:
self.send_date = timezone.now()
self.save()
self.notify(Message.SENDING)
# locking ?
legit_mails = self.mails.legit_for(self)
now = timezone.now()
MailStatus.objects.bulk_create([
MailStatus(
mail=i, status=MailStatus.QUEUED,
creation_date=now, raw_msg='Enqueued in celery')
for i in legit_mails])
# bulk_create do not update Mail (too high db cost)
legit_mails.update(
curstatus=MailStatus.QUEUED, latest_status_date=now)
# end_locking ?
tasks = celery.group([send_mail.s(m.pk) for m in legit_mails])
log.info('Starting sending {} (#{}) to {} recipients.'.format(
self, self.pk, len(tasks)))
tasks.apply_async()
评论列表
文章目录