Files
GIA/core/views/queues.py

101 lines
2.9 KiB
Python

from asgiref.sync import async_to_sync
from django.contrib.auth.mixins import LoginRequiredMixin
from django.db import transaction
from django.http import HttpResponse
from django.utils import timezone as dj_timezone
from mixins.views import ObjectCreate, ObjectDelete, ObjectList, ObjectUpdate
from rest_framework import status
from rest_framework.views import APIView
from core.forms import QueueForm
from core.models import Message, QueuedMessage
from core.util import logs
log = logs.get_logger("queue")
class AcceptMessageAPI(LoginRequiredMixin, APIView):
def get(self, request, message_id):
try:
queued = QueuedMessage.objects.select_related(
"session",
"session__identifier",
"session__user",
).get(
user=request.user,
id=message_id,
)
except QueuedMessage.DoesNotExist:
return HttpResponse(status=status.HTTP_404_NOT_FOUND)
ts = async_to_sync(queued.session.identifier.send)(
queued.text or "",
[],
)
if not ts:
log.error("Queue accept send failed for queued message %s", queued.id)
return HttpResponse(status=status.HTTP_502_BAD_GATEWAY)
sent_ts = (
int(ts)
if (ts is not None and not isinstance(ts, bool))
else int(dj_timezone.now().timestamp() * 1000)
)
with transaction.atomic():
Message.objects.create(
user=queued.session.user,
session=queued.session,
custom_author=queued.custom_author or "BOT",
text=queued.text,
ts=sent_ts,
delivered_ts=sent_ts,
read_source_service=queued.session.identifier.service,
)
queued.delete()
return HttpResponse(status=status.HTTP_200_OK)
class RejectMessageAPI(LoginRequiredMixin, APIView):
def get(self, request, message_id):
try:
message = QueuedMessage.objects.get(
user=self.request.user,
id=message_id,
)
except QueuedMessage.DoesNotExist:
return HttpResponse(status=status.HTTP_404_NOT_FOUND)
message.delete()
return HttpResponse(status=status.HTTP_200_OK)
class QueueList(LoginRequiredMixin, ObjectList):
list_template = "partials/queue-list.html"
model = QueuedMessage
page_title = "Queue"
list_url_name = "queues"
list_url_args = ["type"]
submit_url_name = "queue_create"
class QueueCreate(LoginRequiredMixin, ObjectCreate):
model = QueuedMessage
form_class = QueueForm
submit_url_name = "queue_create"
class QueueUpdate(LoginRequiredMixin, ObjectUpdate):
model = QueuedMessage
form_class = QueueForm
submit_url_name = "queue_update"
class QueueDelete(LoginRequiredMixin, ObjectDelete):
model = QueuedMessage