diff --git a/app/admin_manager.py b/app/admin_manager.py index 670eb13..87979a5 100644 --- a/app/admin_manager.py +++ b/app/admin_manager.py @@ -3,6 +3,7 @@ from pathlib import Path from fastapi import FastAPI from sqladmin import Admin from sqladmin.authentication import login_required +from starlette.exceptions import HTTPException from starlette.requests import Request from starlette.responses import Response from sqlalchemy.ext.asyncio import AsyncEngine @@ -28,6 +29,24 @@ class DashboardAdmin(Admin): {"title": "대시보드", "subtitle": "", "admin_role": admin_role, **ctx}, ) + @login_required + async def edit(self, request: Request) -> Response: + if request.session.get("admin_role") == "viewer": + raise HTTPException(status_code=403) + return await super().edit(request) + + @login_required + async def create(self, request: Request) -> Response: + if request.session.get("admin_role") == "viewer": + raise HTTPException(status_code=403) + return await super().create(request) + + @login_required + async def delete(self, request: Request) -> Response: + if request.session.get("admin_role") == "viewer": + raise HTTPException(status_code=403) + return await super().delete(request) + def init_admin( app: FastAPI, diff --git a/app/backoffice/admin/admin_view.py b/app/backoffice/admin/admin_view.py index 7ab56b0..cf7ceac 100644 --- a/app/backoffice/admin/admin_view.py +++ b/app/backoffice/admin/admin_view.py @@ -43,7 +43,7 @@ class AdminAdmin(SuperAdminOnly, ModelView, model=Admin): form_args = { "role": { "label": "권한", - "choices": [("superadmin", "전체 관리자"), ("viewer", "조회 전용")], + "choices": [("superadmin", "전체 관리자"), ("viewer", "일반 관리자")], "default": "viewer", } } diff --git a/app/backoffice/admin/auth.py b/app/backoffice/admin/auth.py index 7c55642..6296b36 100644 --- a/app/backoffice/admin/auth.py +++ b/app/backoffice/admin/auth.py @@ -36,6 +36,7 @@ class AdminAuthBackend(AuthenticationBackend): request.session["admin_id"] = admin.id request.session["admin_role"] = admin.role + request.session["admin_name"] = admin.name or admin.username logger.info(f"[ADMIN-AUTH] login success admin_id={admin.id} username={username} role={admin.role}") # 마지막 로그인 시간 갱신 diff --git a/app/backoffice/credit_view.py b/app/backoffice/credit_view.py index 026426c..295d048 100644 --- a/app/backoffice/credit_view.py +++ b/app/backoffice/credit_view.py @@ -21,6 +21,8 @@ class CreditChargeRequestAdmin(SuperAdminEditable, ModelView, model=CreditCharge icon = "fa-solid fa-coins" category = "크레딧 관리" page_size = 30 + can_edit = True + can_delete = False column_list = [ "id", diff --git a/app/backoffice/frontend/templates/sqladmin/details.html b/app/backoffice/frontend/templates/sqladmin/details.html new file mode 100644 index 0000000..612b7ae --- /dev/null +++ b/app/backoffice/frontend/templates/sqladmin/details.html @@ -0,0 +1,106 @@ +{% extends "sqladmin/layout.html" %} +{% block content %} +
| Column | +Value | +||
|---|---|---|---|
| {{ label }} | + {% set value, formatted_value = model_view.get_detail_value(model, name) %} + {% if name in model_view._relation_names %} + {% if is_list( value ) %} +
+ {% for elem, formatted_elem in zip(value, formatted_value) %}
+ {% if model_view.show_compact_lists %}
+ ({{ formatted_elem }})
+ {% else %}
+ {{ formatted_elem }} + {% endif %} + {% endfor %} + |
+ {% else %}
+ {{ formatted_value }} + | + {% endif %} + {% else %} +{{ formatted_value }} | + {% endif %} +
| + | + {% for name in model_view._list_prop_names %} + {% set label = model_view._column_labels.get(name, name) %} + | + {% if name in model_view._sort_fields %} + {% if request.query_params.get("sortBy") == name and request.query_params.get("sort") == "asc" %} + {{ + label }} + {% elif request.query_params.get("sortBy") == name and request.query_params.get("sort") == "desc" %} + {{ label + }} + {% else %} + {{ label }} + {% endif %} + {% else %} + {{ label }} + {% endif %} + | + {% endfor %} +||
|---|---|---|---|---|
| + + + | ++ {% if model_view.can_view_details %} + + + + {% endif %} + {% if model_view.can_edit and request.session.get('admin_role') == 'superadmin' %} + + + + {% endif %} + {% if model_view.can_delete and request.session.get('admin_role') == 'superadmin' %} + + + + {% endif %} + | + {% for name in model_view._list_prop_names %} + {% set value, formatted_value = model_view.get_list_value(row, name) %} + {% if name in model_view._relation_names %} + {% if is_list( value ) %} +
+ {% for elem, formatted_elem in zip(value, formatted_value) %}
+ {% if model_view.show_compact_lists %}
+ ({{ formatted_elem }})
+ {% else %}
+ {{ formatted_elem }} + {% endif %} + {% endfor %} + |
+ {% else %}
+ {{ formatted_value }} | + {% endif %} + {% else %} +{{ formatted_value }} | + {% endif %} + {% endfor %} +