12.1.2. Пример обработки входа и выхода¶
В этом примере показана схема обработки входа приложение и выхода из него.
Чтобы включить пример обработки входа в приложение, и посмотреть как он работает нужно выполнить следующие действия.
Переименовать файл logon.py.template в logon.py (см. раздел Шаблоны расширяемых Python-модулей)
В файле logon.py расскоментировать вызов функции примера:
import cerebro
import examples
def logon():
examples.logon.logon()
Модуль примера обработки входа расположен в examples/logon.py (см. раздел Организация файлов)
examples/logon.py
# -*- coding: utf-8 -*-
"""
Пример демонстритует запуск таймера на вызов функции в момент входа в Cerebro.
Вызываемая по таймеру функция будет проверять есть ли в списке задач к выполнению те,
которые стартуют в ближайшее время. Если есть, то пользователю будет показано уведомление
Функции:
logon() - вызывается в момент входа в Cerebro
check_start_tasks() - вызывается по таймеру, и проверяет список поставленных задач
"""
import cerebro
import datetime
def logon():
# Запуск таймера на вызов функции example_timer
cerebro.core.start_timer('examples.logon.example_timer', 1000) # запуск таймера каждую секунду
def example_timer():
cerebro.core.print_info('Вызов example_timer по таймеру')
print('Вызов example_timer по таймеру')
Чтобы включить пример обработки выхода из приложения, и посмотреть как он работает нужно выполнить следующие действия.
Переименовать файл logoff.py.template в logoff.py.
В файле logoff.py расскоментировать вызов функции примера:
import cerebro
import examples
def logoff():
return examples.logoff.logoff()
Модуль примера обработки выхода расположен в examples/logoff.py
examples/logoff.py
# -*- coding: utf-8 -*-
"""
Пример демонстритует проверку отчетности пользователя в момент завершения сеанса работы с Cerebro.
Если время больше 18:00 и пользователь отчитался меньше чем на 8 часов, переспросим пользователя,
действительно ли он хочет выйти не написав отчет.
Функции:
logoff() - вызывается в момент завершения сеанса в Cerebro
check_start_tasks() - вызывается по таймеру, и проверяет список поставленных задач
"""
import cerebro
import datetime
def logoff():
if datetime.datetime.now().hour >= 18: # если время больше 18:00 начинаем проверку отчетности
database = cerebro.db.Db() # получаем объект базы данных для произведения запроса
# Для выполнения запроса нам так же понадобятся идентификатор текущего пользователя
current_user_id = cerebro.core.user_profile()[cerebro.aclasses.Users.DATA_ID] # идентификатор текущего пользователя
# и промежуток времени, который мы будем рассматривать. В данном случаи за сегодня.
start = datetime.datetime.combine(datetime.datetime.now().date(), datetime.time(0, 0, 0))
stop = datetime.datetime.combine(start.date(), datetime.time(23, 59 , 59, 999))
# Выполняем запрос на количество потраченных часов, за которые он отчитался в течении дня
reports = database.execute('select sum(declared) from "dumpReportsByUser"($1,$2::text::timestamp with time zone,$3::text::timestamp with time zone)', current_user_id, start.isoformat(), stop.isoformat())
question = ''
if len(reports) == 0 or reports[0][0] == None: # если отчетов не было совсем
question = 'Вы не написали ни одного отчета за сегодня.\n Вы уверены, что хотите выйти?'
elif reports[0][0] < 8*60: # если отчеты были, но меньше чам на 8 часов
question = 'Вы отчитались всего за ' + str(round(reports[0][0]/60, 1)) + ' часов.\n Вы уверены, что хотите выйти?'
if question != '': # если вопрос возник
# показываем его пользователю
if cerebro.gui.question_box('Cerebro', question) == False: # если пользователь не выходит
return False # в этом случаи завершение сеанса не произойдет и пользователь может пойти в нужные задачи и отчитаться в них
# Останавливаем таймер на вызов функции check_start_tasks, запущенный при входе в Cerebro (модуль logon)
cerebro.core.stop_timer('examples.logon.check_start_tasks')
return True