Планирование проблем и перепланирование постов с сельдереем - PullRequest
2 голосов
/ 22 декабря 2010

Я работаю над блогом Django, и мне нужно запланировать публикацию на более поздний срок.Celery отлично подходит для первоначального планирования сообщений, но я сталкиваюсь с проблемами, когда пользователь пытается обновить сообщение, чтобы либо перенести его, либо перенести на неопределенный срок.

Вот что я пытаюсь сделать:

def save(self, **kwargs):
    ''' 
    Saves an event. If the event is currently scheduled to publish, 
    sets a celery task to publish the event at the selected time.  
    If there is an existing scheduled task,cancel it and reschedule it 
    if necessary.
    ''' 
    import celery
    this_task_id = 'publish-post-%s' % self.id 
    celery.task.control.revoke(task_id=this_task_id)

    if self.status == self.STATUS_SCHEDULED:
        from blog import tasks
        tasks.publish_post.apply_async(args=[self.id], eta=self.date_published,
                task_id=this_task_id) 
    else:
        self.date_published = datetime.now()

    super(Post, self).save(**kwargs)

Проблема в том, что после того, как идентификатор задачи Celery был указан как отозванный, он остается отмененным даже после того, как я пытаюсь перенести его.Это кажется достаточно распространенной задачей, поэтому должно быть простое решение.

1 Ответ

2 голосов
/ 22 декабря 2010

Я не знаю, как выглядит ваш файл tasks.py, но я предполагаю, что он выглядит примерно так:

from celery.decorators import task

@task
def publish_post(post_id):
    ''' Sets the status of a post to Published '''
    from blog.models import Post

    Post.objects.filter(pk=post_id).update(status=Post.STATUS_PUBLISHED)

Вы должны отредактировать фильтр в задаче, чтобы убедиться, что текущий статусSTATUS_SCHEDULED и что время в date_published прошло.Например:

from celery.decorators import task

@task
def publish_post(post_id):
    ''' Sets the status of a post to Published '''
    from blog.models import Post
    from datetime import datetime

    Post.objects.filter(
        pk=post_id,
        date_published__lte=datetime.now(),
        status=Post.STATUS_SCHEDULED
    ).update(status=Post.STATUS_PUBLISHED)

Таким образом, пользователи могут изменять состояние вперед и назад, изменять время, и задача будет когда-либо изменять статус публикации только в том случае, если задача выполняется после столбца date_published.Нет необходимости отслеживать идентификаторы или отзывать задачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...