to_inventory/back/tgbot/views.py

99 lines
3.3 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 .apps import TgBotUpdater
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):
TgBotUpdater.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):
TgBotUpdater.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 TgBotUpdater.return_values:
response.append(TgBotUpdater.return_values[chat_id])
del TgBotUpdater.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):
TgBotUpdater.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 TgBotUpdater.return_values:
response.append(TgBotUpdater.return_values[field_id])
del TgBotUpdater.return_values[field_id]
break
return Response(response)