62 lines
2.3 KiB
Python
62 lines
2.3 KiB
Python
from django.contrib.auth.mixins import LoginRequiredMixin
|
|
from django.http import JsonResponse
|
|
from django.shortcuts import render
|
|
from django.utils.translation import gettext as _
|
|
from django.views import View
|
|
import logging
|
|
from .ai_agent import analyze_prompt
|
|
# from .haikal_agent import DatabaseInsightSystem, analyze_prompt_sync
|
|
from .utils.export import export_to_excel, export_to_csv
|
|
|
|
logger = logging.getLogger(__name__)
|
|
# analyze_prompt_ai = DatabaseInsightSystem
|
|
|
|
class HaikalBot(LoginRequiredMixin, View):
|
|
def get(self, request, *args, **kwargs):
|
|
"""
|
|
Render the chat interface.
|
|
"""
|
|
context = {
|
|
'dark_mode': request.session.get('dark_mode', False),
|
|
'page_title': _('AI Assistant')
|
|
}
|
|
return render(request, "haikalbot/chat.html", context)
|
|
|
|
def post(self, request, *args, **kwargs):
|
|
"""
|
|
Process the prompt and return results.
|
|
"""
|
|
prompt = request.POST.get("prompt")
|
|
export = request.POST.get("export")
|
|
language = request.POST.get("language", request.LANGUAGE_CODE)
|
|
|
|
if not prompt:
|
|
error_msg = _("Prompt is required.") if language != "ar" else "الاستعلام مطلوب."
|
|
return JsonResponse({"status": "error", "error": error_msg}, status=400)
|
|
try:
|
|
result = analyze_prompt(prompt)
|
|
|
|
if export and result.get("status") == "success" and result.get("data"):
|
|
try:
|
|
if export == "excel":
|
|
return export_to_excel(result["data"])
|
|
elif export == "csv":
|
|
return export_to_csv(result["data"])
|
|
except Exception as e:
|
|
logger.error(f"Export error: {e}")
|
|
result["export_error"] = str(e)
|
|
|
|
return JsonResponse(result, safe=False)
|
|
|
|
except Exception as e:
|
|
logger.exception(f"Error processing prompt: {e}")
|
|
error_msg = _("An error occurred while processing your request.")
|
|
if language == "ar":
|
|
error_msg = "حدث خطأ أثناء معالجة طلبك."
|
|
|
|
return JsonResponse({
|
|
"status": "error",
|
|
"error": error_msg,
|
|
"details": str(e) if request.user.is_staff else None
|
|
}, status=500)
|