Pluggable notification channels (Teams, …) for MPT Extension SDK projects.
Project description
mpt-extension-contrib-custom-notifications
Shared notification channels for SoftwareONE MPT extensions built on the
Extension SDK. Extensions report to a channel (Microsoft Teams today, AWS SES
next) through one registry — ctx.notifications — instead of re-implementing a
sender per extension.
Channels are pluggable: each is gated by an optional-dependency extra and self-registers through an entry point, so a base install pulls no channel dependencies and only the channels you install and configure are exposed.
It consolidates the per-extension notification code previously re-implemented in
the AWS (swo/notifications/teams.py) and Adobe (adobe_vipm/notifications.py)
extensions.
See AGENTS.md for the module documentation map.
Install
pip install "mpt-extension-contrib-custom-notifications[teams]"
The base distribution has no channel dependencies. Each channel is an extra:
| Extra | Pulls in | Channel key |
|---|---|---|
teams |
microsoft-teams-cards, httpx |
teams |
Public API
mpt_extension_contrib.custom_notifications exposes the core; channel implementations
live under mpt_extension_contrib.custom_notifications.channels.<name>.
| Object | Purpose |
|---|---|
NotificationsContextMixin |
Adds self.notifications to an SDK context, built from settings. |
NotificationRegistry |
Named lookup of configured channels (register, get). |
build_registry(settings) |
Discover installed channels and register the configured ones. |
Notification |
Marker Protocol every channel satisfies. |
NotificationChannel |
Entry-point descriptor (name, build) advertised by a channel. |
NotificationSettings |
Marker Protocol for the settings a channel factory reads. |
Teams channel — mpt_extension_contrib.custom_notifications.channels.teams (extra teams):
| Object | Purpose |
|---|---|
TeamsNotifications |
Send Adaptive Cards to a Teams channel via a Workflows webhook. |
TeamsNotifier |
Protocol a custom Teams implementation must preserve. |
TeamsSettings |
Protocol describing the settings the channel reads (teams_webhook_url). |
Button, FactsSection |
Value types for a card link button and a facts section. |
Usage
Make the extension settings satisfy each installed channel's settings protocol
(inherit it so the contract is type-checked), then mix NotificationsContextMixin
into the context — it reads the standard ext_settings, so no extra wiring:
from dataclasses import dataclass
from mpt_extension_sdk.settings.extension import BaseExtensionSettings
from mpt_extension_contrib.custom_notifications import NotificationsContextMixin
from mpt_extension_contrib.custom_notifications.channels.teams import TeamsSettings
@dataclass(frozen=True)
class ExtensionSettings(BaseExtensionSettings, TeamsSettings):
# MSTEAMS_WEBHOOK_URL is read from the extension configuration.
teams_webhook_url: str | None = None
class OrderContext(NotificationsContextMixin, SdkOrderContext): ...
Then resolve a channel and send. get(NotifierProtocol) returns the registered
channel that satisfies the protocol, typed as that protocol:
from mpt_extension_contrib.custom_notifications.channels.teams import (
Button,
FactsSection,
TeamsNotifier,
)
teams = ctx.notifications.get(TeamsNotifier)
teams.send_error(
"Agreement sync failed",
str(exc),
button=Button(label="Open agreement", url=agreement_url),
facts=FactsSection(title="Context", entries={"Agreement": agreement_id}),
)
A channel appears in the registry only when both its extra is installed and
it is configured in settings. Asking for a channel that is not registered raises
KeyError, so an extension that does not use Teams neither installs the extra
nor configures the webhook.
Custom channels
A custom implementation only has to satisfy the channel Protocol; register it
under any key (use override=True to replace a built-in):
ctx.notifications.register("teams", MyTeamsNotifications(...), override=True)
To make a custom channel discoverable across extensions, ship it as its own
distribution that advertises a mpt_extension_contrib.custom_notifications.channels
entry point exposing a NotificationChannel.
Documentation
- Usage — install, configure, send, and write your own channel
- Architecture
- Contributing
- Testing
- Releases
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mpt_extension_contrib_custom_notifications-1.0.0.tar.gz.
File metadata
- Download URL: mpt_extension_contrib_custom_notifications-1.0.0.tar.gz
- Upload date:
- Size: 10.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.25 {"installer":{"name":"uv","version":"0.11.25","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
35fecf9552c7dec652b9915965c61cd9482f9e4c4fa9c10d95421f6d693ed098
|
|
| MD5 |
aacb765dd97f3381babddd18e3413ee6
|
|
| BLAKE2b-256 |
34ff89c323b2bd0350b217ca66f40b04a83d64c80c45ba679b97c2871fefc029
|
File details
Details for the file mpt_extension_contrib_custom_notifications-1.0.0-py3-none-any.whl.
File metadata
- Download URL: mpt_extension_contrib_custom_notifications-1.0.0-py3-none-any.whl
- Upload date:
- Size: 14.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.25 {"installer":{"name":"uv","version":"0.11.25","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
86e7fd99bd91c38538b69dfe1dd9ce678cd8de1cf23a24af3ce36e77adbb4c4d
|
|
| MD5 |
c3032131f56a71824a144c95cd3793b8
|
|
| BLAKE2b-256 |
afe9be14ce45de5562b9ad630ff8d0cf3ca374d163681acfd10a03b2f425a940
|