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})