70 lines
3.9 KiB
Python
70 lines
3.9 KiB
Python
# /data/gyber/apps/web/gyber/context_processors.py
|
|
|
|
from .auth_utils import is_admin_user, is_viewer_user, dashboard_only_user
|
|
|
|
def theme_processor(request):
|
|
"""
|
|
현재 요청에 적용할 테마 (dark 또는 light)를 결정하여 템플릿 컨텍스트에 추가합니다.
|
|
1. 쿠키('theme')에 저장된 값이 있으면 그 값을 사용합니다.
|
|
2. 쿠키가 없으면 시스템 환경설정(prefers-color-scheme)을 따릅니다.
|
|
"""
|
|
theme_value = request.COOKIES.get('theme')
|
|
is_dark_theme = False # 기본값은 라이트 테마
|
|
|
|
if theme_value == 'dark':
|
|
is_dark_theme = True
|
|
elif theme_value is None: # 쿠키에 명시적인 설정이 없을 경우
|
|
# HTTP_SEC_CH_PREFERS_COLOR_SCHEME 헤더는 클라이언트 힌트이며, 모든 브라우저/환경에서 항상 제공되지는 않음
|
|
# 또한, 이 헤더는 HTTPS 연결에서만 전송될 수 있음 (request.is_secure() 확인)
|
|
# JavaScript의 window.matchMedia('(prefers-color-scheme: dark)') 가 더 신뢰성 있는 방법이지만,
|
|
# 서버 사이드에서는 한계가 있음.
|
|
# 여기서는 JavaScript에서 localStorage에 저장하고, 필요시 쿠키와 동기화하는 방식을 보완적으로 사용한다고 가정.
|
|
# 또는 초기 로드 시 JavaScript가 data-bs-theme을 설정하는 것을 기본으로 하고,
|
|
# 서버 사이드 렌더링 시 깜빡임 방지를 위해 이 컨텍스트 프로세서를 보조적으로 사용.
|
|
# 아래 로직은 base.html의 JS 로직과 유사하게 맞춤.
|
|
if request.is_secure: # HTTPS 연결일 때만 클라이언트 힌트 고려 가능성
|
|
# HTTP_SEC_CH_PREFERS_COLOR_SCHEME 헤더는 request.META에 대문자로, 하이픈은 언더스코어로 변환되어 들어올 수 있음
|
|
# 예: 'HTTP_SEC_CH_PREFERS_COLOR_SCHEME'
|
|
# Django는 일반적으로 request.headers 딕셔너리를 통해 접근하는 것을 권장
|
|
preferred_scheme_header = request.headers.get('Sec-CH-Prefers-Color-Scheme', '').lower()
|
|
if 'dark' in preferred_scheme_header:
|
|
is_dark_theme = True
|
|
# AJAX 요청 여부 조건은 여기서 제외하거나, 특정 목적이 있다면 주석으로 명시
|
|
# if request.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest':
|
|
# pass # AJAX 요청 시에는 테마 관련 로직을 다르게 처리할 수 있음
|
|
|
|
# logger = logging.getLogger('gyber.context_processors') # 필요시 로깅
|
|
# logger.debug(f"Theme processor: cookie='{theme_value}', is_dark_theme={is_dark_theme}")
|
|
|
|
return {'is_dark_theme': is_dark_theme}
|
|
|
|
|
|
def auth_context(request):
|
|
"""
|
|
인증된 사용자의 주요 권한 상태를 컨텍스트에 추가합니다.
|
|
모든 템플릿에서 user.is_authenticated 는 기본적으로 사용 가능합니다.
|
|
여기서는 추가적인 그룹 기반 권한 상태를 제공합니다.
|
|
"""
|
|
user = request.user
|
|
if not user.is_authenticated:
|
|
return {
|
|
'user_is_admin_group_member': False,
|
|
'user_is_viewer_group_member': False, # 예시
|
|
'user_dashboard_only': False, # 예시
|
|
# ... 기타 권한 변수 기본값 ...
|
|
}
|
|
|
|
# auth_utils.py의 함수들을 사용하여 권한 확인
|
|
is_admin = is_admin_user(user)
|
|
is_viewer = is_viewer_user(user) # 예시, 실제 사용하는 함수로 대체
|
|
dashboard_only = dashboard_only_user(user) # 예시, 실제 사용하는 함수로 대체
|
|
|
|
# logger.debug(f"Auth context for user '{user.username}': is_admin={is_admin}, dashboard_only={dashboard_only}")
|
|
return {
|
|
'user_is_admin_group_member': is_admin,
|
|
'user_is_viewer_group_member': is_viewer,
|
|
'user_dashboard_only': dashboard_only,
|
|
# ... 기타 필요한 권한 관련 변수 ...
|
|
# 'user_is_resource_manager': is_resource_manager(user), # 필요시 추가
|
|
}
|