SPB Git

spb/job-ka

Public

[ka6] fix connecteur osgoode_properties: frontal ADP intermittent PAR CID (5e cas, garde-fou retry borné répliqué) — stale causé par 2 syncs 404 pendant l'épisode nocturne ADP du 30-31/10, tenant vivant, sync vert found=1 (= médiane 1.0)

Chronologie : vert found=1 en continu jusqu'à 21:26 EDT le 30/10, puis 404 franc sur la liste fr_CA à 23:47 et 02:24 — épisode nocturne ADP multi-tenants (nemaska_lithium, niobec, strathmore, uv_assurance, canadian_royalties touchés 23:45→03:23 pendant que cookit/cultures_genv/h2o_innovation répondaient 200), le même que niobec 61a2ddf8 de la veille. À 04:30 la panne persistait par intermittence pour CE cid : 2 succès sur 6 essais curl sur la MÊME URL liste à la même minute (404 404 200 200 404 404), et le sync rejoué sans correctif a encore pris un 404 à la seconde où curl obtenait 200. Le repli « détail seulement » du connecteur laisse volontairement passer les 4xx (un 404 franc est normalement un signal sûr chez ADP), d'où le stale — même angle mort que bento_sushi 64f53c8f, cookit 7873198d, mitsubishi_hc_capital (2026-10-26) et niobec (2026-10-31), fiche mémoire adp-frontal-intermittent-par-cid.

Tenant VIVANT, aucune migration : la liste en_CA expose 3 réquisitions (Live-In Superintendent Ottawa, Live-In Superintendent Kingston ON, Concierge - Gatineau QC) — l'unique offre QC 9201780233629_1 est toujours publiée, found=1 est le volume exact.

Correctif minimal, scoped au connecteur (doctrine des 4 frères, PAS de proxy) : _get_json retente jusqu'à 30 fois (pause 2 s) sur 404/502/503/504/timeout/non-JSON, timeout abaissé 30→15 s pour borner les connexions qui pendent. Dormant hors panne (1er essai OK = zéro surcoût) ; un sync vert ne coûte qu'UN appel liste par culture (détails en cache BD). L'itération bi-culture CULTURES=(fr_CA, en_CA) du fix f5132e4d est intacte.

Test : sync isolé rejoué AVEC garde-fou = vert ok=1 found=1 added=0 removed=0 en 7,1 s (quelques retries absorbés), offre Concierge - Gatineau active en base. 108 tests pytest verts. Fiches osgoode_properties.md/ats-adp.md/INDEX.md régénérées (1132 autres restaurées, hors périmètre). pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Simon-Pierre Boucher committed (Oct 31, 2026) parent ab14991 Browse files

4 changed files +76 −24

modified docs/connecteurs/INDEX.md +10 −10
@@ -5,16 +5,16 @@ Auteur : Simon-Pierre Boucher
5 5 Contact : contact@spboucher.ai
6 6 Fichier : docs/connecteurs/INDEX.md
7 7 Rôle : Index généré de la documentation des connecteurs (ATS, employeurs, portails, dépôt)
8 −Généré : 2026-10-31 04:16 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
8 +Généré : 2026-10-31 04:32 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 9 relancer le script pour régénérer.
10 10 =============================================================================
11 11 -->
12 12
13 13 # Job·Ka — Connecteurs (index)
14 14
15 −> Index généré le 2026-10-31 04:16 EDT par `scripts/gen_connector_docs.py` (rejouable). Croise `data/sources.json`, l'introspection de `jobka/connectors/*.py` et la base live `data/jobka.db`.
15 +> Index généré le 2026-10-31 04:32 EDT par `scripts/gen_connector_docs.py` (rejouable). Croise `data/sources.json`, l'introspection de `jobka/connectors/*.py` et la base live `data/jobka.db`.
16 16
17 −**1103 employeurs directs** connectés via **27 plateformes ATS** + **3 portails agrégateurs** + le canal de **dépôt direct** — **25362 offres actives** (22932 directes, 2430 portails ; 101 masquées comme doublons inter-sources, soit 25261 visibles). 1135 fiches.
17 +**1103 employeurs directs** connectés via **27 plateformes ATS** + **3 portails agrégateurs** + le canal de **dépôt direct** — **25358 offres actives** (22928 directes, 2430 portails ; 100 masquées comme doublons inter-sources, soit 25258 visibles). 1135 fiches.
18 18
19 19 Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conserve son URL originale ; la candidature se fait chez l'employeur (badge « Offre directe » sur les sources directes).
20 20
@@ -27,9 +27,9 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
27 27 | [`workable`](ats-workable.md) | 71 | 1974 | 17 % | 100 % |
28 28 | [`dayforce`](ats-dayforce.md) | 129 | 1901 | 10 % | 100 % |
29 29 | [`successfactors`](ats-successfactors.md) | 12 | 1649 | 19 % | 99 % |
30 −| [`njoyn`](ats-njoyn.md) | 11 | 1345 | 70 % | 87 % |
30 +| [`njoyn`](ats-njoyn.md) | 11 | 1343 | 71 % | 87 % |
31 31 | [`workland`](ats-workland.md) | 1 | 1109 | 37 % | 100 % |
32 −| [`wpjobmanager`](ats-wpjobmanager.md) | 8 | 806 | 6 % | 100 % |
32 +| [`wpjobmanager`](ats-wpjobmanager.md) | 8 | 805 | 6 % | 100 % |
33 33 | [`greenhouse`](ats-greenhouse.md) | 132 | 792 | 19 % | 100 % |
34 34 | [`lever`](ats-lever.md) | 58 | 622 | 20 % | 95 % |
35 35 | [`breezy`](ats-breezy.md) | 71 | 402 | 37 % | 94 % |
@@ -40,7 +40,7 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
40 40 | [`teamtailor`](ats-teamtailor.md) | 10 | 166 | 28 % | 96 % |
41 41 | [`zoho_recruit`](ats-zoho_recruit.md) | 16 | 146 | 14 % | 86 % |
42 42 | [`jazzhr`](ats-jazzhr.md) | 27 | 143 | 17 % | 91 % |
43 −| [`adp`](ats-adp.md) | 17 | 132 | 33 % | 91 % |
43 +| [`adp`](ats-adp.md) | 17 | 131 | 34 % | 91 % |
44 44 | [`taleo`](ats-taleo.md) | 5 | 105 | 0 % | 100 % |
45 45 | [`icims`](ats-icims.md) | 7 | 52 | 27 % | 98 % |
46 46 | [`ultipro`](ats-ultipro.md) | 4 | 48 | 50 % | 100 % |
@@ -71,8 +71,8 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
71 71 | [Walmart Canada](walmart.md) | [`workday`](ats-workday.md) | 872 | 98 % | 90 % | ✅ |
72 72 | [TEHORA](tehora.md) | [`workable`](ats-workable.md) | 421 | 0 % | 100 % | ✅ |
73 73 | [Université McGill](mcgill.md) | [`workday`](ats-workday.md) | 417 | 81 % | 100 % | ✅ |
74 −| [CGI](cgi.md) | [`njoyn`](ats-njoyn.md) | 299 | 0 % | 94 % | ✅ |
75 74 | [Mouvement Desjardins](desjardins.md) | [`workday`](ats-workday.md) | 298 | 1 % | 92 % | ✅ |
75 +| [CGI](cgi.md) | [`njoyn`](ats-njoyn.md) | 297 | 0 % | 94 % | ✅ |
76 76 | [CIMA+](cima2.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 282 | 1 % | 100 % | ✅ |
77 77 | [Go RH](gorh.md) | [`lever`](ats-lever.md) | 267 | 17 % | 98 % | ✅ |
78 78 | [Slihrms](slihrms.md) | [`workday`](ats-workday.md) | 260 | 10 % | 95 % | ❌ |
@@ -218,13 +218,13 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
218 218 | [Teknion Roy & Breton](teknionroybreton.md) | [`recruitee`](ats-recruitee.md) | 26 | 50 % | 85 % | ✅ |
219 219 | [Altasciences](altasciences.md) | [`workday`](ats-workday.md) | 25 | 0 % | 96 % | ✅ |
220 220 | [AVP](aviva.md) | [`workday`](ats-workday.md) | 25 | 12 % | 92 % | ✅ |
221 −| [CHUM](chum.md) | [`wpjobmanager`](ats-wpjobmanager.md) | 25 | 4 % | 100 % | ✅ |
222 221 | [Estimator](tranetechnologies.md) | [`workday`](ats-workday.md) | 25 | 100 % | 96 % | ✅ |
223 222 | [Huawei Canada](huaweicanada.md) | [`recruitee`](ats-recruitee.md) | 25 | 4 % | 100 % | ✅ |
224 223 | [AppDirect](appdirect.md) | [`greenhouse`](ats-greenhouse.md) | 24 | 25 % | 100 % | ✅ |
225 224 | [Baseten](baseten.md) | [`ashby`](ats-ashby.md) | 24 | 100 % | 0 % | ✅ |
226 225 | [Behaviour Interactif](bhvr.md) | [`lever`](ats-lever.md) | 24 | 0 % | 100 % | ✅ |
227 226 | [Best Buy Canada](bestbuycanada.md) | [`workday`](ats-workday.md) | 24 | 0 % | 38 % | ✅ |
227 +| [CHUM](chum.md) | [`wpjobmanager`](ats-wpjobmanager.md) | 24 | 4 % | 100 % | ✅ |
228 228 | [Directive](directive.md) | [`ashby`](ats-ashby.md) | 24 | 21 % | 0 % | ✅ |
229 229 | [Exportation et développement Canada (EDC)](export_development_canada.md) | [`workable`](ats-workable.md) | 24 | 96 % | 100 % | ✅ |
230 230 | [FedEx Express Canada](fedex.md) | [`workday`](ats-workday.md) | 24 | 100 % | 88 % | ✅ |
@@ -555,7 +555,6 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
555 555 | [Bilingual (French/English) Sales Broker (RIBO Licensed)](ogc.md) | [`dayforce`](ats-dayforce.md) | 6 | 33 % | 100 % | ✅ |
556 556 | [Board](deltastar.md) | [`dayforce`](ats-dayforce.md) | 6 | 33 % | 100 % | ✅ |
557 557 | [Bronswerk](bronswerk.md) | [`dayforce`](ats-dayforce.md) | 6 | 0 % | 100 % | ✅ |
558 −| [Canadian Royalties](canadian_royalties.md) | [`adp`](ats-adp.md) | 6 | 33 % | 100 % | ✅ |
559 558 | [Carnaval de Québec Inc.](carnaval.md) | [`zoho_recruit`](ats-zoho_recruit.md) | 6 | 0 % | 100 % | ✅ |
560 559 | [Cfibfcei](cfibfcei.md) | [`dayforce`](ats-dayforce.md) | 6 | 17 % | 100 % | ✅ |
561 560 | [Conseil de gestion financière des Premières Nations (FNFMB)](fnfmb.md) | [`dayforce`](ats-dayforce.md) | 6 | 0 % | 100 % | ✅ |
@@ -604,6 +603,7 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
604 603 | [Aviya Aerospace Systems](aviyatech.md) | [`lever`](ats-lever.md) | 5 | 0 % | 100 % | ✅ |
605 604 | [BDL Énergie](bdl_energie.md) | [`breezy`](ats-breezy.md) | 5 | 20 % | 20 % | ✅ |
606 605 | [Behavox](behavox.md) | [`greenhouse`](ats-greenhouse.md) | 5 | 0 % | 100 % | ✅ |
606 +| [Canadian Royalties](canadian_royalties.md) | [`adp`](ats-adp.md) | 5 | 40 % | 100 % | ✅ |
607 607 | [Conagrabrands](conagrabrands.md) | [`workday`](ats-workday.md) | 5 | 80 % | 100 % | ✅ |
608 608 | [Consultant(e) en développement des affaires](omnitrans.md) | [`dayforce`](ats-dayforce.md) | 5 | 40 % | 100 % | ✅ |
609 609 | [Cultures Gen V](cultures_genv.md) | [`adp`](ats-adp.md) | 5 | 20 % | 100 % | ✅ |
@@ -982,7 +982,7 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
982 982 | [ON Animation Studio](onanimationstudio.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 1 | 0 % | 100 % | ✅ |
983 983 | [Onomatic](onomatic.md) | [`workable`](ats-workable.md) | 1 | 0 % | 100 % | ✅ |
984 984 | [Openmind Technologies](openmindt.md) | [`bamboohr`](ats-bamboohr.md) | 1 | 0 % | 100 % | ✅ |
985 −| [Osgoode Properties](osgoode_properties.md) | [`adp`](ats-adp.md) | 1 | 100 % | 100 % | ❌ |
985 +| [Osgoode Properties](osgoode_properties.md) | [`adp`](ats-adp.md) | 1 | 100 % | 100 % | ✅ |
986 986 | [Panda7](panda7.md) | [`breezy`](ats-breezy.md) | 1 | 100 % | 100 % | ✅ |
987 987 | [Passport Brand Design](passportbranddesign.md) | [`greenhouse`](ats-greenhouse.md) | 1 | 0 % | 100 % | ✅ |
988 988 | [Patterson Companies](pattersoncompanies.md) | [`workday`](ats-workday.md) | 1 | 0 % | 100 % | ✅ |
modified docs/connecteurs/ats-adp.md +6 −6
@@ -5,14 +5,14 @@ Auteur : Simon-Pierre Boucher
5 5 Contact : contact@spboucher.ai
6 6 Fichier : docs/connecteurs/ats-adp.md
7 7 Rôle : Fiche plateforme ATS adp — mécanique partagée + tableau des 17 tenants
8 −Généré : 2026-10-31 04:03 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
8 +Généré : 2026-10-31 04:32 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 9 relancer le script pour régénérer.
10 10 =============================================================================
11 11 -->
12 12
13 13 # Plateforme ATS `adp`
14 14
15 −**17 employeurs connectés** via cette plateforme — **132 offres actives**. Module partagé : `jobka/connectors/adp.py` ; un employeur = une sous-classe d'environ 10 lignes.
15 +**17 employeurs connectés** via cette plateforme — **131 offres actives**. Module partagé : `jobka/connectors/adp.py` ; un employeur = une sous-classe d'environ 10 lignes.
16 16
17 17 ## Description & mécanique
18 18
@@ -47,13 +47,13 @@ Généré : 2026-10-31 04:03 EDT par scripts/gen_connector_docs.py — NE PAS
47 47 | [Cook It](cookit.md) | 10 | 60 % | 100 % | 0 % | 2026-10-31 01:26 | ✅ |
48 48 | [H2O Innovation](h2o_innovation.md) | 9 | 0 % | 100 % | 0 % | 2026-10-31 01:47 | ✅ |
49 49 | [Strathmore](strathmore.md) | 9 | 44 % | 100 % | 0 % | 2026-10-31 03:00 | ✅ |
50 −| [Bento Sushi](bento_sushi.md) | 8 | 88 % | 100 % | 0 % | 2026-10-31 03:56 | ✅ |
50 +| [Bento Sushi](bento_sushi.md) | 8 | 88 % | 100 % | 0 % | 2026-10-31 04:23 | ✅ |
51 51 | [MSI Gestion immobilière](msi_gestion.md) | 6 | 100 % | 100 % | 50 % | 2026-10-31 02:12 | ✅ |
52 −| [Canadian Royalties](canadian_royalties.md) | 6 | 33 % | 100 % | 0 % | 2026-10-31 01:18 | ❌ |
53 −| [Abritek](abritek.md) | 6 | 100 % | 100 % | 0 % | 2026-10-31 03:43 | ✅ |
52 +| [Abritek](abritek.md) | 6 | 100 % | 100 % | 0 % | 2026-10-31 04:17 | ✅ |
54 53 | [Cultures Gen V](cultures_genv.md) | 5 | 20 % | 100 % | 0 % | 2026-10-31 01:27 | ✅ |
54 +| [Canadian Royalties](canadian_royalties.md) | 5 | 40 % | 100 % | 0 % | 2026-10-31 04:25 | ✅ |
55 55 | [Mitsubishi HC Capital Canada](mitsubishi_hc_capital.md) | 1 | 0 % | 100 % | 0 % | 2026-10-31 02:08 | ✅ |
56 −| [Osgoode Properties](osgoode_properties.md) | 1 | 100 % | 100 % | 0 % | 2026-10-31 02:24 | ❌ |
56 +| [Osgoode Properties](osgoode_properties.md) | 1 | 100 % | 100 % | 0 % | 2026-10-31 04:32 | ✅ |
57 57 | [Nemaska Lithium](nemaska_lithium.md) | 1 | 0 % | 100 % | 0 % | 2026-10-31 02:15 | ✅ |
58 58 | [Triple Boris](triple_boris.md) | 1 | 0 % | 100 % | 0 % | 2026-10-31 03:15 | ✅ |
59 59 | [Niobec (Magris Performance Materials)](niobec.md) | 0 | — | — | — | 2026-10-31 04:03 | ✅ |
modified docs/connecteurs/osgoode_properties.md +7 −7
@@ -5,7 +5,7 @@ Auteur : Simon-Pierre Boucher
5 5 Contact : contact@spboucher.ai
6 6 Fichier : docs/connecteurs/osgoode_properties.md
7 7 Rôle : Fiche connecteur — Osgoode Properties (employeur direct, ATS adp)
8 −Généré : 2026-10-14 18:40 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
8 +Généré : 2026-10-31 04:32 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER,
9 9 relancer le script pour régénérer.
10 10 =============================================================================
11 11 -->
@@ -38,7 +38,7 @@ Généré : 2026-10-14 18:40 EDT par scripts/gen_connector_docs.py — NE PAS
38 38
39 39 ## Champs → schéma
40 40
41 −Complétude mesurée sur les **1 offres actives** de la source (base live, 2026-10-14 18:40 EDT).
41 +Complétude mesurée sur les **1 offres actives** de la source (base live, 2026-10-31 04:32 EDT).
42 42
43 43 | Champ (`jobs.*`) | Rôle | Complétude |
44 44 |---|---|---|
@@ -51,7 +51,7 @@ Complétude mesurée sur les **1 offres actives** de la source (base live, 2026-
51 51 | `address` — Adresse | adresse du lieu de travail | 0 % |
52 52 | `postal_code` — Code postal | code postal si publié | 100 % |
53 53 | `work_mode` — Mode | presentiel / hybride / teletravail | 0 % |
54 −| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % |
54 +| `employment_type` — Type | temps_plein / temps_partiel / … | 0 % |
55 55 | `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 100 % |
56 56 | `salary_label` — Libellé salaire | texte salarial original | 0 % |
57 57 | `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % |
@@ -79,15 +79,15 @@ Exemple réel : *Concierge - Gatineau* — Gatineau · ∅ · parue le 2026-08-0
79 79
80 80 ## Volumétrie & complétude live
81 81
82 −*(mesuré le 2026-10-14 18:40 EDT dans `data/jobka.db`)*
82 +*(mesuré le 2026-10-31 04:32 EDT dans `data/jobka.db`)*
83 83
84 84 - **Offres en base** : 2 (dont **1 actives**, 0 masquées comme doublons `dup_of`)
85 85 - **Salaire** : 1/1 actives (100 %)
86 86 - **GPS** : 1/1 actives (100 %)
87 87 - **Mode** : 0/1 actives (0 %)
88 88 - **Parution** : 1/1 actives (100 %)
89 −- **Dernier sync** : 2026-10-14 15:47 — trouvées 1, +0, ~0, -0
90 −- **Syncs enregistrés** (`sync_log`) : 548
89 +- **Dernier sync** : 2026-10-31 04:32 — trouvées 1, +0, ~0, -0
90 +- **Syncs enregistrés** (`sync_log`) : 692
91 91
92 92 ## Erreurs & dépannage
93 93
@@ -95,7 +95,7 @@ Erreurs relevées dans `sync_log` :
95 95
96 96 | Erreur | Occurrences | Dernière fois |
97 97 |---|---|---|
98 −| 404 Client Error: Not Found for url: https://workforcenow.adp.com/mascsr/default/careercen… | 1 | 2026-10-10 02:02 |
98 +| 404 Client Error: Not Found for url: https://workforcenow.adp.com/mascsr/default/careercen… | 4 | 2026-10-31 04:30 |
99 99 | Expecting value: line 1 column 1 (char 0) | 2 | 2026-08-29 22:54 |
100 100 | ('Connection aborted.', ConnectionResetError(54, 'Connection reset by peer')) | 1 | 2026-08-29 02:25 |
101 101
modified jobka/connectors/osgoode_properties.py +53 −1
@@ -6,7 +6,7 @@
6 6 # Rôle : Connecteur Osgoode Properties (immobilier locatif — immeubles à
7 7 # Gatineau) — ADP WFN bi-culture (fr_CA + en_CA) + repli « détail
8 8 # seulement » quand l'API liste échoue (maintenances nocturnes ADP)
9 −# Créé : 2026-08-19 Modifié : 2026-10-10
9 +# Créé : 2026-08-19 Modifié : 2026-10-31
10 10 # =============================================================================
11 11 """Osgoode Properties — ADP Workforce Now bi-culture, avec repli de
12 12 revalidation.
@@ -48,9 +48,31 @@ sorry.adp.com), l'erreur d'origine est propagée pour que le sync reste un
48 48 échec (inventaire préservé). Limite assumée : le repli ne découvre pas les
49 49 NOUVELLES offres — le chemin liste normal reprend seul au cycle suivant la
50 50 fin de la maintenance.
51 +
52 +Chronologie (mission ka6 2026-10-31) : 5e tenant ADP de l'app touché par le
53 +frontal intermittent PAR CID (même panne que bento_sushi 64f53c8f, cookit
54 +7873198d, mitsubishi_hc_capital du 2026-10-26 et niobec 61a2ddf8 de la
55 +veille — pool backend malade côté ADP). Vert found=1 en continu jusqu'à
56 +21:26 EDT le 30/10, puis 404 franc sur la liste fr_CA à 23:47 et 02:24
57 +(épisode nocturne multi-tenants : nemaska_lithium, niobec, strathmore,
58 +uv_assurance, canadian_royalties touchés dans la même fenêtre 23:45→03:23,
59 +pendant que cookit/cultures_genv/h2o_innovation répondaient 200) ; le repli
60 +« détail seulement » ci-dessus laisse volontairement passer les 4xx, d'où
61 +le stale. Sonde live 04:30 : 2 succès sur 6 essais sur la MÊME URL liste à
62 +la même minute (404 404 200 200 404 404) — intermittence, pas une panne
63 +totale ni un tenant mort (la liste en_CA 200 expose une réquisition vivante,
64 +itemID 9201802642033_1 parue le 2026-10-20). Garde-fou répliqué des quatre
65 +frères : `_get_json` retente jusqu'à 30 fois (pause 2 s) sur
66 +404/502/503/504/timeout/non-JSON, timeout abaissé 30→15 s pour borner les
67 +connexions qui pendent. Dormant dès que le frontal est sain (1er essai OK =
68 +zéro surcoût) ; un sync vert ne coûte qu'UN appel liste par culture
69 +(détails en cache BD). NE PAS retirer ce garde-fou si un futur scan le
70 +croise : il est inerte hors panne.
51 71 """
52 72 from __future__ import annotations
53 73
74 +import time
75 +
54 76 import requests
55 77
56 78 from ..schema import JobPosting, clean_html
@@ -66,6 +88,36 @@ class OsgoodePropertiesConnector(ADPWorkforceNowConnector):
66 88 # gagne la fusion ; en_CA est la seule culture servie en 2026-10.
67 89 CULTURES = ("fr_CA", "en_CA")
68 90
91 + # Frontal ADP intermittent pour CE tenant (2026-10-31) : mêmes bornes que
92 + # bento_sushi/cookit/mitsubishi_hc_capital/niobec — les 404 échouent vite
93 + # (<1 s), le timeout court borne les connexions qui pendent, et un sync
94 + # vert ne coûte qu'UN appel liste par culture (détails en cache BD).
95 + timeout = 15
96 + _FLAKY_TRIES = 30
97 + _FLAKY_PAUSE = 2.0
98 +
99 + def _get_json(self, url: str, params: dict) -> dict:
100 + last: Exception | None = None
101 + for attempt in range(self._FLAKY_TRIES):
102 + if attempt:
103 + time.sleep(self._FLAKY_PAUSE)
104 + try:
105 + return super()._get_json(url, params)
106 + except requests.HTTPError as exc:
107 + status = getattr(exc.response, "status_code", None)
108 + if status not in (404, 502, 503, 504):
109 + raise
110 + last = exc
111 + except (requests.Timeout, requests.ConnectionError) as exc:
112 + last = exc
113 + except RuntimeError as exc:
114 + # « ADP non-JSON après 3 essais » de la classe de base :
115 + # même frontal malade, même traitement.
116 + if not str(exc).startswith("ADP non-JSON"):
117 + raise
118 + last = exc
119 + raise last
120 +
69 121 def fetch(self) -> list[JobPosting]:
70 122 try:
71 123 merged: dict[str, JobPosting] = {}
72 124
Menu

Theme