handOver2/utils/validators.py

222 lines
4.7 KiB
Python

# -*- coding: utf-8 -*-
"""
유효성 검사 모듈
다양한 입력 유효성 검사 함수를 제공합니다.
"""
import re
from datetime import date, time
from typing import Optional
from core.logger import get_logger
logger = get_logger(__name__)
def is_valid_train_number(train_number: str) -> bool:
"""
편성번호 유효성 검사
Args:
train_number: 편성번호 (예: "001", "123")
Returns:
유효 여부
"""
if not train_number:
return False
# 숫자로만 구성되고 1-3자리
pattern = r"^\d{1,3}$"
return bool(re.match(pattern, train_number))
def is_valid_car_number(car_number: str) -> bool:
"""
호차 유효성 검사
Args:
car_number: 호차 (예: "1", "10")
Returns:
유효 여부
"""
if not car_number:
return False
try:
num = int(car_number)
return 1 <= num <= 10 # 보통 1~10호차
except ValueError:
return False
def is_valid_date_string(date_str: str) -> bool:
"""
날짜 문자열 유효성 검사
Args:
date_str: 날짜 문자열 (YYYY-MM-DD)
Returns:
유효 여부
"""
if not date_str:
return False
pattern = r"^\d{4}-\d{2}-\d{2}$"
if not re.match(pattern, date_str):
return False
try:
year, month, day = map(int, date_str.split('-'))
date(year, month, day)
return True
except ValueError:
return False
def is_valid_time_string(time_str: str) -> bool:
"""
시간 문자열 유효성 검사
Args:
time_str: 시간 문자열 (HH:MM)
Returns:
유효 여부
"""
if not time_str:
return False
pattern = r"^\d{2}:\d{2}$"
if not re.match(pattern, time_str):
return False
try:
hour, minute = map(int, time_str.split(':'))
time(hour, minute)
return True
except ValueError:
return False
def is_valid_fault_code(fault_code: str) -> bool:
"""
고장코드 유효성 검사
Args:
fault_code: 고장코드
Returns:
유효 여부
"""
if not fault_code:
return True # 선택 필드
# 알파벳과 숫자 조합, 최대 20자
pattern = r"^[A-Za-z0-9\-_]{1,20}$"
return bool(re.match(pattern, fault_code))
def is_required_field(value: Optional[str], field_name: str = "") -> tuple:
"""
필수 필드 검사
Args:
value: 필드 값
field_name: 필드 이름
Returns:
(유효 여부, 오류 메시지)
"""
if value is None or (isinstance(value, str) and not value.strip()):
return False, f"'{field_name}' 필드는 필수입니다." if field_name else "필수 필드입니다."
return True, ""
def validate_instruction_data(data: dict) -> tuple:
"""
지시 데이터 유효성 검사
Args:
data: 지시 데이터
Returns:
(유효 여부, 오류 메시지 리스트)
"""
errors = []
# 필수 필드
if not data.get('instruction_content'):
errors.append("지시내용은 필수입니다.")
return len(errors) == 0, errors
def validate_fault_data(data: dict) -> tuple:
"""
고장 데이터 유효성 검사
Args:
data: 고장 데이터
Returns:
(유효 여부, 오류 메시지 리스트)
"""
errors = []
# 필수 필드
if not data.get('fault_content'):
errors.append("고장내용은 필수입니다.")
# 편성번호 유효성
if data.get('train_number') and not is_valid_train_number(data['train_number']):
errors.append("편성번호 형식이 올바르지 않습니다.")
# 호차 유효성
if data.get('car_number') and not is_valid_car_number(data['car_number']):
errors.append("호차 형식이 올바르지 않습니다.")
return len(errors) == 0, errors
def validate_work_data(data: dict) -> tuple:
"""
작업 데이터 유효성 검사
Args:
data: 작업 데이터
Returns:
(유효 여부, 오류 메시지 리스트)
"""
errors = []
# 필수 필드
if not data.get('work_content'):
errors.append("작업내용은 필수입니다.")
return len(errors) == 0, errors
def validate_misc_data(data: dict) -> tuple:
"""
기타 데이터 유효성 검사
Args:
data: 기타 데이터
Returns:
(유효 여부, 오류 메시지 리스트)
"""
errors = []
# 필수 필드
if not data.get('report_content'):
errors.append("전달내용은 필수입니다.")
return len(errors) == 0, errors