from auditlog.models import LogEntry from django.shortcuts import get_object_or_404 from rest_framework import status, viewsets from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from apps.logs.api.permissions import enforce_workspace_log_access from apps.logs.api.serializers import ( WorkspaceLogDetailSerializer, WorkspaceLogListSerializer, WorkspaceLogQuerySerializer, ) from apps.logs.services import ( WorkspaceLogFilters, filter_workspace_logs, get_log_workspace_id, is_visible_workspace_log, parse_filter_datetime, ) from apps.workspaces.models import Workspace from core.paginations.limit_offset import CustomLimitOffsetPagination class WorkspaceLogViewSet(viewsets.ReadOnlyModelViewSet): permission_classes = [IsAuthenticated] pagination_class = CustomLimitOffsetPagination def get_queryset(self): return LogEntry.objects.select_related("actor", "content_type").order_by("-timestamp") def get_serializer_class(self): if self.action == "retrieve": return WorkspaceLogDetailSerializer return WorkspaceLogListSerializer def list(self, request, *args, **kwargs): query_data = request.query_params.copy() if "from" in query_data: query_data["from_date"] = query_data.get("from") if "to" in query_data: query_data["to_date"] = query_data.get("to") query_serializer = WorkspaceLogQuerySerializer(data=query_data) query_serializer.is_valid(raise_exception=True) filters_data = query_serializer.validated_data workspace = get_object_or_404( Workspace, id=filters_data["workspace"], is_deleted=False, ) enforce_workspace_log_access(request.user, workspace) filters = WorkspaceLogFilters( workspace_id=str(workspace.id), section=filters_data.get("section"), actor_id=str(filters_data["actor"]) if filters_data.get("actor") else None, event=filters_data.get("event"), search=filters_data.get("search") or None, from_value=parse_filter_datetime(query_data.get("from")), to_value=parse_filter_datetime(query_data.get("to"), is_end=True), ordering=filters_data.get("ordering", "-timestamp"), ) queryset = filter_workspace_logs(self.get_queryset(), filters) page = self.paginate_queryset(queryset) serializer = self.get_serializer(page, many=True) return self.get_paginated_response(serializer.data) def retrieve(self, request, *args, **kwargs): entry = self.get_object() workspace_id = get_log_workspace_id(entry) if not workspace_id: return Response({"detail": "Not found."}, status=status.HTTP_404_NOT_FOUND) workspace = get_object_or_404(Workspace, id=workspace_id, is_deleted=False) enforce_workspace_log_access(request.user, workspace) if not is_visible_workspace_log(entry): return Response({"detail": "Not found."}, status=status.HTTP_404_NOT_FOUND) serializer = self.get_serializer(entry) return Response(serializer.data)