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