Даты вывода в расписании Кронтаба Сельдерея в шаблон Django

#python #django #django-templates #cron #celery

Вопрос:

Я использую Сельдерей для своего проекта Django и запланировал несколько задач crontab для отправки электронных писем пользователям в определенное время. Мне нужно вывести расписание в шаблоне HTML/Django, в котором указаны даты, на которые пользователи могут ожидать отправки электронных писем. Мое расписание кронтаба выглядит так для сельдерея:

 import os
from celery import Celery
from celery.schedules import crontab

app = Celery("myapp")
app.config_from_object("django.conf:settings", namespace="CELERY")
app.autodiscover_tasks()


@app.task(bind=True)
def debug_task(self):
    print("Request: {0!r}".format(self.request))

first_monday_april_to_july = crontab(
    minute=15, hour=6, day_of_week="monday", day_of_month="1-7", month_of_year="4,5,6,7"
)
august_every_monday_first_two_weeks = crontab(
    minute=15, hour=6, day_of_week="monday", day_of_month="1-14", month_of_year="8"
)
august_weekdays_second_two_weeks = crontab(
    minute=15, hour=6, day_of_week="mon-fri", day_of_month="15-31", month_of_year="8"
)

app.conf.beat_schedule = {
    "report1": {
        "task": "email_report",
        "schedule": first_monday_april_to_july,
    },
    "report2": {
        "task": "email_report",
        "schedule": august_every_monday_first_two_weeks,
    },
    "report3": {
        "task": "email_report",
        "schedule": august_weekdays_second_two_weeks,
}
 

Я надеялся, что смогу захватить все даты, на которые будут отправлены электронные письма из этих задач, и сохранить их в списке в представлении, а затем отправить его в шаблон, который будет отображаться в таблице. Возможно ли что-то подобное? Пока мне не удается найти способ сделать это.

Комментарии:

1. Вы имеете в виду, что вам нужно рассчитать, какой будет следующая дата исполнения?

2. возможно, этот пакет может вам помочь. PeriodicTask модель задач, определенная в этом приложении django, содержит информацию о периодических задачах с сельдереем. Вы можете передать набор запросов этой модели в контекст и использовать в шаблоне.

3. @VictorErmakov Да, для этого нужно было бы показать все даты выполнения задач.

4. Я думаю, что вам нужно получить этот пакет github.com/kiorky/croniter

Ответ №1:

В итоге я создал функцию для извлечения всех дат из задач, а затем добавил их все в список расписания, а затем передал его через представление в шаблон для вывода в таблицу. Это выглядит так:

 from datetime import date, datetime, timedelta
from .celery import (
    first_monday_april_to_july,
    august_every_monday_first_two_weeks,
    august_weekdays_second_two_weeks,
)


def get_schedule_due_dates(schedule, last_date=datetime.now().date().replace(month=12, day=31)):
    start_date = datetime.now()
    end_date = datetime.combine(last_date, datetime.max.time())
    schedules = []
    while start_date <= end_date:
        next_due_schedule = schedule.remaining_estimate(start_date)
        due_date = datetime.now()   next_due_schedule
        if due_date <= end_date:
            schedules.append(due_date)
        else:
            break
        start_date = due_date   timedelta(days=1)
    return schedules


def report_schedule(request):
    schedules = []
    schedules.extend(get_schedule_due_dates(first_monday_april_to_july))
    schedules.extend(get_schedule_due_dates(august_every_monday_first_two_weeks))
    schedules.extend(get_schedule_due_dates(august_weekdays_second_two_weeks))
    return render(
        request,
        "reports/report_schedule.html",
        {"schedules": sorted(schedules)},
    )