diff --git a/back/api/settings.py b/back/api/settings.py index d60982a..efe805e 100644 --- a/back/api/settings.py +++ b/back/api/settings.py @@ -27,11 +27,7 @@ SECRET_KEY = "django-insecure-ruo!wst&sb8(f9)j5u4rda-w!673lj_-c0a%gx_t@)ff*q*2ze # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True -<<<<<<< HEAD -NGROK_TEMP = "357e-193-228-134-167.ngrok-free.app" -======= -NGROK_TEMP = "5f4c-193-228-134-167.ngrok-free.app" ->>>>>>> bx-581-startproject +NGROK_TEMP = "da22-193-228-134-167.ngrok-free.app" ALLOWED_HOSTS = [ "localhost", NGROK_TEMP, diff --git a/back/tgbot/admin.py b/back/tgbot/admin.py index 44b1f86..bc79e66 100644 --- a/back/tgbot/admin.py +++ b/back/tgbot/admin.py @@ -1,5 +1,5 @@ from django.contrib import admin -from .models import Item +# from .models import Item # Register your models here. -admin.site.register(Item) \ No newline at end of file +# admin.site.register(Item) \ No newline at end of file diff --git a/back/tgbot/apps.py b/back/tgbot/apps.py index 8c38f08..3079eb9 100644 --- a/back/tgbot/apps.py +++ b/back/tgbot/apps.py @@ -26,17 +26,12 @@ class TgBotClass(AppConfig): return app async def some_function(self=None): - # await TgBotClass.app.bot.get_me() while True: if not TgBotClass.my_queue.empty(): item = TgBotClass.my_queue.get() - try: - await TgBotClass.app.process_update(item) - except Exception as e: - print('err') - await TgBotClass.app.process_update(item) + await TgBotClass.app.process_update(item) TgBotClass.my_queue.task_done() - time.sleep(3) + time.sleep(1) async def some_callback(): await TgBotClass.some_function() diff --git a/back/tgbot/models.py b/back/tgbot/models.py index a22a518..bbae866 100644 --- a/back/tgbot/models.py +++ b/back/tgbot/models.py @@ -1,8 +1,12 @@ +import uuid from django.db import models class Item(models.Model): - id = models.AutoField(primary_key=True) + id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) + 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) def __str__(self): return f"Tg item {self.id}" diff --git a/back/tgbot/tgbot.py b/back/tgbot/tgbot.py index c4f27ce..ebbea59 100644 --- a/back/tgbot/tgbot.py +++ b/back/tgbot/tgbot.py @@ -1,4 +1,5 @@ from django.conf import settings +from asgiref.sync import sync_to_async from telegram import ( ForceReply, Update, @@ -11,7 +12,10 @@ from telegram.ext import ( filters, CallbackContext, ) -from telegram.constants import ParseMode, ChatType +from telegram.constants import ParseMode, ChatType, MessageEntityType + +from .apps import TgBotClass +from .models import Item import logging @@ -22,14 +26,49 @@ class TgBotApp: _app = None async def start(self, update: Update, context: CallbackContext): - user = update.effective_user - # logger.info(update) - await update.message.reply_html( - rf"Hi {user.mention_html()}!", + await update.message.reply_markdown_v2( + ( + "Это бот для проведения инвентаризации\n" + "/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) + logger.info(f"Step {current_step} from user {user.full_name}") + if not current_step and update.message.text == "/inv": + inv = await sync_to_async(Item.objects.create)(user_id=user.id) + await update.message.reply_markdown_v2( + ( + f"Специалист {user.name or user.full_name}, ID {user.id}\n" + f"Начинаем инвентаризацию `#{inv.id}`\n" + f"Введите название объекта" + ), + reply_parameters=ReplyParameters(message_id=update.message.message_id), + ) + context.chat_data["step"] = "name" + context.chat_data["inv"] = inv.id + elif current_step is "name": + inv = await sync_to_async(Item.objects.get)(id=context.chat_data["inv"]) + inv.name = update.message.text + await sync_to_async(inv.save)() + await update.message.reply_markdown_v2( + ( + f"Инвентаризация `#{inv.id}`\n" + f"Название объекта `{inv.name}`" + ), + reply_parameters=ReplyParameters(message_id=update.message.message_id), + ) + # context.chat_data["step"] = "add" + context.chat_data["step"] = None + + async def error(self, update: Update, context: CallbackContext): + logger.info(f"error in tgbot {context.error}\nReply update") + TgBotClass.my_queue.put(update) + async def set_webhook(self, url): if not self._app: logger.error("no app") @@ -45,8 +84,12 @@ class TgBotApp: .updater(None) .build() ) - self._app.add_handler(CommandHandler("start", self.start)) - self._app.add_handler(MessageHandler(filters.ChatType.PRIVATE, self.start)) + self._app.add_handler( + CommandHandler("start", self.start, 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) logger.info( { diff --git a/back/tgbot/views.py b/back/tgbot/views.py index 159651b..df5669a 100644 --- a/back/tgbot/views.py +++ b/back/tgbot/views.py @@ -7,7 +7,6 @@ from asgiref.sync import async_to_sync from rest_framework import viewsets from rest_framework.response import Response -import time from .apps import TgBotClass from .models import Item from .serializers import ItemSerializer