"""Initial data seed: schedules + servers + system settings""" from datetime import datetime from app.core.utils import now_tw, configure_timezone from croniter import croniter from sqlalchemy.orm import Session from app.models.schedule import Schedule from app.models.server import Server from app.models.settings import SystemSettings INITIAL_SCHEDULES = [ {"id": 1, "name": "租戶檢查", "cron_timer": "0 */3 * * * *"}, {"id": 2, "name": "帳號檢查", "cron_timer": "0 */3 * * * *"}, {"id": 3, "name": "系統狀態", "cron_timer": "0 0 8 * * *"}, ] INITIAL_SERVERS = [ {"id": 1, "name": "home", "ip_address": "10.1.0.254", "sort_order": 1, "description": "核心服務主機 (Ubuntu 24.04 / Dell Inspiron 3910)"}, {"id": 2, "name": "小的NAS", "ip_address": "10.1.0.20", "sort_order": 2, "description": "資料庫主機 (Synology DS716+II / DSM 6.2.4)"}, {"id": 3, "name": "大的NAS", "ip_address": "10.1.0.30", "sort_order": 3, "description": "儲存主機 (Synology DS920+ / DSM 7.3.2)"}, {"id": 4, "name": "Porsche_KLI", "ip_address": "10.1.0.245", "sort_order": 4, "description": "開發環境 (ASUS MINIPC PN62 / Windows 11)"}, ] def _calc_next_run(cron_timer: str) -> datetime: # croniter: six-field cron (sec min hour day month weekday) cron = croniter(cron_timer, now_tw()) return cron.get_next(datetime) def seed_initial_data(db: Session) -> None: """Insert initial schedules and servers if not present.""" for s in INITIAL_SCHEDULES: if not db.get(Schedule, s["id"]): db.add(Schedule( id=s["id"], name=s["name"], cron_timer=s["cron_timer"], status="Waiting", next_run_at=_calc_next_run(s["cron_timer"]), )) for sv in INITIAL_SERVERS: if not db.get(Server, sv["id"]): db.add(Server(**sv)) # Seed default system settings (id=1) if not db.get(SystemSettings, 1): db.add(SystemSettings(id=1)) db.commit() # Apply timezone from settings s = db.get(SystemSettings, 1) if s: configure_timezone(s.timezone)