diff --git a/backend.py b/backend.py
index 0382593..db827f2 100644
--- a/backend.py
+++ b/backend.py
@@ -29,6 +29,7 @@ from oedb.resources.live import live
from oedb.resources.rss import rss_latest, rss_by_family
from oedb.resources.event_form import event_form
from oedb.resources.db_dump import db_dump_list, db_dump_create
+from oedb.resources.quality_assurance import quality_assurance
def create_app():
"""
@@ -84,6 +85,7 @@ def create_app():
app.add_route('/event/{id}', event) # Handle single event requests
app.add_route('/event', event) # Handle event collection requests
app.add_route('/stats', stats) # Handle stats requests
+ app.add_route('/quality_assurance', quality_assurance) # Handle quality assurance requests
app.add_route('/demo', demo) # Handle demo page requests
app.add_route('/demo/add', event_form) # Handle event submission form
app.add_route('/demo/by-what', demo, suffix='by_what') # Handle events by type page
@@ -94,6 +96,7 @@ def create_app():
app.add_route('/demo/traffic', demo, suffix='traffic') # Handle traffic jam reporting page
app.add_route('/demo/view-events', demo, suffix='view_events') # Handle view saved events page
app.add_route('/demo/stats', demo_stats) # Handle stats by what page
+ app.add_route('/demo/property-stats', demo, suffix='property_stats') # Handle property statistics page
app.add_route('/demo/live', live) # Live page
app.add_route('/rss', rss_latest) # RSS latest 200
app.add_route('/rss/by/{family}', rss_by_family) # RSS by family
diff --git a/oedb/resources/demo/demo_main.py b/oedb/resources/demo/demo_main.py
index f16521b..31f0ffe 100644
--- a/oedb/resources/demo/demo_main.py
+++ b/oedb/resources/demo/demo_main.py
@@ -487,19 +487,25 @@ class DemoMainResource:
const properties = feature.properties;
// Extraire les informations principales
- const title = properties.title || 'Événement sans titre';
+ const title = properties.label || properties.title || 'Événement sans titre';
const what = properties.what || 'Non spécifié';
const when = properties.when ? formatDate(properties.when) : 'Date inconnue';
const description = properties.description || 'Aucune description disponible';
- // Créer le HTML de la popup
+ // Créer le HTML de la popup avec titre cliquable pour édition
+ const editLink = properties.id ? `/demo/edit/${properties.id}` : '#';
+
return `
`;
}
@@ -786,7 +792,9 @@ class DemoMainResource:
// Create popup content
let popupContent = '
diff --git a/oedb/resources/demo/templates/partials/demo_nav.html b/oedb/resources/demo/templates/partials/demo_nav.html
index d96ee0b..32420a4 100644
--- a/oedb/resources/demo/templates/partials/demo_nav.html
+++ b/oedb/resources/demo/templates/partials/demo_nav.html
@@ -23,4 +23,3 @@
}
});
-
diff --git a/oedb/resources/demo/templates/traffic.html b/oedb/resources/demo/templates/traffic.html
index 5f72871..e077091 100644
--- a/oedb/resources/demo/templates/traffic.html
+++ b/oedb/resources/demo/templates/traffic.html
@@ -12,6 +12,7 @@
+
@@ -187,11 +188,6 @@
-
- GPS: inconnu
diff --git a/oedb/resources/event_form.py b/oedb/resources/event_form.py
index 9cf4246..48c2fe3 100644
--- a/oedb/resources/event_form.py
+++ b/oedb/resources/event_form.py
@@ -38,6 +38,7 @@ class EventFormResource:
+
+
+
+
+
+
+
+ Contrôle Qualité des Événements
+
+
+ Analyse des 1000 derniers événements pour détecter les problèmes divers
+
+
+
+
+
+
Filtres
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Total événements problématiques: """ + str(len(problematic_events)) + """
+ """
+
+ for issue_type, count in sorted(issue_counts.items(), key=lambda x: x[1], reverse=True):
+ issue_label = issue_type.replace('_', ' ').title()
+ html += f"
{issue_label}: {count}
"
+
+ html += """
+
+
+
+
+
+
+
+ """
+
+ # Add events
+ for event in problematic_events:
+ properties = event.get('properties', {})
+ event_title = properties.get('label', properties.get('name', f'Événement #{event["id"]}'))
+ event_what = properties.get('what', 'Non spécifié')
+
+ # Get severity classes for the card
+ max_severity = 'low'
+ for issue in event['issues']:
+ if issue['severity'] == 'high':
+ max_severity = 'high'
+ break
+ elif issue['severity'] == 'medium' and max_severity == 'low':
+ max_severity = 'medium'
+
+ html += f"""
+
+
+
+
+
+
{event_title}
+
+ Type: {event_what} |
+ Coordonnées:
+ {event.get('latitude', 'N/A')}, {event.get('longitude', 'N/A')}
+
+
+
+
+
+
+
+
+
Problèmes détectés:
+
+ """
+
+ for issue in event['issues']:
+ severity_icon = {
+ 'high': '🔴',
+ 'medium': '🟡',
+ 'low': '🟢'
+ }.get(issue['severity'], '⚪')
+
+ html += f"""
+ -
+ {severity_icon} {issue['type'].replace('_', ' ').title()}:
+ {issue['description']}
+
+ """
+
+ html += """
+
+
+
+
+
+ Créé: """ + str(event.get('createdate', 'N/A')) + """ |
+ Modifié: """ + str(event.get('lastupdate', 'N/A')) + """
+
+
+
+
+ """
+
+ if not problematic_events:
+ html += """
+
+
+ Aucun problème détecté dans les 1000 derniers événements ! 🎉
+
+ """
+
+ html += """
+
+
+
+
+
+
+
+
+