- i18n 사전 100% (break/overtime/leave/clockin) — 50+ 신규 키 - 런타임 재번역 인프라 (ui/i18n_runtime.py) — 재시작 없이 메인 UI 적용 - MealController 분리 — 점심/저녁 토글을 컨트롤러로 추출 - 통합 테스트 +15 (S36-S52: 온보딩/salary/CSV/notification dedupe 등) - pytest 신규 4종 + i18n_runtime 테스트 (총 122 케이스, 90→122) - README/INSTALL/CLAUDE/AGENTS v2.6+ 아키텍처 반영
57 lines
1.8 KiB
Python
57 lines
1.8 KiB
Python
"""
|
|
점심/저녁 토글 컨트롤러.
|
|
|
|
main_window.py에서 toggle_lunch_break / toggle_dinner_break / update_lunch_status /
|
|
update_dinner_status 가 합쳐져 있던 것을 분리. 1Hz hot path 외 사용자 액션 응답.
|
|
|
|
단위 테스트가 가능하도록 window 의존성을 명시적으로 받음.
|
|
"""
|
|
from __future__ import annotations
|
|
from datetime import datetime
|
|
|
|
from core.i18n import tr
|
|
|
|
|
|
class MealController:
|
|
"""점심/저녁 토글 + 상태 라벨 갱신."""
|
|
|
|
def __init__(self, window):
|
|
self.window = window
|
|
self.db = window.db
|
|
|
|
# -------- 토글 --------
|
|
def toggle_lunch(self) -> None:
|
|
w = self.window
|
|
w.lunch_break_enabled = w.lunch_button.isChecked()
|
|
self.refresh_lunch_label()
|
|
|
|
# 사용자가 직접 토글하면 자동 적용 플래그를 처리됨으로 간주 (중복 알림 방지)
|
|
if w.lunch_break_enabled:
|
|
w.auto_lunch_applied_today = True
|
|
|
|
if w.is_clocked_in:
|
|
today = datetime.now().date().isoformat()
|
|
self.db.update_lunch_break(today, w.lunch_break_enabled)
|
|
|
|
def toggle_dinner(self) -> None:
|
|
w = self.window
|
|
w.dinner_break_enabled = w.dinner_button.isChecked()
|
|
self.refresh_dinner_label()
|
|
|
|
if w.is_clocked_in:
|
|
today = datetime.now().date().isoformat()
|
|
self.db.update_dinner_break(today, w.dinner_break_enabled)
|
|
|
|
# -------- 라벨 --------
|
|
def refresh_lunch_label(self) -> None:
|
|
w = self.window
|
|
w.lunch_button.setText(
|
|
tr('btn.lunch_applied') if w.lunch_break_enabled else tr('btn.lunch_add')
|
|
)
|
|
|
|
def refresh_dinner_label(self) -> None:
|
|
w = self.window
|
|
w.dinner_button.setText(
|
|
tr('btn.dinner_applied') if w.dinner_break_enabled else tr('btn.dinner_add')
|
|
)
|