# Django imports from django.db.models import Exists, OuterRef # Third Party imports from rest_framework.response import Response from rest_framework import status from rest_framework.permissions import AllowAny # Module imports from .base import BaseAPIView from plane.app.serializers import DeployBoardSerializer from plane.db.models import Project, DeployBoard, ProjectMember class ProjectDeployBoardPublicSettingsEndpoint(BaseAPIView): permission_classes = [AllowAny] def get(self, request, anchor): project_deploy_board = DeployBoard.objects.get(anchor=anchor, entity_name="project") serializer = DeployBoardSerializer(project_deploy_board) return Response(serializer.data, status=status.HTTP_200_OK) class WorkspaceProjectDeployBoardEndpoint(BaseAPIView): permission_classes = [AllowAny] def get(self, request, anchor): deploy_board = DeployBoard.objects.filter(anchor=anchor, entity_name="project").values_list projects = ( Project.objects.filter(workspace=deploy_board.workspace) .annotate( is_public=Exists( DeployBoard.objects.filter(anchor=anchor, project_id=OuterRef("pk"), entity_name="project") ) ) .filter(is_public=True) ).values( "id", "identifier", "name", "description", "emoji", "icon_prop", "cover_image", ) return Response(projects, status=status.HTTP_200_OK) class WorkspaceProjectAnchorEndpoint(BaseAPIView): permission_classes = [AllowAny] def get(self, request, slug, project_id): project_deploy_board = DeployBoard.objects.get( workspace__slug=slug, project_id=project_id, entity_name="project" ) serializer = DeployBoardSerializer(project_deploy_board) return Response(serializer.data, status=status.HTTP_200_OK) class ProjectMembersEndpoint(BaseAPIView): permission_classes = [AllowAny] def get(self, request, anchor): deploy_board = DeployBoard.objects.filter(anchor=anchor).first() if not deploy_board: return Response( {"error": "Invalid anchor"}, status=status.HTTP_404_NOT_FOUND, ) members = ProjectMember.objects.filter( project=deploy_board.project, workspace=deploy_board.workspace, is_active=True, ).values( "id", "member", "member__display_name", "member__avatar", ) return Response(members, status=status.HTTP_200_OK)