60 lines
1.8 KiB
Python
60 lines
1.8 KiB
Python
from pathlib import Path
|
|
|
|
from fastapi import FastAPI
|
|
from sqladmin import Admin
|
|
from sqladmin.authentication import login_required
|
|
from starlette.requests import Request
|
|
from starlette.responses import Response
|
|
from sqlalchemy.ext.asyncio import AsyncEngine
|
|
|
|
from app.backoffice.admin.admin_view import AdminAdmin
|
|
from app.backoffice.admin.auth import AdminAuthBackend
|
|
from app.backoffice.credit_view import CreditChargeRequestAdmin, CreditTransactionAdmin
|
|
from app.backoffice.dashboard import get_dashboard_context
|
|
from app.user.api.user_admin import SocialAccountAdmin, UserAdmin
|
|
from config import prj_settings
|
|
|
|
TEMPLATES_DIR = Path(__file__).parent / "backoffice" / "frontend" / "templates"
|
|
|
|
|
|
class DashboardAdmin(Admin):
|
|
@login_required
|
|
async def index(self, request: Request) -> Response:
|
|
ctx = await get_dashboard_context()
|
|
admin_role = request.session.get("admin_role", "viewer")
|
|
return await self.templates.TemplateResponse(
|
|
request,
|
|
"sqladmin/index.html",
|
|
{"title": "대시보드", "subtitle": "", "admin_role": admin_role, **ctx},
|
|
)
|
|
|
|
|
|
def init_admin(
|
|
app: FastAPI,
|
|
db_engine: AsyncEngine,
|
|
base_url: str = prj_settings.ADMIN_BASE_URL,
|
|
) -> Admin:
|
|
auth_backend = AdminAuthBackend(secret_key=prj_settings.ADMIN_SESSION_SECRET)
|
|
|
|
admin = DashboardAdmin(
|
|
app,
|
|
db_engine,
|
|
base_url=base_url,
|
|
authentication_backend=auth_backend,
|
|
title="ADO2 관리자",
|
|
templates_dir=str(TEMPLATES_DIR),
|
|
)
|
|
|
|
# 사용자 관리
|
|
admin.add_view(UserAdmin)
|
|
admin.add_view(SocialAccountAdmin)
|
|
|
|
# 크레딧 관리 (superadmin: 전체, viewer: 읽기 전용)
|
|
admin.add_view(CreditChargeRequestAdmin)
|
|
admin.add_view(CreditTransactionAdmin)
|
|
|
|
# 백오피스 설정
|
|
admin.add_view(AdminAdmin)
|
|
|
|
return admin
|