import logging from django.utils.translation import gettext as _ from rest_framework.response import Response from rest_framework.permissions import IsAdminUser from pingcap_sso.api.base import AdminEndpoint from pingcap_sso.api.permissions import MethodPermission from pingcap_sso.models import ( SiteSettingDB, SiteSetting, MetaSiteSetting ) logger = logging.getLogger(__name__) class SettingEndpoint(AdminEndpoint): permission_classes = (IsAdminUser, MethodPermission) perms_map = { 'GET': ['pingcap_sso.view_sitesettingdb'], 'PUT': ['pingcap_sso.change_sitesettingdb'] } def get(self, request, *args, **kwargs): """audit_log: 查看了站点设置""" registered_settings = MetaSiteSetting.REGISTERED_SETTINGS data = {} for name, data_type in registered_settings.items(): value = getattr(SiteSetting, name) try: _db_instance = SiteSettingDB.objects.get(name=name, data_type=data_type) if not _db_instance.display_at_admin_frontend: continue except SiteSettingDB.DoesNotExist: logger.error('SiteSetting({}) not exists'.format(name)) data[name] = { 'name': name, 'value': self._encode_as_html_display(value, data_type), 'data_type': data_type } return Response({ 'detail': _('success'), 'data': data }) def _encode_as_html_display(self, value, data_type): if data_type == SiteSettingDB.TYPE_STR_LIST: return '\n'.join(value) else: return value def put(self, request, *args, **kwargs): """audit_log: 修改了站点设置""" setting_name = request.data['name'] setting_value = request.data['value'] data_type = MetaSiteSetting.REGISTERED_SETTINGS[setting_name] if data_type == SiteSettingDB.TYPE_STR_LIST: setting_value = list(map(lambda x: x.strip(), ( filter(lambda x: x, setting_value.split('\n'))))) elif data_type == SiteSettingDB.TYPE_STR: pass elif data_type == SiteSettingDB.TYPE_INTEGER: setting_value = int(setting_value) else: raise Exception('Unsupported') setattr(SiteSetting, setting_name, setting_value) return Response({ 'detail': _('success') })