diff --git a/back/tgbot/admin.py b/back/tgbot/admin.py index bc79e66..5a438af 100644 --- a/back/tgbot/admin.py +++ b/back/tgbot/admin.py @@ -1,5 +1,6 @@ from django.contrib import admin -# from .models import Item +from .models import Item, Element # Register your models here. -# admin.site.register(Item) \ No newline at end of file +admin.site.register(Item) +admin.site.register(Element) \ No newline at end of file diff --git a/back/tgbot/models.py b/back/tgbot/models.py index a08b97e..779f4fc 100644 --- a/back/tgbot/models.py +++ b/back/tgbot/models.py @@ -3,14 +3,42 @@ from django.db import models from tmc.models import CustomTable +import logging + +logger = logging.getLogger("root") + + +def group_based_upload_to(instance, filename): + logger.info(instance) + return "files/image/{}/{}/{}".format( + type(instance).__name__.lower(), instance.id, filename + ) + + +class Element(models.Model): + tmc = models.ForeignKey(CustomTable, models.RESTRICT) + name = models.CharField() + photoid = models.CharField() + photo = models.ImageField(null=True, upload_to=group_based_upload_to) + text = models.TextField(blank=True, null=True) + + def __str__(self): + return f"Element {self.tmc} {self.name}" class Item(models.Model): - id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) + id = models.UUIDField( + auto_created=True, + primary_key=True, + default=uuid.uuid4, + editable=False, + unique=True, + ) user_id = models.BigIntegerField() name = models.CharField(max_length=255) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) tmc = models.ManyToManyField(CustomTable) + element = models.ManyToManyField(Element) def __str__(self): return f"Tg item {self.id}" diff --git a/back/tgbot/tgbot.py b/back/tgbot/tgbot.py index f33e474..aed2c75 100644 --- a/back/tgbot/tgbot.py +++ b/back/tgbot/tgbot.py @@ -4,6 +4,11 @@ from telegram import ( ForceReply, Update, ReplyParameters, + ReplyKeyboardMarkup, + ReplyKeyboardRemove, + KeyboardButton, + InlineKeyboardMarkup, + InlineKeyboardButton, ) from telegram.ext import ( Application, @@ -15,7 +20,7 @@ from telegram.ext import ( from telegram.constants import ParseMode, ChatType, MessageEntityType from .apps import TgBotClass -from .models import Item +from .models import Element, Item from tmc.models import CustomTable, BaseCustomField import logging @@ -23,6 +28,10 @@ import logging logger = logging.getLogger("root") +def chunk(n, l): + return [l[i : i + n] for i in range(0, len(l), n)] + + class TgBotApp: _app = None @@ -30,12 +39,28 @@ class TgBotApp: await update.message.reply_markdown_v2( ( "Это бот для проведения инвентаризации\n" + "/my \-\- продолжить инвентаризацию\n" "/inv \-\- начать новую инвентаризацию" ), # reply_markup=ForceReply(selective=True), reply_parameters=ReplyParameters(message_id=update.message.message_id), ) + async def my(self, update: Update, context: CallbackContext): + user = update.effective_user + current_step = context.chat_data.get("step", None) + logger.info(f"Step {current_step} from user {user.full_name}") + + inv = [] + async for e in Item.objects.filter(user_id=user.id): + inv.append(e) + + await update.message.reply_markdown_v2( + ("Ваши инвентаризации\n" "\n".join([f"`/inv_{i.id}`" for i in inv])), + # reply_markup=ForceReply(selective=True), + reply_parameters=ReplyParameters(message_id=update.message.message_id), + ) + async def inv(self, update: Update, context: CallbackContext): user = update.effective_user current_step = context.chat_data.get("step", None) @@ -61,16 +86,15 @@ class TgBotApp: tmc = [] async for e in CustomTable.objects.all(): - tmc.append(f"`{e.name}`") + tmc.append(e.name) + keys = chunk(3, tmc) await update.message.reply_markdown_v2( - ( - f"Инвентаризация `#{inv.id}`\n" - f"Название объекта `{inv.name}`\n" - f"Объекты ТМЦ {', '.join(tmc)}\n" - "Вставьте название объекта, который будете добавлять" - ), + (f"Инвентаризация `#{inv.id}`\n" f"Название объекта `{inv.name}`\n"), reply_parameters=ReplyParameters(message_id=update.message.message_id), + reply_markup=ReplyKeyboardMarkup( + [[KeyboardButton(i) for i in arr] for arr in keys] + ), ) logger.info(tmc) context.chat_data["step"] = "add_tmc" @@ -78,20 +102,60 @@ class TgBotApp: elif current_step is "add_tmc": tmc_name = update.message.text tmc = await CustomTable.objects.aget(name=tmc_name) - + inv = await Item.objects.aget(id=context.chat_data["inv"]) await inv.tmc.aadd(tmc) - + fields = [] async for e in tmc.fields.all(): - fields.append(f"`{e.name}`") + fields.append(e.name) + keys = chunk(1, fields) + await update.message.reply_markdown_v2( ( - f"Необходимые данные {', '.join(fields)}" + f"Инвентаризация `#{inv.id}`\n" + f"Название объекта `{inv.name}`\n" + f"Название ТМЦ `{tmc.name}`\n" + f"Что вы загружаете?" ), reply_parameters=ReplyParameters(message_id=update.message.message_id), + reply_markup=ReplyKeyboardMarkup( + [[KeyboardButton(i) for i in arr] for arr in keys] + ), ) - # context.chat_data["step"] = "name" + context.chat_data["tmc"] = tmc.id + context.chat_data["step"] = "add_field" + elif current_step is "add_field": + tmc = await CustomTable.objects.aget(id=context.chat_data["tmc"]) + + element_name = update.message.text + element = await Element.objects.acreate(name=element_name, tmc=tmc) + + inv = await Item.objects.aget(id=context.chat_data["inv"]) + await inv.element.aadd(element) + + 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" + elif current_step is "add_field_data": + element = await Element.objects.aget(id=context.chat_data["element"]) + + if update.message.photo: + element.photoid = update.message.photo[-1].file_id + elif update.message.text: + element.text = update.message.text + + await element.asave() if "step" in context.chat_data and context.chat_data["step"] == current_step: context.chat_data["step"] = None @@ -119,6 +183,7 @@ class TgBotApp: self._app.add_handler( CommandHandler("start", self.start, filters.ChatType.PRIVATE) ) + self._app.add_handler(CommandHandler("my", self.my, filters.ChatType.PRIVATE)) self._app.add_handler(CommandHandler("inv", self.inv, filters.ChatType.PRIVATE)) self._app.add_handler(MessageHandler(filters.ChatType.PRIVATE, self.inv)) self._app.add_error_handler(self.error)