from django.shortcuts import render, redirect from django.contrib.auth.models import User from django.contrib.auth.decorators import login_required from chat.models import UserRelation, Messages from django.http.response import JsonResponse from django.contrib import messages as django_messages from django.db.models import Q # Import Q @login_required(login_url="login") def chat(request, username): usersen = request.user try: # Get the friend and the relation in one go friend = User.objects.get(username=username) relation = UserRelation.objects.get(user=usersen, friend=friend, accepted=True) except (User.DoesNotExist, UserRelation.DoesNotExist): # If user or relation doesn't exist, show error message and redirect django_messages.error( request, "User or relation not found. You cannot chat with this user." ) return redirect("home") # Retrieve messages in one query, sorted by timestamp messages = Messages.objects.filter( (Q(sender_name=usersen) & Q(receiver_name=friend)) | (Q(sender_name=friend) & Q(receiver_name=usersen)) ).order_by("timestamp") # Handle GET method to render the chat if request.method == "GET": return render( request, "chat.html", { "relation_key": relation.relation_key, "messages": messages, "curr_user": usersen, "friend": friend, }, ) # If the method is not GET, return an error response return JsonResponse({"error": "Invalid request method"}, status=405) # @login_required(login_url="login") # @csrf_exempt # def message_list(request, sender=None, receiver=None): # if request.method == "GET": # messages = Messages.objects.filter( # sender_name=sender, receiver_name=receiver, seen=False # ) # serializer = MessageSerializer( # messages, many=True, context={"request": request} # ) # for message in messages: # message.seen = True # message.save() # return JsonResponse(serializer.data, safe=False) # elif request.method == "POST": # data = JSONParser().parse(request) # serializer = MessageSerializer(data=data) # if serializer.is_valid(): # serializer.save() # return JsonResponse(serializer.data, status=201) # return JsonResponse(serializer.errors, status=400)