Skip to content

Commit a035577

Browse files
Clément VALENTINclaude
andcommitted
feat: avertissement fallback + correction URLs manquantes
- Ajout de used_fallback et fallback_reason dans tous les scrapers - Affichage d'une bannière amber quand les données de secours sont utilisées - Correction: mise à jour des providers existants avec URLs par défaut (résout le bug où les URLs n'étaient pas affichées après import 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]> EOF )
1 parent a77347a commit a035577

File tree

12 files changed

+53
-4
lines changed

12 files changed

+53
-4
lines changed

apps/api/src/routers/admin.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1015,6 +1015,8 @@ async def preview_offers_update(
10151015
"offers_to_create": preview_result["offers_to_create"],
10161016
"offers_to_update": preview_result["offers_to_update"],
10171017
"offers_to_deactivate": preview_result["offers_to_deactivate"],
1018+
"used_fallback": preview_result.get("used_fallback", False),
1019+
"fallback_reason": preview_result.get("fallback_reason"),
10181020
"summary": {
10191021
"total_offers": preview_result["summary"]["total_scraped"],
10201022
"new": preview_result["summary"]["new"],
@@ -1439,11 +1441,12 @@ async def list_providers(
14391441
existing_result = await db.execute(select(EnergyProvider.name))
14401442
existing_names = {row[0] for row in existing_result.fetchall()}
14411443

1442-
# Create missing providers with defaults
1444+
# Create missing providers and update existing ones with defaults
14431445
for scraper_name in PriceUpdateService.SCRAPERS.keys():
14441446
if scraper_name not in existing_names:
14451447
logger.info(f"Auto-creating missing provider: {scraper_name}")
1446-
await service._get_or_create_provider(scraper_name)
1448+
# Call for ALL scrapers to also update existing providers with missing URLs
1449+
await service._get_or_create_provider(scraper_name)
14471450

14481451
await db.commit()
14491452

apps/api/src/services/price_scrapers/alpiq_scraper.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,8 @@ async def fetch_offers(self) -> List[OfferData]:
120120
self.logger.info(f"Using fallback data for AlpIQ due to errors: {' | '.join(errors)}")
121121
fallback_offers = self._get_fallback_offers()
122122
if fallback_offers:
123+
self.used_fallback = True
124+
self.fallback_reason = ' | '.join(errors)
123125
self.logger.info(f"Successfully loaded {len(fallback_offers)} AlpIQ offers from fallback data")
124126
return fallback_offers
125127
else:

apps/api/src/services/price_scrapers/alterna_scraper.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,8 @@ async def fetch_offers(self) -> List[OfferData]:
130130
self.logger.info(f"Using fallback data for Alterna due to errors: {' | '.join(errors)}")
131131
fallback_offers = self._get_fallback_offers()
132132
if fallback_offers:
133+
self.used_fallback = True
134+
self.fallback_reason = ' | '.join(errors)
133135
self.logger.info(f"Successfully loaded {len(fallback_offers)} Alterna offers from fallback data")
134136
return fallback_offers
135137
else:

apps/api/src/services/price_scrapers/base.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,9 @@ class BasePriceScraper(ABC):
159159
def __init__(self, provider_name: str):
160160
self.provider_name = provider_name
161161
self.logger = logging.getLogger(f"{__name__}.{self.__class__.__name__}")
162+
# Flag to indicate if fallback data was used (scraping failed)
163+
self.used_fallback = False
164+
self.fallback_reason: str | None = None
162165

163166
@abstractmethod
164167
async def fetch_offers(self) -> List[OfferData]:

apps/api/src/services/price_scrapers/ekwateur_scraper.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@ async def fetch_offers(self) -> List[OfferData]:
9999
self.logger.info(f"Using fallback data for Ekwateur due to errors: {' | '.join(errors)}")
100100
fallback_offers = self._get_fallback_offers()
101101
if fallback_offers:
102+
self.used_fallback = True
103+
self.fallback_reason = ' | '.join(errors)
102104
self.logger.info(f"Successfully loaded {len(fallback_offers)} Ekwateur offers from fallback data")
103105
return fallback_offers
104106
else:

apps/api/src/services/price_scrapers/enercoop_scraper.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,8 @@ async def fetch_offers(self) -> List[OfferData]:
115115
self.logger.info(f"Using fallback data for Enercoop due to errors: {' | '.join(errors)}")
116116
fallback_offers = self._get_fallback_offers()
117117
if fallback_offers:
118+
self.used_fallback = True
119+
self.fallback_reason = ' | '.join(errors)
118120
self.logger.info(f"Successfully loaded {len(fallback_offers)} Enercoop offers from fallback data")
119121
return fallback_offers
120122
else:

apps/api/src/services/price_scrapers/engie_scraper.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,8 @@ async def fetch_offers(self) -> List[OfferData]:
9494
self.logger.info(f"Using fallback data for Engie due to errors: {' | '.join(errors)}")
9595
fallback_offers = self._get_fallback_offers()
9696
if fallback_offers:
97+
self.used_fallback = True
98+
self.fallback_reason = ' | '.join(errors)
9799
self.logger.info(f"Successfully loaded {len(fallback_offers)} Engie offers from fallback data")
98100
return fallback_offers
99101
else:

apps/api/src/services/price_scrapers/primeo_scraper.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ async def fetch_offers(self) -> List[OfferData]:
9191
self.logger.info(f"Using fallback data for Priméo Énergie due to errors: {' | '.join(errors)}")
9292
fallback_offers = self._get_fallback_offers()
9393
if fallback_offers:
94+
self.used_fallback = True
95+
self.fallback_reason = ' | '.join(errors)
9496
self.logger.info(f"Successfully loaded {len(fallback_offers)} Priméo Énergie offers from fallback data")
9597
return fallback_offers
9698
else:

apps/api/src/services/price_scrapers/totalenergies_scraper.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,8 @@ async def fetch_offers(self) -> List[OfferData]:
128128
self.logger.info(f"Using fallback data for TotalEnergies due to errors: {' | '.join(errors)}")
129129
fallback_offers = self._get_fallback_offers()
130130
if fallback_offers:
131+
self.used_fallback = True
132+
self.fallback_reason = ' | '.join(errors)
131133
self.logger.info(f"Successfully loaded {len(fallback_offers)} TotalEnergies offers from fallback data")
132134
return fallback_offers
133135
else:

apps/api/src/services/price_update_service.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,8 @@ async def preview_provider_update(self, provider_name: str) -> Dict[str, Any]:
434434
"offers_to_update": offers_to_update,
435435
"offers_to_deactivate": offers_to_deactivate,
436436
"scraped_offers": all_scraped_offers, # All scraped offers for caching
437+
"used_fallback": scraper.used_fallback,
438+
"fallback_reason": scraper.fallback_reason,
437439
"summary": {
438440
"total_current": len(current_offers),
439441
"total_scraped": len(scraped_offers),

0 commit comments

Comments
 (0)