diff --git a/extractors/osm_cal.py b/extractors/osm_cal.py
index cc3b2be..5d066ea 100755
--- a/extractors/osm_cal.py
+++ b/extractors/osm_cal.py
@@ -614,15 +614,17 @@ def submit_event(event):
event: A GeoJSON Feature representing the event.
Returns:
- bool: True if the event was successfully submitted, False otherwise.
+ tuple: A tuple containing (success: bool, event_id: str or None).
+ success is True if the event was successfully submitted, False otherwise.
+ event_id is the OEDB event ID if available, None otherwise.
"""
try:
# Extract event properties for logging
properties = event['properties']
-
+
# API endpoint for OpenEventDatabase
api_url = "https://api.openeventdatabase.org/event"
-
+
# Make the API request
logger.info(f"Submitting event '{properties.get('label')}' to API")
response = requests.post(
@@ -630,32 +632,38 @@ def submit_event(event):
headers={"Content-Type": "application/json"},
data=json.dumps(event)
)
-
+
# Check if the request was successful
if response.status_code == 200 or response.status_code == 201:
# Parse the response to get the event ID
response_data = response.json()
event_id = response_data.get('id')
-
+
if event_id:
logger.success(f"Event created with ID: {event_id}")
logger.info(f" https://api.openeventdatabase.org/event/{event_id}")
- return True
+ return (True, event_id)
else:
logger.warning(f"Event created but no ID returned in response")
- return True
+ return (True, None)
elif response.status_code == 409:
# 409 Conflict - L'événement existe déjà, considéré comme un succès
logger.success(f"Event already exists in database: {properties.get('label')} (HTTP 409)")
- return True
+ # Essayer d'extraire l'ID de l'événement existant depuis la réponse
+ try:
+ response_data = response.json()
+ existing_event_id = response_data.get('id')
+ return (True, existing_event_id)
+ except:
+ return (True, None)
else:
logger.warning(f"Failed to create event: {properties.get('label')}. Status code: {response.status_code}")
logger.warning(f"Response: {response.text}")
- return False
+ return (False, None)
except Exception as e:
logger.error(f"Error submitting event: {e}")
- return False
+ return (False, None)
def main(max_events=1, offset=0):
"""
@@ -695,7 +703,8 @@ def main(max_events=1, offset=0):
# Vérifier si l'événement existe dans le cache et a le statut 'success'
if link in event_cache and event_cache[link].get('status') == 'success':
success_events.append(link)
- logger.info(f"Événement déjà traité avec succès, ignoré : {link}")
+ oedb_id = event_cache[link].get('oedb_event_id', 'ID non disponible')
+ logger.info(f"Événement déjà traité avec succès (ID OEDB: {oedb_id}), ignoré : {link}")
else:
new_events.append(link)
# Initialiser l'événement dans le cache s'il n'existe pas
@@ -709,7 +718,8 @@ def main(max_events=1, offset=0):
# Log du statut actuel pour les événements déjà en cache
current_status = event_cache[link].get('status', 'unknown')
attempts = event_cache[link].get('attempts', 0)
- logger.info(f"Événement à retraiter (statut: {current_status}, tentatives: {attempts}) : {link}")
+ oedb_id = event_cache[link].get('oedb_event_id', 'non disponible')
+ logger.info(f"Événement à retraiter (statut: {current_status}, tentatives: {attempts}, ID OEDB: {oedb_id}) : {link}")
logger.info(f"Liens d'événements trouvés : {len(event_links)}")
logger.info(f"Événements déjà traités avec succès : {len(success_events)}")
@@ -766,11 +776,17 @@ def main(max_events=1, offset=0):
if event:
# Tenter de soumettre l'événement à l'API
- if submit_event(event):
+ submit_success, oedb_event_id = submit_event(event)
+ if submit_success:
success_count += 1
event_cache[event_link]['status'] = 'success'
event_cache[event_link]['inserted_at'] = datetime.now().isoformat()
- logger.success(f"Événement inséré avec succès : {event_link}")
+ # Sauvegarder l'ID de l'événement OEDB dans le cache
+ if oedb_event_id:
+ event_cache[event_link]['oedb_event_id'] = oedb_event_id
+ logger.success(f"Événement inséré avec succès (ID OEDB: {oedb_event_id}) : {event_link}")
+ else:
+ logger.success(f"Événement inséré avec succès (ID OEDB non disponible) : {event_link}")
else:
event_cache[event_link]['status'] = 'failed'
logger.warning(f"Échec de l'insertion de l'événement : {event_link}")
diff --git a/oedb/resources/demo.py b/oedb/resources/demo.py
index 492252b..c67ac72 100644
--- a/oedb/resources/demo.py
+++ b/oedb/resources/demo.py
@@ -66,7 +66,7 @@ class DemoResource:
template = self.jinja_env.get_template('edit.html')
html = template.render(
id=id,
- event_data=json.dumps(event_data)
+ event_data=event_data
)
# Set the response body and status
@@ -404,5 +404,64 @@ class DemoResource:
resp.status = falcon.HTTP_500
resp.text = f"Error: {str(e)}"
+ def on_get_property_stats(self, req, resp):
+ """
+ Handle GET requests to the /demo/property-stats endpoint.
+ Returns an HTML page with statistics about property occurrences in the last 200 events.
+
+ Args:
+ req: The request object.
+ resp: The response object.
+ """
+ logger.info("Processing GET request to /demo/property-stats")
+
+ try:
+ # Set content type to HTML
+ resp.content_type = 'text/html'
+
+ # Fetch the last 200 events from the API
+ try:
+ response = requests.get('https://api.openeventdatabase.org/event?limit=200')
+ if response.status_code == 200 and response.text:
+ events_data = response.json()
+ else:
+ logger.error(f"Error fetching events: Status code {response.status_code}")
+ events_data = {"features": []}
+ except Exception as e:
+ logger.error(f"Error fetching events: {e}")
+ events_data = {"features": []}
+
+ # Count property occurrences
+ property_counts = {}
+ total_events = len(events_data.get('features', []))
+
+ for feature in events_data.get('features', []):
+ properties = feature.get('properties', {})
+ for prop_name in properties.keys():
+ if prop_name in property_counts:
+ property_counts[prop_name] += 1
+ else:
+ property_counts[prop_name] = 1
+
+ # Sort properties by occurrence count (descending order)
+ sorted_properties = sorted(property_counts.items(), key=lambda x: x[1], reverse=True)
+
+ # Render the template
+ template = self.jinja_env.get_template('property_stats.html')
+ html = template.render(
+ property_stats=sorted_properties,
+ total_events=total_events,
+ unique_properties=len(sorted_properties)
+ )
+
+ # Set the response body and status
+ resp.text = html
+ resp.status = falcon.HTTP_200
+ logger.success("Successfully processed GET request to /demo/property-stats")
+ except Exception as e:
+ logger.error(f"Error processing GET request to /demo/property-stats: {e}")
+ resp.status = falcon.HTTP_500
+ resp.text = f"Error: {str(e)}"
+
# Create a global instance of DemoResource
demo = DemoResource()
\ No newline at end of file
diff --git a/oedb/resources/demo/demo_main.py b/oedb/resources/demo/demo_main.py
index 45d6c71..f16521b 100644
--- a/oedb/resources/demo/demo_main.py
+++ b/oedb/resources/demo/demo_main.py
@@ -297,6 +297,7 @@ class DemoMainResource: