diff --git a/eb_dashboard.py b/eb_dashboard.py index fea6fd4..a5b8815 100644 --- a/eb_dashboard.py +++ b/eb_dashboard.py @@ -313,6 +313,65 @@ def login(): # BLOCK 3B: FILE UTILITIES # ============================================================================ +def wait_for_scheduled_launch(): + """Asks the user when to start the processing and waits if needed. + Options: Immediately / In X minutes / At HH:MM + """ + choice = questionary.select( + "When to start processing ?", + choices=["Immediately", "In X minutes", "At HH:MM"] + ).ask() + + if choice is None or choice == "Immediately": + return + + if choice == "In X minutes": + minutes_str = questionary.text( + "Number of minutes :", + validate=lambda x: x.isdigit() and int(x) > 0 + ).ask() + if not minutes_str: + return + target_time = datetime.now() + timedelta(minutes=int(minutes_str)) + + else: # "At HH:MM" + time_str = questionary.text( + "Start time (HH:MM) :", + validate=lambda x: bool(re.match(r'^\d{2}:\d{2}$', x)) and + 0 <= int(x.split(':')[0]) <= 23 and + 0 <= int(x.split(':')[1]) <= 59 + ).ask() + if not time_str: + return + now = datetime.now() + h, m = int(time_str.split(':')[0]), int(time_str.split(':')[1]) + target_time = now.replace(hour=h, minute=m, second=0, microsecond=0) + if target_time <= now: + console.print("[yellow]⚠ Specified time is already past. Starting immediately.[/yellow]") + return + + print() + try: + while True: + remaining = target_time - datetime.now() + if remaining.total_seconds() <= 0: + break + total_secs = int(remaining.total_seconds()) + h = total_secs // 3600 + m = (total_secs % 3600) // 60 + s = total_secs % 60 + target_str = target_time.strftime('%H:%M:%S') + print(f"\r Starting in {h:02d}:{m:02d}:{s:02d}... (at {target_str}) — Ctrl+C to cancel ", + end="", flush=True) + sleep(1) + print() + console.print("[green]✓ Starting processing.[/green]") + except KeyboardInterrupt: + print() + console.print("[bold red]Launch cancelled by user.[/bold red]") + raise SystemExit(0) + + def load_json_file(filename): """ Load a JSON file from disk. @@ -1236,6 +1295,9 @@ def main(): number_of_threads = int((questionary.text("Number of threads :", default="12", validate=lambda x: x.isdigit() and 0 < int(x) <= MAX_THREADS).ask())) + print() + wait_for_scheduled_launch() + print() load_inclusions_mapping_config() load_organizations_mapping_config()