Example #1
0
def delete_reminder(name, user):
    user_reminders = db_api.get_periodic_calls(user_id=user)

    if not user_reminders:
        raise RuntimeError("У Вас еще нет напоминалок.")

    reminder_to_delete = db_api.get_periodic_call_by_name(name)

    if reminder_to_delete.id in [r.id for r in user_reminders]:
        db_api.delete_periodic_call(name)
    else:
        raise RuntimeError("Неправильный id.")
Example #2
0
def validate_reminder(count, user, text):
    max_count = int(CONF.get('commands', 'reminders_count'))

    if count > max_count or count < 1:
        raise RuntimeError(
            "Ограничение на количество повторений: 0-%s; текущее: %s"
            % (max_count, count)
        )

    validate_reminder_text(text)
    existing_reminders = db_api.get_periodic_calls(user_id=user)

    max_reminders = int(CONF.get('commands', 'reminders_per_user'))
    if len(existing_reminders) >= max_reminders:
        raise RuntimeError(
            "Нельзя создать больше %s напоминалок, у Вас уже есть %s. "
            "Удалить можно с помощью команды 'забудь <id>'. Посмотреть "
            "напоминалки можно командой 'мои напоминалки'."
            % (max_reminders, len(existing_reminders))
        )
Example #3
0
def process_periodic_calls():
    """Long running thread processing next periodic calls

    :return:
    """
    while True:
        calls_to_process = get_next_periodic_calls()
        while not calls_to_process:
            calls = api.get_periodic_calls()

            now = datetime.datetime.now()
            nearest = min([c.execution_time for c in calls])

            time_to_sleep = (nearest - now).total_seconds()
            time_to_sleep = time_to_sleep if time_to_sleep > 0 else 1

            LOG.debug("Sleeping for %s s..." % time_to_sleep)

            time.sleep(time_to_sleep)
            calls_to_process = get_next_periodic_calls()

        for call in calls_to_process:
            func = utils.import_class(call.target_method)
            arguments = json.loads(call.arguments)

            api.update_periodic_call(
                call.name,
                {
                    'execution_time': get_next_time(
                        call.pattern, call.execution_time
                    ),
                    'processing': True
                }
            )
            SEMAPHORES[call.id].acquire()
            t = eventlet.spawn(func, **arguments)
            t.link(end_processing, call)
Example #4
0
def get_reminders(user):
    return db_api.get_periodic_calls(user_id=user)