Adding planned execution
This commit is contained in:
@@ -313,6 +313,65 @@ def login():
|
|||||||
# BLOCK 3B: FILE UTILITIES
|
# 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):
|
def load_json_file(filename):
|
||||||
"""
|
"""
|
||||||
Load a JSON file from disk.
|
Load a JSON file from disk.
|
||||||
@@ -1236,6 +1295,9 @@ def main():
|
|||||||
number_of_threads = int((questionary.text("Number of threads :", default="12",
|
number_of_threads = int((questionary.text("Number of threads :", default="12",
|
||||||
validate=lambda x: x.isdigit() and 0 < int(x) <= MAX_THREADS).ask()))
|
validate=lambda x: x.isdigit() and 0 < int(x) <= MAX_THREADS).ask()))
|
||||||
|
|
||||||
|
print()
|
||||||
|
wait_for_scheduled_launch()
|
||||||
|
|
||||||
print()
|
print()
|
||||||
load_inclusions_mapping_config()
|
load_inclusions_mapping_config()
|
||||||
load_organizations_mapping_config()
|
load_organizations_mapping_config()
|
||||||
|
|||||||
Reference in New Issue
Block a user