many to many

This commit is contained in:
Kseninia Mikhaylova 2024-07-18 12:12:05 +03:00
parent 463e7451fb
commit b118fb7124
4 changed files with 24 additions and 15 deletions

View File

@ -1,6 +1,7 @@
from django.contrib import admin
from .models import TgItem, TmcElement
from .models import TgItem, TmcElement, TmcField
# Register your models here.
admin.site.register(TgItem)
admin.site.register(TmcElement)
admin.site.register(TmcField)

View File

@ -57,7 +57,7 @@ class TgBotUpdater:
await TgBot.app.process_update(item)
TgBotUpdater.my_queue.task_done()
await asyncio.sleep(3)
await asyncio.sleep(1)
async def main(self):
await asyncio.gather(

View File

@ -15,10 +15,15 @@ def group_based_upload_to(instance, filename):
)
class TmcField(models.Model):
field = models.ForeignKey(BaseCustomField, models.RESTRICT)
text = models.CharField(null=True, blank=True)
class TmcElement(models.Model):
tmc = models.ForeignKey(CustomTable, models.RESTRICT)
name = models.CharField(null=True, blank=True)
element = models.ManyToManyField(BaseCustomField)
field = models.ManyToManyField(TmcField)
class TgItem(models.Model):

View File

@ -28,7 +28,7 @@ from telegram.constants import ParseMode
from django.conf import settings
from .apps import TgBotUpdater
from .models import TmcElement, TgItem
from .models import TgItem, TmcElement, TmcField
from tmc.models import CustomTable, BaseCustomField
@ -161,9 +161,10 @@ class TgBot:
field_id = query.data.split("@")[-1]
field = await BaseCustomField.objects.aget(id=field_id)
await tmc.element.aadd(field)
tmc_field = await TmcField.objects.acreate(field=field)
tmc.field.aadd(field)
context.chat_data["element"] = field.id
context.chat_data["element"] = tmc_field.id
context.chat_data["step"] = "add_element"
await self.inv(update, context)
@ -267,16 +268,17 @@ class TgBot:
elif current_step == "add_element":
inv = await TgItem.objects.aget(id=context.chat_data["inv"])
tmc = await inv.tmc.aget(id=context.chat_data["tmc"])
element = await tmc.element.aget(id=context.chat_data["element"])
logger.info(context.chat_data["element"])
element = await TmcField.objects.aget(id=context.chat_data["element"])
field = await BaseCustomField.objects.aget(id=element.field_id)
context.chat_data["step"] = "add_element_data"
await update.effective_message.reply_markdown_v2(
(
f"Инвентаризация `{inv.name}` от `{inv.created_at.strftime('%x')}`\n"
f"Количество ТМЦ {await inv.tmc.acount()}\n\n"
f"Название ТМЦ `{tmc.name}`\n"
f"Элемент `{element.name}`\n"
f"Элемент `{field.name}`\n"
f"Загрузите фото или пришлите текст"
),
reply_parameters=ReplyParameters(
@ -287,10 +289,11 @@ class TgBot:
elif current_step == "add_element_data":
inv = await TgItem.objects.aget(id=context.chat_data["inv"])
tmc = await inv.tmc.aget(id=context.chat_data["tmc"])
element = await tmc.element.aget(id=context.chat_data["element"])
element = await TmcField.objects.aget(id=context.chat_data["element"])
field = await BaseCustomField.objects.aget(id=element.field_id)
if update.message.photo:
element.photoid = update.message.photo[-1].file_id
element.text = update.message.photo[-1].file_id
elif update.message.text:
element.text = update.message.text
@ -301,7 +304,7 @@ class TgBot:
f"Инвентаризация `{inv.name}` от `{inv.created_at.strftime('%x')}`\n"
f"Количество ТМЦ {await inv.tmc.acount()}\n\n"
f"Название ТМЦ `{tmc.name}`\n"
f"Элемент `{element.name}`\n"
f"Элемент `{field.name}`\n"
f"Данные загружены"
),
reply_parameters=ReplyParameters(message_id=update.message.message_id),
@ -322,7 +325,7 @@ class TgBot:
) -> None:
"""Log the error and send a telegram message to notify the developer."""
# Log the error before we do anything else, so we can see it even if something breaks.
logger.error("Exception while handling an update:", exc_info=context.error)
# logger.error("Exception while handling an update:", exc_info=context.error)
# traceback.format_exception returns the usual python message about an exception, but as a
# list of strings rather than a single string, so we have to join them together.
@ -343,4 +346,4 @@ class TgBot:
f"<pre>{html.escape(tb_string)}</pre>"
)
# logger.error(context.error)
logger.info(f"error in tgbot {context.error}\nReply update")
logger.info(f"error in tgbot {context.error}\n{tb_string}\nReply update")