## Which issue(s) this PR closes https://www.loom.com/share/e1858db48e8b4fa99014a997af5e3d5e Closes https://github.com/grafana/irm/issues/322 ## 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. --------- Co-authored-by: Vadim Stepanov <vadimkerr@gmail.com>
52 lines
2.2 KiB
Python
52 lines
2.2 KiB
Python
from rest_framework import status
|
|
from rest_framework.permissions import IsAuthenticated
|
|
from rest_framework.response import Response
|
|
from rest_framework.views import APIView
|
|
|
|
from apps.alerts.paging import DirectPagingAlertGroupResolvedError, DirectPagingUserTeamValidationError, direct_paging
|
|
from apps.api.permissions import RBACPermission
|
|
from apps.api.serializers.direct_paging import DirectPagingSerializer
|
|
from apps.auth_token.auth import PluginAuthentication
|
|
from apps.mobile_app.auth import MobileAppAuthTokenAuthentication
|
|
from common.api_helpers.exceptions import BadRequest
|
|
|
|
|
|
class DirectPagingAPIView(APIView):
|
|
authentication_classes = (
|
|
MobileAppAuthTokenAuthentication,
|
|
PluginAuthentication,
|
|
)
|
|
permission_classes = (IsAuthenticated, RBACPermission)
|
|
|
|
rbac_permissions = {
|
|
"post": [RBACPermission.Permissions.ALERT_GROUPS_DIRECT_PAGING],
|
|
}
|
|
|
|
def post(self, request):
|
|
organization = request.auth.organization
|
|
|
|
serializer = DirectPagingSerializer(
|
|
data=request.data, context={"organization": organization, "request": request}
|
|
)
|
|
serializer.is_valid(raise_exception=True)
|
|
validated_data = serializer.validated_data
|
|
|
|
try:
|
|
alert_group = direct_paging(
|
|
organization=organization,
|
|
from_user=request.user,
|
|
message=validated_data["message"],
|
|
title=validated_data["title"],
|
|
source_url=validated_data["source_url"],
|
|
grafana_incident_id=validated_data["grafana_incident_id"],
|
|
team=validated_data["team"],
|
|
important_team_escalation=validated_data["important_team_escalation"],
|
|
users=[(user["instance"], user["important"]) for user in validated_data["users"]],
|
|
alert_group=validated_data["alert_group"],
|
|
)
|
|
except DirectPagingAlertGroupResolvedError:
|
|
raise BadRequest(detail=DirectPagingAlertGroupResolvedError.DETAIL)
|
|
except DirectPagingUserTeamValidationError:
|
|
raise BadRequest(detail=DirectPagingUserTeamValidationError.DETAIL)
|
|
|
|
return Response(data={"alert_group_id": alert_group.public_primary_key}, status=status.HTTP_200_OK)
|