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.")
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)) )
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)
def get_reminders(user): return db_api.get_periodic_calls(user_id=user)