|
4 | 4 | from .models import Chat, User |
5 | 5 | from .forms import MessageForm |
6 | 6 |
|
7 | | -@login_required |
8 | | -def select_send_message(request): |
9 | | - """Allow the user to select a recipient for messaging.""" |
10 | | - if request.method == "POST": |
11 | | - user_id = request.POST.get("receiver") |
12 | | - return redirect(reverse('send_message', args=[user_id])) # Redirect to send_message view |
13 | | - |
14 | | - users = User.objects.exclude(id=request.user.id) # Exclude the logged-in user |
15 | | - return render(request, 'select_send_message.html', {'users': users}) |
16 | | - |
17 | | -@login_required |
18 | | -def send_message(request, user_id): |
19 | | - receiver = get_object_or_404(User, id=user_id) |
20 | | - chat = Chat.get_or_create_chat(request.user, receiver) |
21 | | - |
22 | | - if request.method == "POST": |
23 | | - form = MessageForm(request.POST) |
24 | | - if form.is_valid(): |
25 | | - message = form.save(commit=False) |
26 | | - message.sender = request.user |
27 | | - message.chat = chat |
28 | | - message.save() |
29 | | - return redirect('chat_detail', chat_id=chat.id) |
30 | | - # Handle GET request by preloading the message form |
31 | | - else: |
32 | | - form = MessageForm() |
33 | | - |
34 | | - return render(request, 'send_message.html', {'form': form, 'receiver': receiver}) |
35 | | - |
36 | | -@login_required |
37 | | -def chat_list(request): |
38 | | - chats = Chat.objects.filter(user1=request.user) | Chat.objects.filter(user2=request.user) |
39 | | - return render(request, 'chat_list.html', {'chats': chats}) |
40 | | - |
41 | | -@login_required |
42 | | -def chat_detail(request, chat_id): |
43 | | - chat = get_object_or_404(Chat, id=chat_id) |
| 7 | +# https://chatgpt.com/share/67fd9c70-d378-8005-8c39-b0453f0f790f |
| 8 | +from rest_framework import viewsets, permissions, serializers |
| 9 | +from rest_framework.response import Response |
| 10 | +from rest_framework.decorators import action |
| 11 | +from django.contrib.auth.models import User |
| 12 | +from django.db.models import Q |
| 13 | +from .models import Chat, Message |
| 14 | +from .serializers import ChatSerializer, MessageSerializer |
| 15 | + |
| 16 | +class ChatViewSet(viewsets.ModelViewSet): |
| 17 | + queryset = Chat.objects.all() |
| 18 | + serializer_class = ChatSerializer |
| 19 | + permission_classes = [permissions.IsAuthenticated] |
| 20 | + |
| 21 | + def get_queryset(self): |
| 22 | + """Restrict to chats where the user is a participant.""" |
| 23 | + user = self.request.user |
| 24 | + return Chat.objects.filter(Q(user1=user) | Q(user2=user)).order_by('-updatedAt') |
| 25 | + # return Chat.objects.filter(user1=user).union(Chat.objects.filter(user2=user)).order_by('-updatedAt') |
| 26 | + |
| 27 | + def perform_create(self, serializer): |
| 28 | + """Prevent duplicate chats, enforce user1-user2 ordering.""" |
| 29 | + user1 = self.request.user |
| 30 | + user2_id = self.request.data.get('user2') |
| 31 | + if not user2_id: |
| 32 | + raise serializers.ValidationError({"user2": "This field is required."}) |
| 33 | + |
| 34 | + try: |
| 35 | + user2 = User.objects.get(id=user2_id) |
| 36 | + except User.DoesNotExist: |
| 37 | + raise serializers.ValidationError({"user2": "User not found."}) |
| 38 | + |
| 39 | + chat, created = Chat.objects.get_or_create_chat(user1, user2) |
| 40 | + if not created: |
| 41 | + raise serializers.ValidationError("Chat already exists.") |
| 42 | + serializer.instance = chat |
| 43 | + |
| 44 | + @action(detail=True, methods=['get']) |
| 45 | + def messages(self, request, pk=None): |
| 46 | + """List messages for a chat.""" |
| 47 | + chat = self.get_object() |
| 48 | + messages = chat.messages.all() |
| 49 | + serializer = MessageSerializer(messages, many=True) |
| 50 | + return Response(serializer.data) |
| 51 | + |
| 52 | +class MessageViewSet(viewsets.ModelViewSet): |
| 53 | + queryset = Message.objects.all() |
| 54 | + serializer_class = MessageSerializer |
| 55 | + permission_classes = [permissions.IsAuthenticated] |
| 56 | + |
| 57 | + def perform_create(self, serializer): |
| 58 | + serializer.save(sender=self.request.user) |
| 59 | + |
| 60 | +# ============================================= |
| 61 | +# NOTE: ENPOINTS BELOW ARE CONSIDERED LEGACY |
| 62 | +# ============================================= |
| 63 | + |
| 64 | +# @login_required |
| 65 | +# def select_send_message(request): |
| 66 | +# """Allow the user to select a recipient for messaging.""" |
| 67 | +# if request.method == "POST": |
| 68 | +# user_id = request.POST.get("receiver") |
| 69 | +# return redirect(reverse('send_message', args=[user_id])) # Redirect to send_message view |
| 70 | + |
| 71 | +# users = User.objects.exclude(id=request.user.id) # Exclude the logged-in user |
| 72 | +# return render(request, 'select_send_message.html', {'users': users}) |
| 73 | + |
| 74 | +# @login_required |
| 75 | +# def send_message(request, user_id): |
| 76 | +# receiver = get_object_or_404(User, id=user_id) |
| 77 | +# chat = Chat.get_or_create_chat(request.user, receiver) |
| 78 | + |
| 79 | +# if request.method == "POST": |
| 80 | +# form = MessageForm(request.POST) |
| 81 | +# if form.is_valid(): |
| 82 | +# message = form.save(commit=False) |
| 83 | +# message.sender = request.user |
| 84 | +# message.chat = chat |
| 85 | +# message.save() |
| 86 | +# return redirect('chat_detail', chat_id=chat.id) |
| 87 | +# # Handle GET request by preloading the message form |
| 88 | +# else: |
| 89 | +# form = MessageForm() |
| 90 | + |
| 91 | +# return render(request, 'send_message.html', {'form': form, 'receiver': receiver}) |
| 92 | + |
| 93 | +# @login_required |
| 94 | +# def chat_list(request): |
| 95 | +# chats = Chat.objects.filter(user1=request.user) | Chat.objects.filter(user2=request.user) |
| 96 | +# return render(request, 'chat_list.html', {'chats': chats}) |
| 97 | + |
| 98 | +# @login_required |
| 99 | +# def chat_detail(request, chat_id): |
| 100 | +# chat = get_object_or_404(Chat, id=chat_id) |
44 | 101 |
|
45 | | - # Ensure the logged-in user is part of this chat |
46 | | - if request.user != chat.user1 and request.user != chat.user2: |
47 | | - return redirect('chat_list') |
| 102 | +# # Ensure the logged-in user is part of this chat |
| 103 | +# if request.user != chat.user1 and request.user != chat.user2: |
| 104 | +# return redirect('chat_list') |
48 | 105 |
|
49 | | - messages = chat.messages.all() |
50 | | - form = MessageForm() |
| 106 | +# messages = chat.messages.all() |
| 107 | +# form = MessageForm() |
51 | 108 |
|
52 | | - return render(request, 'chat_detail.html', {'chat': chat, 'messages': messages, 'form': form}) |
| 109 | +# return render(request, 'chat_detail.html', {'chat': chat, 'messages': messages, 'form': form}) |
53 | 110 |
|
54 | 111 |
|
0 commit comments