91 lines
3.6 KiB
Python
91 lines
3.6 KiB
Python
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) |