oncall-engine/engine/apps/api/serializers/alert_group_table_settings.py
Yulya Artyukhina 8ade7d65e8
Fix alert group columns validation (#3577)
# What this PR does
Fix alert group columns validation: - validate column ids by each type
separately
## Which issue(s) this PR fixes
validation check from this issue -
https://github.com/grafana/oncall-private/issues/2378
## 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] `CHANGELOG.md` updated (or `pr:no changelog` PR label added if not
required)
2023-12-15 17:15:50 +00:00

65 lines
2.7 KiB
Python

from rest_framework import serializers
from rest_framework.exceptions import ValidationError
from apps.user_management.constants import (
AlertGroupTableColumnTypeChoices,
AlertGroupTableDefaultColumnChoices,
default_columns,
)
class AlertGroupTableColumnSerializer(serializers.Serializer):
name = serializers.CharField(max_length=200)
id = serializers.CharField(max_length=200)
type = serializers.ChoiceField(choices=AlertGroupTableColumnTypeChoices.choices)
def validate(self, data):
self._validate_id(data)
return data
def _validate_id(self, data):
"""Validate if `id` of column with `default` type is in the list of available default columns"""
if (
data["type"] == AlertGroupTableColumnTypeChoices.DEFAULT.value
and data["id"] not in AlertGroupTableDefaultColumnChoices.values
):
raise ValidationError("Invalid column id format")
class AlertGroupTableColumnsOrganizationSerializer(serializers.Serializer):
visible = AlertGroupTableColumnSerializer(many=True)
hidden = AlertGroupTableColumnSerializer(many=True)
def validate(self, data):
"""
Validate that at least one column is selected as visible and that all default columns are in the list.
"""
request_columns_by_type = {}
for column in data["visible"] + data["hidden"]:
request_columns_by_type.setdefault(column["type"], []).append(column["id"])
if len(data["visible"]) == 0:
raise ValidationError("At least one column should be selected as visible")
elif not (
set(request_columns_by_type[AlertGroupTableColumnTypeChoices.DEFAULT])
== set(AlertGroupTableDefaultColumnChoices.values)
):
raise ValidationError("Default column cannot be removed")
for columns_ids in request_columns_by_type.values():
if len(columns_ids) > len(set(columns_ids)):
raise ValidationError("Duplicate column")
return data
class AlertGroupTableColumnsUserSerializer(AlertGroupTableColumnsOrganizationSerializer):
def validate(self, data):
"""
Validate that all columns exist in organization alert group table columns list.
"""
data = super().validate(data)
columns = data["visible"] + data["hidden"]
request_columns_ids = [column["id"] for column in columns]
organization_columns = self.context["request"].auth.organization.alert_group_table_columns or default_columns()
organization_columns_ids = [column["id"] for column in organization_columns]
if set(organization_columns_ids) != set(request_columns_ids):
raise ValidationError("Invalid settings")
return data