codescraftman / ethanicbot / views.py
views.py
Raw
from django.shortcuts import render
from django.views.decorators.csrf import csrf_exempt
from django.http import JsonResponse
from django.template.loader import render_to_string
from django.utils.safestring import mark_safe
from django.contrib.sessions.models import Session
from .models import ChatSession, ChatMessage
from ethanicbot.langchain.agent import get_agent

@csrf_exempt
def chat_view(request):
    """
    Handles the chat functionality of EthanicBot.
    This view processes both POST and GET requests for the bot's interaction.
    """
    if request.method == "POST":
        message = request.POST.get("message")
        session_key = request.session.session_key or request.session.save() or request.session.session_key

        # Get or create ChatSession for this user
        chat_session, _ = ChatSession.objects.get_or_create(session_key=session_key, defaults={
            "user": request.user if request.user.is_authenticated else None
        })

        # Save user message in the database
        ChatMessage.objects.create(session=chat_session, is_user=True, message=message)

        # Get the bot response using the agent
        agent = get_agent()
        try:
            response = agent.invoke({"input": message})
            reply = response["response"]
        except Exception as e:
            reply = f"Sorry, I encountered an error: {e}"

        # Save bot response in the database
        ChatMessage.objects.create(session=chat_session, is_user=False, message=reply)

        return JsonResponse({"response": reply})

    return render(request, "ethanicbot/chat.html")


def ethanicbot_chatbox_partial(request):
    """
    Renders the chatbox partial template to be injected dynamically
    on every page that includes it.
    """
    html = render_to_string("ethanicbot/partials/ethanicbot_chatbox.html", request=request)
    return JsonResponse({"html": mark_safe(html)})