Files
TDI-Dashboard/Tool/pages.py
T
2026-05-13 11:06:48 +02:00

168 lines
6.4 KiB
Python

from .config import _state, _access_log, DbType
from .renderer import _base, _card, _page_css, _page_js, _tmpl
from .queries.db import e as _e, query as _query
from .queries import processes as q_processes
from .queries import pec as q_pec
from .queries import logs as q_logs
from .queries import report as q_report
from .queries import documenti as q_documenti
from .queries import iscrizioni as q_iscrizioni
from .queries import email as q_email
def _load_data(db_path: str) -> dict:
db_type = _state.get('db_type', 'unknown')
if db_type == DbType.INTRAZ:
middle_stats = {**q_iscrizioni.get_stats(db_path), **q_email.get_stats(db_path)}
else:
middle_stats = q_pec.get_stats(db_path)
stats = {
**q_processes.get_stats(db_path),
**middle_stats,
**q_logs.get_stats(db_path),
}
return {
'processes': q_processes.get_processes(db_path),
'pec': [] if db_type == DbType.INTRAZ else q_pec.get_pec(db_path),
'logs': q_logs.get_logs(db_path),
'stats': stats,
}
def _page_dashboard(db_path: str) -> str:
s = _load_data(db_path)['stats']
db_type = _state.get('db_type', 'unknown')
cards_runs = (
_card("Run totali", s['total_runs'])
+ _card("Completati", s['completed_runs'], '#16a34a')
+ _card("Incompleti", s['total_runs'] - s['completed_runs'], '#dc2626')
)
cards_logs = (
_card("Errori", s['log_errors'], '#dc2626')
+ _card("Warning", s['log_warnings'], '#d97706')
)
if db_type == DbType.INTRAZ:
cards_middle = (
_card("Corsi totali", s.get('isc_total', 0))
+ _card("Completati", s.get('isc_ok', 0), '#16a34a')
+ _card("Con errore", s.get('isc_errore', 0), '#dc2626')
+ _card("In corso", s.get('isc_pending', 0), '#d97706')
)
cards_email = (
_card("Email totali", s.get('email_total', 0))
+ _card("Inviate", s.get('email_inviata', 0), '#16a34a')
+ _card("Pending", s.get('email_pending', 0), '#d97706')
+ _card("Errori", s.get('email_errore', 0), '#dc2626')
)
section_middle = (
'<section>'
'<h2><a href="/iscrizioni" class="sec-link">&#128203; Corsi Intraziendali</a></h2>'
f'<div class="grid">{cards_middle}</div>'
'</section>'
'<section>'
'<h2><a href="/email" class="sec-link">&#9993; Email</a></h2>'
f'<div class="grid">{cards_email}</div>'
'</section>'
)
else:
cards_middle = (
_card("PEC totali", s.get('total_pec', 0))
+ _card("Inviate", s.get('pec_inviato', 0), '#16a34a')
+ _card("Pending", s.get('pec_pending', 0), '#d97706')
+ _card("Errori", s.get('pec_errore', 0), '#dc2626')
)
section_middle = (
'<section>'
'<h2><a href="/pec" class="sec-link">&#9993; Comunicazioni PEC</a></h2>'
f'<div class="grid">{cards_middle}</div>'
'</section>'
)
content = _tmpl('dashboard.html').substitute(
cards_runs=cards_runs, section_middle=section_middle, cards_logs=cards_logs
)
return _base('Dashboard', content, 'nav_dashboard', db_path, _page_css('dashboard'), _page_js('dashboard'))
def _page_runs(db_path: str) -> str:
content = _tmpl('runs.html').substitute(
tbl_processes=q_processes.render_table(q_processes.get_processes(db_path))
)
return _base('Processi', content, 'nav_runs', db_path, _page_css('runs'), _page_js('runs'))
def _page_pec(db_path: str) -> str:
content = _tmpl('pec.html').substitute(
tbl_pec=q_pec.render_table(q_pec.get_pec(db_path))
)
return _base('PEC', content, 'nav_pec', db_path, _page_css('pec'), _page_js('pec'))
def _page_logs(db_path: str, run_id: int = None) -> str:
logs = q_logs.get_logs(db_path)
pagination = (
'<div class="log-pagination">'
'<div id="filter-process-names" class="pg-process-filter"></div>'
'</div>'
)
content = _tmpl('logs.html').substitute(
run_info='',
pagination=pagination,
tbl_logs=q_logs.render_table(logs),
)
return _base('Log DB', content, 'nav_logs', db_path, _page_css('logs'), _page_js('logs'))
def _page_report(db_path: str) -> str:
rows = q_report.get_report(db_path)
content = _tmpl('report.html').substitute(
tbl_report=q_report.render_table(rows)
)
return _base('Report', content, 'nav_report', db_path, _page_css('report'), _page_js('report'))
def _page_documenti(db_path: str) -> str:
rows = q_documenti.get_documenti(db_path)
content = _tmpl('documenti.html').substitute(
sessions_html=q_documenti.render_page(rows)
)
return _base('Documenti', content, 'nav_documenti', db_path, _page_css('documenti'), _page_js('documenti'))
def _page_iscrizioni(db_path: str) -> str:
rows = q_iscrizioni.get_corsi(db_path)
content = _tmpl('iscrizioni.html').substitute(
tbl_iscrizioni=q_iscrizioni.render_table(rows),
)
return _base('Corsi Intraziendali', content, 'nav_iscrizioni', db_path, _page_css('iscrizioni'), _page_js('iscrizioni'))
def _page_email(db_path: str) -> str:
rows = q_email.get_email(db_path)
content = _tmpl('email.html').substitute(
tbl_email=q_email.render_table(rows)
)
return _base('Email', content, 'nav_email', db_path, _page_css('email'), _page_js('email'))
def _page_server_logs(db_path: str) -> str:
rows = ''.join(
f'<tr>'
f'<td>{_e(entry["ts"])}</td><td>{_e(entry["method"])}</td><td>{_e(entry["path"])}</td>'
f'<td style="color:{"#16a34a" if entry["code"] < 400 else "#d97706" if entry["code"] < 500 else "#dc2626"};font-weight:600">{entry["code"]}</td>'
f'<td>{_e(entry["client"])}</td>'
f'</tr>'
for entry in reversed(_access_log)
)
table = (
'<table><thead><tr>'
'<th>Timestamp</th><th>Method</th><th>Path</th><th>Status</th><th>Client</th>'
'</tr></thead><tbody>'
+ (rows or '<tr><td colspan=5 class="empty">Nessuna richiesta ancora.</td></tr>')
+ '</tbody></table>'
)
content = f'<section><h2>Accessi HTTP (ultimi 200)</h2><div class="tw">{table}</div></section>'
return _base('Server Logs', content, '', db_path, _page_css('server-logs'))