File size: 3,308 Bytes
1f6c983
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
"""
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})