403 lines
14 KiB
Python
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}")
|