chat qo'shildi
This commit is contained in:
172
core/apps/chat/views/chat.py
Normal file
172
core/apps/chat/views/chat.py
Normal file
@@ -0,0 +1,172 @@
|
||||
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."})
|
||||
Reference in New Issue
Block a user