SIENTIAPDE-1172
feat: enhance orchestrator activities with new email and Postgres integrations - Added Email and Postgres classes to the Activities class for improved functionality. - Introduced new methods in MongoDB and SlotManager for loading and managing data. - Updated requirements.txt to include jinja2. - Added new formatting activity for log reports in Formatters class. - Enhanced test coverage for MongoDB and SlotManager activities.
This commit is contained in:
75
orchestrator/utils/email_builder.py
Normal file
75
orchestrator/utils/email_builder.py
Normal file
@@ -0,0 +1,75 @@
|
||||
import json
|
||||
from sientia_do.temporal.utils.logger import Logger
|
||||
from sientia_do.notifications.models import NotificationLevel
|
||||
from jinja2 import Template
|
||||
import re
|
||||
|
||||
|
||||
class EmailBuilder:
|
||||
def __init__(self, logger: Logger):
|
||||
self.logger = logger
|
||||
|
||||
self.report_template_file = './orchestrator/utils/templates/email_template.html'
|
||||
self.general_template_file = './orchestrator/utils/templates/general_template.html'
|
||||
|
||||
self.tag_template_file = './orchestrator/utils/templates/opc_tag_report_template.html'
|
||||
self.opc_template_file = './orchestrator/utils/templates/opc_connection_report_template.html'
|
||||
|
||||
self.partition_manager_template_file = './orchestrator/utils/templates/partition_manager_report_template.html'
|
||||
|
||||
with open(self.report_template_file, 'r') as file:
|
||||
self.report_template = file.read()
|
||||
with open(self.general_template_file, 'r') as file:
|
||||
self.general_template = file.read()
|
||||
|
||||
def replace_parameters(self, template: str, parameters: dict) -> str:
|
||||
# Criar um template Jinja2
|
||||
template = Template(template)
|
||||
|
||||
return template.render(parameters)
|
||||
|
||||
def parameters(self, report_data: dict, general_events: dict, mail_type: str) -> dict:
|
||||
return {
|
||||
'project_name': report_data[0]['project'],
|
||||
'mail_type': mail_type,
|
||||
'error_events': self.replace_parameters(self.general_template,
|
||||
general_events['ERROR']) if general_events['ERROR']['models'] else '',
|
||||
'warning_events': self.replace_parameters(self.general_template,
|
||||
general_events['WARNING']) if general_events['WARNING']['models'] else '',
|
||||
'info_events': self.replace_parameters(self.general_template,
|
||||
general_events['INFO']) if general_events['INFO']['models'] else '',
|
||||
}
|
||||
|
||||
def build_email(self, report_data: list[dict], mail_type: str) -> str:
|
||||
"""
|
||||
Builds the email html.
|
||||
"""
|
||||
general_events = {}
|
||||
|
||||
for report in report_data:
|
||||
|
||||
level = report['level']
|
||||
model_name = report['model_name']
|
||||
|
||||
if level not in general_events:
|
||||
general_events[level] = {
|
||||
'section_name': f'{level.capitalize()}s detected:',
|
||||
'models': {}
|
||||
}
|
||||
|
||||
if model_name not in general_events[level]['models']:
|
||||
general_events[level]['models'][model_name] = {
|
||||
'model_name': model_name,
|
||||
'events': []
|
||||
}
|
||||
|
||||
general_events[level]['models'][model_name]['events'].append(
|
||||
report)
|
||||
|
||||
print(general_events)
|
||||
for _type, content in general_events.items():
|
||||
content['models'] = list(content['models'].values())
|
||||
|
||||
return self.replace_parameters(self.report_template, self.parameters(
|
||||
report_data, general_events, mail_type
|
||||
))
|
||||
24
orchestrator/utils/templates/email_template.html
Normal file
24
orchestrator/utils/templates/email_template.html
Normal file
@@ -0,0 +1,24 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="pt-BR">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>SIENTIA™ Report</title>
|
||||
<style>
|
||||
body { font-family: Arial, sans-serif; margin: 0; padding: 20px; }
|
||||
h1, h2 { color: #333; }
|
||||
table { width: 100%; border-collapse: collapse; margin-top: 20px; }
|
||||
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
|
||||
th { background-color: #f4f4f4; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>SIENTIA™ {{ mail_type }}</h1>
|
||||
|
||||
{{ error_events }}
|
||||
{{ warning_events }}
|
||||
{{ info_events }}
|
||||
|
||||
{{ special_events }}
|
||||
</body>
|
||||
</html>
|
||||
24
orchestrator/utils/templates/general_template.html
Normal file
24
orchestrator/utils/templates/general_template.html
Normal file
@@ -0,0 +1,24 @@
|
||||
<h3>{{ section_name }}</h3>
|
||||
{% for model in models %}
|
||||
<h4>Model: <span>{{ model.model_name }}</span></h4>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Notification ID</th>
|
||||
<th>Block</th>
|
||||
<th>Timestamp</th>
|
||||
<th>Message</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for event in model.events %}
|
||||
<tr>
|
||||
<td>{{ event.notification_id }}</td>
|
||||
<td>{{ event.block }}</td>
|
||||
<td>{{ event.timestamp }}</td>
|
||||
<td>{{ event.message }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% endfor %}
|
||||
Reference in New Issue
Block a user