Files
wizarr/dev.py
Matthieu B 5feaf51337 Enhance wizard step management and UI
- Updated the sub-navigation for the wizard to conditionally display step creation options based on the default state and available bundles.
- Improved the bundles page layout by categorizing steps into pre-invite, post-invite, and additional categories, enhancing user experience.
- Added orphaned step handling to allow users to remove steps that no longer have an associated entry.
- Displayed the associated wizard bundle name in the invite card if applicable.
- Adjusted JavaScript routing for bundle steps in the wizard.
- Modified the development script to set the NODE_ENV to development when installing npm dependencies, ensuring proper handling of devDependencies.
- Updated the subproject reference in the plus directory to indicate a dirty state.
2025-10-26 12:26:26 +01:00

162 lines
5.4 KiB
Python
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import argparse
import subprocess
import sys
from pathlib import Path
def check_node_installation():
print("Checking Node.js and npm installation...")
try:
node_version = subprocess.run(
["node", "--version"], capture_output=True, text=True, check=True
).stdout.strip()
print(f"✓ Node.js {node_version} is installed")
npm_version = subprocess.run(
["npm", "--version"], capture_output=True, text=True, check=True
).stdout.strip()
print(f"✓ npm {npm_version} is installed")
except subprocess.CalledProcessError:
print("❌ Node.js and/or npm is not installed!")
print("Please install Node.js and npm before running this script.")
print("You can download them from: https://nodejs.org/")
sys.exit(1)
def check_uv_installation():
print("Checking uv installation...")
try:
uv_version = subprocess.run(
["uv", "--version"], capture_output=True, text=True, check=True
).stdout.strip()
print(f"✓ uv {uv_version} is installed")
except subprocess.CalledProcessError:
print("❌ uv is not installed!")
print("Please install uv before running this script.")
print(
"You can download it from: https://docs.astral.sh/uv/getting-started/installation/"
)
sys.exit(1)
def run_command(command, cwd=None, env=None):
print(f"Running: {' '.join(command)}")
try:
process = subprocess.Popen(command, cwd=cwd, env=env)
process.wait()
if process.returncode != 0:
print(f"Error running command: {' '.join(command)}")
print(f"Error code: {process.returncode}")
sys.exit(1)
except KeyboardInterrupt:
print("\nReceived interrupt signal. Shutting down...")
process.terminate()
process.wait()
sys.exit(0)
except Exception as e:
print(f"Error running command: {' '.join(command)}")
print(f"Error: {e}")
sys.exit(1)
def main():
import os
parser = argparse.ArgumentParser(
description="Wizarr development server",
epilog="""
Examples:
python dev.py # Start development server (default)
python dev.py --scheduler # Start with background scheduler enabled
python dev.py --plus # Start with Plus features enabled
python dev.py --plus --scheduler # Start with both Plus and scheduler enabled
The scheduler runs maintenance tasks like:
- Expiry cleanup (every 1 minute in dev mode)
- User account deletion for expired users
- Server-specific expiry enforcement
Plus features include:
- Audit logging for admin actions
- Advanced analytics and reporting
- Enhanced security features
""",
formatter_class=argparse.RawDescriptionHelpFormatter,
)
parser.add_argument(
"--scheduler",
action="store_true",
help="Enable the background scheduler for testing expiry and maintenance tasks",
)
parser.add_argument(
"--plus",
action="store_true",
help="Enable Plus features including audit logging and advanced analytics",
)
args = parser.parse_args()
check_node_installation()
check_uv_installation()
project_root = Path(__file__).parent
static_dir = project_root / "app" / "static"
# Create dev environment with NODE_ENV=development to ensure devDependencies are installed
npm_env = os.environ.copy()
npm_env["NODE_ENV"] = "development"
print("Compiling translations...")
run_command(["uv", "run", "pybabel", "compile", "-d", "app/translations", "-f"])
print("Running database setup...")
print("Applying alembic migrations...")
run_command(["uv", "run", "flask", "db", "upgrade"])
print("Installing/updating npm dependencies...")
run_command(["npm", "install"], cwd=static_dir, env=npm_env)
print("Building static assets (CSS & JS)...")
run_command(["npm", "run", "build"], cwd=static_dir, env=npm_env)
# Start the Tailwind watcher in the background
print("Starting Tailwind watcher...")
tailwind_process = subprocess.Popen(
["npm", "run", "watch:css"], cwd=static_dir, env=npm_env
)
try:
flask_command = ["uv", "run", "flask", "run", "--debug"]
# Set environment variables based on flags
if args.scheduler:
print(
"🕒 Scheduler enabled - background tasks will run (expiry cleanup every 1 minute)"
)
os.environ["WIZARR_ENABLE_SCHEDULER"] = "true"
else:
print(
" Scheduler disabled - use --scheduler flag to enable background tasks"
)
if args.plus:
print(
"⭐ Plus features enabled - audit logging and advanced features available"
)
os.environ["WIZARR_PLUS_ENABLED"] = "true"
else:
print(
" Plus features disabled - use --plus flag to enable audit logging and advanced features"
)
print("Starting Flask development server...")
run_command(flask_command)
finally:
# Ensure we clean up the Tailwind process when Flask exits
tailwind_process.terminate()
tailwind_process.wait()
if __name__ == "__main__":
main()