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": } """ 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."})