gmao/app_new/outlook/location_extractor.py
2026-08-14 16:02:25 +00:00

99 lines
No EOL
2.8 KiB
Python

"""
Extraction de salle/zone depuis le texte - GMAO College
Parse le corps des emails/messages pour identifier les salles mentionnees.
"""
import re
from ..extensions import db
from ..core.models.college import Room, Building
def extract_rooms_from_text(text):
"""Cherche des noms de salles dans le texte et retourne les Rooms correspondantes.
Strategie :
1. Chercher des patterns comme "salle B01", "B01", "couloir", "cour", etc.
2. Fuzzy match avec les noms de salles en DB
3. Retourne une liste de Room objects
"""
if not text:
return []
text_lower = text.lower()
rooms = Room.query.all()
matched = []
for room in rooms:
if not room.name:
continue
room_name_lower = room.name.lower()
# Match exact ou partiel
if room_name_lower in text_lower:
matched.append(room)
continue
# Match par code si la salle a un code
if hasattr(room, 'code') and room.code:
if room.code.lower() in text_lower:
matched.append(room)
continue
# Dedoublonner
seen_ids = set()
unique = []
for r in matched:
if r.id not in seen_ids:
unique.append(r)
seen_ids.add(r.id)
return unique
def extract_zone_from_text(text):
"""Cherche des zones mentionnees (cour, couloir, batiment A, etc.)."""
if not text:
return []
text_lower = text.lower()
buildings = Building.query.all()
matched = []
for b in buildings:
if not b.name:
continue
if b.name.lower() in text_lower:
matched.append(b)
# Patterns communs
common_zones = ['cour', 'couloir', 'gymnase', 'cantine', 'cdi', 'salle des professeurs',
'chaufferie', 'garage', 'atelier', 'preau']
for zone in common_zones:
if zone in text_lower:
matched.append(type('Zone', (), {'name': zone.capitalize(), 'id': None})())
return matched
def enrich_interpretation_with_location(text, suggested_location=None, suggested_equipment=None):
"""Complete les informations de localisation manquantes depuis le texte.
Si l'IA n'a pas trouve la salle, on cherche dans le texte.
"""
result = {
'rooms': [],
'zones': [],
'location': suggested_location or '',
}
# Si pas de location suggeree, chercher dans le texte
if not suggested_location:
rooms = extract_rooms_from_text(text)
if rooms:
result['rooms'] = [{'id': r.id, 'name': r.name} for r in rooms]
result['location'] = rooms[0].name
zones = extract_zone_from_text(text)
if zones:
result['zones'] = [z.name for z in zones]
if not result['location']:
result['location'] = zones[0].name
return result