v0.0.29 | 사이트 설정(SiteSettings) 모델 및 API 추가
All checks were successful
Build And Test / build-and-push (push) Successful in 2m1s

- Google 로그인 활성화 여부 관리 기능
- 관리자 전용 설정 수정 API
- 싱글톤 패턴으로 구현

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-18 23:39:23 +09:00
parent 96615e4b94
commit 03f7ad94a9
5 changed files with 138 additions and 2 deletions

View File

@ -12,7 +12,7 @@ from django.conf import settings
from google.oauth2 import id_token
from google.auth.transport import requests as google_requests
from .serializers import RegisterSerializer, CustomTokenObtainPairSerializer, UserListSerializer, KVMServerSerializer
from .models import CustomUser, NHNCloudProject, KVMServer
from .models import CustomUser, NHNCloudProject, KVMServer, SiteSettings
logger = logging.getLogger(__name__)
tracer = trace.get_tracer(__name__) # ✅ 트레이서 생성
@ -1426,3 +1426,68 @@ class GoogleUnlinkView(APIView):
"message": "Google 계정 연동이 해제되었습니다.",
"social_provider": None,
}, status=status.HTTP_200_OK)
# ============================================
# 사이트 설정 API
# ============================================
class IsAdmin(BasePermission):
"""admin 등급만 접근 가능"""
def has_permission(self, request, view):
if not request.user or not request.user.is_authenticated:
return False
return request.user.grade == 'admin'
class SiteSettingsView(APIView):
"""
사이트 설정 조회/수정 (관리자 전용)
"""
def get_permissions(self):
# GET은 인증된 사용자면 누구나 가능 (설정 조회)
# PUT/PATCH는 관리자만 가능 (설정 변경)
if self.request.method in ['PUT', 'PATCH']:
return [IsAuthenticated(), IsAdmin()]
return [] # GET은 누구나 가능 (비로그인 포함)
def get(self, request):
"""사이트 설정 조회 (공개)"""
with tracer.start_as_current_span("SiteSettingsView GET") as span:
settings_obj = SiteSettings.get_settings()
span.add_event("Site settings retrieved")
return Response({
"google_login_enabled": settings_obj.google_login_enabled,
"updated_at": settings_obj.updated_at.isoformat() if settings_obj.updated_at else None,
})
def patch(self, request):
"""사이트 설정 수정 (관리자 전용)"""
with tracer.start_as_current_span("SiteSettingsView PATCH") as span:
email, ip, ua = get_request_info(request)
settings_obj = SiteSettings.get_settings()
# 업데이트할 필드 처리
updated_fields = []
if 'google_login_enabled' in request.data:
settings_obj.google_login_enabled = request.data['google_login_enabled']
updated_fields.append('google_login_enabled')
if updated_fields:
settings_obj.save()
logger.info(
f"[SITE SETTINGS UPDATE] admin={email} | fields={updated_fields} | IP={ip} | UA={ua}"
)
span.add_event("Site settings updated", attributes={
"admin": email,
"fields": str(updated_fields)
})
return Response({
"message": "설정이 저장되었습니다.",
"google_login_enabled": settings_obj.google_login_enabled,
"updated_at": settings_obj.updated_at.isoformat() if settings_obj.updated_at else None,
})