# What this PR does Add stack slug to /organization endpoint response ## Which issue(s) this PR fixes https://github.com/grafana/oncall-private/issues/2444 ## 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)
106 lines
3.5 KiB
Python
106 lines
3.5 KiB
Python
from dataclasses import asdict
|
|
|
|
from rest_framework import serializers
|
|
|
|
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"]
|
|
|
|
|
|
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 = serializers.SerializerMethodField()
|
|
|
|
rbac_enabled = serializers.BooleanField(read_only=True, source="is_rbac_permissions_enabled")
|
|
|
|
SELECT_RELATED = ["slack_team_identity"]
|
|
|
|
class Meta:
|
|
model = Organization
|
|
fields = [
|
|
"pk",
|
|
"name",
|
|
"stack_slug",
|
|
"slack_team_identity",
|
|
"slack_channel",
|
|
"rbac_enabled",
|
|
]
|
|
read_only_fields = [
|
|
"stack_slug",
|
|
"slack_team_identity",
|
|
"rbac_enabled",
|
|
]
|
|
|
|
def get_slack_channel(self, obj):
|
|
from apps.slack.models import SlackChannel
|
|
|
|
if obj.general_log_channel_id is None or obj.slack_team_identity is None:
|
|
return None
|
|
try:
|
|
channel = obj.slack_team_identity.get_cached_channels().get(slack_id=obj.general_log_channel_id)
|
|
except SlackChannel.DoesNotExist:
|
|
return {"display_name": None, "slack_id": obj.general_log_channel_id, "id": None}
|
|
|
|
return {
|
|
"display_name": channel.name,
|
|
"slack_id": channel.slack_id,
|
|
"id": channel.public_primary_key,
|
|
}
|
|
|
|
|
|
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
|
|
return {
|
|
"telegram_configured": telegram_configured,
|
|
"phone_provider": asdict(phone_provider_config),
|
|
}
|
|
|
|
|
|
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"]
|