notifications/apps/emails/tasks.py
Sayyid Hamid Mahdavi 66862e8d5d fail_silently=True
2026-04-22 14:20:37 +03:30

54 lines
1.8 KiB
Python

from django.db.models import F
from django.utils import timezone
import logging
from apps.emails.models import Email, EmailQueue
from main import celery_app
from utils.clients import gotify
logger = logging.getLogger(__name__)
@celery_app.task
def send_email(email_uuid):
from .models import Email
email = Email.objects.get(uuid=email_uuid)
email._send_email()
email.state = email.StateChoices.DONE
email.save()
@celery_app.task
def send_email_for_queued_events():
logger.info('Sending email for queued events')
for email_queue in EmailQueue.objects.all():
logger.info('Sending email for queue %s', email_queue.title)
qs = Email.objects.filter(queue=email_queue, stats=Email.StateChoices.INIT, created_at__gte=F('queue__last_sent'))
if email_queue.last_sent <= timezone.now() - timezone.timedelta(minutes=10) and qs.exists():
logger.info('Sending email for queue %s', email_queue.title)
from django.core.mail import send_mail
from django.conf import settings
title = 'you have some queued task(s)'
message = f"you have {qs.count()} queued task(s) \n"
for index, email in enumerate(qs, start=1):
message += f"{index} - {email.title} \n"
send_mail(
title,
message,
settings.EMAIL_HOST_USER,
["xdshia49@gmail.com"],
fail_silently=True,
)
email_queue.last_sent = timezone.now()
email_queue.save()
celery_app.conf.beat_schedule = {
'print-every-minute': {
'task': 'apps.emails.tasks.send_email_for_queued_events',
'schedule': 10.0, # هر 60 ثانیه
# یا می‌توانید از crontab استفاده کنید:
# 'schedule': crontab(minute='*/1'),
},
}