# What this PR does This is a follow-up PR to https://github.com/grafana/oncall/pull/4628. As @Ferril pointed out, there was a slight issue in `apps.alerts.tasks.notify_user.perform_notification` method when using a "fallback"/default user notification policy. This is because the `log_record_pk` arg passed into `perform_notification` will fetch the `UserNotificationPolicyLogRecord` object, but that object will have a `notification_policy` set to `None` (because there's no persistent `UserNotificationPolicy` object to refer to). Instead we now pass in a second argument to `perform_notification`, `use_default_notification_policy_fallback`. If this is true, simply grab the transient/in-memory `UserNotificationPolicy` and use that inside of this task Related to https://github.com/grafana/oncall/issues/4410 ## Checklist - [x] Unit, integration, and e2e (if applicable) tests updated - [x] Documentation added (or `pr:no public docs` PR label added if not required) - [x] Added the relevant release notes label (see labels prefixed w/ `release:`). These labels dictate how your PR will show up in the autogenerated release notes.
35 lines
1.1 KiB
Python
35 lines
1.1 KiB
Python
import typing
|
|
|
|
from apps.base.messaging import BaseMessagingBackend
|
|
from apps.email.tasks import notify_user_async
|
|
|
|
if typing.TYPE_CHECKING:
|
|
from apps.alerts.models import AlertGroup
|
|
from apps.base.models import UserNotificationPolicy
|
|
from apps.user_management.models import User
|
|
|
|
|
|
class EmailBackend(BaseMessagingBackend):
|
|
backend_id = "EMAIL"
|
|
label = "Email"
|
|
short_label = "Email"
|
|
available_for_use = True
|
|
|
|
templater = "apps.email.alert_rendering.AlertEmailTemplater"
|
|
template_fields = ("title", "message")
|
|
|
|
def serialize_user(self, user: "User"):
|
|
return {"email": user.email}
|
|
|
|
def notify_user(
|
|
self, user: "User", alert_group: "AlertGroup", notification_policy: typing.Optional["UserNotificationPolicy"]
|
|
):
|
|
"""
|
|
NOTE: `notification_policy` may be None if the user has no notification policies defined, as
|
|
email is the default backend used
|
|
"""
|
|
notify_user_async.delay(
|
|
user_pk=user.pk,
|
|
alert_group_pk=alert_group.pk,
|
|
notification_policy_pk=notification_policy.pk if notification_policy else None,
|
|
)
|