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)