start:utils:cockpit:p1:cpu:criticity
Table of Contents
Ticket Criticity
Comme l'on pourrait sélectionner autre chose que des P1, ce menu permet d'indiquer la criticité des différentes priorités sélectionnées.
WebCriticity.py
- WebCriticity.py
# WebCriticity.py import PersistentData import CockpitITSM def init_criticity_interface(ui): """ Registers the bridge between Criticity.html and Python logic. Allows assigning a criticity level to each selected ticket priority. Criticity values: 1 = VERY_HIGH 2 = HIGH 3 = MEDIUM 4 = LOW 5 = INFORMATION """ def handle_get_ticket_criticity(_, __): """Syncs with API then returns ticket priorities with their criticity from DB.""" success = CockpitITSM.update_ticket_priorities() if not success: ui.send_message("criticity_response", { "success": False, "message": "Failed to refresh ticket priorities. Check API configuration." }) return priorities = PersistentData.get_ticket_priorities_with_criticity() ui.send_message("criticity_data", {"priorities": priorities}) def handle_save_ticket_criticity(_, data): """Persists the criticity level for each ticket priority.""" try: priorities = data.get("priorities", []) for p in priorities: criticity = int(p.get("criticity", 0)) # Clamp to valid range 0–5 criticity = max(0, min(5, criticity)) PersistentData.db.update( "objects", {"criticity": criticity}, condition=f"id = {p['id']} AND subType = '{p['subType']}'" ) print(f"DEBUG: Saved criticity for {len(priorities)} ticket priorities.") ui.send_message("criticity_response", { "success": True, "message": f"Criticity saved ({len(priorities)} priorities)." }) except Exception as e: print(f"ERROR saving ticket criticity: {str(e)}") ui.send_message("criticity_response", { "success": False, "message": f"Save error: {str(e)}" }) # Registering the handlers ui.on_message("get_ticket_criticity", handle_get_ticket_criticity) ui.on_message("save_ticket_criticity", handle_save_ticket_criticity)
Criticity.html
- Criticity.html
# WebCriticity.py import PersistentData import CockpitITSM def init_criticity_interface(ui): """ Registers the bridge between Criticity.html and Python logic. Allows assigning a criticity level to each selected ticket priority. Criticity values: 1 = VERY_HIGH 2 = HIGH 3 = MEDIUM 4 = LOW 5 = INFORMATION """ def handle_get_ticket_criticity(_, __): """Syncs with API then returns ticket priorities with their criticity from DB.""" success = CockpitITSM.update_ticket_priorities() if not success: ui.send_message("criticity_response", { "success": False, "message": "Failed to refresh ticket priorities. Check API configuration." }) return priorities = PersistentData.get_ticket_priorities_with_criticity() ui.send_message("criticity_data", {"priorities": priorities}) def handle_save_ticket_criticity(_, data): """Persists the criticity level for each ticket priority.""" try: priorities = data.get("priorities", []) for p in priorities: criticity = int(p.get("criticity", 0)) # Clamp to valid range 0–5 criticity = max(0, min(5, criticity)) PersistentData.db.update( "objects", {"criticity": criticity}, condition=f"id = {p['id']} AND subType = '{p['subType']}'" ) print(f"DEBUG: Saved criticity for {len(priorities)} ticket priorities.") ui.send_message("criticity_response", { "success": True, "message": f"Criticity saved ({len(priorities)} priorities)." }) except Exception as e: print(f"ERROR saving ticket criticity: {str(e)}") ui.send_message("criticity_response", { "success": False, "message": f"Save error: {str(e)}" }) # Registering the handlers ui.on_message("get_ticket_criticity", handle_get_ticket_criticity) ui.on_message("save_ticket_criticity", handle_save_ticket_criticity)
app_criticity.js
- app_criticity.js
// app_criticity.js const socket = io(); // Criticity levels mapping const CRITICITY_LEVELS = [ { value: 0, label: "0 - (undefined)" }, { value: 1, label: "1 - VERY_HIGH" }, { value: 2, label: "2 - HIGH" }, { value: 3, label: "3 - MEDIUM" }, { value: 4, label: "4 - LOW" }, { value: 5, label: "5 - INFORMATION" } ]; // ── Socket events ───────────────────────────────────────────────────────────── socket.on("connect", () => { console.log("Connected to server"); setStatus("Loading ticket priorities...", null); socket.emit("get_ticket_criticity", {}); }); socket.on("connect_error", (err) => { console.error("Connection error:", err); setStatus("Connection error. Please reload.", false); }); socket.on("criticity_data", function(data) { renderCriticityList(data.priorities || []); setStatus("", null); }); socket.on("criticity_response", function(data) { setStatus(data.message, data.success); }); // ── Actions ─────────────────────────────────────────────────────────────────── function saveCriticity() { const selects = document.querySelectorAll(".criticity-select"); const priorities = Array.from(selects).map(sel => ({ id: parseInt(sel.dataset.id), subType: sel.dataset.subtype, criticity: parseInt(sel.value) })); if (priorities.length === 0) { setStatus("No priorities to save.", false); return; } setStatus("Saving...", null); socket.emit("save_ticket_criticity", { priorities: priorities }); } // ── Rendering ───────────────────────────────────────────────────────────────── function renderCriticityList(priorities) { const container = document.getElementById("criticityList"); if (priorities.length === 0) { container.innerHTML = '<div class="criticity-list-empty">No ticket priorities found.</div>'; return; } container.innerHTML = priorities.map(p => { const selectId = `criticity_${p.id}_${escapeAttr(p.subType)}`; const options = CRITICITY_LEVELS.map(level => `<option value="${level.value}" ${p.criticity === level.value ? "selected" : ""}>${escapeHtml(level.label)}</option>` ).join(""); return ` <div class="criticity-item"> <label for="${selectId}">${escapeHtml(p.subType)} / ${escapeHtml(p.reference)}</label> <select class="criticity-select" id="${selectId}" data-id="${p.id}" data-subtype="${escapeAttr(p.subType)}" data-value="${p.criticity}" onchange="updateSelectColor(this)" >${options}</select> </div> `; }).join(""); // Apply colors on initial render document.querySelectorAll(".criticity-select").forEach(updateSelectColor); } function updateSelectColor(sel) { sel.dataset.value = sel.value; } // ── Helpers ─────────────────────────────────────────────────────────────────── function setStatus(message, success) { const el = document.getElementById("statusMessage"); el.innerText = message; if (success === true) el.style.color = "#4db6ac"; else if (success === false) el.style.color = "#e57373"; else el.style.color = "#bb86fc"; } function escapeHtml(str) { return String(str) .replace(/&/g, "&") .replace(/</g, "<") .replace(/>/g, ">") .replace(/"/g, """); } function escapeAttr(str) { return String(str).replace(/[^a-zA-Z0-9_-]/g, "_"); }
start/utils/cockpit/p1/cpu/criticity.txt · Last modified: by admin_wiki
