notifications/apps/emails/tasks.py
Sayyid Hamid Mahdavi 6795e415f1 celery beat
2025-09-06 17:00:21 +03:30

46 lines
1.5 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():
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(hours=1) and qs.exists():
from django.core.mail import send_mail
from django.conf import settings
send_mail(
"you have some queued task(s)",
f"you have {qs.count()} queued task(s)",
settings.EMAIL_HOST_USER,
["xdshia49@gmail.com"],
fail_silently=False,
)
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'),
},
}