Files
qlockify-backend-deployment/apps/clients/api/views.py

102 lines
3.9 KiB
Python

from rest_framework import status
from rest_framework.viewsets import ModelViewSet
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
from rest_framework.filters import SearchFilter, OrderingFilter
from django_filters.rest_framework import DjangoFilterBackend
from core.paginations.limit_offset import CustomLimitOffsetPagination
from apps.clients.models import Client
from apps.clients.api.serializers import (
ClientSerializer,
ClientCreateSerializer,
ClientUpdateSerializer
)
from apps.clients.api.permissions import IsClientWorkspaceMember
from apps.clients.services.clients import create_client, update_client
class ClientViewSet(ModelViewSet):
"""
API endpoints for managing clients within workspaces.
"""
permission_classes = [IsAuthenticated, IsClientWorkspaceMember]
pagination_class = CustomLimitOffsetPagination
filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
filterset_fields = ("workspace", )
search_fields = ("name", "notes")
ordering_fields = ("name", "created_at", "updated_at")
ordering = ("-updated_at", "-created_at")
def get_queryset(self):
"""
Returns active clients belonging to workspaces where the current user is an active member.
"""
if getattr(self, "swagger_fake_view", False) or not self.request.user.is_authenticated:
return Client.objects.none()
return Client.objects.filter(
workspace__memberships__user=self.request.user,
workspace__memberships__is_active=True,
is_deleted=False
).distinct()
def get_serializer_class(self):
"""
Selects the appropriate serializer based on the request action.
"""
if self.action == "create":
return ClientCreateSerializer
elif self.action in ["update", "partial_update"]:
return ClientUpdateSerializer
return ClientSerializer
def create(self, request, *args, **kwargs):
"""
Creates a new client using the client service.
"""
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
client = create_client(
user=request.user,
workspace_id=serializer.validated_data["workspace_id"],
name=serializer.validated_data["name"],
notes=serializer.validated_data.get("notes", ""),
thumbnail=serializer.validated_data.get("thumbnail"),
)
output_serializer = ClientSerializer(client, context={"request": request})
return Response(output_serializer.data, status=status.HTTP_201_CREATED)
def update(self, request, *args, **kwargs):
"""
Updates an existing client using the client service.
"""
partial = kwargs.pop("partial", False)
client = self.get_object()
serializer = self.get_serializer(data=request.data, partial=partial)
serializer.is_valid(raise_exception=True)
updated_client = update_client(
client=client,
name=serializer.validated_data.get("name"),
notes=serializer.validated_data.get("notes"),
thumbnail=serializer.validated_data.get("thumbnail"),
clear_thumbnail=serializer.validated_data.get("clear_thumbnail", False),
)
output_serializer = ClientSerializer(updated_client, context={"request": request})
return Response(output_serializer.data, status=status.HTTP_200_OK)
def destroy(self, request, *args, **kwargs):
"""
Soft deletes a client.
"""
client = self.get_object()
client.is_deleted = True
client.save(update_fields=["is_deleted", "updated_at"])
return Response(status=status.HTTP_204_NO_CONTENT)