jumpserver/apps/settings/serializers/settings.py

107 lines
3.8 KiB
Python

from django.core.cache import cache
from django.utils import translation
from django.utils.translation import gettext_noop, gettext_lazy as _
from rest_framework import serializers
from common.utils import i18n_fmt
from .auth import (
LDAPSettingSerializer, OIDCSettingSerializer, KeycloakSettingSerializer,
CASSettingSerializer, RadiusSettingSerializer, FeiShuSettingSerializer,
LarkSettingSerializer, WeComSettingSerializer, DingTalkSettingSerializer,
AlibabaSMSSettingSerializer, TencentSMSSettingSerializer, CMPP2SMSSettingSerializer,
AuthSettingSerializer, SAML2SettingSerializer, OAuth2SettingSerializer, PasskeySettingSerializer,
CustomSMSSettingSerializer,
)
from .basic import BasicSettingSerializer
from .cleaning import CleaningSerializer
from .feature import (
AnnouncementSettingSerializer, OpsSettingSerializer, VaultSettingSerializer,
TicketSettingSerializer, ChatAISettingSerializer, VirtualAppSerializer
)
from .msg import EmailSettingSerializer, EmailContentSettingSerializer
from .other import OtherSettingSerializer
from .security import SecuritySettingSerializer
from .terminal import TerminalSettingSerializer
__all__ = [
'BaseSerializerWithFieldLabel',
'SettingsSerializer',
]
class BaseSerializerWithFieldLabel:
CACHE_KEY: str
ignore_iter_fields = True
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.fields_label_mapping = None
def extract_fields(self, serializer):
fields = {}
for field_name, field in serializer.get_fields().items():
if isinstance(field, serializers.Serializer):
fields.update(self.extract_fields(field))
else:
fields.update({field_name: field})
return fields
def get_field_label(self, field_name):
self.fields_label_mapping = cache.get(self.CACHE_KEY, None)
if self.fields_label_mapping is None:
self.fields_label_mapping = {}
with translation.override('en'):
cls = self.__class__
base_name = getattr(cls, 'PREFIX_TITLE', cls.__name__)
for subclass in cls.__bases__:
ignore_iter_fields = getattr(subclass, 'ignore_iter_fields', False)
if ignore_iter_fields:
continue
prefix = getattr(subclass, 'PREFIX_TITLE', base_name)
fields = self.extract_fields(subclass())
for name, item in fields.items():
label = getattr(item, 'label', '')
detail = i18n_fmt(gettext_noop('[%s] %s'), prefix, label)
self.fields_label_mapping[name] = detail
cache.set(self.CACHE_KEY, self.fields_label_mapping, 3600 * 24)
return self.fields_label_mapping.get(field_name, field_name)
class SettingsSerializer(
BaseSerializerWithFieldLabel,
BasicSettingSerializer,
LDAPSettingSerializer,
AuthSettingSerializer,
TerminalSettingSerializer,
SecuritySettingSerializer,
WeComSettingSerializer,
DingTalkSettingSerializer,
FeiShuSettingSerializer,
LarkSettingSerializer,
EmailSettingSerializer,
EmailContentSettingSerializer,
OtherSettingSerializer,
OIDCSettingSerializer,
SAML2SettingSerializer,
OAuth2SettingSerializer,
KeycloakSettingSerializer,
CASSettingSerializer,
RadiusSettingSerializer,
CleaningSerializer,
AlibabaSMSSettingSerializer,
TencentSMSSettingSerializer,
CMPP2SMSSettingSerializer,
CustomSMSSettingSerializer,
PasskeySettingSerializer,
ChatAISettingSerializer,
AnnouncementSettingSerializer,
OpsSettingSerializer,
VaultSettingSerializer,
TicketSettingSerializer,
VirtualAppSerializer,
):
PREFIX_TITLE = _('Setting')
CACHE_KEY = 'SETTING_FIELDS_MAPPING'