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