codescraftman / contacts / views.py
views.py
Raw
from django.shortcuts import render, redirect, get_object_or_404  
from django.contrib import messages
from .forms import InquiryForm
from .models import LiveChat, ChatMessage
from django.contrib.auth.decorators import login_required
from django.utils import timezone
from django.core.mail import send_mail
from django.urls import reverse
from django.http import JsonResponse
from django.views.generic import View
from django.contrib.auth.mixins import LoginRequiredMixin
import json  # Ensure you import json for handling JSON data

class LiveChatView(LoginRequiredMixin, View):
    def get(self, request, *args, **kwargs):
        # Render the live chat interface
        return render(request, 'contacts/live_chat.html')
    
    def post(self, request):
        data = json.loads(request.body)  # Load JSON data
        message_text = data.get('message')
        chat_id = data.get('chat_id')  # Make sure to send chat_id in your JS

        if message_text and chat_id:
            chat = get_object_or_404(LiveChat, id=chat_id, user=request.user)
            ChatMessage.objects.create(chat=chat, sender=request.user, message=message_text)
            chat.last_message = timezone.now()
            chat.save()
            return JsonResponse({'status': 'Message sent', 'reply': 'Your message was received.'})

        return JsonResponse({'status': 'Error', 'message': 'Invalid data'}, status=400)

def send_inquiry(request):
    if request.method == 'POST':
        form = InquiryForm(request.POST)
        if form.is_valid():
            form.save()
            messages.success(request, 'Your inquiry has been sent successfully!')
            if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
                return JsonResponse({'status': 'success', 'redirect_url': reverse('contacts:index')})
            return redirect('contacts:index')
    else:
        form = InquiryForm()

    return render(request, 'contacts/send_inquiry.html', {'form': form})

@login_required
def start_chat(request):
    chat, created = LiveChat.objects.get_or_create(user=request.user, active=True)

    if created:
        admin_email = 'thimethane@outlook.com'
        subject = f"New Live Chat Request from {request.user.username}"
        message = (
            f"A new live chat has been initiated by {request.user.username}.\n"
            f"Visit the dashboard to view and respond to the chat:\n"
            f"{request.build_absolute_uri(reverse('admin:contacts_livechat_change', args=[chat.id]))}"
        )
        send_mail(subject, message, 'no-reply@thimethane.com', [admin_email])
    
    return redirect('contacts:chat', chat_id=chat.id)

@login_required
def chat_view(request, chat_id):
    chat = get_object_or_404(LiveChat, id=chat_id, user=request.user)

    messages = chat.messages.all()  # Fetch all messages related to this chat
    if request.method == 'POST':
        message_text = request.POST.get('message')
        if message_text:
            ChatMessage.objects.create(chat=chat, sender=request.user, message=message_text)
            chat.last_message = timezone.now()
            chat.save()

            if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
                return JsonResponse({'status': 'Message sent', 'sender': request.user.username, 'message': message_text})

    return render(request, 'contacts/chat_view.html', {'chat': chat, 'messages': messages})

@login_required
def index(request):
    messages.info(request, "You need to log in to access this page.")
    return render(request, 'contacts/index.html')

@login_required
def admin_chat_view(request):
    if request.method == 'POST':
        message = request.POST.get('message')
        chat_id = request.POST.get('chat_id', None)

        if message and chat_id:
            try:
                chat = LiveChat.objects.get(id=chat_id)
                ChatMessage.objects.create(chat=chat, sender=request.user, message=message)
                chat.last_message = timezone.now()
                chat.save()
                return JsonResponse({'status': 'Message sent'})
            except LiveChat.DoesNotExist:
                return JsonResponse({'status': 'Error', 'message': 'Chat not found'}, status=404)
        else:
            return JsonResponse({'status': 'Error', 'message': 'Invalid data'}, status=400)

    return JsonResponse({'status': 'Error', 'message': 'Invalid request method'}, status=405)

@login_required
def admin_chat_list(request):
    chats = LiveChat.objects.filter(active=True)
    return render(request, 'contacts/admin_chat_list.html', {'chats': chats})