to_inventory/back/tgbot/views.py

115 lines
4.1 KiB
Python

from django.conf import settings
from django.db import models
from django.http import StreamingHttpResponse, HttpResponse
import json
import time
import boto3
import io
from telegram import Update
from rest_framework import mixins, viewsets
from rest_framework.response import Response
from rest_framework.decorators import action
from django_filters.rest_framework import DjangoFilterBackend
from .tgbot import TgBot
from .updater import tg_bot_updater_instance
from .models import TgItem, TmcField
from .serializers import TgItemSerializer, TmcFieldSerializer
import logging
logger = logging.getLogger("root")
class TgItemViewSet(viewsets.ModelViewSet):
queryset = TgItem.objects.all().order_by("-updated_at")
serializer_class = TgItemSerializer
http_method_names = ["post", "get", "patch"]
permission_classes = ()
authentication_classes = ()
filter_backends = [DjangoFilterBackend]
filterset_fields = ["user_id"]
def retrieve(self, request, pk=None):
item = TgItem.objects.get(id=pk)
logger.info(
item.tmc.values("tmc__name").annotate(count=models.Count("tmc__name"))
)
return super().retrieve(request, pk)
# return Response(serializer.data)
def partial_update(self, request, *args, **kwargs):
if "location_id" in request.data:
request.data["location"] = 35
return super().partial_update(request)
@action(detail=False, methods=["post"], url_path=settings.TGBOT["WEBHOOK_URL"])
def send_tg_data(self, request):
tg_bot_updater_instance.my_queue.put(
Update.de_json(data=json.loads(request.body), bot=TgBot.app.bot)
)
return Response({"result": "ok"})
# return super().create(request, *args, **kwargs)
class TmcFieldViewset(viewsets.ModelViewSet):
queryset = TmcField.objects.all()
serializer_class = TmcFieldSerializer
http_method_names = ["post", "get", "patch"]
permission_classes = ()
authentication_classes = ()
def partial_update(self, request, *args, **kwargs):
return super().partial_update(request)
@action(detail=False, methods=["get"], url_path=r"get_name/(?P<chat_id>[^/.]+)")
def get_name(self, request, chat_id):
tg_bot_updater_instance.my_queue.put(
{"name": "admin_get_name", "queryset": chat_id}
)
response = []
timer = 30
while timer > 0:
sleeping = 1
timer -= sleeping
time.sleep(sleeping)
if chat_id in tg_bot_updater_instance.return_values:
response.append(tg_bot_updater_instance.return_values[chat_id])
del tg_bot_updater_instance.return_values[chat_id]
break
return Response(response)
@action(detail=False, methods=["get"], url_path=r"get_image/(?P<field_id>[^/.]+)")
def get_image(self, request, field_id):
tg_bot_updater_instance.my_queue.put(
{"name": "admin_get_image", "queryset": field_id}
)
response = []
timer = 30
while timer > 0:
sleeping = 1
timer -= sleeping
time.sleep(sleeping)
if field_id in tg_bot_updater_instance.return_values:
response.append(tg_bot_updater_instance.return_values[field_id])
del tg_bot_updater_instance.return_values[field_id]
break
return Response(response)
@action(detail=False, methods=["get"], url_path=r"get_image_s3/(?P<file_id>[^/.]+)")
def get_image_s3(self, request, file_id):
s3 = boto3.client(
service_name="s3",
endpoint_url="https://s3.ru-1.storage.selcloud.ru",
aws_access_key_id=settings.SELECTEL["access"],
aws_secret_access_key=settings.SELECTEL["secret"],
)
get_object_response = s3.get_object(Bucket="inventorization", Key=file_id)
image = get_object_response["Body"].read()
response = HttpResponse(image, content_type='image/jpeg')
response['Content-Disposition'] = 'inline; filename="image.jpeg"'
return response