SIDEL_ScriptsManager/example_script.py

403 lines
14 KiB
Python

#!/usr/bin/env python3
"""
ScriptsManager Metadata:
@description: Example script demonstrating proper parameter handling
@description_long: This script shows how to properly handle all required parameters from SIDEL ScriptsManager
@description_es: Script de ejemplo que demuestra el manejo adecuado de parámetros
@description_it: Script di esempio che dimostra la gestione corretta dei parametri
@description_fr: Script d'exemple démontrant la gestion correcte des paramètres
@required_level: viewer
@category: example
@tags: demo,template,parameters
@parameters: []
@execution_timeout: 300
@flask_port: auto
"""
import argparse
import os
import json
from pathlib import Path
from flask import Flask, render_template_string, request, jsonify
def parse_arguments():
parser = argparse.ArgumentParser(description="SIDEL ScriptsManager Example Script")
parser.add_argument("--data-dir", required=True, help="Data directory path")
parser.add_argument(
"--user-level",
required=True,
choices=["admin", "developer", "operator", "viewer"],
help="User permission level",
)
parser.add_argument("--port", required=True, type=int, help="Flask port number")
parser.add_argument("--project-id", required=True, help="Project ID")
parser.add_argument("--project-name", required=True, help="Project name")
parser.add_argument(
"--theme",
required=True,
choices=["light", "dark"],
help="User theme preference",
)
parser.add_argument(
"--language",
required=True,
choices=["en", "es", "it", "fr"],
help="User language preference",
)
return parser.parse_args()
class ScriptDataManager:
def __init__(self, data_dir, project_id, project_name):
self.data_dir = Path(data_dir)
self.project_id = project_id
self.project_name = project_name
# Ensure data directory exists
self.data_dir.mkdir(parents=True, exist_ok=True)
# Load or create config
self.config_file = self.data_dir / "config.json"
self.config = self.load_config()
def load_config(self):
"""Load configuration from JSON file."""
if self.config_file.exists():
try:
with open(self.config_file, "r") as f:
return json.load(f)
except (json.JSONDecodeError, FileNotFoundError):
pass
# Default configuration
return {
"example_setting": "default_value",
"user_preferences": {},
"execution_count": 0,
}
def save_config(self):
"""Save configuration to JSON file."""
with open(self.config_file, "w") as f:
json.dump(self.config, f, indent=2)
def increment_execution_count(self):
"""Track how many times this script has been executed."""
self.config["execution_count"] = self.config.get("execution_count", 0) + 1
self.save_config()
def create_flask_app(
data_manager, user_level, project_id, project_name, theme, language
):
app = Flask(__name__)
# Language translations
translations = {
"en": {
"title": "SIDEL ScriptsManager - Example Script",
"welcome": "Welcome to the Example Script",
"project": "Project",
"user_level": "User Level",
"theme": "Theme",
"language": "Language",
"data_directory": "Data Directory",
"execution_count": "Execution Count",
"save_settings": "Save Settings",
"example_setting": "Example Setting",
"settings_saved": "Settings saved successfully!",
},
"es": {
"title": "SIDEL ScriptsManager - Script de Ejemplo",
"welcome": "Bienvenido al Script de Ejemplo",
"project": "Proyecto",
"user_level": "Nivel de Usuario",
"theme": "Tema",
"language": "Idioma",
"data_directory": "Directorio de Datos",
"execution_count": "Número de Ejecuciones",
"save_settings": "Guardar Configuración",
"example_setting": "Configuración de Ejemplo",
"settings_saved": "¡Configuración guardada exitosamente!",
},
"it": {
"title": "SIDEL ScriptsManager - Script di Esempio",
"welcome": "Benvenuto nello Script di Esempio",
"project": "Progetto",
"user_level": "Livello Utente",
"theme": "Tema",
"language": "Lingua",
"data_directory": "Directory Dati",
"execution_count": "Conteggio Esecuzioni",
"save_settings": "Salva Impostazioni",
"example_setting": "Impostazione di Esempio",
"settings_saved": "Impostazioni salvate con successo!",
},
"fr": {
"title": "SIDEL ScriptsManager - Script d'Exemple",
"welcome": "Bienvenue dans le Script d'Exemple",
"project": "Projet",
"user_level": "Niveau d'Utilisateur",
"theme": "Thème",
"language": "Langue",
"data_directory": "Répertoire de Données",
"execution_count": "Nombre d'Exécutions",
"save_settings": "Sauvegarder les Paramètres",
"example_setting": "Paramètre d'Exemple",
"settings_saved": "Paramètres sauvegardés avec succès!",
},
}
def get_text(key):
return translations.get(language, translations["en"]).get(key, key)
# HTML template with theme support
html_template = """
<!DOCTYPE html>
<html lang="{{ language }}">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ get_text('title') }}</title>
<style>
:root {
--bg-color: {{ '#ffffff' if theme == 'light' else '#2d3748' }};
--text-color: {{ '#2d3748' if theme == 'light' else '#e2e8f0' }};
--border-color: {{ '#e2e8f0' if theme == 'light' else '#4a5568' }};
--button-bg: {{ '#3182ce' if theme == 'light' else '#4299e1' }};
--button-hover: {{ '#2c5282' if theme == 'light' else '#3182ce' }};
--sidel-blue: #0066cc;
}
body {
background-color: var(--bg-color);
color: var(--text-color);
font-family: Arial, sans-serif;
margin: 0;
padding: 20px;
}
.header {
background-color: var(--sidel-blue);
color: white;
padding: 10px 20px;
margin: -20px -20px 20px -20px;
display: flex;
align-items: center;
}
.logo {
font-weight: bold;
font-size: 24px;
margin-right: 20px;
}
.container {
max-width: 800px;
margin: 0 auto;
}
.info-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 20px;
margin: 20px 0;
}
.info-card {
border: 1px solid var(--border-color);
border-radius: 8px;
padding: 15px;
background-color: var(--bg-color);
}
.info-label {
font-weight: bold;
margin-bottom: 5px;
}
.form-group {
margin: 15px 0;
}
label {
display: block;
margin-bottom: 5px;
font-weight: bold;
}
input, select {
width: 100%;
padding: 8px;
border: 1px solid var(--border-color);
border-radius: 4px;
background-color: var(--bg-color);
color: var(--text-color);
}
button {
background-color: var(--button-bg);
color: white;
padding: 10px 20px;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 16px;
}
button:hover {
background-color: var(--button-hover);
}
.success-message {
background-color: #48bb78;
color: white;
padding: 10px;
border-radius: 4px;
margin: 10px 0;
display: none;
}
</style>
</head>
<body>
<div class="header">
<div class="logo">SIDEL</div>
<h1>{{ get_text('welcome') }}</h1>
</div>
<div class="container">
<div class="info-grid">
<div class="info-card">
<div class="info-label">{{ get_text('project') }}:</div>
<div>{{ project_name }} (ID: {{ project_id }})</div>
</div>
<div class="info-card">
<div class="info-label">{{ get_text('user_level') }}:</div>
<div>{{ user_level }}</div>
</div>
<div class="info-card">
<div class="info-label">{{ get_text('theme') }}:</div>
<div>{{ theme }}</div>
</div>
<div class="info-card">
<div class="info-label">{{ get_text('language') }}:</div>
<div>{{ language }}</div>
</div>
<div class="info-card">
<div class="info-label">{{ get_text('data_directory') }}:</div>
<div>{{ data_directory }}</div>
</div>
<div class="info-card">
<div class="info-label">{{ get_text('execution_count') }}:</div>
<div>{{ execution_count }}</div>
</div>
</div>
<form id="settingsForm">
<div class="form-group">
<label for="exampleSetting">{{ get_text('example_setting') }}:</label>
<input type="text" id="exampleSetting" name="exampleSetting" value="{{ example_setting }}">
</div>
<button type="submit">{{ get_text('save_settings') }}</button>
</form>
<div id="successMessage" class="success-message">
{{ get_text('settings_saved') }}
</div>
</div>
<script>
document.getElementById('settingsForm').addEventListener('submit', function(e) {
e.preventDefault();
const formData = new FormData(this);
const data = Object.fromEntries(formData);
fetch('/save_settings', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(data)
})
.then(response => response.json())
.then(result => {
if (result.success) {
document.getElementById('successMessage').style.display = 'block';
setTimeout(() => {
document.getElementById('successMessage').style.display = 'none';
}, 3000);
}
})
.catch(error => {
console.error('Error:', error);
});
});
</script>
</body>
</html>
"""
@app.route("/")
def index():
data_manager.increment_execution_count()
return render_template_string(
html_template,
project_name=project_name,
project_id=project_id,
user_level=user_level,
theme=theme,
language=language,
data_directory=str(data_manager.data_dir),
execution_count=data_manager.config["execution_count"],
example_setting=data_manager.config["example_setting"],
get_text=get_text,
)
@app.route("/save_settings", methods=["POST"])
def save_settings():
try:
data = request.get_json()
data_manager.config["example_setting"] = data.get("exampleSetting", "")
data_manager.save_config()
return jsonify({"success": True})
except Exception as e:
return jsonify({"success": False, "error": str(e)})
return app
if __name__ == "__main__":
args = parse_arguments()
print(f"[EXAMPLE] Starting with parameters:")
print(f" Data Dir: {args.data_dir}")
print(f" User Level: {args.user_level}")
print(f" Port: {args.port}")
print(f" Project: {args.project_name} (ID: {args.project_id})")
print(f" Theme: {args.theme}")
print(f" Language: {args.language}")
# Initialize data manager
data_manager = ScriptDataManager(args.data_dir, args.project_id, args.project_name)
# Create Flask app
app = create_flask_app(
data_manager,
args.user_level,
args.project_id,
args.project_name,
args.theme,
args.language,
)
# Run the Flask application
try:
print(f"[EXAMPLE] Starting Flask server on port {args.port}")
app.run(host="127.0.0.1", port=args.port, debug=False)
except KeyboardInterrupt:
print(f"[EXAMPLE] Script terminated by user")
except Exception as e:
print(f"[EXAMPLE] Error: {e}")