diff --git a/scripts/push_to_escada.py b/scripts/push_to_escada.py new file mode 100644 index 0000000..190e143 --- /dev/null +++ b/scripts/push_to_escada.py @@ -0,0 +1,467 @@ +"""Pousse vers Escada les changements de statut effectués dans l'app. + +Usage : + python scripts/push_to_escada.py # tous les changements en attente + python scripts/push_to_escada.py --test # test limité à Poidevin Alexandre / EM-AU 1 + python scripts/push_to_escada.py --count # affiche le nombre de changements en attente + python scripts/push_to_escada.py --no-pull # ne pas récupérer le serveur avant push +""" +from __future__ import annotations + +import json +import subprocess +import sys +from datetime import date +from pathlib import Path + +_root = Path(__file__).resolve().parent.parent +if str(_root) not in sys.path: + sys.path.insert(0, str(_root)) + +if hasattr(sys.stdout, "reconfigure"): + sys.stdout.reconfigure(encoding="utf-8", errors="replace") +if hasattr(sys.stderr, "reconfigure"): + sys.stderr.reconfigure(encoding="utf-8", errors="replace") + +from playwright.sync_api import sync_playwright, TimeoutError as PWTimeout + +from src.db import Absence, Apprenti, EscadaPending, get_engine, init_db, upsert_escada_pending +from sqlalchemy.orm import sessionmaker, Session +from sqlalchemy import select + +# Réutilise les utilitaires de navigation depuis sync_esacada +from scripts.sync_esacada import ( + BASE_URL, CLASSES_URL, PROFILE_DIR, + _log, _ensure_logged_in, _launch_context, + _go_to_absence_page, _cache_load, +) + +# ── Coordonnées du serveur ──────────────────────────────────────────────────── +_SSH_HOST = "julbal@20.199.136.37" +_SSH_REMOTE = "/opt/absences" + + +# ── Interaction avec la page d'absences ─────────────────────────────────────── + +_JS_SET_DROPDOWN = """([nom, prenom, idx, val]) => { + for (const tr of document.querySelectorAll('tr')) { + // Vérifier que nom et prénom apparaissent dans des