Files
backend-v1/core/apps/chat/views/chat.py
2026-04-02 20:50:00 +05:00

173 lines
6.0 KiB
Python

from django_core.mixins import BaseViewSetMixin
from django_filters.rest_framework import DjangoFilterBackend
from drf_spectacular.utils import OpenApiParameter, extend_schema
from rest_framework.decorators import action
from rest_framework.filters import OrderingFilter
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet
from core.apps.chat.filters.chat import ChatmessageFilter, ChatroomFilter
from core.apps.chat.models import ChatmessageModel, ChatroomModel
from core.apps.chat.serializers.chat import (
CreateChatmessageSerializer,
CreateChatroomSerializer,
ListChatmessageSerializer,
ListChatroomSerializer,
RetrieveChatmessageSerializer,
RetrieveChatroomSerializer,
)
@extend_schema(
tags=["Chat"],
parameters=[
OpenApiParameter("room", int, description="Xona ID bo'yicha filter"),
OpenApiParameter("message_type", str, description="Xabar turi: text, image, video, voice, file"),
OpenApiParameter("is_read", bool, description="O'qilgan/o'qilmagan"),
OpenApiParameter("created_from", str, description="Boshlanish sanasi (ISO 8601)"),
OpenApiParameter("created_to", str, description="Tugash sanasi (ISO 8601)"),
],
)
class ChatmessageView(BaseViewSetMixin, ModelViewSet):
permission_classes = [IsAuthenticated]
parser_classes_for_create = None # multipart + json qo'llab-quvvatlanadi
filter_backends = [DjangoFilterBackend, OrderingFilter]
filterset_class = ChatmessageFilter
ordering_fields = ["created_at"]
ordering = ["created_at"]
pagination_class = None
action_permission_classes = {}
action_serializer_class = {
"list": ListChatmessageSerializer,
"retrieve": RetrieveChatmessageSerializer,
"create": CreateChatmessageSerializer,
}
def get_serializer_class(self):
return self.action_serializer_class.get(self.action, ListChatmessageSerializer)
def get_queryset(self):
return (
ChatmessageModel.objects.select_related("sender")
.only(
"id",
"room_id",
"message_type",
"text",
"file",
"is_read",
"created_at",
"sender__id",
"sender__first_name",
"sender__last_name",
"sender__phone",
"sender__role",
)
)
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
results = list(queryset)
serializer = self.get_serializer(results, many=True)
return Response(
{
"count": len(results),
"next": None,
"previous": None,
"results": serializer.data,
}
)
@extend_schema(description="Xabarlarni o'qilgan deb belgilash")
@action(detail=False, methods=["post"], url_path="mark-read")
def mark_read(self, request):
"""
Berilgan xona uchun barcha o'qilmagan xabarlarni o'qilgan qiladi.
Body: { "room": <id> }
"""
room_id = request.data.get("room")
if not room_id:
return Response({"detail": "room majburiy."}, status=400)
updated = (
ChatmessageModel.objects.filter(room_id=room_id, is_read=False)
.exclude(sender=request.user)
.update(is_read=True)
)
return Response({"updated": updated})
@extend_schema(
tags=["ChatRoom"],
parameters=[
OpenApiParameter("type", str, description="Xona turi: auto_evaluation, direct"),
OpenApiParameter("auto_evaluation", int, description="AutoEvaluation ID"),
],
)
class ChatRoomView(BaseViewSetMixin, ModelViewSet):
permission_classes = [IsAuthenticated]
filter_backends = [DjangoFilterBackend]
filterset_class = ChatroomFilter
pagination_class = None
action_permission_classes = {}
action_serializer_class = {
"list": ListChatroomSerializer,
"retrieve": RetrieveChatroomSerializer,
"create": CreateChatroomSerializer,
}
def get_serializer_class(self):
return self.action_serializer_class.get(self.action, ListChatroomSerializer)
def get_queryset(self):
return ChatroomModel.objects.prefetch_related("members").only(
"id",
"type",
"auto_evaluation_id",
"created_at",
)
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
results = list(queryset)
serializer = self.get_serializer(results, many=True)
return Response(
{
"count": len(results),
"next": None,
"previous": None,
"results": serializer.data,
}
)
@extend_schema(
description="Xonaga yangi a'zo qo'shish",
request={"application/json": {"type": "object", "properties": {"user_id": {"type": "integer"}}}},
)
@action(detail=True, methods=["post"], url_path="add-member")
def add_member(self, request, pk=None):
room = self.get_object()
user_id = request.data.get("user_id")
if not user_id:
return Response({"detail": "user_id majburiy."}, status=400)
room.members.add(user_id)
return Response({"detail": "A'zo qo'shildi."})
@extend_schema(
description="Xonadan a'zoni chiqarish",
request={"application/json": {"type": "object", "properties": {"user_id": {"type": "integer"}}}},
)
@action(detail=True, methods=["post"], url_path="remove-member")
def remove_member(self, request, pk=None):
room = self.get_object()
user_id = request.data.get("user_id")
if not user_id:
return Response({"detail": "user_id majburiy."}, status=400)
room.members.remove(user_id)
return Response({"detail": "A'zo chiqarildi."})