# What this PR does Limit length of text in block being posted to slack when showing alert group timeline. ## Which issue(s) this PR closes Related to [issue link here] <!-- *Note*: If you want the issue to be auto-closed once the PR is merged, change "Related to" to "Closes" in the line above. If you have more than one GitHub issue that this PR closes, be sure to preface each issue link with a [closing keyword](https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/using-keywords-in-issues-and-pull-requests#linking-a-pull-request-to-an-issue). This ensures that the issue(s) are auto-closed once the PR has been merged. --> ## 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.
85 lines
3.1 KiB
Python
85 lines
3.1 KiB
Python
import typing
|
|
|
|
from apps.api.permissions import RBACPermission
|
|
from apps.slack.chatops_proxy_routing import make_private_metadata
|
|
from apps.slack.constants import BLOCK_SECTION_TEXT_MAX_SIZE
|
|
from apps.slack.scenarios import scenario_step
|
|
from apps.slack.scenarios.slack_renderer import AlertGroupLogSlackRenderer
|
|
from apps.slack.types import (
|
|
Block,
|
|
BlockActionType,
|
|
EventPayload,
|
|
InteractiveMessageActionType,
|
|
ModalView,
|
|
PayloadType,
|
|
ScenarioRoute,
|
|
)
|
|
from apps.user_management.models import Organization
|
|
|
|
from .step_mixins import AlertGroupActionsMixin
|
|
|
|
if typing.TYPE_CHECKING:
|
|
from apps.slack.models import SlackTeamIdentity, SlackUserIdentity
|
|
|
|
|
|
class OpenAlertGroupTimelineDialogStep(AlertGroupActionsMixin, scenario_step.ScenarioStep):
|
|
REQUIRED_PERMISSIONS = [RBACPermission.Permissions.CHATOPS_WRITE]
|
|
|
|
def process_scenario(
|
|
self,
|
|
slack_user_identity: "SlackUserIdentity",
|
|
slack_team_identity: "SlackTeamIdentity",
|
|
payload: EventPayload,
|
|
predefined_org: typing.Optional["Organization"] = None,
|
|
) -> None:
|
|
alert_group = self.get_alert_group(slack_team_identity, payload)
|
|
if not self.is_authorized(alert_group):
|
|
self.open_unauthorized_warning(payload)
|
|
return
|
|
|
|
private_metadata = {
|
|
"organization_id": self.organization.pk,
|
|
"alert_group_pk": alert_group.pk,
|
|
"message_ts": payload.get("message_ts") or payload["container"]["message_ts"],
|
|
}
|
|
|
|
alert_receive_channel = alert_group.channel
|
|
past_log_report = AlertGroupLogSlackRenderer.render_alert_group_past_log_report_text(alert_group)
|
|
future_log_report = AlertGroupLogSlackRenderer.render_alert_group_future_log_report_text(alert_group)
|
|
blocks: typing.List[Block.Section] = []
|
|
if past_log_report:
|
|
blocks.append(
|
|
{"type": "section", "text": {"type": "mrkdwn", "text": past_log_report[:BLOCK_SECTION_TEXT_MAX_SIZE]}}
|
|
)
|
|
if future_log_report:
|
|
blocks.append(
|
|
{"type": "section", "text": {"type": "mrkdwn", "text": future_log_report[:BLOCK_SECTION_TEXT_MAX_SIZE]}}
|
|
)
|
|
|
|
view: ModalView = {
|
|
"blocks": blocks,
|
|
"type": "modal",
|
|
"title": {
|
|
"type": "plain_text",
|
|
"text": "Alert group log",
|
|
},
|
|
"private_metadata": make_private_metadata(private_metadata, alert_receive_channel.organization),
|
|
}
|
|
|
|
self._slack_client.views_open(trigger_id=payload["trigger_id"], view=view)
|
|
|
|
|
|
STEPS_ROUTING: ScenarioRoute.RoutingSteps = [
|
|
{
|
|
"payload_type": PayloadType.INTERACTIVE_MESSAGE,
|
|
"action_type": InteractiveMessageActionType.BUTTON,
|
|
"action_name": OpenAlertGroupTimelineDialogStep.routing_uid(),
|
|
"step": OpenAlertGroupTimelineDialogStep,
|
|
},
|
|
{
|
|
"payload_type": PayloadType.BLOCK_ACTIONS,
|
|
"block_action_type": BlockActionType.BUTTON,
|
|
"block_action_id": OpenAlertGroupTimelineDialogStep.routing_uid(),
|
|
"step": OpenAlertGroupTimelineDialogStep,
|
|
},
|
|
]
|