From dea71fc6b31cf1b04f7c79b1a8a96fc2ad834e5e Mon Sep 17 00:00:00 2001 From: Tykayn Date: Sat, 27 Sep 2025 00:39:18 +0200 Subject: [PATCH] up emoji on demo map --- extractors/osm_cal.py | 44 ++-- oedb/resources/demo.py | 61 ++++- oedb/resources/demo/demo_main.py | 35 ++- oedb/resources/demo/templates/edit.html | 22 +- .../demo/templates/property_stats.html | 177 +++++++++++++ static/edit.js | 232 ++++++++++++++++++ static/map_by_what.js | 29 ++- 7 files changed, 565 insertions(+), 35 deletions(-) create mode 100644 oedb/resources/demo/templates/property_stats.html create mode 100644 static/edit.js 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:

+ Traffic event

+ Any Event

Live

+

📊 Statistiques propriétés

@@ -304,7 +305,7 @@ class DemoMainResource:

-