181 lines
6.9 KiB
Python

from time import sleep
from datetime import datetime
from rest_framework.views import APIView
from rest_framework import status
from rest_framework.permissions import IsAuthenticated
from django.core.exceptions import ObjectDoesNotExist
from rest_framework.response import Response
from rest_framework import status
from .models import Message
from .models import AdminComment
from .models import AdminRequest
from .models import GuildInfo
from geeksbot_web.utils.api_utils import PaginatedAPIView
from .utils import create_error_response
from .utils import create_success_response
from .utils import create_request_success_response
from .utils import create_comment_success_response
from .serializers import AdminRequestSerializer
from .serializers import AdminCommentSerializer
# Create your views here.
# API Views
class MessagesAPI(PaginatedAPIView):
permission_classes = [IsAuthenticated]
def get(self, request, format=None):
messages = Message.objects.all()
page = self.paginate_queryset(messages)
if page:
return create_success_response(page, status.HTTP_200_OK, many=True)
return create_success_response(messages, status.HTTP_200_OK, many=True)
def post(self, request, format=None):
data = dict(request.data)
return Message.add_new_message(data)
class MessageDetailAPI(APIView):
permission_classes = [IsAuthenticated]
def get(self, request, id, format=None):
message = Message.get_message_by_id(id)
if message:
return create_success_response(message, status.HTTP_200_OK, many=False)
else:
return create_error_response("Message Does Not Exist",
status=status.HTTP_404_NOT_FOUND)
def put(self, request, id, format=None):
data = dict(request.data)
message = Message.get_message_by_id(id)
if message:
return message.update_message(data)
else:
return create_error_response('Message Does Not Exist',
status=status.HTTP_404_NOT_FOUND)
class WaitForMessageAPI(APIView):
permission_classes = [IsAuthenticated]
def get(self, request, id, timeout: int = 3, format=None):
message = Message.get_message_by_id(id)
try_count = 0
while not message:
sleep(0.1)
try_count += 1
if try_count > timeout * 10:
return create_error_response("Timeout reached before message is available.",
statu=status.HTTP_404_NOT_FOUND)
message = Message.get_message_by_id(id)
return create_success_response(message, status=status.HTTP_200_OK)
class RequestsAPI(PaginatedAPIView):
permission_classes = [IsAuthenticated]
def get(self, request, guild_id, format=None):
requests = AdminRequest.get_open_requests_by_guild(guild_id)
page = self.paginate_queryset(requests)
if page is not None:
return create_request_success_response(page, status.HTTP_200_OK, many=True)
if requests:
return create_request_success_response(requests, status.HTTP_200_OK, many=True)
return create_error_response("No requests found")
def post(self, request, guild_id, format=None):
data = dict(request.data)
return AdminRequest.add_new_request(guild_id, data)
class UserRequestsAPI(PaginatedAPIView):
permission_classes = [IsAuthenticated]
def get(self, request, guild_id, author_id, format=None):
requests = AdminRequest.get_open_requests_by_guild_author(guild_id, author_id)
page = self.paginate_queryset(requests)
if page is not None:
return create_request_success_response(page, status.HTTP_200_OK, many=True)
if requests:
return create_request_success_response(requests, status.HTTP_200_OK, many=True)
return create_error_response("No requests found")
class RequestDetailAPI(APIView):
permission_classes = [IsAuthenticated]
def get(self, req, guild_id, request_id, format=None):
req = AdminRequest.get_open_request_by_id(guild_id, request_id)
if req:
comments = AdminComment.get_comments_by_request(req)
if comments:
data = AdminRequestSerializer(req).data
data['comments'] = AdminCommentSerializer(comments, many=True).data
return Response(data, status.HTTP_200_OK)
else:
return create_request_success_response(req, status.HTTP_200_OK, many=False)
else:
return create_error_response("That Request Does Not Exist",
status=status.HTTP_404_NOT_FOUND)
def put(self, request, guild_id, request_id, format=None):
req = AdminRequest.get_open_request_by_id(guild_id, request_id)
if req:
data = dict(request.data)
return req.update_request(data)
return create_error_response("That Request Does Not Exist",
status=status.HTTP_404_NOT_FOUND)
def delete(self, request, guild_id, request_id, format=None):
data = dict(request.data)
request = AdminRequest.get_open_request_by_id(guild_id, request_id)
data['completed'] = True
data['completed_at'] = datetime.utcnow()
return request.update_request(data)
class CommentsAPI(PaginatedAPIView):
permissions_classes = [IsAuthenticated]
def get(self, request, guild_id, request_id, format=None):
comments = AdminComment.get_comments_by_request(request_id)
if comments:
return create_comment_success_response(comments, status=status.HTTP_200_OK, many=True)
return create_error_response("No Comments found")
def post(self, request, guild_id, request_id, format=None):
data = dict(request.data)
return AdminComment.add_new_comment(data, guild_id, request_id)
class CommentsCountAPI(PaginatedAPIView):
permissions_classes = [IsAuthenticated]
def get(self, request, guild_id, request_id, format=None):
comments = AdminComment.get_comments_by_request(request_id)
if comments:
return Response(len(comments), status=status.HTTP_200_OK)
return Response(0, status.HTTP_200_OK)
class CommentDetailAPI(APIView):
permissions_classes = [IsAuthenticated]
def get(self, request, request_id, comment_id, format=None):
comment = AdminComment.get_comment_by_id(comment_id)
if comment:
if comment.request.id != request_id:
return create_error_response("That comment is not for this request",
status=status.HTTP_400_BAD_REQUEST)
return create_comment_success_response(comment, status.HTTP_200_OK, many=False)
else:
return create_error_response("Comment Does Not Exist",
status=status.HTTP_404_NOT_FOUND)