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)