Revert "[ka6] fix connecteur multibrosses.com: 6e application du garde-fou _get_list() (revert-du-revert de d9c8aeb, qui avait annulé 05984f2 — lui-même 5e sauvetage après 9cfd761/10d0f63/1e6156f/ea0ba25/bf38005/12f30a8/e1a55b7/c3adc85; guerre de reverts, même pattern que foodcrayon/402, artisansduvitrail/_seq et labete/_woo_uninstalled). Cause racine re-vérifiée live le 2026-09-15: le WordPress du site (Flywheel/Fastly) est toujours en panne, la Store API /wp-json/wc/store/v1/products ET l'accueil répondent 200 avec le JSON parasite {"success":true} (robots.txt statique OK). Sans le garde-fou, ce dict passait le parsing → faux « ok / 0 produit » qui purgeait le catalogue (141 produits historiques, re-vérifiés présents en base ce jour). Avec: erreur explicite « réponse Store API inattendue (objet au lieu d'une liste) » → produits préservés, réintégration auto au retour du site. Sync réel 2026-09-15: multibrosses.com 1 erreur explicite (plus de faux ok/0); non-régression artisandulac.ca (445 produits), multi-eco.com (8 produits), labete.ca (0 sans erreur, chemin _woo_uninstalled intact). NE PAS RE-REVERTER tant que le site sert ce JSON parasite."
This reverts commit d6ece04b4605a881e8a0f63bff90855c0c3d673f.
1 changed file +2 −18
modified
fabrika/connectors/woocommerce.py
+2 −18
@@ -323,35 +323,19 @@ class WooCommerceConnector(BaseConnector): | ||
| 323 | 323 | continue |
| 324 | 324 | return out |
| 325 | 325 | |
| 326 | − def _get_list(self, url: str): | |
| 327 | − """Page de la liste Store API — toujours un tableau JSON à la source. | |
| 328 | − | |
| 329 | − Un objet ici = erreur Woo ({"code": ...}) ou site cassé qui sert un | |
| 330 | − JSON parasite en 200 (ex. multibrosses.com sous Flywheel : | |
| 331 | − {"success":true} sur toutes les routes PHP) — c'est une panne, pas un | |
| 332 | − catalogue vide : sans ce garde-fou le sync passe « ok / 0 produit » | |
| 333 | − et purge silencieusement tout le catalogue. | |
| 334 | − """ | |
| 335 | − items = self._get_items(url) | |
| 336 | − if isinstance(items, dict): | |
| 337 | − raise ValueError( | |
| 338 | − f"réponse Store API inattendue (objet au lieu d'une liste): " | |
| 339 | − f"{str(items)[:120]}") | |
| 340 | − return items | |
| 341 | − | |
| 342 | 326 | def fetch(self) -> list[Product]: |
| 343 | 327 | out: list[Product] = [] |
| 344 | 328 | page = 1 |
| 345 | 329 | first_page_exc: Exception | None = None |
| 346 | 330 | while page <= self.max_pages: |
| 347 | 331 | try: |
| 348 | − items = self._get_list(self._store_api_url("products", f"per_page=100&page={page}")) | |
| 332 | + items = self._get_items(self._store_api_url("products", f"per_page=100&page={page}")) | |
| 349 | 333 | except Exception as exc: |
| 350 | 334 | if page == 1 and not self._use_rest_route: |
| 351 | 335 | # chemin /wp-json/ bloqué par l'hébergeur ? retenter via ?rest_route= |
| 352 | 336 | self._use_rest_route = True |
| 353 | 337 | try: |
| 354 | − items = self._get_list(self._store_api_url("products", f"per_page=100&page={page}")) | |
| 338 | + items = self._get_items(self._store_api_url("products", f"per_page=100&page={page}")) | |
| 355 | 339 | except Exception: |
| 356 | 340 | self._use_rest_route = False |
| 357 | 341 | first_page_exc = exc |
| 358 | 342 | |