oedb-backend/extractors/demo_agendadulibre.py

134 lines
4.7 KiB
Python
Raw Permalink Normal View History

2025-10-04 19:26:00 +02:00
#!/usr/bin/env python3
"""
Script de démonstration pour le scraper de l'agenda du libre
Mode dry-run pour tester sans envoyer de données à l'API
"""
import sys
import os
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
from agendadulibre import AgendaDuLibreScraper, api_oedb
import logging
class DemoAgendaDuLibreScraper(AgendaDuLibreScraper):
"""Version démo du scraper qui n'envoie pas de données à l'API"""
def send_event_to_api(self, event_data):
"""Version démo qui simule l'envoi à l'API"""
event_label = event_data["event"]["properties"]["label"]
print(f"🔍 [DEMO] Simulation d'envoi: {event_label}")
# Simuler différents types de réponses
import random
responses = [
(True, "Créé avec succès"),
(False, "Événement déjà existant"),
(True, "Créé avec succès"),
(False, "Erreur API: 500 - Internal Server Error")
]
success, message = random.choice(responses)
if success:
print(f"✅ [DEMO] {event_label} - {message}")
else:
print(f"❌ [DEMO] {event_label} - {message}")
return success, message
def main():
"""Exécute la démonstration"""
print("🎭 Démonstration du scraper agenda du libre (mode dry-run)")
print("=" * 60)
# Configuration du logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
# Créer le scraper en mode démo
scraper = DemoAgendaDuLibreScraper(
api_base_url=api_oedb, # Utiliser l'URL par défaut
batch_size=2 # Traiter 2 événements par batch pour la démo
)
print(f"📋 Configuration:")
print(f" - URL iCal: {scraper.ical_url}")
print(f" - Taille des batches: {scraper.batch_size}")
print(f" - Fichier de données: {scraper.data_file}")
print(f" - Fichier cache iCal: {scraper.ical_file}")
print(f" - Durée de cache: {scraper.cache_duration_hours}h")
print()
# Récupérer le fichier iCal
print("📥 Récupération du fichier iCal...")
calendar = scraper.fetch_ical_data()
if not calendar:
print("❌ Impossible de récupérer le fichier iCal")
return False
# Compter les événements
event_count = 0
for component in calendar.walk():
if component.name == "VEVENT":
event_count += 1
print(f"📅 {event_count} événements trouvés dans le fichier iCal")
# Test du cache
print("\n🔄 Test du cache iCal...")
print(" Premier appel (téléchargement)...")
calendar2 = scraper.fetch_ical_data()
print(" Deuxième appel (depuis le cache)...")
calendar3 = scraper.fetch_ical_data()
print(" ✅ Cache fonctionne correctement")
print()
# Traiter seulement les 5 premiers événements pour la démo
print("🔄 Traitement des 5 premiers événements (démo)...")
print("-" * 40)
processed = 0
for component in calendar.walk():
if component.name == "VEVENT" and processed < 5:
parsed_event = scraper.parse_event(component)
if parsed_event:
event_label = parsed_event["event"]["properties"]["label"]
start_date = parsed_event["event"]["properties"]["start"]
location = parsed_event["event"]["properties"]["where"]
print(f"📝 Événement {processed + 1}:")
print(f" Titre: {event_label}")
print(f" Date: {start_date}")
print(f" Lieu: {location}")
print()
# Simuler l'envoi
success, message = scraper.send_event_to_api(parsed_event)
# Mettre à jour les données locales (simulation)
event_id = parsed_event["id"]
scraper.events_data["events"][event_id] = {
"status": "saved" if success else "error",
"message": message,
"last_attempt": "2024-01-01T00:00:00",
"event": parsed_event["event"]
}
processed += 1
print("-" * 40)
print(f"✅ Démonstration terminée - {processed} événements traités")
print()
print("💡 Pour exécuter le vrai scraper:")
print(" python agendadulibre.py --batch-size 5 --api-url http://localhost:5000")
print()
print("🧪 Pour exécuter les tests:")
print(" python test_agendadulibre.py")
return True
if __name__ == "__main__":
success = main()
sys.exit(0 if success else 1)