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[^/.]+)") 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[^/.]+)") 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)