very base tg bot
This commit is contained in:
parent
431655eaac
commit
ef08733979
|
@ -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)
|
|
@ -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}"
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue