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