# -*- 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