39649-vm/core/views.py
2026-04-15 16:15:01 +00:00

152 lines
4.4 KiB
Python

import os
import platform
from django import get_version as django_version
from django.contrib import messages
from django.db.models import Count, Q
from django.shortcuts import get_object_or_404, redirect, render
from django.utils import timezone
from .forms import PostizInstallBriefForm
from .models import PostizInstallBrief
SETUP_STEPS = [
{
"title": "Install the runtime",
"description": "Get Node.js and the selected package manager onto the VM before cloning Postiz.",
},
{
"title": "Wire prerequisite services",
"description": "Confirm PostgreSQL, Redis, and Temporal are reachable before the first app boot.",
},
{
"title": "Bootstrap the repository",
"description": "Fill the .env file, install packages, push Prisma schema changes, and start the dev processes.",
},
]
def base_context(request):
host_name = request.get_host().lower()
agent_brand = "AppWizzy" if host_name == "appwizzy.com" else "Flatlogic"
now = timezone.now()
stats = PostizInstallBrief.objects.aggregate(
total=Count("id"),
ready=Count(
"id",
filter=Q(postgres_ready=True, redis_ready=True, temporal_ready=True),
),
)
return {
"project_name": "Postiz Native Setup Studio",
"agent_brand": agent_brand,
"django_version": django_version(),
"python_version": platform.python_version(),
"current_time": now,
"host_name": host_name,
"project_description": os.getenv("PROJECT_DESCRIPTION", ""),
"project_image_url": os.getenv("PROJECT_IMAGE_URL", ""),
"brief_stats": stats,
"setup_steps": SETUP_STEPS,
}
def build_blueprint(brief):
prerequisites = [
{
"title": "Node runtime",
"ready": True,
"detail": f"Use {brief.node_version} with {brief.package_manager} for dependency management.",
},
{
"title": "PostgreSQL",
"ready": brief.postgres_ready,
"detail": "Prepare DATABASE_URL before copying .env.example to .env.",
},
{
"title": "Redis",
"ready": brief.redis_ready,
"detail": "Queue workers expect REDIS_URL on the VM.",
},
{
"title": "Temporal stack",
"ready": brief.temporal_ready,
"detail": "Point TEMPORAL_ADDRESS at the Temporal service before starting dev workflows.",
},
]
env_lines = [
'DATABASE_URL="postgresql://postiz-user:password@localhost:5432/postiz-db-local"',
'REDIS_URL="redis://localhost:6379"',
'TEMPORAL_ADDRESS="localhost:7233"',
f'FRONTEND_URL="{brief.public_url}"',
'NEXT_PUBLIC_BACKEND_URL="http://127.0.0.1:3000"',
'BACKEND_INTERNAL_URL="http://127.0.0.1:3000"',
]
command_plan = [
"git clone https://github.com/gitroomhq/postiz-app.git",
"pnpm install",
"pnpm run prisma-db-push",
"pnpm run dev",
]
return {
"prerequisites": prerequisites,
"env_lines": env_lines,
"command_plan": command_plan,
}
def home(request):
context = base_context(request)
context.update(
{
"recent_briefs": PostizInstallBrief.objects.all()[:3],
}
)
return render(request, "core/index.html", context)
def brief_create(request):
if request.method == "POST":
form = PostizInstallBriefForm(request.POST)
if form.is_valid():
brief = form.save()
messages.success(request, "Install brief saved. Review the generated blueprint below.")
return redirect("brief_detail", pk=brief.pk)
else:
form = PostizInstallBriefForm()
context = base_context(request)
context.update(
{
"form": form,
}
)
return render(request, "core/brief_form.html", context)
def brief_list(request):
context = base_context(request)
context.update(
{
"briefs": PostizInstallBrief.objects.all(),
}
)
return render(request, "core/brief_list.html", context)
def brief_detail(request, pk):
brief = get_object_or_404(PostizInstallBrief, pk=pk)
blueprint = build_blueprint(brief)
context = base_context(request)
context.update(
{
"brief": brief,
"blueprint": blueprint,
}
)
return render(request, "core/brief_detail.html", context)