File size: 2,527 Bytes
727a40a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
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)