Установка функции тайм-аута в Django - PullRequest
1 голос
/ 14 июля 2009

Итак, я создаю приложение django, которое позволяет пользователю добавлять новую строку текста в существующую группу текстовых строк. Однако я не хочу, чтобы несколько пользователей добавляли строки в одну и ту же группу текстовых строк одновременно. Поэтому я создал BoolField isBeingEdited, для которого установлено значение True, как только пользователь решит добавить определенную группу. Когда Bool установлен в True, никто больше не может добавлять группу до тех пор, пока редактирование не будет отправлено, после чего Bool снова устанавливается в False. Работает хорошо, если кто-то не решит сделать редактирование, затем передумать или забыть об этом и т. Д. Я хочу, чтобы isBeingEdited переключился на False через 10 минут или около того. Это работа для cron, или есть что-то более простое? Есть предложения?

1 Ответ

4 голосов
/ 14 июля 2009

Изменить логическое значение на "время блокировки"

  1. Чтобы заблокировать модель, установите время блокировки на текущее время.
  2. Чтобы разблокировать модель, установите время блокировки Нет
  3. Добавить метод is_locked. Этот метод возвращает «не заблокирован», если текущее время превышает 10 минут после времени блокировки.

Это дает вам время без Cron и без регулярных попаданий в DB, ​​чтобы проверить флаги и сбросить их. Вместо этого время проверяется только в том случае, если вы заинтересованы в , эта модель заблокирована. Крону, скорее всего, придется проверить все модели.

from django.db import models
from datetime import datetime, timedelta
# Create your models here.
class yourTextLineGroup(models.Model):
    # fields go here    
    lock_time = models.DateTimeField(null=True)
    locked_by = models.ForeignKey()#Point me to your user model

    def lock(self):
        if self.is_locked(): #and code here to see if current user is not locked_by user
            #exception / bad return value here
            pass

        self.lock_time = datetime.now()

    def unlock(self):
        self.lock_time = None

    def is_locked(self):
        return self.lock_time and datetime.now() - self.lock_time < timedelta(minutes=10)

Код выше предполагает, что вызывающая сторона будет вызывать метод save после вызова блокировки или разблокировки.

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