Notifier
Using the NotifierManager
and notifiers, e.g. EmailNotifier
you can create visual reports about the steps that the robot did.
And send these reports via e-mail, print them out into terminal or import into Prefect.
Manager
- class aiviro.modules.notifier.NotifierManager
Notifier manager provides an interface for propagating messages through several Notifiers. Where each notifier is specified by its scope.
Warning
Using NotifierManager is deprecated, and it’ll be removed in the future versions. Please use just
EmailNotifier
instead.- Example:
>>> from aiviro.modules.notifier import NotifierManager, EmailNotifier >>> nm = NotifierManager() >>> # Adds root notifier >>> nm.add_notifier(EmailNotifier("<client>", "Orders Title", "customer@cmp.com")) >>> # Adds dev notifier >>> nm.add_notifier(EmailNotifier("<client>", "[DEV] Orders Title", "developer@cmp.com"), scope="dev") >>> nm.successful("Item added") # Adds message into both notifiers >>> nm.error("Something went wrong", scope="dev") # Adds message only into 'dev' notifier >>> blk = nm.create_block("New Block") # Creates a shared block in both notifiers >>> blk.successful("Great message !!") # Message is added into shared block for both notifiers >>> # sending reports >>> nm.send_report() # sends report to both notifiers >>> nm.send_report(propagate=False) # sends report only to the notifiers with "base" title >>> nm.send_report(scope="dev") # sends report to the notifier with "dev" title
- property root_notifier: BaseNotifier
Returns notifier with an empty scope
- add_notifier(notifier: BaseNotifier, scope: str = '') NotifierManager
Adds new notifier with a specified scope
- Parameters:
notifier – Notifier to add
scope – Notifier’s scope to propagate messages
- Example:
>>> from aiviro.modules.notifier import NotifierManager, EmailNotifier >>> nm = NotifierManager().add_notifier( ... EmailNotifier("..."), scope="dev" ... )
- property last_block: NotificationBlock
Returns last created
NotificationBlock
- create_block(title: str, block_id: str | None = None, sort_notifications: bool = False, style: Style | None = None, scope: str = '') NotificationBlock
Creates new block/section in the report.
- Parameters:
title – Title of the block
block_id – Identifier of the block, if not set ‘title’ is used as identifier
sort_notifications – If True notification messages will be sorted in the block
style – Style to automatically format
Item
messages.scope – Identification into which notifiers to add a new block
- custom(title: str, text: MSG_TYPE, m_type: NotificationType = NotificationType.INFO, scope: str = '') Notification
Method creates custom notification message in default block and propage it.
- Parameters:
title – Title of the message
text – Additional text of the message
m_type – Type of the notification, see
NotificationType
for optionsscope – Identification into which notifiers to propagate the message
- Returns:
Notification object, to add additional messages
- Example:
>>> from aiviro.modules.notifier import NotifierManager, EmailNotifier, NotificationType >>> nm = NotifierManager().add_notifier(EmailNotifier("<client>", "title")) >>> nm.custom("Custom", "message text", NotificationType.INFO).add_sub_msg("Sub message") "Custom - message text - Sub message"
- successful(msg: MSG_TYPE, scope: str = '') Notification
Method creates ‘successful’ (green) notification message in default block.
- Parameters:
msg – Standardized message object
scope – Identification into which notifiers to propagate the message
- Returns:
Notification object, to add additional messages
- Example:
>>> from aiviro.modules.notifier import NotifierManager, EmailNotifier, Item >>> nm = NotifierManager().add_notifier(EmailNotifier("<client>", "title")) >>> nm.successful(Item("faktúra", "310-231234")) "Úspěšně zpracováno - Faktúra '310-231234'"
- unable_to_process(msg: MSG_TYPE, scope: str = '') Notification
Method creates ‘unable to process’ (blue) notification message in default block.
- Parameters:
msg – Standardized message object
scope – Identification into which notifiers to propagate the message
- Returns:
Notification object, to add additional messages
- Example:
>>> from aiviro.modules.notifier import NotifierManager, EmailNotifier, Item >>> nm = NotifierManager().add_notifier(EmailNotifier("<client>", "title")) >>> nm.unable_to_process( ... Item("e-mail", "Invoice no.331343") ... ).add_sub_msg("Neznámý formát e-mailu") "Nelze zpracovat - E-mail 'Invoice no.331343' - Neznámý formát e-mailu"
- warning(msg: MSG_TYPE, scope: str = '') Notification
Method creates ‘warning’ (yellow) notification message in default block.
- Parameters:
msg – Standardized message object
scope – Identification into which notifiers to propagate the message
- Returns:
Notification object, to add additional messages
- Example:
>>> from aiviro.modules.notifier import NotifierManager, EmailNotifier >>> nm = NotifierManager().add_notifier(EmailNotifier("<client>", "title")) >>> nm.warning( ... "Byl spracovany maximálni počet položek" ... ).add_sub_msg("spracovano 20/20") "Upozornení - Byl spracovany maximálni počet položek - spracovano 20/20"
- error(msg: MSG_TYPE, scope: str = '') Notification
Method creates ‘error’ (red) notification message in default block.
- Parameters:
msg – Standardized message object
scope – Identification into which notifiers to propagate the message
- Returns:
Notification object, to add additional messages
- Example:
>>> from aiviro.modules.notifier import NotifierManager, EmailNotifier, Item >>> nm = NotifierManager().add_notifier(EmailNotifier("<client>", "title")) >>> nm.error( ... Item("Objednávka", "RE-102-3539").text("neobsahuje požadované položky") ... ).add_sub_msg("položka DP-34101") "Chyba - Objednávka 'RE-102-3539' neobsahuje požadované položky - položka DP-34101"
- trigger_event(event: BaseEvent) None
Sends an event to all notifiers which the event targets. Notifiers can be set up to handle specific events. For example EmailNotifier only handles SendReportEvent.
- Parameters:
event – Event which is sent to all notifiers specified in the event.
- send_report(recipients: ADDR_TYPE | None = None, logging_info: bool = True, prefect_artifact: bool = True, email_subject: str | None = None, email_attachments: List[str] | None = None, scope: str = '', propagate: bool = True) None
Triggers send report in all notifiers which are inside the scope parameter.
- Parameters:
recipients – (Deprecated) E-mail recipients of the html report
logging_info – If True, plain-text report is logged in INFO level
prefect_artifact – If True, Prefect artifact with markdown report is created
email_subject – Subject of them e-mail, if None
report_title
is used as subjectemail_attachments – List of paths to attach to the email
scope – Scope of notifiers in which this method should be executed
propagate – If the send report should be propagated to all scopes or the exact one
- Example:
>>> from aiviro.modules.notifier import NotifierManager, EmailNotifier, Item >>> # Sending with one notifier >>> nm = NotifierManager().add_notifier(EmailNotifier("<client>", "title")) >>> nm.send_report() >>> # Sending with multiple notifiers >>> nm = NotifierManager().add_notifier(EmailNotifier("<client>", "base")) >>> nm.add_notifier(EmailNotifier("<client>", "dev"), "dev") >>> nm.send_report() # sends report to both notifiers >>> nm.send_report(propagate=False) # sends report only to the notifiers with "base" title >>> nm.send_report(scope="dev") # sends report to the notifier with "dev" title
Email Notifier
- class aiviro.modules.notifier.EmailNotifier(client: EmailClient, report_title: str, recipients: ADDR_TYPE, logging_level: str | None = None, notification_titles: Dict[NotificationType, str] | None = None)
Email notifier which provides an interface to create standardized reports for Aiviro scripts. It creates report in html, markdown and plain-text format.
- Parameters:
client –
EmailClient
object with configured SMTP server credentialsreport_title – Title of the report
recipients – E-mail recipients of the report
logging_level – Logging level using which every message is logged
notification_titles – Dictionary with custom titles for notifications, if not specified, default titles are used
- Example:
>>> from aiviro.modules.email import EmailClient >>> from aiviro.modules.notifier import NotifierManager, EmailNotifier, Msg, Item, Style, NotificationType >>> >>> client = EmailClient() >>> client.setup_smtp_basic_auth("<SMTP_SERVER>", "<EMAIL_ADDRESS>", "<EMAIL_PASSWORD>") >>> # initialize notifier & manager >>> en = EmailNotifier( ... client, ... "Zpracovaní faktur", ... ["email@domain.com", "email2@domain.com"], ... logging_level="INFO", ... notification_titles={ ... NotificationType.SUCCESS: "OK", ... NotificationType.INFO: "Nezpracováno", ... }, ... ) >>> # set-up default block style >>> en.default_block.item_style = Style(bold=True) >>> en.successful(Item("Faktura", "Malsing 21893918.pdf")) >>> en.successful(Item("Objednávka", "300220178")) >>> en.unable_to_process( ... Item("e-mail", "SecureNetwork.cz: Potvrzení o přijetí platby") ... ).add_sub_msg("Neobsahuje přílohu") >>> en.unable_to_process( ... Item("e-mail", "faktura FV-11/2022") ... ).add_sub_msg("Obsahuje neznámou přílohu") >>> en.warning( ... Item("položka", "107236").item("Faktura", "R22E09315").item("Objednávka", "301210221") ... ).add_sub_msg(Msg("nebyla nalezena v 'Převod s výběrem a potvrdzením'")) >>> en.error("Extrakce emailu") >>> en.error(Item("faktura", "Imman 503031100.PDF").item("parser", "ImmanParser")) ... >>> blk = en.create_block("Blok 2") >>> blk.item_style = Style(italic=True) >>> blk.unable_to_process( ... Item("E-mail", 'Company Electronics, a.s.') ... ).add_sub_msg("Neobsahuje přílohu s PDF") >>> blk.unable_to_process( ... Item("Objednávka", "123-30XDSF03").text("jiz existuje ve 'Expedicni prikazy'") ... ) >>> blk.warning(Msg("Výber maximálního-menšího množství (20)").item("polozka", "7811248")) >>> blk.error( ... Item("Faktura", '123-3498129').text("nelze zpracovat") ... ).add_sub_msg(Item("Firma", "Siner s.r.o.").text("nebyla nalezena v konfiguračním souboru")) >>> # send report >>> en.send_report()
- send_report(recipients: ADDR_TYPE | None = None, logging_info: bool = True, prefect_artifact: bool = True, email_subject: str | None = None, email_attachments: List[str] | None = None) None
Method generates and sends the report.
- Parameters:
recipients – (Deprecated) E-mail recipients of the html report
logging_info – If True, plain-text report is logged in INFO level
prefect_artifact – If True, Prefect artifact with markdown report is created
email_subject – Subject of them e-mail, if None
report_title
is used as subjectemail_attachments – List of paths to attach to the email
- property blocks: List[NotificationBlock]
Returns list of non-empty blocks. It can be used to check if report contains any messages.
- Example:
>>> from aiviro.modules.notifier import EmailNotifier >>> en = EmailNotifier("<client>", "Invoice Processing", "robot.aiviro@aiviro.com") >>> if en.blocks: >>> en.send_report(email_subject="Robot Report")
- create_block(title: str, block_id: str | None = None, sort_notifications: bool = False, style: Style | None = None, log_settings: NotifierLog | None = None, notification_titles: Dict[NotificationType, str] | None = None) NotificationBlock
Creates new block/section in the report.
- Parameters:
title – Title of the block
block_id – Identifier of the block, if not set ‘title’ is used as identifier
sort_notifications – If True notification messages will be sorted in the block
style – Style to automatically format
Item
messages.log_settings – Logging configuration for the block
notification_titles – Titles for notification types, if not set default titles are used
- custom(title: str, text: MSG_TYPE, m_type: NotificationType = NotificationType.INFO, log_settings: NotifierLog | None = None) Notification
Method creates custom notification message.
- Parameters:
title – Title of the message
text – Additional text of the message
m_type – Type of the notification, see
NotificationType
for optionslog_settings – Logging configuration for the message
- Returns:
Notification object, to add additional messages
>>> from aiviro.modules.notifier import EmailNotifier, NotificationType >>> en = EmailNotifier("<client>", "title") >>> en.custom("Custom", "message text", NotificationType.INFO).add_sub_msg("Sub message") "Custom - message text - Sub message"
- property default_block: NotificationBlock
Returns default
NotificationBlock
- error(msg: MSG_TYPE, log_settings: NotifierLog | None = None) Notification
Method creates ‘error’ (red) notification message in default block.
- Parameters:
msg – Standardized message object
log_settings – Logging configuration for the message
- Returns:
Notification object, to add additional messages
- Example:
>>> from aiviro.modules.notifier import EmailNotifier, Item >>> en = EmailNotifier("<client>", "title") >>> en.error( ... Item("Objednávka", "RE-102-3539").text("neobsahuje požadované položky") ... ).add_sub_msg("položka DP-34101") "Chyba - Objednávka 'RE-102-3539' neobsahuje požadované položky - položka DP-34101"
- get_block(block_id: str) NotificationBlock
Method to get
NotificationBlock
- Parameters:
block_id – Identification of the notification block
- inactive(msg: MSG_TYPE, log_settings: NotifierLog | None = None) Notification
Method creates ‘inactive’ (gray) notification message in default block.
- Parameters:
msg – Standardized message object
log_settings – Logging configuration for the message
- Returns:
Notification object, to add additional messages
- Example:
>>> from aiviro.modules.notifier import EmailNotifier, Item >>> en = EmailNotifier("<client>", "title") >>> en.inactive(Item("Položka", "SU-1239-A")) "Neaktivní - Položka 'SU-1239-A'"
- property last_block: NotificationBlock
Returns last created
NotificationBlock
- successful(msg: MSG_TYPE, log_settings: NotifierLog | None = None) Notification
Method creates ‘successful’ (green) notification message in default block.
- Parameters:
msg – Standardized message object
log_settings – Logging configuration for the message
- Returns:
Notification object, to add additional messages
- Example:
>>> from aiviro.modules.notifier import EmailNotifier, Item >>> en = EmailNotifier("<client>", "title") >>> en.successful(Item("faktúra", "310-231234")) "Úspěšně zpracováno - Faktúra '310-231234'"
- unable_to_process(msg: MSG_TYPE, log_settings: NotifierLog | None = None) Notification
Method creates ‘unable to process’ (blue) notification message in default block.
- Parameters:
msg – Standardized message object
log_settings – Logging configuration for the message
- Returns:
Notification object, to add additional messages
- Example:
>>> from aiviro.modules.notifier import EmailNotifier, Item >>> en = EmailNotifier("<client>", "title") >>> en.unable_to_process( ... Item("e-mail", "Invoice no.331343") ... ).add_sub_msg("Neznámý formát e-mailu") "Nelze zpracovat - E-mail 'Invoice no.331343' - Neznámý formát e-mailu"
- warning(msg: MSG_TYPE, log_settings: NotifierLog | None = None) Notification
Method creates ‘warning’ (yellow) notification message in default block.
- Parameters:
msg – Standardized message object
log_settings – Logging configuration for the message
- Returns:
Notification object, to add additional messages
- Example:
>>> from aiviro.modules.notifier import EmailNotifier, Msg >>> en = EmailNotifier("<client>", "title") >>> en.warning( ... Msg("Byl spracovany maximálni počet položek") ... ).add_sub_msg("spracovano 20/20") "Upozornení - Byl spracovany maximálni počet položek - spracovano 20/20"
Notification Components
- class aiviro.modules.notifier.Notification(title: str, message: Msg, m_type: NotificationType, item_style: Style | None = None, log_settings: NotifierLog | None = None)
Notification object representing one message (possibly with sub messages) for
NotificationBlock
.- add_sub_msg(text: MSG_TYPE, log_settings: NotifierLog | None = None) Notification
Adds sub message into the notification
- Parameters:
text – Text of the sub message
log_settings – Logging configuration for the message
- property notification_type: NotificationType
Type of the notification, one of
NotificationType
options.- Getter:
Returns notification type
- Setter:
Sets type of the notification
- Example:
>>> from aiviro.modules.notifier import NotifierManager, EmailNotifier, NotificationType, Item >>> en = EmailNotifier("<client>", "Title", "mail@bs.com") >>> msg = en.successful(Item("invoice", "600-123456")) >>> # some code >>> # change the successful message into error >>> msg.notification_type = NotificationType.ERROR
- class aiviro.modules.notifier.NotificationBlock(blk_id: str, title: str, sort_notifications: bool = False, style: Style | None = None, notification_manager: NotifierManager | None = None, default_scope: str = '', log_settings: NotifierLog | None = None, notification_titles: Dict[NotificationType, str] | None = None)
Block/section of the section, containing corresponding notifications.
- Parameters:
blk_id – Identifier of the block
title – Title of the section
sort_notifications – If True notification messages will be sorted
- property item_style: Style | None
Default style setting using which
Item
text is automatically formated.- Getter:
Returns style object
- Setter:
Sets style for item texts
- Example:
>>> from aiviro.modules.notifier import NotifierManager, EmailNotifier, NotificationType, Item, Style >>> en = EmailNotifier("<client>", "Title", "mail@bs.com") >>> blk = en.create_block("New Block", "nb") >>> blk.item_style = Style(bold=True) >>> blk.successful(Item("invoice", "600-123456").item("email", "title of email")) "Úspěšně zpracováno - **Invoice** '600-123456', **Email** 'title of email'"
- custom(title: str, text: MSG_TYPE, m_type: NotificationType = NotificationType.INFO, scope: str = '', log_settings: NotifierLog | None = None) Notification
Method creates custom notification message.
- Parameters:
title – Title of the message
text – Additional text of the message
m_type – Type of the notification, see
NotificationType
for optionsscope – Identification into which notifiers to add a message
log_settings – Logging configuration for the message
- Returns:
Notification object, to add additional messages
- Example:
>>> from aiviro.modules.notifier import NotifierManager, EmailNotifier, NotificationType >>> en = EmailNotifier("<client>", "Title", "mail@bs.com") >>> blk = en.create_block("supplier-1", "s1") >>> blk.custom("Custom", "message text", NotificationType.INFO).add_sub_msg("Sub message") "Custom - message text - Sub message"
- inactive(msg: MSG_TYPE, scope: str = '', log_settings: NotifierLog | None = None) Notification
Method creates ‘inactive’ (gray) notification message.
- Parameters:
msg – Standardized message object
scope – Identification into which notifiers to add a message
log_settings – Logging configuration for the message
- Returns:
Notification object, to add additional messages
- Example:
>>> from aiviro.modules.notifier import NotifierManager, EmailNotifier, Item >>> en = EmailNotifier("<client>", "Title", "mail@bs.com") >>> blk = en.create_block("supplier-1", "s1") >>> blk.inactive(Item("faktúra", "310-231234")) "Neaktivní - Faktúra '310-231234'"
- successful(msg: MSG_TYPE, scope: str = '', log_settings: NotifierLog | None = None) Notification
Method creates ‘successful’ (green) notification message.
- Parameters:
msg – Standardized message object
scope – Identification into which notifiers to add a message
log_settings – Logging configuration for the message
- Returns:
Notification object, to add additional messages
- Example:
>>> from aiviro.modules.notifier import NotifierManager, EmailNotifier, Item >>> en = EmailNotifier("<client>", "Title", "mail@bs.com") >>> blk = en.create_block("supplier-1", "s1") >>> blk.successful(Item("faktúra", "310-231234")) "Úspěšně zpracováno - Faktúra '310-231234'"
- unable_to_process(msg: MSG_TYPE, scope: str = '', log_settings: NotifierLog | None = None) Notification
Method creates ‘unable to process’ (blue) notification message.
- Parameters:
msg – Standardized message object
scope – Identification into which notifiers to add a message
log_settings – Logging configuration for the message
- Returns:
Notification object, to add additional messages
- Example:
>>> from aiviro.modules.notifier import NotifierManager, EmailNotifier, Item >>> en = EmailNotifier("<client>", "Title", "mail@bs.com") >>> blk = en.create_block("supplier-1", "s1") >>> blk.unable_to_process( ... Item("e-mail", "Invoice no.331343") ... ).add_sub_msg("Neznámý formát e-mailu") "Nelze zpracovat - E-mail 'Invoice no.331343' - Neznámý formát e-mailu"
- warning(msg: MSG_TYPE, scope: str = '', log_settings: NotifierLog | None = None) Notification
Method creates ‘warning’ (yellow) notification message.
- Parameters:
msg – Standardized message object
scope – Identification into which notifiers to add a message
log_settings – Logging configuration for the message
- Returns:
Notification object, to add additional messages
- Example:
>>> from aiviro.modules.notifier import NotifierManager, EmailNotifier, Msg >>> en = EmailNotifier("<client>", "Title", "mail@bs.com") >>> blk = en.create_block("supplier-1", "s1") >>> blk.warning( ... Msg("Byl spracovany maximálni počet položek") ... ).add_sub_msg("spracovano 20/20") "Upozornení - Byl spracovany maximálni počet položek - spracovano 20/20"
- error(msg: MSG_TYPE, scope: str = '', log_settings: NotifierLog | None = None) Notification
Method creates ‘error’ (red) notification message.
- Parameters:
msg – Standardized message object
scope – Identification into which notifiers to add a message
log_settings – Logging configuration for the message
- Returns:
Notification object, to add additional messages
- Example:
>>> from aiviro.modules.notifier import NotifierManager, EmailNotifier, Item >>> en = EmailNotifier("<client>", "Title", "mail@bs.com") >>> blk = en.create_block("supplier-1", "s1") >>> blk.error( ... Item("Objednávka", "RE-102-3539").text("neobsahuje požadované položky") ... ).add_sub_msg("položka DP-34101") "Chyba - Objednávka 'RE-102-3539' neobsahuje požadované položky - položka DP-34101"
- class aiviro.modules.notifier.NotificationType(value)
Default types for notification messages.
- INACTIVE = 0
Gray colored message
- SUCCESS = 10
Green colored message
- INFO = 20
Blue colored message
- WARNING = 30
Yellow colored message
- ERROR = 40
Red colored message
- class aiviro.modules.notifier.Msg(text: str = '', style: Style | None = None)
Main object to create a standardized message for e-mail notifications, see
EmailNotifier
.- Parameters:
text – Initial text of the message
style – Style to format text
- Example:
>>> from aiviro.modules.notifier import Msg >>> m = Msg("Text at the beginning") >>> m.message "Text at the beginning"
>>> m = Msg("") ... .item("Item", 'DP123-1').text("unable to process") ... .item("Invoice", "300220178").text("has invalid format") >>> m.message "Item 'DP123-1' unable to process, Invoice '300220178' has invalid format"
- item(name: str, value: str, style: Style | None = None) Msg
Method to add custom item with its value.
- Parameters:
name – Name of the item, text is capitalized
value – String value of the item, text is formatted between two ‘
style – Style to format ‘name’ text, ‘value’ is not formatted
- Example:
>>> m = Msg("Some text").item('invoice', '310-12345').item('file', 'R234_12345.pdf') >>> m.message "Some text, Invoice '310-12345', File 'R234_12345.pdf'"
>>> m = Msg("Some text").item("Item", 'DP123-1', Style(bold=True)) >>> m.message "Some text, **Item** 'DP123-1'"
- text(text: str, style: Style | None = None) Msg
Method to add additional text to the message.
- Parameters:
text – Text added to the final message, “space” is added in front of it
style – Style to format text
- Example:
>>> m = Msg("Some text").text("additional text") >>> m.message "Some text addtitional text"
>>> m = Msg("Bold text", Style(bold=True)) >>> m.message "**Bold text**"
- class aiviro.modules.notifier.Item(name: str, value: str, style: Style | None = None)
Object to create a standardized message for e-mail notifications, see
EmailNotifier
. Can be used instead ofMsg
, when initial text is not required.- Parameters:
name – Name of the item, text is capitalized
value – String value of the item, text is formatted between two ‘
- Example:
>>> from aiviro.modules.notifier import Item >>> m = Item("Item", "DP123-1") >>> m.message "Item 'DP123-1'"
>>> m = Item("Item", 'DP123-1').text("unable to process") ... .item("Invoice", "300220178").text("has invalid format") >>> m.message "Item 'DP123-1' unable to process, Invoice '300220178' has invalid format"
>>> m = Item("Item", 'DP123-1', Style(bold=True)).text("unable to process") >>> m.message "**Item** 'DP123-1' unable to process"