173 lines
6.0 KiB
Python
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."})
|