Files
demo_sites/builder/views.py
2026-05-17 18:29:30 -05:00

96 lines
3.5 KiB
Python

from pathlib import Path
from django.conf import settings
from django.contrib import messages
from django.contrib.auth import login
from django.contrib.auth.decorators import login_required
from django.http import FileResponse, Http404, HttpRequest, HttpResponse
from django.shortcuts import get_object_or_404, redirect, render
from django.views.generic import TemplateView
from .forms import ClientSiteForm, SignUpForm
from .models import ClientSite, TemplateOption
from .services import SiteGenerator
class HomeView(TemplateView):
template_name = "home.html"
def signup_view(request: HttpRequest) -> HttpResponse:
if request.user.is_authenticated:
return redirect("dashboard")
if request.method == "POST":
form = SignUpForm(request.POST)
if form.is_valid():
user = form.save()
login(request, user)
return redirect("dashboard")
else:
form = SignUpForm()
return render(request, "registration/signup.html", {"form": form})
@login_required
def dashboard_view(request: HttpRequest) -> HttpResponse:
sites = ClientSite.objects.filter(owner=request.user).select_related("template_option")
form = ClientSiteForm()
form.fields["template_option"].queryset = TemplateOption.objects.filter(is_active=True)
return render(request, "builder/dashboard.html", {"sites": sites, "form": form})
@login_required
def create_site_view(request: HttpRequest) -> HttpResponse:
if request.method != "POST":
return redirect("dashboard")
form = ClientSiteForm(request.POST)
form.fields["template_option"].queryset = TemplateOption.objects.filter(is_active=True)
if not form.is_valid():
sites = ClientSite.objects.filter(owner=request.user).select_related("template_option")
return render(request, "builder/dashboard.html", {"sites": sites, "form": form})
site = form.save(commit=False)
site.owner = request.user
site.status = ClientSite.Status.GENERATING
site.save()
generator = SiteGenerator()
try:
generator.build_all(site)
messages.success(request, "Site generated successfully.")
except Exception as exc:
site.status = ClientSite.Status.FAILED
site.last_error = str(exc)
site.save(update_fields=["status", "last_error", "updated_at"])
messages.error(request, "Generation failed. Check site detail for error info.")
return redirect("site_detail", site_id=site.id)
@login_required
def site_detail_view(request: HttpRequest, site_id) -> HttpResponse:
site = get_object_or_404(ClientSite, id=site_id, owner=request.user)
return render(request, "builder/site_detail.html", {"site": site})
def _download_site_file(site: ClientSite, relative_path: str) -> FileResponse:
if not relative_path:
raise Http404("File not generated yet.")
full_path = Path(settings.MEDIA_ROOT) / relative_path
if not full_path.exists():
raise Http404("File missing from storage.")
return FileResponse(full_path.open("rb"), as_attachment=True, filename=full_path.name)
@login_required
def download_basic_site(request: HttpRequest, site_id) -> FileResponse:
site = get_object_or_404(ClientSite, id=site_id, owner=request.user)
return _download_site_file(site, site.basic_zip_path)
@login_required
def download_django_site(request: HttpRequest, site_id) -> FileResponse:
site = get_object_or_404(ClientSite, id=site_id, owner=request.user)
return _download_site_file(site, site.django_zip_path)