Related to https://github.com/grafana/oncall/issues/96 --------- Co-authored-by: Ravishankar <ravishankar.gnanaprakasam@gmail.com>
133 lines
4.9 KiB
Python
133 lines
4.9 KiB
Python
from dataclasses import asdict
|
|
|
|
from rest_framework import serializers
|
|
|
|
from apps.api.serializers.slack_channel import SlackChannelSerializer
|
|
from apps.base.messaging import get_messaging_backend_from_id
|
|
from apps.base.models import LiveSetting
|
|
from apps.phone_notifications.phone_provider import get_phone_provider
|
|
from apps.slack.models import SlackTeamIdentity
|
|
from apps.user_management.models import Organization
|
|
from common.api_helpers.mixins import EagerLoadingMixin
|
|
|
|
|
|
class FastSlackTeamIdentitySerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = SlackTeamIdentity
|
|
fields = ["cached_name", "needs_reinstall"]
|
|
|
|
|
|
class OrganizationSerializer(EagerLoadingMixin, serializers.ModelSerializer):
|
|
pk = serializers.CharField(read_only=True, source="public_primary_key")
|
|
slack_team_identity = FastSlackTeamIdentitySerializer(read_only=True)
|
|
|
|
name = serializers.CharField(required=False, allow_null=True, allow_blank=True, source="org_title")
|
|
slack_channel = SlackChannelSerializer(read_only=True, source="default_slack_channel")
|
|
|
|
rbac_enabled = serializers.BooleanField(read_only=True, source="is_rbac_permissions_enabled")
|
|
grafana_incident_enabled = serializers.BooleanField(read_only=True, source="is_grafana_incident_enabled")
|
|
grafana_irm_enabled = serializers.BooleanField(read_only=True, source="is_grafana_irm_enabled")
|
|
|
|
SELECT_RELATED = ["slack_team_identity", "slack_channel"]
|
|
|
|
class Meta:
|
|
model = Organization
|
|
fields = [
|
|
"pk",
|
|
"name",
|
|
"stack_slug",
|
|
"slack_team_identity",
|
|
"slack_channel",
|
|
"rbac_enabled",
|
|
"grafana_incident_enabled",
|
|
"grafana_irm_enabled",
|
|
"direct_paging_prefer_important_policy",
|
|
]
|
|
read_only_fields = [
|
|
"stack_slug",
|
|
"slack_team_identity",
|
|
"rbac_enabled",
|
|
"grafana_incident_enabled",
|
|
"grafana_irm_enabled",
|
|
]
|
|
|
|
|
|
class CurrentOrganizationSerializer(OrganizationSerializer):
|
|
env_status = serializers.SerializerMethodField()
|
|
banner = serializers.SerializerMethodField()
|
|
|
|
class Meta(OrganizationSerializer.Meta):
|
|
fields = [
|
|
*OrganizationSerializer.Meta.fields,
|
|
"is_resolution_note_required",
|
|
"env_status",
|
|
"banner",
|
|
]
|
|
read_only_fields = [
|
|
*OrganizationSerializer.Meta.read_only_fields,
|
|
"banner",
|
|
]
|
|
|
|
def get_banner(self, obj):
|
|
from apps.base.models import DynamicSetting
|
|
|
|
banner = DynamicSetting.objects.get_or_create(
|
|
name="banner",
|
|
defaults={"json_value": {"title": None, "body": None}},
|
|
)[0]
|
|
return banner.json_value
|
|
|
|
def get_env_status(self, obj):
|
|
# deprecated in favour of ConfigAPIView.
|
|
# All new env statuses should be added there
|
|
LiveSetting.populate_settings_if_needed()
|
|
|
|
telegram_configured = not LiveSetting.objects.filter(name__startswith="TELEGRAM", error__isnull=False).exists()
|
|
phone_provider_config = get_phone_provider().flags
|
|
mattermost_configured = not LiveSetting.objects.filter(
|
|
name__startswith="MATTERMOST", error__isnull=False
|
|
).exists()
|
|
return {
|
|
"telegram_configured": telegram_configured,
|
|
"phone_provider": asdict(phone_provider_config),
|
|
"mattermost_configured": mattermost_configured,
|
|
}
|
|
|
|
|
|
class FastOrganizationSerializer(serializers.ModelSerializer):
|
|
pk = serializers.CharField(read_only=True, source="public_primary_key")
|
|
name = serializers.CharField(read_only=True, source="org_title")
|
|
|
|
class Meta:
|
|
model = Organization
|
|
fields = ["pk", "name"]
|
|
|
|
|
|
class CurrentOrganizationConfigChecksSerializer(serializers.ModelSerializer):
|
|
is_chatops_connected = serializers.SerializerMethodField()
|
|
is_integration_chatops_connected = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = Organization
|
|
fields = [
|
|
"is_chatops_connected",
|
|
"is_integration_chatops_connected",
|
|
]
|
|
|
|
def get_is_chatops_connected(self, obj):
|
|
msteams_backend = get_messaging_backend_from_id("MSTEAMS")
|
|
return bool(
|
|
obj.slack_team_identity_id is not None # slack is connected
|
|
or obj.telegram_channel.exists() # telegram is connected
|
|
or (msteams_backend and msteams_backend.is_configured_for_organization(obj)) # msteams is connected
|
|
)
|
|
|
|
def get_is_integration_chatops_connected(self, obj):
|
|
return (
|
|
(
|
|
obj.slack_team_identity_id is not None
|
|
and obj.alert_receive_channels.filter(channel_filters__notify_in_slack=True).exists()
|
|
)
|
|
or obj.alert_receive_channels.filter(channel_filters__notify_in_telegram=True).exists()
|
|
or obj.alert_receive_channels.filter(channel_filters__notification_backends__MSTEAMS__enabled=True).exists()
|
|
)
|