54 lines
1.8 KiB
Python
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'),
|
|
},
|
|
}
|