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 django.contrib import admin
from .models import TgItem, TmcElement from .models import TgItem, TmcElement, TmcField
# Register your models here. # Register your models here.
admin.site.register(TgItem) admin.site.register(TgItem)
admin.site.register(TmcElement) admin.site.register(TmcElement)
admin.site.register(TmcField)

View File

@ -57,7 +57,7 @@ class TgBotUpdater:
await TgBot.app.process_update(item) await TgBot.app.process_update(item)
TgBotUpdater.my_queue.task_done() TgBotUpdater.my_queue.task_done()
await asyncio.sleep(3) await asyncio.sleep(1)
async def main(self): async def main(self):
await asyncio.gather( 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): class TmcElement(models.Model):
tmc = models.ForeignKey(CustomTable, models.RESTRICT) tmc = models.ForeignKey(CustomTable, models.RESTRICT)
name = models.CharField(null=True, blank=True) name = models.CharField(null=True, blank=True)
element = models.ManyToManyField(BaseCustomField) field = models.ManyToManyField(TmcField)
class TgItem(models.Model): class TgItem(models.Model):

View File

@ -28,7 +28,7 @@ from telegram.constants import ParseMode
from django.conf import settings from django.conf import settings
from .apps import TgBotUpdater from .apps import TgBotUpdater
from .models import TmcElement, TgItem from .models import TgItem, TmcElement, TmcField
from tmc.models import CustomTable, BaseCustomField from tmc.models import CustomTable, BaseCustomField
@ -161,9 +161,10 @@ class TgBot:
field_id = query.data.split("@")[-1] field_id = query.data.split("@")[-1]
field = await BaseCustomField.objects.aget(id=field_id) 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" context.chat_data["step"] = "add_element"
await self.inv(update, context) await self.inv(update, context)
@ -267,16 +268,17 @@ class TgBot:
elif current_step == "add_element": elif current_step == "add_element":
inv = await TgItem.objects.aget(id=context.chat_data["inv"]) inv = await TgItem.objects.aget(id=context.chat_data["inv"])
tmc = await inv.tmc.aget(id=context.chat_data["tmc"]) 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" context.chat_data["step"] = "add_element_data"
await update.effective_message.reply_markdown_v2( await update.effective_message.reply_markdown_v2(
( (
f"Инвентаризация `{inv.name}` от `{inv.created_at.strftime('%x')}`\n" f"Инвентаризация `{inv.name}` от `{inv.created_at.strftime('%x')}`\n"
f"Количество ТМЦ {await inv.tmc.acount()}\n\n" f"Количество ТМЦ {await inv.tmc.acount()}\n\n"
f"Название ТМЦ `{tmc.name}`\n" f"Название ТМЦ `{tmc.name}`\n"
f"Элемент `{element.name}`\n" f"Элемент `{field.name}`\n"
f"Загрузите фото или пришлите текст" f"Загрузите фото или пришлите текст"
), ),
reply_parameters=ReplyParameters( reply_parameters=ReplyParameters(
@ -287,10 +289,11 @@ class TgBot:
elif current_step == "add_element_data": elif current_step == "add_element_data":
inv = await TgItem.objects.aget(id=context.chat_data["inv"]) inv = await TgItem.objects.aget(id=context.chat_data["inv"])
tmc = await inv.tmc.aget(id=context.chat_data["tmc"]) 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: if update.message.photo:
element.photoid = update.message.photo[-1].file_id element.text = update.message.photo[-1].file_id
elif update.message.text: elif update.message.text:
element.text = update.message.text element.text = update.message.text
@ -301,7 +304,7 @@ class TgBot:
f"Инвентаризация `{inv.name}` от `{inv.created_at.strftime('%x')}`\n" f"Инвентаризация `{inv.name}` от `{inv.created_at.strftime('%x')}`\n"
f"Количество ТМЦ {await inv.tmc.acount()}\n\n" f"Количество ТМЦ {await inv.tmc.acount()}\n\n"
f"Название ТМЦ `{tmc.name}`\n" f"Название ТМЦ `{tmc.name}`\n"
f"Элемент `{element.name}`\n" f"Элемент `{field.name}`\n"
f"Данные загружены" f"Данные загружены"
), ),
reply_parameters=ReplyParameters(message_id=update.message.message_id), reply_parameters=ReplyParameters(message_id=update.message.message_id),
@ -322,7 +325,7 @@ class TgBot:
) -> None: ) -> None:
"""Log the error and send a telegram message to notify the developer.""" """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. # 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 # 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. # 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>" f"<pre>{html.escape(tb_string)}</pre>"
) )
# logger.error(context.error) # 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")