Files
gyber/apps/web/gyber/db/group.py
2025-09-15 13:33:34 +09:00

133 lines
6.4 KiB
Python

# /data/gyber/apps/web/gyber/db/group.py
import logging
from django.db import connections, DatabaseError, InterfaceError, OperationalError
from .base import execute_procedure, dictfetchall
logger = logging.getLogger(__name__)
# --- 그룹(Group/부서) 관련 함수 ---
def get_all_groups():
"""모든 그룹(부서) 목록을 이름순으로 조회합니다."""
return execute_procedure('sp_get_all_groups', fetch_mode='all_dicts')
def get_group_by_id(group_id):
"""특정 그룹(부서) ID로 상세 정보를 조회합니다 (관리자 정보 포함)."""
logger.debug(f"Calling sp_get_group_by_id with group_id: {group_id}")
result = execute_procedure('sp_get_group_by_id', [group_id], fetch_mode='one_dict')
if not result:
logger.warning(f"sp_get_group_by_id did not find group with ID: {group_id}")
return result
def add_new_group(admin_user_id, actor_description, group_name, manager_user_id):
"""
새로운 그룹(부서)을 추가합니다.
프로시저: sp_add_group (OUT: p_new_group_id(index 4), p_result_message(index 5))
Returns:
tuple: (success: bool, message: str, new_group_id: int|None)
"""
params = [
admin_user_id, actor_description, group_name, manager_user_id,
None, # OUT p_new_group_id placeholder
None # OUT p_result_message placeholder
]
call_params = params[:-2]
logger.debug(f"Calling sp_add_group with params (excluding OUT): {call_params}")
try:
with connections['default'].cursor() as cursor:
cursor.callproc('sp_add_group', params)
# OUT 파라미터 가져오기
cursor.execute("SELECT @_sp_add_group_4, @_sp_add_group_5;")
result = cursor.fetchone()
if result:
new_group_id = result[0]
message = result[1]
if message and message.endswith('추가 완료.') and new_group_id is not None:
logger.info(f"sp_add_group succeeded: {message} (New ID: {new_group_id})")
return True, message, new_group_id
else:
logger.warning(f"sp_add_group reported an issue: {message} (New ID: {new_group_id})")
return False, message if message else "그룹 추가 실패", None
else:
logger.error("Failed to retrieve OUT parameters from sp_add_group.")
return False, "프로시저 결과(OUT 파라미터)를 가져오는데 실패했습니다.", None
except (DatabaseError, InterfaceError, OperationalError) as e:
logger.error(f"Database error calling sp_add_group: {e}", exc_info=True)
return False, f"데이터베이스 오류: {e}", None
except Exception as e:
logger.error(f"Unexpected error calling sp_add_group: {e}", exc_info=True)
return False, f"알 수 없는 오류: {e}", None
def update_group(admin_user_id, actor_description, group_id, group_name, manager_user_id):
"""
그룹(부서) 정보를 수정합니다.
프로시저: sp_update_group (OUT: p_result_message - index 5)
Returns:
tuple: (success: bool, message: str)
"""
params = [
admin_user_id, actor_description, group_id, group_name, manager_user_id,
None # OUT p_result_message placeholder
]
call_params = params[:-1]
logger.debug(f"Calling sp_update_group for group_id {group_id} with params (excluding OUT): {call_params}")
try:
with connections['default'].cursor() as cursor:
cursor.callproc('sp_update_group', params)
# OUT 파라미터 가져오기
cursor.execute("SELECT @_sp_update_group_5;")
result = cursor.fetchone()
if result:
message = result[0]
if message and message.endswith('정보 수정 완료.'):
logger.info(f"sp_update_group succeeded: {message}")
return True, message
else:
logger.warning(f"sp_update_group reported an issue: {message}")
return False, message if message else "그룹 수정 실패"
else:
logger.error("Failed to retrieve OUT parameter from sp_update_group.")
return False, "프로시저 결과(OUT 파라미터)를 가져오는데 실패했습니다."
except (DatabaseError, InterfaceError, OperationalError) as e:
logger.error(f"Database error calling sp_update_group: {e}", exc_info=True)
return False, f"데이터베이스 오류: {e}"
except Exception as e:
logger.error(f"Unexpected error calling sp_update_group: {e}", exc_info=True)
return False, f"알 수 없는 오류: {e}"
def delete_group(admin_user_id, actor_description, group_id):
"""
그룹(부서)을 삭제합니다.
프로시저: sp_delete_group (OUT: p_result_message - index 3)
Returns:
tuple: (success: bool, message: str)
"""
params = [
admin_user_id, actor_description, group_id,
None # OUT p_result_message placeholder
]
call_params = params[:-1]
logger.debug(f"Calling sp_delete_group for group_id {group_id} with params (excluding OUT): {call_params}")
try:
with connections['default'].cursor() as cursor:
cursor.callproc('sp_delete_group', params)
# OUT 파라미터 가져오기
cursor.execute("SELECT @_sp_delete_group_3;")
result = cursor.fetchone()
if result:
message = result[0]
if message and message.endswith('삭제 완료.'):
logger.info(f"sp_delete_group succeeded: {message}")
return True, message
else: # 멤버 존재 등
logger.warning(f"sp_delete_group reported an issue: {message}")
return False, message if message else "그룹 삭제 실패"
else:
logger.error("Failed to retrieve OUT parameter from sp_delete_group.")
return False, "프로시저 결과(OUT 파라미터)를 가져오는데 실패했습니다."
except (DatabaseError, InterfaceError, OperationalError) as e:
logger.error(f"Database error calling sp_delete_group: {e}", exc_info=True)
return False, f"데이터베이스 오류: {e}"
except Exception as e:
logger.error(f"Unexpected error calling sp_delete_group: {e}", exc_info=True)
return False, f"알 수 없는 오류: {e}"