Related to https://github.com/grafana/oncall-private/issues/2826 RBAC enabled or not (OSS or cloud), it is possible to get service account permissions, enabling perm check (for service account tokens) in public API. Also allow empty value for users in sync (instead of returning a 400 response).
55 lines
2 KiB
Python
55 lines
2 KiB
Python
from rest_framework import serializers
|
|
|
|
from apps.alerts.models import AlertGroup, ResolutionNote
|
|
from common.api_helpers.custom_fields import OrganizationFilteredPrimaryKeyRelatedField, UserIdField
|
|
from common.api_helpers.exceptions import BadRequest
|
|
from common.api_helpers.mixins import EagerLoadingMixin
|
|
|
|
|
|
class ResolutionNoteSerializer(EagerLoadingMixin, serializers.ModelSerializer):
|
|
id = serializers.CharField(read_only=True, source="public_primary_key")
|
|
alert_group_id = OrganizationFilteredPrimaryKeyRelatedField(
|
|
queryset=AlertGroup.objects,
|
|
source="alert_group",
|
|
filter_field="channel__organization",
|
|
)
|
|
text = serializers.CharField(allow_null=False, source="message_text")
|
|
source = serializers.CharField(read_only=True, source="get_source_display")
|
|
author = UserIdField(read_only=True)
|
|
|
|
class Meta:
|
|
model = ResolutionNote
|
|
fields = [
|
|
"id",
|
|
"alert_group_id",
|
|
"author",
|
|
"source",
|
|
"created_at",
|
|
"text",
|
|
]
|
|
read_only_fields = [
|
|
"created_at",
|
|
]
|
|
|
|
SELECT_RELATED = ["alert_group", "resolution_note_slack_message", "author"]
|
|
|
|
def create(self, validated_data):
|
|
user = self.context["request"].user
|
|
if not user.is_service_account and user.pk:
|
|
validated_data["author"] = user
|
|
validated_data["source"] = ResolutionNote.Source.WEB
|
|
return super().create(validated_data)
|
|
|
|
def to_representation(self, instance):
|
|
result = super().to_representation(instance)
|
|
result["text"] = instance.text
|
|
return result
|
|
|
|
|
|
class ResolutionNoteUpdateSerializer(ResolutionNoteSerializer):
|
|
alert_group_id = serializers.CharField(read_only=True, source="alert_group.public_primary_key")
|
|
|
|
def update(self, instance, validated_data):
|
|
if instance.source != ResolutionNote.Source.WEB:
|
|
raise BadRequest(detail="Cannot update message with this source type")
|
|
return super().update(instance, validated_data)
|