to_inventory/back/tgbot/views.py

99 lines
3.4 KiB
Python

from django.conf import settings
from django.db import models
import json
import requests
import time
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
from tmc.models import TerritoryItem
from tmc.serializers import TerritoryItemSerializer
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)