【问题标题】:How to repeat django event occurrence period?如何重复django事件发生周期?
【发布时间】:2020-04-17 10:39:12
【问题描述】:

我有一个模型,它可以获取事件应该始终发生的星期几和时间。此外,人们可以参加活动的天数。

def validate_only_one(obj):
    model = obj.__class__
    if model.objects.count() > 0 and obj.id != model.objects.get().id:
        raise ValidationError("Você só pode adicionar um evento") # You can add only one schedule


class ModelPresenca(models.Model):
    DIAS = (
        # The days are in Portuguese
        ('Domingo', 'Domingo'),
        ('Segunda', 'Segunda'),
        ('Terça', 'Terça'),
        ('Quarta', 'Quarta'),
        ('Quinta', 'Quinta'),
        ('Sexta', 'Sexta'),
        ('Sábado', 'Sábado'),
    )
    dia = models.CharField('Dia da Pelada', max_length=10, help_text='Escolha o dia da pelada', choices=DIAS) # day of the event 
    hora_pelada = models.TimeField('Horário da pelada (ex: 19:30)', help_text='Hora em que sua pelada é realizada') # hour of the event 
    dias_antecedencia = models.PositiveIntegerField('Dias antecedência',
                                                    default=1,
                                                    validators=[MinValueValidator(1), MaxValueValidator(6)],
                                                    help_text='Em quantos dias de antecência os peladeiros devem '
                                                              'marcar presença') # numbers of days before event

但是,我不知道如何在不要求用户每周添加相同信息的情况下重复此事件。我正在考虑以下算法:

def period(request):

    event_data = ModelPresenca.objects.all() # I have always only one object

    hour_timefield = datetime.strptime(h.hora_pelada, '%H:%M') # TimeField to string
    day = event_data.dia # Day of the event 
    b_days = event_data.dias_antecedencia # Number of days before event 

    week_d = week_day(day) # week_day is a function that converts day to int 
    event_d = event_day(week_d, hour_timefield) # event_day is a function that returns the date of full event occur
    conf_d = event_open_date(b_days, event_d) # Is a function that returns date of open to confirm


    n = datetime.now()
    t_str = '{}-{}-{}'.format(n.year, n.month, n.day)
    t_hour = ' {}:{}'.format(n.hour, n.minute)
    today = t_str + t_hour
    today = datetime.strptime(today, '%Y-%m-%d %H:%M')

    if (conf_d <= today) and (today < event_d):
        # Show formulary to confirm presence 
    else:
        # another thing, ie, hidden formulary        


我相信最后一个代码块必须重复,但我不知道这样做,我不知道这是否是最好的方法。如果有人可以帮助我,我将不胜感激。

【问题讨论】:

    标签: django django-models cron django-views python-datetime


    【解决方案1】:

    您可以使用 Django Celery。 Celery 是一个基于分布式消息传递的异步任务队列/作业队列。它专注于实时操作,但也支持调度。

    这里是 django celery 的第一步。您可以在模型中创建一个 post_save 方法,您将在其中运行一个异步任务,该任务将根据需要添加事件。此外,还有一个 Celery beat,可让您创建异步周期性任务。

    例如:

    @app.task()
    def period():
        # Do your stuff here
    

    然后在您的设置文件中添加您的芹菜节拍时间表:

    CELERY_BEAT_SCHEDULE = {
     'add-periodic-events': { 
         'task': 'my_app.my_tasks.periodic', # this is a path to your file separated by '.'
         'schedule': crontab(minute=0, hour=0), # Execute daily at midnight.
        },    
    }
    

    【讨论】:

    • 您好,感谢您的关注!我有一个问题:你认为把午夜的日程安排可以工作吗?我的意思是,活动确认的开始日期,例如,可以是活动前 3 天(星期三),活动日期和时间结束,即星期六晚上 7:30。上次怎么查?
    • 这是一个例子。您可以将其更改为每小时计划。并且在每个小时内,您都会收到所有新的事件,并且您会发送有关您的事件的信息。您可以在 Event 模型中添加一个新字段,用于存储状态、用户是否已被告知。例如:您的任务每小时迭代一次并获取所有事件。然后检查是否需要发送确认邮件如果需要发送邮件,如果不需要,则转到另一个事件。
    猜你喜欢
    • 1970-01-01
    • 2020-07-20
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-03
    • 1970-01-01
    相关资源
    最近更新 更多