o2o-castad-backend/app/user/api/user_admin.py

242 lines
6.7 KiB
Python

import logging
from sqladmin import ModelView, action
from starlette.requests import Request
from starlette.responses import RedirectResponse
from app.backoffice.mixins import SuperAdminEditable, ViewerAccessible
from app.backoffice.user_view_actions import (
handle_block_users,
handle_deduct_credits,
handle_grant_credits,
)
from app.user.models import SocialAccount, User
logger = logging.getLogger(__name__)
class UserAdmin(SuperAdminEditable, ModelView, model=User):
name = "사용자"
name_plural = "사용자 목록"
icon = "fa-solid fa-user"
category = "사용자 관리"
page_size = 30
can_edit = True
can_delete = True
column_list = [
"id",
"user_uuid",
"email",
"nickname",
"credits",
"role",
"is_active",
"is_deleted",
"created_at",
]
column_details_list = [
"id",
"user_uuid",
"email",
"nickname",
"profile_image_url",
"thumbnail_image_url",
"phone",
"name",
"birth_date",
"gender",
"credits",
"is_active",
"is_admin",
"role",
"is_deleted",
"deleted_at",
"last_login_at",
"created_at",
"updated_at",
]
form_columns = [
"nickname",
"email",
"phone",
"name",
"birth_date",
"gender",
"credits",
"is_active",
"is_admin",
"role",
"is_deleted",
]
column_searchable_list = [
User.user_uuid,
User.email,
User.nickname,
User.phone,
User.name,
]
column_default_sort = (User.created_at, True)
column_sortable_list = [
User.id,
User.user_uuid,
User.email,
User.nickname,
User.credits,
User.role,
User.is_active,
User.is_deleted,
User.created_at,
]
column_labels = {
"id": "ID",
"user_uuid": "UUID",
"email": "이메일",
"nickname": "닉네임",
"profile_image_url": "프로필 이미지",
"thumbnail_image_url": "썸네일 이미지",
"phone": "전화번호",
"name": "이름",
"birth_date": "생년월일",
"gender": "성별",
"credits": "크레딧",
"is_active": "활성화",
"is_admin": "관리자",
"role": "권한",
"is_deleted": "삭제됨",
"deleted_at": "삭제일시",
"last_login_at": "마지막 로그인",
"created_at": "생성일시",
"updated_at": "수정일시",
}
@action(
name="01_block_user",
label="계정 차단",
confirmation_message="선택한 사용자를 차단하시겠습니까?",
add_in_list=True,
)
async def seq_f_block_user_action(self, request: Request) -> RedirectResponse:
return await handle_block_users(request, self.identity, block=True)
@action(
name="02_unblock_user",
label="차단 해제",
confirmation_message="선택한 사용자의 차단을 해제하시겠습니까?",
add_in_list=True,
)
async def seq_e_unblock_user_action(self, request: Request) -> RedirectResponse:
return await handle_block_users(request, self.identity, block=False)
@action(
name="03_grant_credits_1",
label="크레딧 +1",
confirmation_message="선택한 사용자에게 크레딧 1개를 충전하시겠습니까?",
add_in_list=True,
)
async def seq_d_grant_credits_1_action(self, request: Request) -> RedirectResponse:
admin_id = request.session.get("admin_id")
return await handle_grant_credits(request, self.identity, amount=1, admin_id=admin_id)
@action(
name="04_grant_credits_5",
label="크레딧 +5",
confirmation_message="선택한 사용자에게 크레딧 5개를 충전하시겠습니까?",
add_in_list=True,
)
async def seq_c_grant_credits_5_action(self, request: Request) -> RedirectResponse:
admin_id = request.session.get("admin_id")
return await handle_grant_credits(request, self.identity, amount=5, admin_id=admin_id)
@action(
name="05_grant_credits_10",
label="크레딧 +10",
confirmation_message="선택한 사용자에게 크레딧 10개를 충전하시겠습니까?",
add_in_list=True,
)
async def seq_b_grant_credits_10_action(self, request: Request) -> RedirectResponse:
admin_id = request.session.get("admin_id")
return await handle_grant_credits(request, self.identity, amount=10, admin_id=admin_id)
@action(
name="06_deduct_credits_1",
label="크레딧 -1",
confirmation_message="선택한 사용자의 크레딧 1개를 차감하시겠습니까?",
add_in_list=True,
)
async def seq_a_deduct_credits_1_action(self, request: Request) -> RedirectResponse:
admin_id = request.session.get("admin_id")
return await handle_deduct_credits(request, self.identity, amount=1, admin_id=admin_id)
class SocialAccountAdmin(ViewerAccessible, ModelView, model=SocialAccount):
name = "소셜 계정"
name_plural = "소셜 계정 목록"
icon = "fa-solid fa-share-nodes"
category = "사용자 관리"
page_size = 30
column_list = [
"id",
"user_uuid",
"platform",
"platform_username",
"is_active",
"is_deleted",
"created_at",
]
column_details_list = [
"id",
"user_uuid",
"platform",
"platform_user_id",
"platform_username",
"token_expires_at",
"is_active",
"is_deleted",
"created_at",
"updated_at",
]
form_excluded_columns = ["created_at", "updated_at", "user"]
column_searchable_list = [
SocialAccount.user_uuid,
SocialAccount.platform,
SocialAccount.platform_user_id,
SocialAccount.platform_username,
]
column_default_sort = (SocialAccount.created_at, True)
column_sortable_list = [
SocialAccount.id,
SocialAccount.user_uuid,
SocialAccount.platform,
SocialAccount.is_active,
SocialAccount.is_deleted,
SocialAccount.created_at,
]
column_labels = {
"id": "ID",
"user_uuid": "사용자 UUID",
"platform": "플랫폼",
"platform_user_id": "플랫폼 사용자 ID",
"platform_username": "플랫폼 사용자명",
"platform_data": "플랫폼 데이터",
"scope": "권한 범위",
"token_expires_at": "토큰 만료일시",
"is_active": "활성화",
"is_deleted": "삭제됨",
"created_at": "생성일시",
"updated_at": "수정일시",
}