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 .models import Item
from .models import Item, Element
# 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
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}"

View File

@ -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"
@ -84,14 +108,54 @@ class TgBotApp:
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)