242 lines
6.7 KiB
Python
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": "수정일시",
|
|
}
|