toy-intelligence / ui /format.py
dwb2023's picture
ensuree rows returned from sqlite are dictionary objects not tuples
e8a087b
# ui/format.py
from string import Template
class ResultFormatter:
@staticmethod
def format_entity_list(entities, entity_type):
items = entities.get(entity_type, [])
if not items:
return '<li>None detected</li>'
return ''.join(f'<li>{item}</li>' for item in items)
@staticmethod
def format_entity_relationships(relationships):
if not relationships:
return ''
items = []
for rel in relationships:
# Use correct SQL column names
item = f"""
<li class="mb-2">
<strong>{rel['source_text']}</strong> &rarr;
<span class="text-blue-600">{rel['relationship_type'].replace('_to_', ' to ')}</span> &rarr;
<strong>{rel['target_text']}</strong>
<br/>
<small class="text-gray-600">Confidence: {int(rel['confidence'] * 100)}%</small>
</li>
"""
items.append(item)
return ''.join(items)
@staticmethod
def format_related_events(events):
if not events:
return ''
items = []
for event in events:
shared = f" | Shared Entities: {event['shared_entities']}" if event.get('shared_entities') else ''
item = f"""
<li class="mb-2">
<div class="flex justify-between items-center">
<div>{event['text']}</div>
<div class="text-sm text-gray-600">
{event['timestamp']} |
Confidence: {int(event['confidence'] * 100)}%{shared}
</div>
</div>
</li>
"""
items.append(item)
return ''.join(items)
@staticmethod
def format_results(analysis_result):
if "error" in analysis_result:
return f"<div style='color: red'>Error: {analysis_result['error']}</div>"
# Load template
with open('templates/results.html', 'r') as f:
template = Template(f.read())
# Prepare template variables
confidence = analysis_result['confidence']
confidence_class = "confidence-high" if confidence >= 0.6 else "confidence-low"
return template.substitute(
confidence_class=confidence_class,
confidence_score=int(confidence * 100),
verification_warning=ResultFormatter._verification_warning(analysis_result),
people_list=ResultFormatter.format_entity_list(analysis_result['entities'], 'people'),
org_list=ResultFormatter.format_entity_list(analysis_result['entities'], 'organizations'),
location_list=ResultFormatter.format_entity_list(analysis_result['entities'], 'locations'),
temporal_list=ResultFormatter.format_entity_list(analysis_result['entities'], 'temporal'),
hashtag_list=ResultFormatter.format_entity_list(analysis_result['entities'], 'hashtags'),
entity_relationships=ResultFormatter.format_entity_relationships(analysis_result.get('entity_relationships')),
validation_success=ResultFormatter._validation_success(analysis_result),
related_events=ResultFormatter.format_related_events(analysis_result.get('related_events')),
base_confidence=int(confidence * 70),
entity_boost=int((confidence - 0.7 if confidence > 0.7 else 0) * 100),
types_detected=len([t for t in ['people', 'organizations', 'locations', 'temporal', 'hashtags']
if analysis_result['entities'].get(t)]),
total_entities=sum(len(e) for e in analysis_result['entities'].values() if isinstance(e, list)),
direct_relationships=len(analysis_result.get('entity_relationships', [])),
related_event_count=len(analysis_result.get('related_events', []))
)
@staticmethod
def _verification_warning(result):
if not result["verification_needed"]:
return ''
return '''
<div class="alert-warning">
&#9888; <strong>Verification Required:</strong> Low confidence score detected. Please verify the extracted information.
</div>
'''
@staticmethod
def _validation_success(result):
if result["verification_needed"]:
return ''
return '''
<div class="alert-success mt-4">
&#9989; <strong>Event Validated:</strong> The extracted information meets confidence thresholds.
</div>
'''