12.1.3. Пример обработки событий

В этом примере показана схема работы с событийным механизмом приложения.

Чтобы включить пример, и посмотреть как он работает нужно выполнить следующие действия.

Переименовать файл event.py.template в event.py (см. раздел Шаблоны расширяемых Python-модулей)

В файле event.py расскоментировать вызовы функций примера:

import cerebro
import examples

def before_event(event):
    examples.event.before_event(event)

def after_event(event):
    examples.event.after_event(event)

def error_event(error, event):
    examples.event.error_event(error, event)

Модуль примера обработки событий расположен в examples/event.py (см. раздел Организация файлов)

examples/event.py

# -*- coding: utf-8 -*-
"""
Пример демонстрирует обработку события создания сообщения, создания задачи и изменения прогресса.
Здесь мы:

a) сделаем проверку на наличие приложенного файла при создании отчета;
b) выставим высокий приоритет задаче при её создании, если она начинается сегодня;
c) Переспросим пользователя при изменении прогресса в меньшую сторону.

Функции:

before_event() - действие перед изменением данных
after_event() - действие после изменения данных
error_event() - обработка ошибки изменения данных
"""

import cerebro
import datetime

def before_event(event):

        # Проверка на наличие вложения при создании отчета
        if event.event_type() == event.EVENT_CREATION_OF_MESSAGE: # если тип события - создание сообщения
                if event.type() == event.TYPE_REPORT: # если новое сообщение - "Отчет"

                        attachs = event.new_attachments() # получаем все вложения отчета
                        if len(attachs) == 0: # если вложений нет, генерируем исключение
                                raise Exception('Приложите файл к отчету!')
                                # Отчет не будет добавлен и пользователь увидит окно с этим текстом исключения.

        # Вопрос пользователю при уменьшении прогресса
        elif event.event_type() == event.EVENT_CHANGING_OF_TASKS_PROGRESS: # если тип события - изменение прогресса

                tasks = event.tasks() # получаем изменяемые задачи
                new_progress = event.new_value() # получаем выставленное пользователем значение прогресса
                for task in tasks: # смотрим, в какую сторону изменяется прогресс у каждой задачи
                        if new_progress < task.progress(): # если новый прогресс меньше, чем тот, что был до этого, то:
                                # переспрашиваем пользователя, действительно ли он хочет это сделать
                                q = 'Вы уверены, что хотите изменить прогресс задачи "'+task.name()+'" в меньшую сторону?'
                                if cerebro.gui.question_box('Изменение прогресса',  q) == False: # если пользователь не уверен, то:
                                        raise Exception('')
                                # Прогресс не будет изменен



def after_event(event):

        # Выставление приоритета при создании задачи
        if event.event_type() == event.EVENT_CREATION_OF_TASK: # если тип события - создание задачи

                start = event.start() # получаем время начала задачи
                delta = start - datetime.datetime.now()
                if delta.days == 0 or delta.days == -1: # если задача начинается сегодня
                        event.set_priority(event.PRIORITY_HIGHT) # устанавливаем высокий приоритет новой задаче



def error_event(error, event):
        print('Ошибка события',  event.type_str(),  error)