import logging from django.utils.translation import gettext as _ from django.utils import timezone from django.db import transaction from rest_framework.response import Response from rest_framework.permissions import IsAdminUser from pingcap_sso.api.base import AdminEndpoint from pingcap_sso.api.endpoints.admin.serializers.blog import BlogTagSerializer from pingcap_sso.models import AskTUGSiteConfig from pingcap_sso.api.permissions import MethodPermission from pingcap_sso.forms.admin_blog import BlogUserRoleForm logger = logging.getLogger(__name__) class SiteConfigEndpoint(AdminEndpoint): permission_classes = (IsAdminUser, MethodPermission) perms_map = { 'GET': ['pingcap_sso.view_asktugsiteconfig'], 'PUT': ['pingcap_sso.change_asktugsiteconfig'] } def get(self, request, *args, **kwargs): data = {} for item in AskTUGSiteConfig.objects.all(): data[item.name] = item.typed_value return Response({ 'detail': _('success'), 'data': data }) def put(self, request, *args, **kwargs): names = [str(name) for name in request.data.keys()] if not names: return Response({ 'detail': _('success'), }) existing_items = { item.name: item for item in AskTUGSiteConfig.objects.filter(name__in=names) } to_create = [] to_update = [] now = timezone.now() try: for name in names: value = request.data.get(name) if name in existing_items: item = existing_items[name] item.set_value(value) item.updated_at = now to_update.append(item) else: item = AskTUGSiteConfig(name=name) item.set_value(value) to_create.append(item) except Exception as exc: return Response({ 'detail': _('invalid payload'), 'error': str(exc), }, status=400) with transaction.atomic(): if to_create: AskTUGSiteConfig.objects.bulk_create(to_create) if to_update: AskTUGSiteConfig.objects.bulk_update(to_update, ['value', 'updated_at']) return Response({ 'detail': _('success'), })