96 lines
3.5 KiB
Python
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)
|