From 1b310dbfbe93f80ce6d79d200b85f067720481d8 Mon Sep 17 00:00:00 2001 From: Kseninia Mikhaylova Date: Fri, 5 Jul 2024 16:50:49 +0300 Subject: [PATCH] part of tg --- back/tgbot/apps.py | 8 +++--- back/tgbot/models.py | 2 +- back/tgbot/tgbot.py | 60 ++++++++++++++++++++++++++++++++++++-------- 3 files changed, 56 insertions(+), 14 deletions(-) diff --git a/back/tgbot/apps.py b/back/tgbot/apps.py index 3079eb9..715ded7 100644 --- a/back/tgbot/apps.py +++ b/back/tgbot/apps.py @@ -22,7 +22,9 @@ class TgBotClass(AppConfig): tgbot = TgBotApp() app = await tgbot.init_tg() - await tgbot.set_webhook(f"https://{settings.TGBOT['base_url']}/api/tgbot/") + await tgbot.set_webhook( + f"https://{settings.TGBOT['base_url']}/api/tgbot/", + ) return app async def some_function(self=None): @@ -31,8 +33,8 @@ class TgBotClass(AppConfig): item = TgBotClass.my_queue.get() await TgBotClass.app.process_update(item) TgBotClass.my_queue.task_done() - time.sleep(1) - + time.sleep(1) + async def some_callback(): await TgBotClass.some_function() diff --git a/back/tgbot/models.py b/back/tgbot/models.py index 779f4fc..2bfa311 100644 --- a/back/tgbot/models.py +++ b/back/tgbot/models.py @@ -34,7 +34,7 @@ class Item(models.Model): unique=True, ) user_id = models.BigIntegerField() - name = models.CharField(max_length=255) + name = models.CharField(max_length=255, unique_for_month=True) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) tmc = models.ManyToManyField(CustomTable) diff --git a/back/tgbot/tgbot.py b/back/tgbot/tgbot.py index aed2c75..c5bfb70 100644 --- a/back/tgbot/tgbot.py +++ b/back/tgbot/tgbot.py @@ -9,6 +9,7 @@ from telegram import ( KeyboardButton, InlineKeyboardMarkup, InlineKeyboardButton, + MessageEntity, ) from telegram.ext import ( Application, @@ -53,19 +54,32 @@ class TgBotApp: inv = [] async for e in Item.objects.filter(user_id=user.id): - inv.append(e) + inv.append(e.name) + keys = chunk(1, inv) await update.message.reply_markdown_v2( - ("Ваши инвентаризации\n" "\n".join([f"`/inv_{i.id}`" for i in inv])), - # reply_markup=ForceReply(selective=True), + ("Ваши инвентаризации"), + reply_markup=ReplyKeyboardMarkup( + [[KeyboardButton(i) for i in arr] for arr in keys] + ), reply_parameters=ReplyParameters(message_id=update.message.message_id), ) + context.chat_data["step"] = "get_inv" async def inv(self, update: Update, context: CallbackContext): user = update.effective_user current_step = context.chat_data.get("step", None) + if not update.message: + return True + logger.info(update.message) logger.info(f"Step {current_step} from user {user.full_name}") + if current_step == "get_inv": + inv = await Item.objects.aget(name=update.message.text) + context.chat_data["inv"] = inv.id + context.chat_data["step"] = "name" + current_step = context.chat_data["step"] + if not current_step and update.message.text == "/inv": inv = await Item.objects.acreate(user_id=user.id) await update.message.reply_markdown_v2( @@ -79,7 +93,7 @@ class TgBotApp: context.chat_data["inv"] = inv.id context.chat_data["step"] = "name" - elif current_step is "name": + elif current_step == "name": inv = await Item.objects.aget(id=context.chat_data["inv"]) inv.name = update.message.text await inv.asave() @@ -90,7 +104,11 @@ class TgBotApp: keys = chunk(3, tmc) await update.message.reply_markdown_v2( - (f"Инвентаризация `#{inv.id}`\n" f"Название объекта `{inv.name}`\n"), + ( + f"Инвентаризация `#{inv.id}`\n" + f"Название объекта `{inv.name}`\n" + f"Количество ТМЦ {await inv.tmc.acount()}" + ), reply_parameters=ReplyParameters(message_id=update.message.message_id), reply_markup=ReplyKeyboardMarkup( [[KeyboardButton(i) for i in arr] for arr in keys] @@ -99,7 +117,7 @@ class TgBotApp: logger.info(tmc) context.chat_data["step"] = "add_tmc" - elif current_step is "add_tmc": + elif current_step == "add_tmc": tmc_name = update.message.text tmc = await CustomTable.objects.aget(name=tmc_name) @@ -125,7 +143,7 @@ class TgBotApp: ) context.chat_data["tmc"] = tmc.id context.chat_data["step"] = "add_field" - elif current_step is "add_field": + elif current_step == "add_field": tmc = await CustomTable.objects.aget(id=context.chat_data["tmc"]) element_name = update.message.text @@ -147,8 +165,10 @@ class TgBotApp: ) context.chat_data["element"] = element.id context.chat_data["step"] = "add_field_data" - elif current_step is "add_field_data": - element = await Element.objects.aget(id=context.chat_data["element"]) + elif current_step == "add_field_data": + inv = await Item.objects.aget(id=context.chat_data["inv"]) + tmc = await CustomTable.objects.aget(id=inv.tmc) + element = await Element.objects.aget(id=inv.element) if update.message.photo: element.photoid = update.message.photo[-1].file_id @@ -157,6 +177,23 @@ class TgBotApp: await element.asave() + await update.message.reply_markdown_v2( + ( + f"Инвентаризация `#{inv.id}`\n" + f"Название объекта `{inv.name}`\n" + f"Название ТМЦ `{tmc.name}`\n" + f"Название элемента `{element.name}`\n" + f"Загрузите фото или пришлите текст" + ), + reply_parameters=ReplyParameters(message_id=update.message.message_id), + reply_markup=ReplyKeyboardRemove(), + ) + context.chat_data["element"] = element.id + context.chat_data["step"] = "add_field_data" + else: + logger.info(update.message.entities) + logger.info(f"no step for update {update}") + if "step" in context.chat_data and context.chat_data["step"] == current_step: context.chat_data["step"] = None context.chat_data["inv"] = None @@ -170,7 +207,9 @@ class TgBotApp: logger.error("no app") return app = self._app - await app.bot.set_webhook(url, allowed_updates=Update.ALL_TYPES) + await app.bot.set_webhook( + url, allowed_updates=Update.ALL_TYPES, drop_pending_updates=True + ) async def init_tg(self): self._app = ( @@ -197,4 +236,5 @@ class TgBotApp: ) await self._app.initialize() await self._app.start() + self._app return self._app