Add Django site, Docker packaging, and beta/prod Gitea deploys.
Unignore site/ (was blocked by mkdocs /site rule), add compose/Docker/uv tooling, and split deploys so push to main goes to beta while prod stays manual.
This commit is contained in:
@@ -0,0 +1,85 @@
|
||||
import json
|
||||
|
||||
from django.contrib.auth.decorators import login_required
|
||||
from django.http import JsonResponse
|
||||
from django.shortcuts import get_object_or_404, render
|
||||
from django.views.decorators.http import require_http_methods, require_POST
|
||||
|
||||
from social.models import SocialAccount, SocialPost
|
||||
from social.ollama import OllamaError, generate_social_post
|
||||
|
||||
|
||||
@login_required
|
||||
def post_list(request):
|
||||
posts = SocialPost.objects.all()[:100]
|
||||
return render(request, "social/post_list.html", {"posts": posts})
|
||||
|
||||
|
||||
@login_required
|
||||
def post_detail(request, pk):
|
||||
post = get_object_or_404(SocialPost.objects.prefetch_related("targets"), pk=pk)
|
||||
return render(request, "social/post_detail.html", {"post": post})
|
||||
|
||||
|
||||
@login_required
|
||||
def account_list(request):
|
||||
accounts = SocialAccount.objects.all()
|
||||
return render(request, "social/account_list.html", {"accounts": accounts})
|
||||
|
||||
|
||||
@login_required
|
||||
@require_http_methods(["GET", "POST"])
|
||||
def composer(request):
|
||||
"""Portal composer — optional Ollama draft assist."""
|
||||
draft = ""
|
||||
error = ""
|
||||
prompt = ""
|
||||
if request.method == "POST":
|
||||
prompt = (request.POST.get("prompt") or "").strip()
|
||||
platform = (request.POST.get("platform") or "").strip()
|
||||
if prompt:
|
||||
try:
|
||||
draft = generate_social_post(prompt, platform=platform)
|
||||
except OllamaError as exc:
|
||||
error = str(exc)
|
||||
body = (request.POST.get("body") or draft).strip()
|
||||
if request.POST.get("action") == "save" and body:
|
||||
post = SocialPost.objects.create(
|
||||
body=body,
|
||||
ollama_prompt=prompt,
|
||||
created_by=request.user,
|
||||
)
|
||||
return render(
|
||||
request,
|
||||
"social/composer.html",
|
||||
{"saved": post, "draft": body, "prompt": prompt},
|
||||
)
|
||||
return render(
|
||||
request,
|
||||
"social/composer.html",
|
||||
{"draft": draft, "prompt": prompt, "error": error},
|
||||
)
|
||||
|
||||
|
||||
@login_required
|
||||
@require_POST
|
||||
def api_generate(request):
|
||||
"""
|
||||
JSON endpoint for the portal to draft posts via Ollama.
|
||||
|
||||
POST JSON: {"prompt": "...", "platform": "facebook"|...}
|
||||
"""
|
||||
try:
|
||||
payload = json.loads(request.body.decode() or "{}")
|
||||
except json.JSONDecodeError:
|
||||
payload = request.POST.dict()
|
||||
prompt = (payload.get("prompt") or "").strip()
|
||||
if not prompt:
|
||||
return JsonResponse({"error": "prompt required"}, status=400)
|
||||
try:
|
||||
text = generate_social_post(
|
||||
prompt, platform=(payload.get("platform") or "").strip()
|
||||
)
|
||||
except OllamaError as exc:
|
||||
return JsonResponse({"error": str(exc)}, status=502)
|
||||
return JsonResponse({"text": text})
|
||||
Reference in New Issue
Block a user