pyrunner / core /views /setup.py
Perspicacious's picture
Deploy PyRunner on Hugging Face
2529305
Raw
History Blame Contribute Delete
3.31 kB
"""
Setup wizard views for first-run configuration.
"""
from django.shortcuts import render, redirect
from django.contrib.auth import login
from django.contrib import messages
from django.views.decorators.http import require_http_methods
from django.views.decorators.csrf import csrf_protect
from django.http import HttpRequest, HttpResponse
from core.services.setup_service import SetupService
from core.forms import AdminSetupForm
@csrf_protect
@require_http_methods(["GET", "POST"])
def setup_view(request: HttpRequest) -> HttpResponse:
"""
Initial setup wizard view.
GET: Display setup status (does not auto-execute)
POST: Trigger setup operations
"""
# Check if setup is already complete
if not SetupService.is_setup_needed():
# If setup is done but no admin exists, redirect to admin setup
if SetupService.needs_admin_setup():
return redirect("setup:admin_setup")
return redirect("auth:login")
# Get current status
status = SetupService.get_status()
# Only run setup on explicit POST request
if request.method == "POST":
results = SetupService.run_full_setup()
# Refresh status after setup
status = SetupService.get_status()
# If setup completed and admin needed, redirect to admin setup
if results.get("completed") and SetupService.needs_admin_setup():
return render(request, "setup/setup.html", {
"status": status,
"results": results,
"setup_complete": True,
"redirect_to_admin_setup": True,
})
return render(request, "setup/setup.html", {
"status": status,
"results": results,
"setup_complete": results.get("completed", False),
})
# GET request - just display status, don't auto-execute
return render(request, "setup/setup.html", {
"status": status,
"results": None,
"setup_complete": False,
})
@csrf_protect
@require_http_methods(["GET", "POST"])
def admin_setup_view(request: HttpRequest) -> HttpResponse:
"""
Admin account creation during setup.
This view is shown after the initial system setup completes
to create the first admin user with password authentication.
"""
# Redirect if admin already exists
if not SetupService.needs_admin_setup():
return redirect("auth:login")
if request.method == "POST":
form = AdminSetupForm(request.POST)
if form.is_valid():
email = form.cleaned_data["email"].lower()
password = form.cleaned_data["password"]
success, message = SetupService.create_admin_user(email, password)
if success:
# Log the user in immediately
from core.models import User
user = User.objects.get(email=email)
login(request, user, backend='django.contrib.auth.backends.ModelBackend')
messages.success(request, "Admin account created! Welcome to PyRunner.")
return redirect("cpanel:dashboard")
else:
messages.error(request, message)
else:
form = AdminSetupForm()
return render(request, "setup/admin_setup.html", {"form": form})