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.
86 lines
2.7 KiB
Python
86 lines
2.7 KiB
Python
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})
|