very base tg bot

This commit is contained in:
Kseninia Mikhaylova 2024-07-05 15:38:13 +03:00
parent 431655eaac
commit ef08733979
3 changed files with 110 additions and 16 deletions

View File

@ -1,5 +1,6 @@
from django.contrib import admin from django.contrib import admin
# from .models import Item from .models import Item, Element
# Register your models here. # Register your models here.
# admin.site.register(Item) admin.site.register(Item)
admin.site.register(Element)

View File

@ -3,14 +3,42 @@ from django.db import models
from tmc.models import CustomTable 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): 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() user_id = models.BigIntegerField()
name = models.CharField(max_length=255) name = models.CharField(max_length=255)
created_at = models.DateTimeField(auto_now_add=True) created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True) updated_at = models.DateTimeField(auto_now=True)
tmc = models.ManyToManyField(CustomTable) tmc = models.ManyToManyField(CustomTable)
element = models.ManyToManyField(Element)
def __str__(self): def __str__(self):
return f"Tg item {self.id}" return f"Tg item {self.id}"

View File

@ -4,6 +4,11 @@ from telegram import (
ForceReply, ForceReply,
Update, Update,
ReplyParameters, ReplyParameters,
ReplyKeyboardMarkup,
ReplyKeyboardRemove,
KeyboardButton,
InlineKeyboardMarkup,
InlineKeyboardButton,
) )
from telegram.ext import ( from telegram.ext import (
Application, Application,
@ -15,7 +20,7 @@ from telegram.ext import (
from telegram.constants import ParseMode, ChatType, MessageEntityType from telegram.constants import ParseMode, ChatType, MessageEntityType
from .apps import TgBotClass from .apps import TgBotClass
from .models import Item from .models import Element, Item
from tmc.models import CustomTable, BaseCustomField from tmc.models import CustomTable, BaseCustomField
import logging import logging
@ -23,6 +28,10 @@ import logging
logger = logging.getLogger("root") logger = logging.getLogger("root")
def chunk(n, l):
return [l[i : i + n] for i in range(0, len(l), n)]
class TgBotApp: class TgBotApp:
_app = None _app = None
@ -30,12 +39,28 @@ class TgBotApp:
await update.message.reply_markdown_v2( await update.message.reply_markdown_v2(
( (
"Это бот для проведения инвентаризации\n" "Это бот для проведения инвентаризации\n"
"/my \-\- продолжить инвентаризацию\n"
"/inv \-\- начать новую инвентаризацию" "/inv \-\- начать новую инвентаризацию"
), ),
# reply_markup=ForceReply(selective=True), # reply_markup=ForceReply(selective=True),
reply_parameters=ReplyParameters(message_id=update.message.message_id), 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): async def inv(self, update: Update, context: CallbackContext):
user = update.effective_user user = update.effective_user
current_step = context.chat_data.get("step", None) current_step = context.chat_data.get("step", None)
@ -61,16 +86,15 @@ class TgBotApp:
tmc = [] tmc = []
async for e in CustomTable.objects.all(): 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( await update.message.reply_markdown_v2(
( (f"Инвентаризация `#{inv.id}`\n" f"Название объекта `{inv.name}`\n"),
f"Инвентаризация `#{inv.id}`\n"
f"Название объекта `{inv.name}`\n"
f"Объекты ТМЦ {', '.join(tmc)}\n"
"Вставьте название объекта, который будете добавлять"
),
reply_parameters=ReplyParameters(message_id=update.message.message_id), 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) logger.info(tmc)
context.chat_data["step"] = "add_tmc" context.chat_data["step"] = "add_tmc"
@ -78,20 +102,60 @@ class TgBotApp:
elif current_step is "add_tmc": elif current_step is "add_tmc":
tmc_name = update.message.text tmc_name = update.message.text
tmc = await CustomTable.objects.aget(name=tmc_name) tmc = await CustomTable.objects.aget(name=tmc_name)
inv = await Item.objects.aget(id=context.chat_data["inv"]) inv = await Item.objects.aget(id=context.chat_data["inv"])
await inv.tmc.aadd(tmc) await inv.tmc.aadd(tmc)
fields = [] fields = []
async for e in tmc.fields.all(): 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( 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_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: if "step" in context.chat_data and context.chat_data["step"] == current_step:
context.chat_data["step"] = None context.chat_data["step"] = None
@ -119,6 +183,7 @@ class TgBotApp:
self._app.add_handler( self._app.add_handler(
CommandHandler("start", self.start, filters.ChatType.PRIVATE) 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(CommandHandler("inv", self.inv, filters.ChatType.PRIVATE))
self._app.add_handler(MessageHandler(filters.ChatType.PRIVATE, self.inv)) self._app.add_handler(MessageHandler(filters.ChatType.PRIVATE, self.inv))
self._app.add_error_handler(self.error) self._app.add_error_handler(self.error)