8. Обработка событий. Модуль event¶
Модуль event позволяет обрабатывать события, происходящие в приложении.
event.py:
def before_event(error, event):
...
def after_event(event):
...
def error_event(event):
...
События происходят при изменении данных в приложении пользователем
и программный интерфейс позволяет управлять этими событиями.
Приложение генерирует события при выполнении
определенных действий. При этом вызываются соответствующие функции
before_event()
, after_event()
или error_event()
из модуля event.
События происходят при операциях изменения данных, поэтому смысл этих функций сводится к следующему:
- before_event() - действие перед изменением данных;
- after_event() - действие после изменения данных;
- error_event() - обработка ошибки изменения данных.
8.1. Генерация событий¶
В момент изменения данных пользователем, перед записью изменений
в базу данных вызывается функция before_event()
.
Если в теле этой функции генерируется исключение,
отправка изменений отменяется и пользователю выводится
сообщение об исключении.
Если код выполнен без исключений, то происходит запись изменений.
Если в момент записи возникла ошибка, например, пропало соединение
с интернетом или пользователь не имеет прав на данное изменение,
вызывается функция error_event()
.
Если запись изменений произошла корректно,
вызывается функция after_event()
.
Событие без ошибок:
before_event(event)
...
# приложение сохраняет изменения
...
after_event(event)
Событие с генерацией исключения в before_event:
before_event(event)
...
raise Exception('Отменить изменение')
...
# приложение показывает сообщение исключения
Событие c ошибкой сохранения изменений:
before_event(event)
...
# приложение сохраняет изменения... Возникла ошибка
# приложение показывает сообщение ошибки
...
error_event(error, event)
Схема события
Рассмотрим, как происходит событие на примере создания нового сообщения в приложении Cerebro.
Пользователь пишет сообщение, прикладывает файлы и нажимает
кнопку «Отправить».
В этот момент происходит вызов функции before_event()
.
event.py:
def before_event(event):
...
Если во время выполнения кода функции before_event()
было сгенерировано исключение,
то пользователю будет показано уведомление,
и создание нового сообщения не произойдет,
но перед пользователем останется интерфейс создания сообщения
с введенным им текстом и вложениями.
event.py:
def before_event(event):
...
raise Exception('Ouch')
...
Если выполнение кода произошло без исключительной ситуации, происходит добавление нового сообщения в базу данных.
Если во время добавления происходит ошибка,
то сообщение не добавляется, пользователь получает сообщение
о причине ошибки и вызывается функция error_event()
.
event.py:
def error_event(error, event):
...
Если добавление сообщения прошло успешно, то вызывается
функция after_event()
.
event.py:
def after_event(event):
...
Если во время выполнения кода функции after_event было сгенерировано исключение, то пользователю будет показано сообщение с этим исключением.
8.2. Функции обработки событий¶
-
event.
before_event
(event)[исходный код]¶ В функцию передается объект события с определенными свойствами, которые позволяют определить, какое изменение данных произойдет и внести собственные изменения.
В теле функции могут выполняться различные проверки и вноситься изменения в данные, которые затем будут переданы в приложение. Это способ контроля изменения данных пользователем, который позволяет проверять эти данные перед их записью в базу данных, корректировать или отменять их. Для того чтобы отменить событие (изменение данных), нужно в сгенерировать исключение. В этом случаи обработка события будет остановлена и пользователю будет показано сообщение исключения.
Если при выполнении кода функции не сгенерировано исключение, то происходит процесс внесения изменений в базу данных с учетом их возможной коррекции.
-
event.
after_event
(event)[исходный код]¶ В функцию передается объект события с определенными свойствами, которые позволяют определить, какое изменение данных произошло.
Вызов функции происходит после внесения данных в базу. В ней можно, например, вызывать функции программного интерфейса по изменению каких-либо дополнительных данных или запускать сторонние приложения.
Если на данном этапе происходит ошибка, вы можете предупредить об этом пользователя сгенерировав исключение.
-
event.
error_event
(error, event)[исходный код]¶ При вызове этой функции в неё передается объект ошибки и объект события, которые позволяют определить, какая ошибка и при каком событии произошла. Вызов функции происходит в случаи какой-либо ошибки, произошедшей в момент внесения данных в базу.
Классы объектов событий описаны в модуле cerebro.events
пакета cerebro
.
8.3. Типы событий¶
Типы события различаются типом изменения данных.
Например, есть такие типы как,
создание сообщения
,
создание задачи
,
изменение прогресса
и т.д.
Для каждого типа события
,
существует набор классов описания объектов, которые передаются
в функции обработки событий.
По типу события и функции обработки, определяется
интерфейс объекта события
.
event.py:
def before_event(event):
if (event.event_type() == event.EVENT_CREATION_OF_MESSAGE) # создание сообщения
# объект event использует интерфейс класса BeforeEventCreationOfMessage
def after_event(event):
if (event.event_type() == event.EVENT_CREATION_OF_MESSAGE) # создание сообщения
# объект event использует интерфейс класса AfterEventCreationOfMessage
def error_event(error, event):
if (event.event_type() == event.EVENT_CREATION_OF_MESSAGE) # создание сообщения
# объект event использует интерфейс класса BeforeEventCreationOfMessage
Как правило, в функцию before_event()
передаются
объекты классов
,
имя которых начинается с Before…
Tакие объекты имеют функции, позволяющие узнать текущие значения,
новые значения и внести дополнительные изменения.
def before_event(event):
if (event.event_type() == event.EVENT_CHANGING_OF_MESSAGE) # редактирование сообщения
omessage = event.original_message() # получаем объект оригинального сообщения
if (event.work_time() != omessage.work_time()) # сравниваем текущее значение рабочего времени сообщения и вновь введенного пользователем.
raise Exception('Изменение рабочих часов невозможно!')
event.set_client_visible(True) # устанавливаем видимость для клиентов
В функцию after_event()
передаются
объекты классов
,
имя которых начинается с After… Tакие объекты имеют функции,
позволяющие узнать новые значения.
def after_event(event):
if (event.event_type() == event.EVENT_CHANGING_OF_TASKS_NAME) # изменение имени задачи
task_name = event.name() # получаем новое имя
В функцию error_event()
передаются
объект ошибки
,
и объекты классов
,
имя которых начинается с Before… Это тот же объект,
который передаётся в функцию before_event()
,
только без возможности производить изменения.
Все типы событий описаны в модуле cerebro.events
пакета cerebro
в
базовом классе события Event
.
С примерами обработки событий можно ознакомится здесь.