From 5e1137fcbfb38f46bcf4822fa71ceba32f73cf01 Mon Sep 17 00:00:00 2001 From: Alexei Date: Wed, 29 Nov 2023 16:15:54 +0300 Subject: [PATCH] =?UTF-8?q?=20=D0=9D=D0=B5=D0=B1=D0=BE=D0=BB=D1=8C=D1=88?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20=D0=B2=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=BA=D0=B0=D0=B7=D0=B0=D1=85=20#21?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. При оповещении - описание заказа 2. Кнопки изменить описание, изменить статус 3. При изменении сразу всё должно быть в поле ввода 4. МаркДаун в сообщениях 5. Информация о заказе на кнопке 7. Высветить номер заказа 8. Проветка что все кнопки разные 9. Не изменяется сообщение при наличии сообщения с родителем 10. Изменять оповещения для разных категорий --- bot_modules/all_orders.py | 69 +++++++++++++++++++++++++++++---------- bot_modules/messages.py | 10 +++--- bot_modules/mod_simple_message.py | 5 +-- bot_modules/mod_table_operate.py | 15 ++++++--- bot_modules/orders.py | 2 ++ bot_modules/user_message.py | 8 ++--- bot_sys/bot_messages.py | 11 ++++++- bot_sys/interfaces.py | 8 +++++ template/bd_item_edit.py | 2 ++ template/sql_request.py | 4 +-- 10 files changed, 98 insertions(+), 36 deletions(-) diff --git a/bot_modules/all_orders.py b/bot_modules/all_orders.py index 8ad17d4..8894daf 100644 --- a/bot_modules/all_orders.py +++ b/bot_modules/all_orders.py @@ -66,6 +66,8 @@ cur_messages = { Введите новый статус заказа: ''', mod_table_operate.Messages.OPEN: f''' +Номер заказа: #{orders.key_name} + Заказ: #{orders.name_field} Описание и состав заказа: #{orders.desc_field} @@ -84,10 +86,16 @@ messages_notification = { mod_table_operate.NotificationMessage(orders.OrderStatus.NEW): f'''Статус заказа "#{orders.name_field}" изменён на - ожидает модерации''', mod_table_operate.NotificationMessage(orders.OrderStatus.PAY): f'''Статус заказа "#{orders.name_field}" изменён на - Заказ ожидает оплаты. -Оплатите заказ и прикрепите чек об оплате к заказу. Для этого проследуйте по пути "Заказы"->"Редактировать мой заказ"->"Загрузить чек по оплате моего заказа"''', +Описание заказа: +#{orders.desc_field} + +Оплатите заказ и прикрепите чек об оплате к заказу. Для этого проследуйте по пути "Главное меню"->"Заказы"->"Загрузить чек по оплате моего заказа"''', mod_table_operate.NotificationMessage(orders.OrderStatus.ADDRESS): f'''Статус заказа "#{orders.name_field}" изменён на - Заказ ожидает указания адреса доставки. -Для этого проследуйте по пути "Заказы"->"Редактировать мой заказ"->"Изменить адрес в моём заказе"''', +Описание заказа: +#{orders.desc_field} + +Для этого проследуйте по пути "Главное меню"->"Заказы"->"Редактировать мой заказ"->"Изменить адрес в моём заказе"''', mod_table_operate.NotificationMessage(orders.OrderStatus.FINISH): f'''Статус заказа "#{orders.name_field}" изменён на - Заказ выполнен''', } @@ -139,9 +147,10 @@ class ModuleAllOrders(orders.ModuleOrders): return DBItemForUserSelectSource(self.m_Bot, self.m_Table.GetName(), parent_id_field, a_PrevPrefix, a_ButtonName) def GetButtonNameAndKeyValueAndAccess(self, a_Item): - parent_field_id = self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.PARENT_ID) + user_field_id = self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.USER_ID) + key_field_id = self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.KEY) n, k, a = super().GetButtonNameAndKeyValueAndAccess(a_Item) - return n + ":" + str(a_Item[parent_field_id]), k, a + return str(a_Item[key_field_id]) + ":" + n + "," + str(a_Item[user_field_id]), k, a async def OnChangeField(self, a_Field, a_ItemID, a_ItemData, a_EditUserID): super().OnChangeField(a_Field, a_ItemID, a_ItemData, a_EditUserID) @@ -154,22 +163,33 @@ class ModuleAllOrders(orders.ModuleOrders): item = item[0] user_field_id = self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.USER_ID) + parent_field_id = self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.PARENT_ID) status_field_id = self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.STATUS) - print('OnChangeField', item, user_field_id, status_field_id) + #print('OnChangeField', item, user_field_id, status_field_id) owner_id = item[user_field_id] new_status = item[status_field_id] + parent_id = item[parent_field_id] msg = self.GetMessage(mod_table_operate.NotificationMessage(new_status)) + parent_id_msg = None + if msg: + name = self.GetMessageNameWithTableFieldDestinyAndValue(mod_table_operate.NotificationMessage(new_status), bd_table.TableFieldDestiny.PARENT_ID, parent_id) + #print('name', name, msg.GetLanguage()) + parent_id_msg = msg.FindMessageForLang(name, msg.GetLanguage()) + if parent_id_msg: + msg = parent_id_msg if not msg: self.m_Log.Error(f'Не удалось оповестить по заказу №{a_ItemID}. Пустое сообщение для нового статуса {new_status}') return msg = self.UpdateMessage(msg, None, item) - await self.m_Bot.SendMessage( - owner_id, - msg.GetDesc(), - msg.GetPhotoID(), - None, - None - ) + await self.SendMessageToUser(msg, owner_id) + + def GetStartButtons(self, a_Message, a_UserGroups): + return [ + [mod_table_operate.ButtonNames.LIST, user_access.AccessMode.VIEW], + [mod_table_operate.ButtonNames.EDIT, user_access.AccessMode.EDIT], + [mod_table_operate.ButtonNames.ADD, user_access.AccessMode.ADD], + [mod_table_operate.ButtonNames.DEL, user_access.AccessMode.DELETE], + ] def GetViewItemInlineKeyboard(self, a_Message, a_UserGroups, a_ItemID): table_name = self.m_Table.GetName() @@ -178,22 +198,37 @@ class ModuleAllOrders(orders.ModuleOrders): user_id = None user_id_field_index = self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.USER_ID) + key_field_index = self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.KEY) if user_id_field_index and cur_item and cur_item[user_id_field_index]: user_id = cur_item[user_id_field_index] if not user_id: return None + cur_buttons = [] - users_mod = self.GetModule(users.module_name) - if users_mod: - cur_buttons += [ - keyboard.InlineButtonWithAccess(self.GetButton(ButtonNames.SHOW_USER_INFO), users_mod.GetShowPrefix(), user_id, users_mod.GetAccess(), user_access.AccessMode.VIEW), - ] + + for dst in bd_table.TableFieldDestiny.DESC, bd_table.TableFieldDestiny.STATUS: + access = self.GetAccessForEditKeyboardButtons(self.m_Table.GetFieldByDestiny(dst)) + btn = mod_table_operate.EditButton(dst) + prefix = self.m_EditPrefix.get(dst, None) + if prefix: + cur_buttons += [ + keyboard.InlineButtonWithAccess(self.GetButton(btn), prefix, cur_item[key_field_index], access, user_access.AccessMode.EDIT), + ] + user_message_mod = self.GetModule(user_message.module_name) if user_message_mod: cur_buttons += [ keyboard.InlineButtonWithAccess(self.GetButton(ButtonNames.SEND_USER_MESSAGE), user_message_mod.GetAddPrefix(), user_id, user_message_mod.GetAccess(), user_access.AccessMode.ADD), ] + + users_mod = self.GetModule(users.module_name) + if users_mod: + cur_buttons += [ + keyboard.InlineButtonWithAccess(self.GetButton(ButtonNames.SHOW_USER_INFO), users_mod.GetShowPrefix(), user_id, users_mod.GetAccess(), user_access.AccessMode.VIEW), + ] + if len(cur_buttons) == 0: return None return keyboard.MakeInlineKeyboardButtons(self.m_Bot, cur_buttons, a_UserGroups) + diff --git a/bot_modules/messages.py b/bot_modules/messages.py index 5db1dba..b8fac8b 100644 --- a/bot_modules/messages.py +++ b/bot_modules/messages.py @@ -46,11 +46,11 @@ button_names = { mod_simple_message.ButtonNames.START: "✉ Сообщения", mod_table_operate.ButtonNames.LIST: "📃 Список сообщений", mod_table_operate.ButtonNames.ADD: "☑ Добавить сообщение", - mod_table_operate.ButtonNames.EDIT: "🛠 Редактировать сообщение", + mod_table_operate.ButtonNames.EDIT: "🛠 Редактировать сообщение бота", mod_table_operate.EditButton(bd_table.TableFieldDestiny.PHOTO): "☐ Изменить изображение у сообщения", - mod_table_operate.EditButton(bd_table.TableFieldDestiny.NAME): "≂ Изменить название у сообщения", - mod_table_operate.EditButton(bd_table.TableFieldDestiny.DESC): "𝌴 Изменить описание у сообщения", - mod_table_operate.EditButton(bd_table.TableFieldDestiny.ACCESS): "✋ Изменить доступ к сообщению", + mod_table_operate.EditButton(bd_table.TableFieldDestiny.NAME): "≂ Изменить название сообщения", + mod_table_operate.EditButton(bd_table.TableFieldDestiny.DESC): "𝌴 Изменить описание сообщения", + mod_table_operate.EditButton(bd_table.TableFieldDestiny.ACCESS): "✋ Изменить доступ к сообщению", mod_table_operate.ButtonNames.DEL: "❌ Удалить сообщение", } @@ -75,7 +75,7 @@ messages = { mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.NAME): f''' Создание сообщения. Шаг №1 -Вы можете добавить номер родителя ID в таком формате: ИмяСообщения{'?' + str(bd_table.TableFieldDestiny.PARENT_ID) + '=ID'} +Вы можете добавить номер родителя ID в таком формате: ИмяСообщения{'?' + str(bd_table.TableFieldDestiny.PARENT_ID) + '=ID'} , чтобы сообщение было только для него Введите название сообщения: diff --git a/bot_modules/mod_simple_message.py b/bot_modules/mod_simple_message.py index 1d6770d..4a69822 100644 --- a/bot_modules/mod_simple_message.py +++ b/bot_modules/mod_simple_message.py @@ -76,8 +76,9 @@ class SimpleMessageModule(mod_interface.IModule): assert False # Телеграм не поддерживает больше assert a_ButtonDesc[0] != ' ', f'ButtonDesc:{a_ButtonDesc}, Телеграм не поддерживает пробелы в начале' assert a_ButtonDesc[-1:] != ' ', f'ButtonDesc:{a_ButtonDesc}, Телеграм не поддерживает пробелы в конце' - # TODO добавить проверку, что все кнопки (a_ButtonDesc) разные - btn = self.m_BotButtons.CreateMessage(f'{self.GetName()} {str(a_ButtonName).replace("ButtonNames.", "")}', a_ButtonDesc, self.m_Log.GetTimeNow()) + btn_name = f'{self.GetName()} {str(a_ButtonName).replace("ButtonNames.", "")}' + assert not self.m_BotButtons.CheckDescExist(a_ButtonDesc), f'ButtonDesc:{a_ButtonDesc}, повтор имени кнопки, все кнопки должны быть разными' + btn = self.m_BotButtons.CreateMessage(btn_name, a_ButtonDesc, self.m_Log.GetTimeNow()) return btn def GetModule(self, a_ModName): diff --git a/bot_modules/mod_table_operate.py b/bot_modules/mod_table_operate.py index acae53f..c46d811 100644 --- a/bot_modules/mod_table_operate.py +++ b/bot_modules/mod_table_operate.py @@ -96,6 +96,7 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): self.m_ChildModName = a_ChildModName self.m_ParentModName = a_ParentModName self.m_SelectPrefix = '' + self.m_EditPrefix = {} def GetEditKeyboardButtons(a_Message, a_UserGroups): return self.GetEditKeyboardButtons(a_Message, a_UserGroups) @@ -239,21 +240,23 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): parent_id = str(a_Item[key_field_id]) return parent_id + def GetMessageNameWithTableFieldDestinyAndValue(self, a_NameWithoutDestiny, a_Destiny, a_Value): + return a_NameWithoutDestiny + '?' + str(a_Destiny) + '=' + str(a_Value) def ShowMessageTemplate(self, a_Message, Inline_keyboard_template_func = None, a_EnablePhoto = False): async def ShowMessage(a_CallbackQuery, a_Item, a_ItemDict, table_name = self.m_Table.GetName()): lang = str(a_CallbackQuery.from_user.language_code) - msg = a_Message.StaticCopy() + msg = a_Message # Подменяем сообщение, если оно уже есть для PARENT_ID parent_id = self.GetParentID(a_Item, a_ItemDict, table_name) if parent_id: - name = msg.GetName() + '?' + str(bd_table.TableFieldDestiny.PARENT_ID) + '=' + parent_id + name = self.GetMessageNameWithTableFieldDestinyAndValue(msg.GetName(), bd_table.TableFieldDestiny.PARENT_ID, parent_id) parent_id_msg = a_Message.FindMessageForLang(name, lang) if parent_id_msg: msg = parent_id_msg - msg = msg.GetMessageForLang(lang).StaticCopy() + msg = msg.GetMessageForLang(lang).StaticCopy() # TODO: добавить поддержку языков в a_MessageName Inline_keyboard_func = None item_access = None @@ -360,7 +363,7 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): async def SendMessageToUser(self, a_Message, a_UserID, a_GetButtonsFunc = None, a_GetInlineButtonsFunc = None, parse_mode = None): a_Message = a_Message.StaticCopy() a_MessageFromUSer = None - user_groups = None + user_groups = None try: print('SendMessage', self.m_Bot, a_Message, a_GetButtonsFunc, a_GetInlineButtonsFunc, a_UserID, a_MessageFromUSer, user_groups, parse_mode) await simple_message.SendMessage(self.m_Bot, a_Message, a_GetButtonsFunc, a_GetInlineButtonsFunc, a_UserID, a_MessageFromUSer, user_groups, parse_mode=parse_mode) @@ -468,7 +471,7 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): a_Prefix = self.RegisterSelect(a_ButtonName, user_access.AccessMode.VIEW, only_parent = True) - bd_item_edit.EditBDItemRegisterHandlers(self.m_Bot, \ + a_Prefix = bd_item_edit.EditBDItemRegisterHandlers(self.m_Bot, \ self.SelectSourceTemplate(a_Prefix, a_ButtonName), \ MakeFSMForEdit(self.GetName(), a_FieldName), \ self.GetMessage(Messages.SELECT_TO_EDIT), \ @@ -487,6 +490,8 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): field_type = a_FieldType\ ) + self.m_EditPrefix.update({a_Field.m_Destiny: a_Prefix}) + def GetAddFields(self): add_destiny = ( bd_table.TableFieldDestiny.NAME, diff --git a/bot_modules/orders.py b/bot_modules/orders.py index 6458984..63f3a95 100644 --- a/bot_modules/orders.py +++ b/bot_modules/orders.py @@ -84,6 +84,8 @@ messages = { ❌ Ошибка, заказ не найден ''', mod_table_operate.Messages.OPEN: f''' +Номер заказа: #{key_name} + Заказ: #{name_field} Описание и состав заказа: #{desc_field} diff --git a/bot_modules/user_message.py b/bot_modules/user_message.py index 087f0bf..6e41be1 100644 --- a/bot_modules/user_message.py +++ b/bot_modules/user_message.py @@ -3,7 +3,7 @@ # Сообщения пользователю -from bot_sys import bot_bd, keyboard, user_access, bd_table, bot_subscribes, bot_messages +from bot_sys import bot_bd, keyboard, user_access, bd_table, bot_subscribes, bot_messages, interfaces from bot_modules import mod_table_operate, mod_simple_message, users # --------------------------------------------------------- @@ -35,8 +35,8 @@ button_names = { mod_table_operate.ButtonNames.LIST: "📃 Список отправленных сообщений", mod_table_operate.ButtonNames.ADD: "📨 Отправить сообщение", mod_table_operate.ButtonNames.EDIT: "🛠 Редактировать сообщение", - mod_table_operate.EditButton(bd_table.TableFieldDestiny.DESC): "𝌴 Изменить описание в категории", - mod_table_operate.EditButton(bd_table.TableFieldDestiny.ACCESS): "✋ Изменить доступ к категории", + mod_table_operate.EditButton(bd_table.TableFieldDestiny.DESC): "𝌴 Изменить описание у сообщения", + mod_table_operate.EditButton(bd_table.TableFieldDestiny.ACCESS): "✋ Изменить доступ к сообщению", mod_table_operate.ButtonNames.DEL: "❌ Удалить отправленное сообщение", } @@ -118,7 +118,7 @@ class ModuleUserMessage(mod_table_operate.TableOperateModule): desc_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.DESC) user_id_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.PARENT_ID) - if not await self.SendMessageToUser(bot_messages.MakeBotMessage(a_ItemData[desc_field]), a_ItemData[user_id_field]): + if not await self.SendMessageToUser(bot_messages.MakeBotMessage(a_ItemData[desc_field]), a_ItemData[user_id_field], parse_mode=interfaces.ParseMode.HTML.value): return None, '❌ Ошибка отправки сообщения' return res, error diff --git a/bot_sys/bot_messages.py b/bot_sys/bot_messages.py index 41f7fc0..07eacb4 100644 --- a/bot_sys/bot_messages.py +++ b/bot_sys/bot_messages.py @@ -70,7 +70,7 @@ class BotMessage: self.m_MessageDesc = new_msg.m_MessageDesc self.m_Language = new_msg.m_Language self.m_PhotoID = new_msg.m_PhotoID - self.m_DateTime = new_msg.m_DateTime + self.m_DateTime = last_update return new_msg def MakeBotMessage(a_MessageDesc): @@ -85,6 +85,15 @@ class BotMessages: def GetMessages(self): return self.m_Messages + def CheckDescExist(self, a_MessageDesc): + msg = self.GetMessages() + for l, m in msg.items(): + for name, cur_msg in m.items(): + if cur_msg.GetDesc() == a_MessageDesc: + return True + + return False + def UpdateSignal(self, a_DateTime): self.m_LastUpdate = a_DateTime diff --git a/bot_sys/interfaces.py b/bot_sys/interfaces.py index e65a760..8c511a0 100644 --- a/bot_sys/interfaces.py +++ b/bot_sys/interfaces.py @@ -3,6 +3,14 @@ from abc import ABC, abstractmethod +from enum import Enum +from enum import auto + +# Способ форматирования +class ParseMode(Enum): + HTML = "HTML" + Markdown ='Markdown' + class IBot(ABC): @abstractmethod def GetRootIDs(self): diff --git a/template/bd_item_edit.py b/template/bd_item_edit.py index 9e877e7..2055881 100644 --- a/template/bd_item_edit.py +++ b/template/bd_item_edit.py @@ -43,3 +43,5 @@ def EditBDItemRegisterHandlers(a_Bot, a_SelectSource, a_FSM, a_StartMessage, a_E a_Bot.RegisterMessageHandler(FinishEditBDItemTemplate(a_Bot, a_FSM, a_TableName, a_KeyName, a_FieldName, a_FinishMessageFunc, a_PostProcessFunc, a_AccessFunc, a_FinishButtonFunc, a_OnChangeFunc, access_mode, field_type = field_type), content_types = ['photo', 'text'], state = a_FSM.item_field) else: a_Bot.RegisterMessageHandler(FinishEditBDItemTemplate(a_Bot, a_FSM, a_TableName, a_KeyName, a_FieldName, a_FinishMessageFunc, a_PostProcessFunc, a_AccessFunc, a_FinishButtonFunc, a_OnChangeFunc, access_mode, field_type = field_type), state = a_FSM.item_field) + + return a_Prefix diff --git a/template/sql_request.py b/template/sql_request.py index 262d781..3d7221d 100644 --- a/template/sql_request.py +++ b/template/sql_request.py @@ -3,7 +3,7 @@ # Сообщения для работы с sql запросами -from bot_sys import user_access, keyboard, bot_messages +from bot_sys import user_access, keyboard, bot_messages, interfaces from bot_modules import groups_utils from template import bd_item, simple_message @@ -31,7 +31,7 @@ def RequestToBDTemplate(a_Bot, a_StartMessage, a_GetButtonsFunc, a_AccessFunc, a await a_FSM.sqlRequest.set() print ('a_FSM.sqlRequest.set()', a_StartMessage) - await simple_message.SendMessage(a_Bot, a_StartMessage, GetCancelKeyboardButtonsTemplate(a_Bot, a_AccessFunc, a_AccessMode), None, user_id, a_Message, user_groups, parse_mode='Markdown') + await simple_message.SendMessage(a_Bot, a_StartMessage, GetCancelKeyboardButtonsTemplate(a_Bot, a_AccessFunc, a_AccessMode), None, user_id, a_Message, user_groups, parse_mode=interfaces.ParseMode.Markdown.value) return RequestToBDStart def RequestToBDFinishTemplate(a_Bot, a_GetButtonsFunc, a_AccessFunc, a_AccessMode):