from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status, mixins, viewsets from rest_framework.permissions import AllowAny, IsAuthenticated, IsAdminUser from rest_framework.decorators import action from django.db import transaction from django.core.mail import EmailMessage, get_connection from .models import * from .serializers import * from .services import * from projects.models import Project from projects.serializers import ProjectListViewSerializer from portfolios.models import Portfolio from portfolios.serializers import PortfolioListViewSerializer from users.models import User class HomeAPIView(APIView): def get(self, request): pass class SearchAPIView(APIView): def get(self, request): search_team = request.query_params.get('q', '') object_type = request.query_params.get('type', None) try: page = int(request.query_params.get("page", 1)) except ValueError: return Response({"is_page_int": False,"detail": "page and page_size must be integers"}, status=status.HTTP_400_BAD_REQUEST) if page < 1: return Response({"is_page_gte_1": False, "detail": "page and page_size must be >= 1"}, status=status.HTTP_400_BAD_REQUEST) page_size = 8 buckets = NocodetoolSearchService.search(search_team, object_type, page, page_size) project_list = NocodetoolSearchService.get_ids_from_buckets(buckets["projects"]) portfolio_list = NocodetoolSearchService.get_ids_from_buckets(buckets["portfolios"]) projects_data = ProjectListViewSerializer( NocodetoolToObjectService.get_objects_by_ids('project', project_list), many=True).data portfolios_data = PortfolioListViewSerializer( NocodetoolToObjectService.get_objects_by_ids('portfolio', portfolio_list), many=True).data return Response({ "projects": projects_data, "portfolios": portfolios_data, "page": page, "page_size": page_size }, status=status.HTTP_200_OK) class PreOrderedAPIViewSet(viewsets.ViewSet): @transaction.atomic @action(detail=False, methods=["post"], url_path="register", permission_classes=[AllowAny]) def register(self, request): serializer = PreOrderedEmailSerializer(data=request.data) if serializer.is_valid(): serializer.save() return Response({"registered": True}, status=status.HTTP_200_OK) return Response({"registered": False, "message": "wrong type or already registered"}, status=status.HTTP_400_BAD_REQUEST) @transaction.atomic @action(detail=False, methods=["post"], url_path="send", permission_classes=[IsAdminUser]) def send(self, request): try: title = request.data["title"] content = request.data["content"] conn = get_connection() emails = [] email_list = PreOrderedEmail.objects.all() for i, email_obj in enumerate(email_list): if i >= 0 and i % 20 == 0: conn.send_messages(emails) conn.close() conn = get_connection() emails = [] emails.append(EmailMessage(subject=title, body=content, to=[email_obj.email], connection=conn)) conn.send_messages(emails) return Response({"success": True}, status=status.HTTP_200_OK) except Exception as e: return Response({"success": False, "error": str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)