Add functionality to open current working directory in file explorer

- Implemented a new button in the UI to open the current working directory in the file explorer.
- Added event listener for the new button that triggers an API call to open the directory.
- Included validation to ensure a group is selected and the working directory is set before attempting to open the explorer.
- Created a new JSON description file for the CSharpCodeMerger script group.
This commit is contained in:
Miguel 2025-05-19 18:21:28 +02:00
parent 3975a96395
commit ffabf6b2b0
21 changed files with 3095 additions and 2093 deletions

49
app.py
View File

@ -5,6 +5,7 @@ import os
import json # Added import
from datetime import datetime
import time # Added for shutdown delay
import sys # Added for platform detection
import subprocess # Add this to the imports at the top
# --- Imports for System Tray Icon ---
@ -109,7 +110,10 @@ def execute_script():
@app.route("/")
def index():
script_groups = config_manager.get_script_groups()
return render_template("index.html", script_groups=script_groups)
# Para ordenar una lista de diccionarios, necesitamos especificar una clave.
# Asumimos que cada diccionario tiene una clave 'name' por la cual ordenar.
sorted_script_groups = sorted(script_groups, key=lambda group: group['name'])
return render_template("index.html", script_groups=sorted_script_groups)
@app.route("/api/config/<level>", methods=["GET", "POST"])
@ -391,6 +395,49 @@ def open_miniconda_console():
)
@app.route("/api/open-explorer", methods=["POST"])
def open_explorer_route():
data = request.json
frontend_path = data.get("path")
group = data.get("group")
if not group:
return jsonify({"status": "error", "message": "Grupo no proporcionado."}), 400
if not frontend_path:
return jsonify({"status": "error", "message": "Ruta no proporcionada."}), 400
# Obtener el directorio de trabajo configurado y normalizado para el grupo
configured_work_dir_raw = config_manager.get_work_dir(group)
if not configured_work_dir_raw:
return jsonify({"status": "error", "message": f"No hay directorio de trabajo configurado para el grupo '{group}'."}), 404
configured_work_dir_abs = os.path.abspath(configured_work_dir_raw)
frontend_path_abs = os.path.abspath(frontend_path)
# Validar que la ruta del frontend coincide con la ruta configurada
if configured_work_dir_abs != frontend_path_abs:
print(f"Intento de acceso no válido: Grupo '{group}', Frontend Path '{frontend_path_abs}', Configured Path '{configured_work_dir_abs}'")
return jsonify({"status": "error", "message": "La ruta proporcionada no coincide con el directorio de trabajo seguro para este grupo."}), 403
# Validar que la ruta (ahora sabemos que es la configurada) realmente existe
if not os.path.isdir(configured_work_dir_abs):
return jsonify({"status": "error", "message": f"El directorio de trabajo configurado '{configured_work_dir_abs}' no es un directorio válido o no existe."}), 400
try:
if sys.platform == "win32":
os.startfile(configured_work_dir_abs)
elif sys.platform == "darwin": # macOS
subprocess.Popen(["open", configured_work_dir_abs])
else: # linux variants
subprocess.Popen(["xdg-open", configured_work_dir_abs])
return jsonify({"status": "success", "message": f"Abriendo '{configured_work_dir_abs}' en el explorador."})
except Exception as e:
error_msg = f"Error al abrir el explorador en '{configured_work_dir_abs}': {str(e)}"
print(error_msg)
return jsonify({"status": "error", "message": error_msg}), 500
# --- System Tray Icon Functions ---

View File

@ -0,0 +1,6 @@
{
"name": "Code : 01 : CSharpCodeMerger",
"description": "Sin descripción",
"version": "1.0",
"author": "Unknown"
}

View File

@ -1,5 +1,5 @@
{
"name": "Desempaquetado de Emails EML",
"name": "Emails : Desempaquetado de Emails EML",
"description": "This script processes email files (.eml) into a chronological narrative in Markdown format, optimized for processing with Large Language Models (LLMs). It extracts essential information from emails while removing unnecessary metadata, creating a clean, temporal narrative that can be easily analyzed. ",
"version": "1.0",
"author": "Miguel"

View File

@ -1,33 +1,39 @@
--- Log de Ejecución: x1.py ---
Grupo: EmailCrono
Directorio de Trabajo: C:\Trabajo\SIDEL\10 - E5.007095 - Modifica O&U - SAE463\Reporte\Email
Inicio: 2025-05-09 16:58:28
Fin: 2025-05-09 16:58:29
Duración: 0:00:00.434600
Directorio de Trabajo: C:\Trabajo\SIDEL\12 - SAE052 - Syrup Update & GSD Update\Reporte\Emails
Inicio: 2025-05-18 16:00:44
Fin: 2025-05-18 16:00:44
Duración: 0:00:00.445734
Estado: SUCCESS (Código de Salida: 0)
--- SALIDA ESTÁNDAR (STDOUT) ---
Working directory: C:\Trabajo\SIDEL\10 - E5.007095 - Modifica O&U - SAE463\Reporte\Email
Input directory: C:\Trabajo\SIDEL\10 - E5.007095 - Modifica O&U - SAE463\Reporte\Email
Output directory: C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/04-SIDEL/10 - E5.007095 - Modifica O&U - SAE463
Cronologia file: C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/04-SIDEL/10 - E5.007095 - Modifica O&U - SAE463\cronologia.md
Attachments directory: C:\Trabajo\SIDEL\10 - E5.007095 - Modifica O&U - SAE463\Reporte\Email\adjuntos
Working directory: C:\Trabajo\SIDEL\12 - SAE052 - Syrup Update & GSD Update\Reporte\Emails
Input directory: C:\Trabajo\SIDEL\12 - SAE052 - Syrup Update & GSD Update\Reporte\Emails
Output directory: C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/04-SIDEL/12 - SAE052 - Syrup Update & GSD Update
Cronologia file: C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/04-SIDEL/12 - SAE052 - Syrup Update & GSD Update\cronologia.md
Attachments directory: C:\Trabajo\SIDEL\12 - SAE052 - Syrup Update & GSD Update\Reporte\Emails\adjuntos
Beautify rules file: D:\Proyectos\Scripts\ParamManagerScripts\backend\script_groups\EmailCrono\config\beautify_rules.json
Found 1 .eml files
Found 2 .eml files
Loaded 0 existing messages
Processing C:\Trabajo\SIDEL\10 - E5.007095 - Modifica O&U - SAE463\Reporte\Email\R_ {EXT} E5.006894 - Modifica O&U - SAE463 New Analyzer.eml
Processing C:\Trabajo\SIDEL\12 - SAE052 - Syrup Update & GSD Update\Reporte\Emails\I_ Backup SAE052.eml
Aplicando reglas de prioridad 1
Aplicando reglas de prioridad 2
Aplicando reglas de prioridad 3
Aplicando reglas de prioridad 4
Processing C:\Trabajo\SIDEL\12 - SAE052 - Syrup Update & GSD Update\Reporte\Emails\Parametri Modificati SAE052.eml
Aplicando reglas de prioridad 1
Aplicando reglas de prioridad 2
Aplicando reglas de prioridad 3
Aplicando reglas de prioridad 4
Estadísticas de procesamiento:
- Total mensajes encontrados: 1
- Mensajes únicos añadidos: 1
- Total mensajes encontrados: 2
- Mensajes únicos añadidos: 2
- Mensajes duplicados ignorados: 0
Writing 1 messages to C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/04-SIDEL/10 - E5.007095 - Modifica O&U - SAE463\cronologia.md
Writing 2 messages to C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/04-SIDEL/12 - SAE052 - Syrup Update & GSD Update\cronologia.md
--- ERRORES (STDERR) ---
Ninguno

View File

@ -8,7 +8,7 @@
"cronologia_file": "cronologia.md"
},
"level3": {
"output_directory": "C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/04-SIDEL/10 - E5.007095 - Modifica O&U - SAE463"
"output_directory": "C:/Users/migue/OneDrive/Miguel/Obsidean/Trabajo/VM/04-SIDEL/12 - SAE052 - Syrup Update & GSD Update"
},
"working_directory": "C:\\Trabajo\\SIDEL\\10 - E5.007095 - Modifica O&U - SAE463\\Reporte\\Email"
"working_directory": "C:\\Trabajo\\SIDEL\\12 - SAE052 - Syrup Update & GSD Update\\Reporte\\Emails"
}

View File

@ -1,6 +1,7 @@
{
"path": "C:\\Trabajo\\SIDEL\\10 - E5.007095 - Modifica O&U - SAE463\\Reporte\\Email",
"path": "C:\\Trabajo\\SIDEL\\12 - SAE052 - Syrup Update & GSD Update\\Reporte\\Emails",
"history": [
"C:\\Trabajo\\SIDEL\\12 - SAE052 - Syrup Update & GSD Update\\Reporte\\Emails",
"C:\\Trabajo\\SIDEL\\10 - E5.007095 - Modifica O&U - SAE463\\Reporte\\Email",
"C:\\Trabajo\\SIDEL\\08 - Masselli TEST\\Reporte\\EMAILs",
"C:\\Trabajo\\SIDEL\\EMAILs\\I_ E5.007727 _ Evo On - SFSRFH300172 + SFSRFH300109 - ANDIA LACTEOS",
@ -9,7 +10,6 @@
"C:\\Trabajo\\VM\\30 - 9.3941- Kosme - Portogallo (Modifica + Linea)\\Reporte\\Emails",
"C:\\Users\\migue\\OneDrive\\Miguel\\Obsidean\\Trabajo\\VM\\30 - 9.3941- Kosme - Portogallo (Modifica + Linea)\\Emails",
"C:\\Trabajo\\VM\\40 - 93040 - HENKEL - NEXT2 Problem\\Reporte\\Emails\\Trial",
"C:\\Trabajo\\VM\\40 - 93040 - HENKEL - NEXT2 Problem\\Reporte\\Emails",
"C:\\Trabajo\\VM\\40 - 93040 - HENKEL - NEXT2 Problem\\Reporte\\Emails\\Error de tablas"
"C:\\Trabajo\\VM\\40 - 93040 - HENKEL - NEXT2 Problem\\Reporte\\Emails"
]
}

View File

@ -1,5 +1,5 @@
{
"name": "Scripts para adaptar IO de Hardware S7 a IO Master en Tia Portal",
"name": "Siemens-Tia : 01 : Scripts para adaptar IO de Hardware S7 a IO Master en Tia Portal",
"description": "Este conjunto de scripts está diseñado para ayudar a los usuarios a adaptar el IO de Hardware S7 a un IO Master en Tia Portal. Incluye scripts para la creación de un nuevo proyecto, la importación de un proyecto existente y la adaptación del IO de Hardware S7 a un IO Master.",
"version": "1.0",
"author": "Miguel"

View File

@ -1,6 +1,6 @@
{
"name": "Importación de Archivos HTML",
"name": "Obsidean : 01 : Importación de Archivos HTML",
"description": "Este script procesa archivos HTML en un directorio y los convierte en un único archivo Markdown, extrayendo las imágenes a una carpeta de adjuntos y manteniendo los enlaces. También genera un índice al principio del archivo.",
"version": "1.0",
"author": "Miguel"
}
}

View File

@ -1,6 +1,6 @@
{
"name": "Exportador de objetos de Tia Portal y procesador de CAx",
"description": "Este conjunto de scripts exporta desde Tia Portal los objetos en fomarto XML y los objetos CAx. Luego se puede generar documentacion desde estos CAx de la periferia IO del PLC exportado.",
"name": "Siemens-Tia : 02 : Exportador de objetos de Tia Portal en formato XML",
"description": "Este conjunto de scripts exporta desde Tia Portal los objetos en fomarto XML.",
"version": "1.0",
"author": "Miguel"
}

File diff suppressed because it is too large Load Diff

View File

@ -5,5 +5,5 @@
},
"level2": {},
"level3": {},
"working_directory": "C:\\Trabajo\\SIDEL\\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\\Reporte\\IOExport"
"working_directory": "C:\\Trabajo\\SIDEL\\09 - SAE452 - Diet as Regular - San Giovanni in Bosco\\Reporte\\SourceDoc\\SourceXML"
}

View File

@ -1,12 +1,12 @@
{
"x1.py": {
"display_name": "1: Exportar Lógica desde TIA",
"display_name": "1: Exportar Lógica desde TIA Portal",
"short_description": "Exporta la lógica del PLC desde TIA Portal en archivos XML y SCL.",
"long_description": "Este script utiliza TIA Portal Openness para exportar la lógica de un PLC en formato XML y SCL. Permite seleccionar un proyecto de TIA Portal y genera los archivos de exportación en el directorio configurado.\n***\n**Lógica Principal:**\n\n1. **Configuración:** Carga parámetros desde `ParamManagerScripts` (directorio de trabajo, versión de TIA Portal).\n2. **Selección de Proyecto:** Abre un cuadro de diálogo para seleccionar el archivo del proyecto de TIA Portal.\n3. **Conexión a TIA Portal:** Utiliza la API de TIA Openness para conectarse al portal y abrir el proyecto seleccionado.\n4. **Exportación:** Exporta la lógica del PLC en archivos XML y SCL al directorio configurado.\n5. **Cierre:** Cierra la conexión con TIA Portal al finalizar.",
"hidden": false
},
"x4.py": {
"display_name": "4: Exportar Referencias Cruzadas",
"display_name": "2: Exportar Referencias Cruzadas desde Tia Portal",
"short_description": "Script para exportar las referencias cruzadas",
"long_description": "",
"hidden": false

View File

@ -1,6 +1,7 @@
{
"path": "C:\\Trabajo\\SIDEL\\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\\Reporte\\IOExport",
"path": "C:\\Trabajo\\SIDEL\\09 - SAE452 - Diet as Regular - San Giovanni in Bosco\\Reporte\\SourceDoc\\SourceXML",
"history": [
"C:\\Trabajo\\SIDEL\\09 - SAE452 - Diet as Regular - San Giovanni in Bosco\\Reporte\\SourceDoc\\SourceXML",
"C:\\Trabajo\\SIDEL\\06 - E5.007363 - Modifica O&U - SAE196 (cip integrato)\\Reporte\\IOExport"
]
}

View File

@ -1,5 +1,5 @@
{
"name": "S7 DB Utilities",
"name": "Siemens-S7 : 01 : S7 DB Utilities",
"description": "Utilidades para Trabajar con DBs de Siemens S7",
"version": "1.0",
"author": "Miguel"

View File

@ -1,9 +1,9 @@
--- Log de Ejecución: x7_value_updater.py ---
Grupo: S7_DB_Utils
Directorio de Trabajo: C:\Trabajo\SIDEL\09 - SAE452 - Diet as Regular - San Giovanni in Bosco\Reporte\DB1001
Inicio: 2025-05-18 13:56:40
Fin: 2025-05-18 13:56:41
Duración: 0:00:01.040596
Inicio: 2025-05-18 15:48:00
Fin: 2025-05-18 15:48:01
Duración: 0:00:00.811974
Estado: SUCCESS (Código de Salida: 0)
--- SALIDA ESTÁNDAR (STDOUT) ---
@ -13,21 +13,21 @@ Los archivos de documentación se guardarán en: C:\Trabajo\SIDEL\09 - SAE452 -
Se encontraron 1 pares de archivos para procesar.
--- Procesando par de archivos ---
Data file: db1001_data.db
Format file: db1001_format.db
Parseando archivo data: db1001_data.db
Parseando archivo format: db1001_format.db
Archivos JSON generados: db1001_data.json y db1001_format.json
Data file: DB1001_data.AWL
Format file: DB1001_format.AWL
Parseando archivo data: DB1001_data.AWL
Parseando archivo format: DB1001_format.AWL
Archivos JSON generados: DB1001_data.json y DB1001_format.json
Comparando estructuras para DB 'HMI_Blender_Parameters': 284 variables en _data, 284 variables en _format
Los archivos son compatibles. Creando el archivo _updated...
Procesando DB 'HMI_Blender_Parameters': 284 variables en _format, 284 variables en _data
Estadísticas para DB 'HMI_Blender_Parameters': 280 variables actualizadas, 0 no encontradas
Archivo _updated generado: C:\Trabajo\SIDEL\09 - SAE452 - Diet as Regular - San Giovanni in Bosco\Reporte\DB1001\json\db1001_updated.json
Archivo Excel de comparación generado: C:\Trabajo\SIDEL\09 - SAE452 - Diet as Regular - San Giovanni in Bosco\Reporte\DB1001\documentation\db1001_comparison.xlsx
Archivo Markdown generado: C:\Trabajo\SIDEL\09 - SAE452 - Diet as Regular - San Giovanni in Bosco\Reporte\DB1001\documentation\db1001_updated.md
Archivo S7 generado: C:\Trabajo\SIDEL\09 - SAE452 - Diet as Regular - San Giovanni in Bosco\Reporte\DB1001\documentation\db1001_updated.txt
Archivo S7 copiado a: C:\Trabajo\SIDEL\09 - SAE452 - Diet as Regular - San Giovanni in Bosco\Reporte\DB1001\db1001_updated.db
Archivo _updated generado: C:\Trabajo\SIDEL\09 - SAE452 - Diet as Regular - San Giovanni in Bosco\Reporte\DB1001\json\DB1001_updated.json
Archivo Excel de comparación generado: C:\Trabajo\SIDEL\09 - SAE452 - Diet as Regular - San Giovanni in Bosco\Reporte\DB1001\documentation\DB1001_comparison.xlsx
Archivo Markdown generado: C:\Trabajo\SIDEL\09 - SAE452 - Diet as Regular - San Giovanni in Bosco\Reporte\DB1001\documentation\DB1001_updated.md
Archivo S7 generado: C:\Trabajo\SIDEL\09 - SAE452 - Diet as Regular - San Giovanni in Bosco\Reporte\DB1001\documentation\DB1001_updated.txt
Archivo S7 copiado a: C:\Trabajo\SIDEL\09 - SAE452 - Diet as Regular - San Giovanni in Bosco\Reporte\DB1001\DB1001_updated.AWL
--- Proceso completado ---

View File

@ -1,5 +1,5 @@
{
"name": "Procesador de XML LAD-SCL-AWL exportado de TIA a SCL / Markdown",
"name": "Siemens-Tia : 03 : Procesador de XML LAD-SCL-AWL exportado de TIA a SCL / Markdown",
"description": "Conjunto de scripts que procesan archivos XML exportados de TIA, conviertiendo los objetos LAD a SCL y generando documentación en formato Markdown. ",
"version": "1.0",
"author": "Miguel"

View File

@ -24,7 +24,7 @@
"hidden": true
},
"x4_cross_reference.py": {
"display_name": "4: Generar Cross References",
"display_name": "2: Procesar un archivo individual usando x4",
"short_description": "LadderToSCL - Conversor de Siemens LAD/FUP XML a SCL",
"long_description": "",
"hidden": false

View File

@ -1,5 +1,5 @@
{
"name": "Grupo de Ejemplo Auto",
"name": "Code : 00 : Grupo de Ejemplo Auto",
"description": "Scripts de demostración que muestran las funcionalidades básicas del sistema.",
"version": "1.0",
"author": "Admin"

File diff suppressed because it is too large Load Diff

View File

@ -913,6 +913,12 @@ async function initializeApp() {
// Agregar el nuevo manejador de eventos
selectElement.addEventListener('change', handleGroupChange);
// Event listener para el nuevo botón de abrir en explorador
const openInExplorerButton = document.getElementById('open-in-explorer-btn');
if (openInExplorerButton) {
openInExplorerButton.addEventListener('click', openCurrentWorkingDirectoryInExplorer);
}
// Cargar datos iniciales
updateGroupDescription();
await initWorkingDirectory();
@ -1314,4 +1320,40 @@ function openMinicondaConsole() {
console.error('Error opening Miniconda Console:', error);
showNotification('Error al comunicarse con el servidor', 'error');
});
}
async function openCurrentWorkingDirectoryInExplorer() {
const group = currentGroup; // Asumiendo que currentGroup está disponible globalmente
const wdInput = document.getElementById('working-directory');
const path = wdInput.value;
if (!group) {
showToast("Por favor, selecciona un grupo primero.", "warning"); // O usa alert() si showToast no está definida
// alert("Por favor, selecciona un grupo primero.");
return;
}
if (!path || path.trim() === "") {
showToast("El directorio de trabajo no está establecido.", "warning");
// alert("El directorio de trabajo no está establecido.");
return;
}
try {
const response = await fetch('/api/open-explorer', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ path: path, group: group })
});
const result = await response.json();
if (result.status === "success") {
// No es necesario un toast para éxito, la acción es visible
} else {
showToast(result.message || "Error al intentar abrir el explorador.", "error");
}
} catch (error) {
console.error("Error de red al abrir en explorador:", error);
showToast("Error de red al intentar abrir el explorador.", "error");
}
}

View File

@ -119,6 +119,9 @@
<button class="bg-gray-500 text-white px-4 py-2 rounded" onclick="browseDirectory()">
Explorar
</button>
<button id="open-in-explorer-btn" class="bg-indigo-500 hover:bg-indigo-600 text-white px-4 py-2 rounded" title="Abrir directorio actual en el explorador de archivos">
Abrir Carpeta
</button>
</div>
<button class="bg-blue-500 text-white px-4 py-2 rounded" onclick="setWorkingDirectory()">
Confirmar