Files
bakery-ia/services/production/migrate_to_raw_alerts.py

251 lines
11 KiB
Python

#!/usr/bin/env python3
"""
Migration script to update production service to send raw alerts
"""
import re
# Read the file
with open('app/services/production_alert_service.py', 'r') as f:
content = f.read()
# Pattern 1: Replace order_overload template usage (line 130-147)
pattern1 = r''' template_data = self\.format_spanish_message\(
'order_overload',
percentage=int\(percentage - 100\)
\)
await self\.publish_item\(tenant_id, \{
'type': 'severe_capacity_overload',
'severity': 'urgent',
'title': template_data\['title'\],
'message': template_data\['message'\],
'actions': template_data\['actions'\],'''
replacement1 = ''' await self.publish_item(tenant_id, {
'type': 'severe_capacity_overload',
'severity': 'urgent',
'title': 'Raw Alert - Will be enriched',
'message': 'Raw Alert - Will be enriched',
'actions': [],'''
content = content.replace(pattern1, replacement1)
# Pattern 2: Replace production_delay template usage (line 231-242)
pattern2 = r''' template_data = self\.format_spanish_message\(
'production_delay',
batch_name=f"\{delay\['product_name'\]\} #\{delay\['batch_number'\]\}",
delay_minutes=int\(delay_minutes\)
\)
await self\.publish_item\(delay\['tenant_id'\], \{
'type': 'production_delay',
'severity': severity,
'title': template_data\['title'\],
'message': template_data\['message'\],
'actions': template_data\['actions'\],'''
replacement2 = ''' await self.publish_item(delay['tenant_id'], {
'type': 'production_delay',
'severity': severity,
'title': 'Raw Alert - Will be enriched',
'message': 'Raw Alert - Will be enriched',
'actions': [],'''
content = content.replace(pattern2, replacement2)
# Add batch_name to metadata for production_delay
content = content.replace(
''' 'metadata': {
'batch_id': str(delay['id']),
'product_name': delay['product_name'],
'batch_number': delay['batch_number'],
'delay_minutes': delay_minutes,''',
''' 'metadata': {
'batch_id': str(delay['id']),
'batch_name': f"{delay['product_name']} #{delay['batch_number']}",
'product_name': delay['product_name'],
'batch_number': delay['batch_number'],
'delay_minutes': delay_minutes,'''
)
# Pattern 3: Replace equipment_failure template usage (line 370-380)
pattern3 = r''' template_data = self\.format_spanish_message\(
'equipment_failure',
equipment_name=equipment\['name'\]
\)
await self\.publish_item\(equipment\['tenant_id'\], \{
'type': 'equipment_failure',
'severity': 'urgent',
'title': template_data\['title'\],
'message': template_data\['message'\],
'actions': template_data\['actions'\],'''
replacement3 = ''' await self.publish_item(equipment['tenant_id'], {
'type': 'equipment_failure',
'severity': 'urgent',
'title': 'Raw Alert - Will be enriched',
'message': 'Raw Alert - Will be enriched',
'actions': [],'''
content = content.replace(pattern3, replacement3)
# Pattern 4: Replace maintenance_required template usage (line 392-403)
pattern4 = r''' template_data = self\.format_spanish_message\(
'maintenance_required',
equipment_name=equipment\['name'\],
days_until_maintenance=max\(0, int\(days_to_maintenance\)\) if days_to_maintenance is not None else 3
\)
await self\.publish_item\(equipment\['tenant_id'\], \{
'type': 'maintenance_required',
'severity': severity,
'title': template_data\['title'\],
'message': template_data\['message'\],
'actions': template_data\['actions'\],'''
replacement4 = ''' await self.publish_item(equipment['tenant_id'], {
'type': 'maintenance_required',
'severity': severity,
'title': 'Raw Alert - Will be enriched',
'message': 'Raw Alert - Will be enriched',
'actions': [],'''
content = content.replace(pattern4, replacement4)
# Pattern 5: Replace low_equipment_efficiency template usage (line 415-426)
pattern5 = r''' template_data = self\.format_spanish_message\(
'low_equipment_efficiency',
equipment_name=equipment\['name'\],
efficiency_percent=round\(efficiency, 1\)
\)
await self\.publish_item\(equipment\['tenant_id'\], \{
'type': 'low_equipment_efficiency',
'severity': severity,
'title': template_data\['title'\],
'message': template_data\['message'\],
'actions': template_data\['actions'\],'''
replacement5 = ''' await self.publish_item(equipment['tenant_id'], {
'type': 'low_equipment_efficiency',
'severity': severity,
'title': 'Raw Alert - Will be enriched',
'message': 'Raw Alert - Will be enriched',
'actions': [],'''
content = content.replace(pattern5, replacement5)
# Pattern 6: Replace production_efficiency template usage (line 479-490)
pattern6 = r''' template_data = self\.format_spanish_message\(
'production_efficiency',
suggested_time=f"\{rec\['start_hour'\]:02d\}:00",
savings_percent=efficiency_loss
\)
await self\.publish_item\(tenant_id, \{
'type': 'production_efficiency',
'severity': 'medium',
'title': template_data\['title'\],
'message': template_data\['message'\],
'actions': template_data\['actions'\],'''
replacement6 = ''' await self.publish_item(tenant_id, {
'type': 'production_efficiency',
'severity': 'medium',
'title': 'Raw Alert - Will be enriched',
'message': 'Raw Alert - Will be enriched',
'actions': [],'''
content = content.replace(pattern6, replacement6)
# Add suggested_time to metadata for production_efficiency
content = content.replace(
''' 'metadata': {
'product_name': rec['product_name'],
'avg_production_time': float(rec['avg_production_time']),''',
''' 'metadata': {
'suggested_time': f"{rec['start_hour']:02d}:00",
'product_name': rec['product_name'],
'avg_production_time': float(rec['avg_production_time']),'''
)
# Pattern 7: Replace energy_optimization template usage (line 588-600)
pattern7 = r''' template_data = self\.format_spanish_message\(
'energy_optimization',
start_time=f"\{min_off_peak\['hour_of_day'\]:02d\}:00",
end_time=f"\{min_off_peak\['hour_of_day'\]\+2:02d\}:00",
savings_euros=potential_savings \* 0\.15 # Rough estimate
\)
await self\.publish_item\(tenant_id, \{
'type': 'energy_optimization',
'severity': 'low',
'title': template_data\['title'\],
'message': template_data\['message'\],
'actions': template_data\['actions'\],'''
replacement7 = ''' await self.publish_item(tenant_id, {
'type': 'energy_optimization',
'severity': 'low',
'title': 'Raw Alert - Will be enriched',
'message': 'Raw Alert - Will be enriched',
'actions': [],'''
content = content.replace(pattern7, replacement7)
# Add time and savings to metadata for energy_optimization
content = content.replace(
''' 'metadata': {
'equipment_name': equipment,
'peak_hour': peak_hour_record['hour_of_day'],''',
''' 'metadata': {
'start_time': f"{min_off_peak['hour_of_day']:02d}:00",
'end_time': f"{min_off_peak['hour_of_day']+2:02d}:00",
'savings_euros': round(potential_savings * 0.15, 2),
'equipment_name': equipment,
'peak_hour': peak_hour_record['hour_of_day'],'''
)
# Pattern 8: Replace production_delay in DB handler (line 632-643)
pattern8 = r''' template_data = self\.format_spanish_message\(
'production_delay',
batch_name=f"\{data\['product_name'\]\} #\{data\.get\('batch_number', 'N/A'\)\}",
delay_minutes=data\['delay_minutes'\]
\)
await self\.publish_item\(tenant_id, \{
'type': 'production_delay',
'severity': 'high',
'title': template_data\['title'\],
'message': template_data\['message'\],
'actions': template_data\['actions'\],'''
replacement8 = ''' await self.publish_item(tenant_id, {
'type': 'production_delay',
'severity': 'high',
'title': 'Raw Alert - Will be enriched',
'message': 'Raw Alert - Will be enriched',
'actions': [],'''
content = content.replace(pattern8, replacement8)
# Add batch_name to DB handler metadata
content = content.replace(
''' 'metadata': {
'batch_id': data['batch_id'],
'delay_minutes': data['delay_minutes'],''',
''' 'metadata': {
'batch_id': data['batch_id'],
'batch_name': f"{data['product_name']} #{data.get('batch_number', 'N/A')}",
'delay_minutes': data['delay_minutes'],'''
)
# Write the updated file
with open('app/services/production_alert_service.py', 'w') as f:
f.write(content)
print("Migration complete!")
print("Updated all template usages to send raw data for enrichment")