Как сделать cron time редактируемым для администратора django - PullRequest
0 голосов
/ 01 декабря 2018

Я должен разрешить администратору установить время cron из представления администратора в django.Как у меня есть модель конфигурации, где администратор может поставить время как запись

  1. 2 часа ночи (запись 1)
  2. 16 часов (запись 2)

Так что на каждой записи я должен запускать cron.Но время cron находится в setting.py

CRONJOBS = [
    ('*/5 * * * *', 'myapp.cron.my_scheduled_job')
]

https://pypi.org/project/django-crontab/

Как сделать этот параметр доступным для администратора.

1 Ответ

0 голосов
/ 01 декабря 2018

Я не вижу хорошего способа сделать это, потому что vanilla django_crontab позволяет заполнять crontab только из настроек.Вам лучше найти другой пакет, который позволяет то, что вы хотите.Но если у вас нет выбора, я думаю, что будет работать следующее:

my_crontab.py

from django_crontab.app_settings import Settings
from django_crontab.crontab import Crontab
from django.conf import settings

# function need to return crontab
# in the same format as settings.py
def populate_from_db():
    # some db magic
    return [('*/5 * * * *', 'myapp.cron.my_scheduled_job')]


class DBCronSettings(Settings):

    def __init__(self, settings):
        super().__init__(settings)
        self.CRONJOBS = populate_from_db() #


class DBCrontab(Crontab):

    def __init__(self, **options):
        super().__init__(**options)
        self.settings = DBCronSettings(settings)

Вам необходимо создать подкласс Crontab и Настройки.Заставьте DBCronSettings читать ваши задания cron из базы данных, а затем используйте эти настройки в вашем пользовательском DBCrontab.

Затем выполните свою собственную команду crontab.Обрабатывает метод точно так же, как и в базовой команде, но использует ваш класс DBCrontab вместо исходного.

command.py

from django_crontab.management.commands.crontab import Command as CrontabCommand
from my_crontab import DBCrontab as Crontab


class Command(CrontabCommand):

    def handle(self, *args, **options):
        """
        Dispatches by given subcommand
        """
        if options['subcommand'] == 'add':         # add command
            with Crontab(**options) as crontab:    # initialize a Crontab class with any specified options
                crontab.remove_jobs()              # remove all jobs specified in settings from the crontab
                crontab.add_jobs()                 # and add them back
        elif options['subcommand'] == 'show':      # show command
            # initialize a readonly Crontab class with any specified options
            with Crontab(readonly=True, **options) as crontab:
                crontab.show_jobs()                # list all currently active jobs from crontab
        elif options['subcommand'] == 'remove':    # remove command
            with Crontab(**options) as crontab:    # initialize a Crontab class with any specified options
                crontab.remove_jobs()              # remove all jobs specified in settings from the crontab
        elif options['subcommand'] == 'run':       # run command
            Crontab().run_job(options['jobhash'])  # run the job with the specified hash
        else:
            # output the help string if the user entered something not specified above
            print(self.help)

Также не забудьте удалить django_crontab из INSTALLED_APPS, если вы планируетеназвать вашу команду 'crontab'.

...