diff --git a/back/tgbot/tgbot.py b/back/tgbot/tgbot.py index a9813c9..75b74a6 100644 --- a/back/tgbot/tgbot.py +++ b/back/tgbot/tgbot.py @@ -27,6 +27,7 @@ from telegram.constants import ParseMode from django.conf import settings from django.urls import reverse +from django.db import models from .apps import TgBotUpdater from .models import TgItem, TmcElement, TmcField @@ -151,8 +152,18 @@ class TgBot: def format_inv(self, inv): return f"Инвентаризация `{inv.name}` от `{inv.created_at.strftime('%x')}`" + async def get_tmc_count(self, inv): + tmc_count = [] + async for e in inv.tmc.values("tmc__name").annotate( + count=models.Count("tmc__name") + ): + tmc_count.append(e) + return tmc_count + def format_tmc_count(self, tmc_count): - return f"Количество ТМЦ {tmc_count}" + res = ["Всего ТМЦ:"] + res.append(", ".join([f"{e['tmc__name']} \({e['count']}\)" for e in tmc_count])) + return " ".join(res) def format_tmc_name(self, tmc): return f"Название ТМЦ `{tmc.name}`" @@ -202,6 +213,7 @@ class TgBot: await tmc_element.field.aadd(tmc_field) await inv.tmc.aadd(tmc_element) + await inv.asave() context.chat_data["tmc"] = tmc_element.id context.chat_data["step"] = "add_tmc" @@ -261,7 +273,7 @@ class TgBot: text = "\n".join( [ self.format_inv(inv), - self.format_tmc_count(await inv.tmc.acount()), + self.format_tmc_count(await self.get_tmc_count(inv)), "Выберите, какую ТМЦ вы осматриваете:", ] ) @@ -302,7 +314,7 @@ class TgBot: text = "\n".join( [ self.format_inv(inv), - self.format_tmc_count(await inv.tmc.acount()), + self.format_tmc_count(await self.get_tmc_count(inv)), self.format_tmc_name(tmc), f"Что вы загружаете?", ] @@ -329,7 +341,8 @@ class TgBot: elif current_step == "add_element": inv = await TgItem.objects.aget(id=context.chat_data["inv"]) - tmc = await inv.tmc.aget(id=context.chat_data["tmc"]) + tmc_element = await inv.tmc.aget(id=context.chat_data["tmc"]) + tmc = await CustomTable.objects.aget(id=tmc_element.tmc_id) element = await TmcField.objects.aget(id=context.chat_data["element"]) field = await BaseCustomField.objects.aget(id=element.field_id) @@ -339,7 +352,7 @@ class TgBot: "\n".join( [ self.format_inv(inv), - self.format_tmc_count(await inv.tmc.acount()), + self.format_tmc_count(await self.get_tmc_count(inv)), self.format_tmc_name(tmc), self.format_element(field), f"Загрузите фото или пришлите текст", @@ -363,6 +376,8 @@ class TgBot: element.text = update.message.text await element.asave() + await inv.asave() + await update.effective_message.reply_markdown_v2( "Изображение сохранено" if update.message.photo else "Текст сохранен" ) diff --git a/back/tgbot/views.py b/back/tgbot/views.py index eaec292..2a59097 100644 --- a/back/tgbot/views.py +++ b/back/tgbot/views.py @@ -1,4 +1,5 @@ from django.conf import settings +from django.db import models import json import time @@ -19,10 +20,18 @@ logger = logging.getLogger("root") class TgItemViewSet(viewsets.ModelViewSet): - queryset = TgItem.objects.all().order_by('-updated_at') + queryset = TgItem.objects.all().order_by("-updated_at") serializer_class = TgItemSerializer http_method_names = ["post", "get"] + 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) + @action(detail=False, methods=["post"], url_path=settings.TGBOT["WEBHOOK_URL"]) def send_tg_data(self, request): TgBotUpdater.my_queue.put( @@ -51,6 +60,7 @@ class TmcFieldViewset(viewsets.ModelViewSet): 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})