diff --git a/bot_modules/access.py b/bot_modules/access.py index d6ecd2d..cebb89b 100644 --- a/bot_modules/access.py +++ b/bot_modules/access.py @@ -87,8 +87,8 @@ moduleaccess_success_edit_message = '''✅ Доступ к модулю успе button_names = { mod_simple_message.ButtonNames.START: start_button_name, mod_table_operate.ButtonNames.EDIT: "🛠 Редактировать доступ", - mod_table_operate.ButtonNames.EDIT_ACCESS: edit_moduleaccess_access_button_name, - mod_table_operate.ButtonNames.EDIT_DEFAULT_ACCESS: edit_moduleaccess_default_access_button_name, + mod_table_operate.EditButton(bd_table.TableFieldDestiny.ACCESS): edit_moduleaccess_access_button_name, + mod_table_operate.EditButton(bd_table.TableFieldDestiny.DEFAULT_ACCESS): edit_moduleaccess_default_access_button_name, } messages = { @@ -97,8 +97,8 @@ messages = { Пожалуйста, выберите действие: ''', mod_table_operate.Messages.SELECT_TO_EDIT: moduleaccess_select_to_edit_message, - mod_table_operate.Messages.EDIT_ACCESS: moduleaccess_edit_access_message, - mod_table_operate.Messages.EDIT_DEFAULT_ACCESS: moduleaccess_edit_default_access_message, + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.ACCESS): moduleaccess_edit_access_message, + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.DEFAULT_ACCESS): moduleaccess_edit_default_access_message, mod_table_operate.Messages.SUCCESS_EDIT: moduleaccess_success_edit_message, } diff --git a/bot_modules/all_orders.py b/bot_modules/all_orders.py new file mode 100644 index 0000000..2c1b30b --- /dev/null +++ b/bot_modules/all_orders.py @@ -0,0 +1,162 @@ +# -*- coding: utf8 -*- +# Общественное достояние, 2023, Алексей Безбородов (Alexei Bezborodov) + +# Заказы + +from bot_sys import bot_bd, keyboard, user_access, bd_table +from bot_modules import mod_table_operate, mod_simple_message, orders +from template import bd_item_select, bd_item_view, bd_item + +# --------------------------------------------------------- +# БД +module_name = 'all_orders' + +table = orders.table + +init_access = f'{user_access.user_access_group_new}=-' + +# --------------------------------------------------------- +# Сообщения и кнопки + +button_names = {} +button_names.update(orders.button_names) +button_names.pop(mod_table_operate.ButtonNames.ADD) + +cur_button_names = { + mod_simple_message.ButtonNames.START: "‍🛒 Все заказы", + mod_table_operate.ButtonNames.LIST: "📃 Список текущих заказов", + orders.ButtonNames.LIST_ALL: "📃 Список всех заказов", + mod_table_operate.ButtonNames.EDIT: "🛠 Редактировать заказ", + mod_table_operate.EditButton(bd_table.TableFieldDestiny.PHOTO_PAY): "☐ Загрузить чек по оплате заказа", + 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.ADDRESS): "𝌴 Изменить адрес в заказе", + mod_table_operate.EditButton(bd_table.TableFieldDestiny.ACCESS): "✋ Изменить доступ к заказу", + mod_table_operate.EditButton(bd_table.TableFieldDestiny.STATUS): "𝌴 Изменить статус в заказе", + mod_table_operate.EnumButton(orders.OrderStatus.NEW): "Заказ ожидает модерации", + mod_table_operate.EnumButton(orders.OrderStatus.PAY): "Заказ ожидает оплаты", + mod_table_operate.EnumButton(orders.OrderStatus.ADDRESS): "Заказ ожидает уточнения адреса", + mod_table_operate.EnumButton(orders.OrderStatus.FINISH): "Заказ выполнен", + mod_table_operate.ButtonNames.DEL: "❌ Удалить заказ",} +button_names.update(cur_button_names) + +messages = {} +messages.update(orders.messages) + +cur_messages = { + mod_simple_message.Messages.START: f''' +{button_names[mod_simple_message.ButtonNames.START]} + +''', + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.STATUS): f''' +Текущий статус заказа: +#{orders.status_field} + +Введите новый статус заказа: +''', + mod_table_operate.Messages.OPEN: f''' +Заказ: #{orders.name_field} + +Описание и состав заказа: #{orders.desc_field} + +Статус: #{orders.status_field} + +Пользователь: #{orders.parent_id_field} + +Адрес доставки: #{orders.address_field} + +Время создания: #{orders.create_datetime_field} +''', +} + +messages_notification = { + mod_table_operate.NotificationMessage(orders.OrderStatus.NEW): f'''Статус заказа "#{orders.name_field}" изменён на - ожидает модерации''', + mod_table_operate.NotificationMessage(orders.OrderStatus.PAY): f'''Статус заказа "#{orders.name_field}" изменён на - Заказ ожидает оплаты. + +Оплатите заказ и прикрепите чек об оплате к заказу. Для этого проследуйте по пути "Заказы"->"Редактировать мой заказ"->"Загрузить чек по оплате моего заказа"''', + mod_table_operate.NotificationMessage(orders.OrderStatus.ADDRESS): f'''Статус заказа "#{orders.name_field}" изменён на - Заказ ожидает указания адреса доставки. + +Для этого проследуйте по пути "Заказы"->"Редактировать мой заказ"->"Изменить адрес в моём заказе"''', + mod_table_operate.NotificationMessage(orders.OrderStatus.FINISH): f'''Статус заказа "#{orders.name_field}" изменён на - Заказ выполнен''', +} + +messages.update(orders.messages_order_status) +messages.update(messages_notification) +messages.update(cur_messages) + +def GetCurItemsTemplate(a_Bot, a_TableName, a_StatusFieldName): + def GetBDItems(a_Message, a_UserGroups, a_ParentID): + request = f'SELECT * FROM {a_TableName} WHERE {a_StatusFieldName} != ?' + return a_Bot.SQLRequest(request, param = ([str(orders.OrderStatus.FINISH)])) + return GetBDItems + +def GetBDItemsForUserTemplate(a_Bot, a_TableName): + def GetBDItems(a_Message, a_UserGroups, a_ParentID): + return bd_item.GetAllItemsTemplate(a_Bot, a_TableName)() + return GetBDItems + +class DBItemForUserSelectSource(bd_item_select.DBItemSelectSource): + def __init__(self, a_Bot, a_TableName, a_ParentIDFieldName, a_PrevPrefix, a_ButtonName, a_OnlyCurrent = False): + super().__init__(a_Bot, a_TableName, a_ParentIDFieldName, a_PrevPrefix, a_ButtonName) + self.m_OnlyCurrent = a_OnlyCurrent + + def GetItemsFunc(self): + if self.m_OnlyCurrent: + return GetCurItemsTemplate(self.m_Bot, self.m_TableName, orders.status_field) + return GetBDItemsForUserTemplate(self.m_Bot, self.m_TableName) + + def IsFirst(self): + return True + +class ModuleAllOrders(orders.ModuleOrders): + def __init__(self, a_ParentModName, a_ChildModName, a_ChildModuleNameList, a_EditModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log): + super().__init__(table, messages, button_names, a_ParentModName, a_ChildModName, init_access, a_ChildModuleNameList, a_EditModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log) + + def GetInitBDCommands(self): + # уже сделано в ModuleUserOrders + return [] + + def GetName(self): + return module_name + + def SelectSourceTemplate(self, a_PrevPrefix, a_ButtonName): + parent_id_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.PARENT_ID) + return DBItemForUserSelectSource(self.m_Bot, self.m_Table.GetName(), parent_id_field, a_PrevPrefix, a_ButtonName, a_OnlyCurrent = True) + + def SelectSourceForAllTemplate(self, a_PrevPrefix, a_ButtonName): + parent_id_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.PARENT_ID) + 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) + n, k, a = super().GetButtonNameAndKeyValueAndAccess(a_Item) + return n + ":" + str(a_Item[parent_field_id]), k, a + + async def OnChangeField(self, a_Field, a_ItemID, a_ItemData, a_EditUserID): + if a_Field.m_Destiny == bd_table.TableFieldDestiny.STATUS: + key_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.KEY) + item = bd_item.GetBDItemsTemplate(self.m_Bot, self.m_Table.GetName(), key_field)(a_ItemID) + if len(item) < 1: + self.m_Log.Error(f'Не удалось оповестить по заказу №{a_ItemID}.') + return + + item = item[0] + 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, parent_field_id, status_field_id) + owner_id = item[parent_field_id] + new_status = item[status_field_id] + msg = self.GetMessage(mod_table_operate.NotificationMessage(new_status)) + 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 + ) + diff --git a/bot_modules/buttons.py b/bot_modules/buttons.py index 991af83..a268b93 100644 --- a/bot_modules/buttons.py +++ b/bot_modules/buttons.py @@ -27,7 +27,7 @@ table = bd_table.Table(table_name, [ bd_table.TableField(key_name, bd_table.TableFieldDestiny.KEY, bd_table.TableFieldType.INT), table_name_field, bd_table.TableField(desc_field, bd_table.TableFieldDestiny.DESC, bd_table.TableFieldType.STR), - bd_table.TableField(photo_field, bd_table.TableFieldDestiny.PHOTO, bd_table.TableFieldType.STR), + bd_table.TableField(photo_field, bd_table.TableFieldDestiny.PHOTO, bd_table.TableFieldType.PHOTO), bd_table.TableField(access_field, bd_table.TableFieldDestiny.ACCESS, bd_table.TableFieldType.STR), bd_table.TableField(create_datetime_field, bd_table.TableFieldDestiny.CREATE_DATE, bd_table.TableFieldType.STR), table_parent_id_field, @@ -47,10 +47,10 @@ button_names = { mod_table_operate.ButtonNames.LIST: "📃 Список названий кнопок", mod_table_operate.ButtonNames.ADD: "☑ Добавить название кнопки", mod_table_operate.ButtonNames.EDIT: "🛠 Редактировать названия кнопок", - mod_table_operate.ButtonNames.EDIT_PHOTO: "☐ Изменить изображение у названия кнопок", - mod_table_operate.ButtonNames.EDIT_NAME: "≂ Изменить название у названия кнопок", - mod_table_operate.ButtonNames.EDIT_DESC: "𝌴 Изменить описание у названия кнопок", - mod_table_operate.ButtonNames.EDIT_ACCESS: "✋ Изменить доступ к названию кнопки", + 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.ButtonNames.DEL: "❌ Удалить название кнопки", } @@ -72,17 +72,17 @@ messages = { Время создания: #{create_datetime_field} ''', - mod_table_operate.Messages.CREATE_NAME: ''' + mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.NAME): ''' Создание названия кнопки Шаг №1 Введите название название кнопки: ''', - mod_table_operate.Messages.CREATE_DESC: ''' + mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.DESC): ''' Создание названия кнопки. Шаг №2 Введите описание название кнопки: ''', - mod_table_operate.Messages.CREATE_PHOTO: ''' + mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.PHOTO): ''' Создание названия кнопки Загрузите обложку для названия кнопок (Фото): На данный момент не поддерживается! @@ -95,23 +95,23 @@ messages = { mod_table_operate.Messages.SELECT_TO_EDIT: ''' Выберите название кнопки, который вы хотите отредактировать. ''', - mod_table_operate.Messages.EDIT_PHOTO: ''' + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.PHOTO): ''' Загрузите новую обложку для названия кнопок (Фото): Она будет отображаться в его описании. ''', - mod_table_operate.Messages.EDIT_NAME: f''' + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.NAME): f''' Текущее название названия кнопок: #{name_field} Введите новое название названия кнопки: ''', - mod_table_operate.Messages.EDIT_DESC: f''' + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.DESC): f''' Текущее описание названия кнопок: #{desc_field} Введите новое описание названия кнопки: ''', - mod_table_operate.Messages.EDIT_ACCESS: f''' + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.ACCESS): f''' Текущий доступ к названию кнопки: #{access_field} diff --git a/bot_modules/comments.py b/bot_modules/comments.py index d9c9c42..28eb8c7 100644 --- a/bot_modules/comments.py +++ b/bot_modules/comments.py @@ -23,7 +23,7 @@ table = bd_table.Table(table_name, [ bd_table.TableField(key_name, bd_table.TableFieldDestiny.KEY, bd_table.TableFieldType.INT), bd_table.TableField(name_field, bd_table.TableFieldDestiny.NAME, bd_table.TableFieldType.STR), bd_table.TableField(desc_field, bd_table.TableFieldDestiny.DESC, bd_table.TableFieldType.STR), - bd_table.TableField(photo_field, bd_table.TableFieldDestiny.PHOTO, bd_table.TableFieldType.STR), + bd_table.TableField(photo_field, bd_table.TableFieldDestiny.PHOTO, bd_table.TableFieldType.PHOTO), bd_table.TableField(access_field, bd_table.TableFieldDestiny.ACCESS, bd_table.TableFieldType.STR), bd_table.TableField(create_datetime_field, bd_table.TableFieldDestiny.CREATE_DATE, bd_table.TableFieldType.STR), bd_table.TableField(parent_id_field, bd_table.TableFieldDestiny.PARENT_ID, bd_table.TableFieldType.INT), @@ -39,10 +39,10 @@ button_names = { mod_table_operate.ButtonNames.LIST: "📃 Список комментариев", mod_table_operate.ButtonNames.ADD: "☑ Добавить комментарий", mod_table_operate.ButtonNames.EDIT: "🛠 Редактировать комментарий", - mod_table_operate.ButtonNames.EDIT_PHOTO: "☐ Изменить изображение у комментария", - mod_table_operate.ButtonNames.EDIT_NAME: "≂ Изменить название у комментария", - mod_table_operate.ButtonNames.EDIT_DESC: "𝌴 Изменить описание у комментария", - mod_table_operate.ButtonNames.EDIT_ACCESS: "✋ Изменить доступ к комментарию", + 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.ButtonNames.DEL: "❌ Удалить комментарий", } @@ -64,17 +64,17 @@ messages = { Время создания: #{create_datetime_field} ''', - mod_table_operate.Messages.CREATE_NAME: ''' + mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.NAME): ''' Создание комментария. Шаг №1 Введите название комментария: ''', - mod_table_operate.Messages.CREATE_DESC: ''' + mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.DESC): ''' Создание комментария. Шаг №2 Введите описание комментария: ''', - mod_table_operate.Messages.CREATE_PHOTO: ''' + mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.PHOTO): ''' Создание комментария. Шаг №3 Загрузите обложку для комментария (Фото): @@ -87,23 +87,23 @@ messages = { mod_table_operate.Messages.SELECT_TO_EDIT: ''' Выберите комментарий, который вы хотите отредактировать. ''', - mod_table_operate.Messages.EDIT_PHOTO: ''' + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.PHOTO): ''' Загрузите новую обложку для комментария (Фото): Она будет отображаться в его описании. ''', - mod_table_operate.Messages.EDIT_NAME: f''' + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.NAME): f''' Текущее название комментария: #{name_field} Введите новое название комментария: ''', - mod_table_operate.Messages.EDIT_DESC: f''' + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.DESC): f''' Текущее описание комментария: #{desc_field} Введите новое описание комментария: ''', - mod_table_operate.Messages.EDIT_ACCESS: f''' + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.ACCESS): f''' Текущий доступ к комментарийу: #{access_field} diff --git a/bot_modules/groups.py b/bot_modules/groups.py index 1707abe..7724eeb 100644 --- a/bot_modules/groups.py +++ b/bot_modules/groups.py @@ -25,7 +25,7 @@ table = bd_table.Table(table_name, [ bd_table.TableField(key_name, bd_table.TableFieldDestiny.KEY, bd_table.TableFieldType.INT), table_name_field, bd_table.TableField(desc_field, bd_table.TableFieldDestiny.DESC, bd_table.TableFieldType.STR), - bd_table.TableField(photo_field, bd_table.TableFieldDestiny.PHOTO, bd_table.TableFieldType.STR), + bd_table.TableField(photo_field, bd_table.TableFieldDestiny.PHOTO, bd_table.TableFieldType.PHOTO), bd_table.TableField(access_field, bd_table.TableFieldDestiny.ACCESS, bd_table.TableFieldType.STR), bd_table.TableField(create_datetime_field, bd_table.TableFieldDestiny.CREATE_DATE, bd_table.TableFieldType.STR), ], @@ -44,10 +44,10 @@ button_names = { mod_table_operate.ButtonNames.LIST: "📃 Список групп", mod_table_operate.ButtonNames.ADD: "✅ Добавить группу", mod_table_operate.ButtonNames.EDIT: "🛠 Редактировать группу", - mod_table_operate.ButtonNames.EDIT_PHOTO: "☐ Изменить изображение в группе", - mod_table_operate.ButtonNames.EDIT_NAME: "≂ Изменить название в группе", - mod_table_operate.ButtonNames.EDIT_DESC: "𝌴 Изменить описание в группе", - mod_table_operate.ButtonNames.EDIT_ACCESS: "✋ Изменить доступ к группе", + 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.ButtonNames.DEL: "❌ Удалить группу", } @@ -69,17 +69,17 @@ messages = { Время создания: #{create_datetime_field} ''', - mod_table_operate.Messages.CREATE_NAME: ''' + mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.NAME): ''' Создание группы. Шаг №1 Введите название группы: ''', - mod_table_operate.Messages.CREATE_DESC: ''' + mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.DESC): ''' Создание группы. Шаг №2 Введите описание группы: ''', - mod_table_operate.Messages.CREATE_PHOTO: ''' + mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.PHOTO): ''' Создание группы. Шаг №3 Загрузите обложку для группы (Фото): @@ -92,23 +92,23 @@ messages = { mod_table_operate.Messages.SELECT_TO_EDIT: ''' Выберите группу, которого вы хотите отредактировать. ''', - mod_table_operate.Messages.EDIT_PHOTO: ''' + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.PHOTO): ''' Загрузите новую обложку для группы (Фото): Она будет отображаться в его описании. ''', - mod_table_operate.Messages.EDIT_NAME: f''' + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.NAME): f''' Текущее название группы: #{name_field} Введите новое название группы: ''', - mod_table_operate.Messages.EDIT_DESC: f''' + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.DESC): f''' Текущее описание группы: #{desc_field} Введите новое описание группы: ''', - mod_table_operate.Messages.EDIT_ACCESS: f''' + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.ACCESS): f''' Текущий доступ к группе: #{access_field} diff --git a/bot_modules/languages.py b/bot_modules/languages.py index 350a433..66af1b9 100644 --- a/bot_modules/languages.py +++ b/bot_modules/languages.py @@ -25,7 +25,7 @@ table = bd_table.Table(table_name, [ bd_table.TableField(key_name, bd_table.TableFieldDestiny.KEY, bd_table.TableFieldType.INT), table_name_field, bd_table.TableField(desc_field, bd_table.TableFieldDestiny.DESC, bd_table.TableFieldType.STR), - bd_table.TableField(photo_field, bd_table.TableFieldDestiny.PHOTO, bd_table.TableFieldType.STR), + bd_table.TableField(photo_field, bd_table.TableFieldDestiny.PHOTO, bd_table.TableFieldType.PHOTO), bd_table.TableField(access_field, bd_table.TableFieldDestiny.ACCESS, bd_table.TableFieldType.STR), bd_table.TableField(create_datetime_field, bd_table.TableFieldDestiny.CREATE_DATE, bd_table.TableFieldType.STR), ], @@ -44,10 +44,10 @@ button_names = { mod_table_operate.ButtonNames.LIST: "📃 Список языков", mod_table_operate.ButtonNames.ADD: "✅ Добавить язык", mod_table_operate.ButtonNames.EDIT: "🛠 Редактировать язык", - mod_table_operate.ButtonNames.EDIT_PHOTO: "☐ Изменить изображение в языке", - mod_table_operate.ButtonNames.EDIT_NAME: "≂ Изменить название в языке", - mod_table_operate.ButtonNames.EDIT_DESC: "𝌴 Изменить описание в языке", - mod_table_operate.ButtonNames.EDIT_ACCESS: "✋ Изменить доступ к языку", + 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.ButtonNames.DEL: "❌ Удалить язык", } @@ -69,17 +69,17 @@ messages = { Время создания: #{create_datetime_field} ''', - mod_table_operate.Messages.CREATE_NAME: ''' + mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.NAME): ''' Создание языка. Шаг №1 Введите название языка: ''', - mod_table_operate.Messages.CREATE_DESC: ''' + mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.DESC): ''' Создание языка. Шаг №2 Введите описание языка: ''', - mod_table_operate.Messages.CREATE_PHOTO: ''' + mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.PHOTO): ''' Создание языка. Шаг №3 Загрузите обложку для языка (Фото): @@ -92,23 +92,23 @@ messages = { mod_table_operate.Messages.SELECT_TO_EDIT: ''' Выберите язык, который вы хотите отредактировать. ''', - mod_table_operate.Messages.EDIT_PHOTO: ''' + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.PHOTO): ''' Загрузите новую обложку для языка (Фото): Она будет отображаться в его описании. ''', - mod_table_operate.Messages.EDIT_NAME: f''' + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.NAME): f''' Текущее название языка: #{name_field} Введите новое название языка: ''', - mod_table_operate.Messages.EDIT_DESC: f''' + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.DESC): f''' Текущее описание языка: #{desc_field} Введите новое описание языка: ''', - mod_table_operate.Messages.EDIT_ACCESS: f''' + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.ACCESS): f''' Текущий доступ к языку: #{access_field} diff --git a/bot_modules/messages.py b/bot_modules/messages.py index e87c8dc..2506c2a 100644 --- a/bot_modules/messages.py +++ b/bot_modules/messages.py @@ -27,7 +27,7 @@ table = bd_table.Table(table_name, [ bd_table.TableField(key_name, bd_table.TableFieldDestiny.KEY, bd_table.TableFieldType.INT), table_name_field, bd_table.TableField(desc_field, bd_table.TableFieldDestiny.DESC, bd_table.TableFieldType.STR), - bd_table.TableField(photo_field, bd_table.TableFieldDestiny.PHOTO, bd_table.TableFieldType.STR), + bd_table.TableField(photo_field, bd_table.TableFieldDestiny.PHOTO, bd_table.TableFieldType.PHOTO), bd_table.TableField(access_field, bd_table.TableFieldDestiny.ACCESS, bd_table.TableFieldType.STR), bd_table.TableField(create_datetime_field, bd_table.TableFieldDestiny.CREATE_DATE, bd_table.TableFieldType.STR), table_parent_id_field, @@ -47,10 +47,10 @@ button_names = { mod_table_operate.ButtonNames.LIST: "📃 Список сообщений", mod_table_operate.ButtonNames.ADD: "☑ Добавить сообщение", mod_table_operate.ButtonNames.EDIT: "🛠 Редактировать сообщение", - mod_table_operate.ButtonNames.EDIT_PHOTO: "☐ Изменить изображение у сообщения", - mod_table_operate.ButtonNames.EDIT_NAME: "≂ Изменить название у сообщения", - mod_table_operate.ButtonNames.EDIT_DESC: "𝌴 Изменить описание у сообщения", - mod_table_operate.ButtonNames.EDIT_ACCESS: "✋ Изменить доступ к сообщению", + 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.ButtonNames.DEL: "❌ Удалить сообщение", } @@ -72,17 +72,17 @@ messages = { Время создания: #{create_datetime_field} ''', - mod_table_operate.Messages.CREATE_NAME: ''' + mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.NAME): ''' Создание сообщения. Шаг №1 Введите название сообщения: ''', - mod_table_operate.Messages.CREATE_DESC: ''' + mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.DESC): ''' Создание сообщения. Шаг №2 Введите описание сообщения: ''', - mod_table_operate.Messages.CREATE_PHOTO: ''' + mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.PHOTO): ''' Создание сообщения. Шаг №3 Загрузите обложку для сообщения (Фото): @@ -95,23 +95,23 @@ messages = { mod_table_operate.Messages.SELECT_TO_EDIT: ''' Выберите сообщение, который вы хотите отредактировать. ''', - mod_table_operate.Messages.EDIT_PHOTO: ''' + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.PHOTO): ''' Загрузите новую обложку для сообщения (Фото): Она будет отображаться в его описании. ''', - mod_table_operate.Messages.EDIT_NAME: f''' + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.NAME): f''' Текущее название сообщения: #{name_field} Введите новое название сообщения: ''', - mod_table_operate.Messages.EDIT_DESC: f''' + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.DESC): f''' Текущее описание сообщения: #{desc_field} Введите новое описание сообщения: ''', - mod_table_operate.Messages.EDIT_ACCESS: f''' + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.ACCESS): f''' Текущий доступ к сообщениеу: #{access_field} diff --git a/bot_modules/mod_simple_message.py b/bot_modules/mod_simple_message.py index 40c78fd..1cc9621 100644 --- a/bot_modules/mod_simple_message.py +++ b/bot_modules/mod_simple_message.py @@ -72,6 +72,7 @@ class SimpleMessageModule(mod_interface.IModule): assert len(a_ButtonDesc) < 41 # Телеграм не поддерживает больше assert a_ButtonDesc[0] != ' ' # Телеграм не поддерживает пробелы в начале assert a_ButtonDesc[-1:] != ' ' # Телеграм не поддерживает пробелы в конце + # TODO добавить проверку, что все кнопки (a_ButtonDesc) разные btn = self.m_BotButtons.CreateMessage(f'{self.GetName()} {str(a_ButtonName).replace("ButtonNames.", "")}', a_ButtonDesc, self.m_Log.GetTimeNow()) return btn diff --git a/bot_modules/mod_table_operate.py b/bot_modules/mod_table_operate.py index a0cfb86..f1a3347 100644 --- a/bot_modules/mod_table_operate.py +++ b/bot_modules/mod_table_operate.py @@ -13,43 +13,43 @@ from aiogram.dispatcher.filters.state import State, StatesGroup from enum import Enum from enum import auto +def EditButton(a_BDTableDestiny): + return 'edit ' + str(a_BDTableDestiny) + +def EnumButton(a_EnumItem): + return 'enum ' + str(a_EnumItem) + +def EditMessage(a_BDTableDestiny): + return 'edit ' + str(a_BDTableDestiny) + +def CreateMessage(a_BDTableDestiny): + return 'create ' + str(a_BDTableDestiny) + +def EnumMessageForView(a_EnumItem): + return 'enum ' + str(a_EnumItem) + +def NotificationMessage(a_EnumItem): + return 'notification ' + str(a_EnumItem) + class ButtonNames(Enum): LIST = auto() ADD = auto() EDIT = auto() - EDIT_PHOTO = auto() - EDIT_NAME = auto() - EDIT_DESC = auto() - EDIT_ACCESS = auto() - EDIT_DEFAULT_ACCESS = auto() DEL = auto() class Messages(Enum): SELECT = auto() ERROR_FIND = auto() OPEN = auto() - CREATE_NAME = auto() - CREATE_DESC = auto() - CREATE_PHOTO = auto() SUCCESS_CREATE = auto() START_EDIT = auto() SELECT_TO_EDIT = auto() - EDIT_PHOTO = auto() - EDIT_NAME = auto() - EDIT_DESC = auto() - EDIT_ACCESS = auto() - EDIT_DEFAULT_ACCESS = auto() SUCCESS_EDIT = auto() SELECT_TO_DELETE = auto() SUCCESS_DELETE = auto() class FSMs(Enum): CREATE = auto() - EDIT_PHOTO = auto() - EDIT_NAME = auto() - EDIT_DESC = auto() - EDIT_ACCESS = auto() - EDIT_DEFAULT_ACCESS = auto() create_fsms_cmd = ''' class FSMCreate{a_ModName}(StatesGroup): @@ -57,28 +57,9 @@ class FSMCreate{a_ModName}(StatesGroup): desc = State() photo = State() -class FSMEdit{a_ModName}PhotoItem(StatesGroup): - item_field = State() - -class FSMEdit{a_ModName}NameItem(StatesGroup): - item_field = State() - -class FSMEdit{a_ModName}DescItem(StatesGroup): - item_field = State() - -class FSMEdit{a_ModName}AccessItem(StatesGroup): - item_field = State() - -class FSMEdit{a_ModName}DefaultAccessItem(StatesGroup): - item_field = State() fsm = { FSMs.CREATE: FSMCreate{a_ModName}, - FSMs.EDIT_NAME: FSMEdit{a_ModName}NameItem, - FSMs.EDIT_DESC: FSMEdit{a_ModName}DescItem, - FSMs.EDIT_PHOTO: FSMEdit{a_ModName}PhotoItem, - FSMs.EDIT_ACCESS: FSMEdit{a_ModName}AccessItem, - FSMs.EDIT_DEFAULT_ACCESS: FSMEdit{a_ModName}DefaultAccessItem, } ''' @@ -89,6 +70,20 @@ def MakeFSMs(a_ModName): return _locals['fsm'] +edit_fsm_cmd = ''' +class FSMEdit{a_ModName}_{a_FieldName}_Item(StatesGroup): + item_field = State() + +fsm = FSMEdit{a_ModName}_{a_FieldName}_Item +''' + +def MakeFSMForEdit(a_ModName, a_FieldName): + cmd = edit_fsm_cmd.replace("{a_ModName}", a_ModName).replace("{a_FieldName}", a_FieldName) + print ('cmd', cmd) + _locals = locals() + exec(cmd, globals(), _locals) + return _locals['fsm'] + class TableOperateModule(mod_simple_message.SimpleMessageModule): def __init__(self, a_Table, a_Messages, a_Buttons, a_ParentModName, a_ChildModName, a_InitAccess, a_ChildModuleNameList, a_EditModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log): super().__init__(a_Messages, a_Buttons, a_InitAccess, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log) @@ -115,8 +110,8 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): return await self.PostDelete(a_CallbackQuery, a_ItemID) self.m_PostDeleteFunc = PostDelete - def AddBDItemFunc(a_ItemData, a_UserID): - return self.AddBDItemFunc(a_ItemData, a_UserID) + async def AddBDItemFunc(a_ItemData, a_UserID): + return await self.AddBDItemFunc(a_ItemData, a_UserID) self.m_AddBDItemFunc = AddBDItemFunc def GetFSM(self, a_FSMName): @@ -139,13 +134,12 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): def GetEditKeyboardButtons(self, a_Message, a_UserGroups): mod_buttons = keyboard.MakeButtons(self.m_Bot, self.GetButtons(self.m_EditModuleNameList), a_UserGroups) - cur_buttons = [ - keyboard.ButtonWithAccess(self.GetButton(ButtonNames.EDIT_PHOTO), user_access.AccessMode.VIEW, self.GetAccess()), - keyboard.ButtonWithAccess(self.GetButton(ButtonNames.EDIT_NAME), user_access.AccessMode.ADD, self.GetAccess()), - keyboard.ButtonWithAccess(self.GetButton(ButtonNames.EDIT_DESC), user_access.AccessMode.DELETE, self.GetAccess()), - keyboard.ButtonWithAccess(self.GetButton(ButtonNames.EDIT_ACCESS), user_access.AccessMode.DELETE, self.GetAccess()), - keyboard.ButtonWithAccess(self.GetButton(ButtonNames.EDIT_DEFAULT_ACCESS), user_access.AccessMode.EDIT, self.GetAccess()), - ] + cur_buttons = [] + for f in self.m_Table.GetFields(): + access = user_access.AccessMode.EDIT + if f.m_Destiny == bd_table.TableFieldDestiny.ACCESS or f.m_Destiny == bd_table.TableFieldDestiny.DEFAULT_ACCESS: + access = user_access.AccessMode.ACCEES_EDIT + cur_buttons += [keyboard.ButtonWithAccess(self.GetButton(EditButton(f.m_Destiny)), access, self.GetAccess()),] return mod_buttons + keyboard.MakeButtons(self.m_Bot, cur_buttons, a_UserGroups) def GetViewItemInlineKeyboardTemplate(self, a_ItemID): @@ -177,7 +171,24 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): a_Item[key_name_id],\ a_Item[access_field_id] - def ShowMessageTemplate(self, a_Message, Inline_keyboard_template_func = None): + def UpdateMessage(self, a_Msg, a_Lang, a_Item, a_EnablePhoto = False): + a_Msg.UpdateDesc(self.m_Table.ReplaceAllFieldTags(a_Msg.GetDesc(), a_Item)) + photos = [] + field_id = 0 + for f in self.m_Table.GetFields(): + if f.m_Type == bd_table.TableFieldType.ENUM: + for s in f.m_Enum: + msg = self.GetMessage(EnumMessageForView(s)) + if msg: + a_Msg.UpdateDesc(a_Msg.GetDesc().replace(str(s), str(msg.GetMessageForLang(a_Lang).StaticCopy()))) + elif f.m_Type == bd_table.TableFieldType.PHOTO: + photos += [str(a_Item[field_id])] + field_id += 1 + if a_EnablePhoto: + a_Msg.UpdatePhotoID(','.join(photos)) + return a_Msg + + def ShowMessageTemplate(self, a_Message, Inline_keyboard_template_func = None, a_EnablePhoto = False): async def ShowMessage(a_CallbackQuery, a_Item): msg = a_Message.StaticCopy() # TODO: добавить поддержку языка в a_MessageName @@ -189,10 +200,7 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): elif len(a_Item) == self.m_Table.GetFieldsCount(): lang = str(a_CallbackQuery.from_user.language_code) msg = msg.GetMessageForLang(lang).StaticCopy() - msg.UpdateDesc(self.m_Table.ReplaceAllFieldTags(msg.GetDesc(), a_Item)) - photo_field = self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.PHOTO) - if photo_field: - msg.UpdatePhotoID(a_Item[photo_field]) + msg = self.UpdateMessage(msg, lang, a_Item) item_access = a_Item[self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.ACCESS)] if Inline_keyboard_template_func: Inline_keyboard_func = Inline_keyboard_template_func(a_Item[self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.KEY)]) @@ -200,12 +208,6 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): return simple_message.WorkFuncResult(msg, item_access = item_access, Inline_keyboard_func = Inline_keyboard_func) return ShowMessage - # TODO: delete? - def SimpleMessageTemplate(self, a_MessageName : Messages): - async def ShowMessage(a_CallbackQuery, a_Item): - return simple_message.WorkFuncResult(self.GetMessage(a_MessageName)) - return ShowMessage - async def PreDelete(self, a_CallbackQuery, a_Item): if len(a_Item) < self.m_Table.GetFieldsCount(): return simple_message.WorkFuncResult(error_find_proj_message) @@ -218,7 +220,7 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): self.OnChange() return simple_message.WorkFuncResult(self.GetMessage(Messages.SUCCESS_DELETE)) - def AddBDItemFunc(self, a_ItemData, a_UserID): + async def AddBDItemFunc(self, a_ItemData, a_UserID): table_name = self.m_Table.GetName() name_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.NAME) photo_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.PHOTO) @@ -227,55 +229,127 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): create_datetime_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.CREATE_DATE) parent_id_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.PARENT_ID) - res, error = None, None def_access = access_utils.GetItemDefaultAccessForModule(self.m_Bot, self.GetName()) - #TODO сделать список полей, чтобы запрос генерировался автоматически. - if parent_id_field: - res, error = self.m_Bot.SQLRequest(f'INSERT INTO {table_name}({photo_field}, {name_field}, {desc_field}, {access_field}, {parent_id_field}, {create_datetime_field}) VALUES(?, ?, ?, ?, ?, {bot_bd.GetBDDateTimeNow()})', - commit = True, return_error = True, param = (a_ItemData[photo_field], a_ItemData[name_field], a_ItemData[desc_field], def_access + f";{a_UserID}=+", a_ItemData[parent_id_field])) - else: - res, error = self.m_Bot.SQLRequest(f'INSERT INTO {table_name}({photo_field}, {name_field}, {desc_field}, {access_field}, {create_datetime_field}) VALUES(?, ?, ?, ?, {bot_bd.GetBDDateTimeNow()})', - commit = True, return_error = True, param = (a_ItemData[photo_field], a_ItemData[name_field], a_ItemData[desc_field], def_access + f";{a_UserID}=+")) + + fields = [] + values = [] + param = () + for f in self.m_Table.GetFields(): + d = f.m_Destiny + n = f.m_Name + if d == bd_table.TableFieldDestiny.KEY: + continue + elif d == bd_table.TableFieldDestiny.CREATE_DATE: + fields += [n] + values += [bot_bd.GetBDDateTimeNow()] + elif d == bd_table.TableFieldDestiny.ACCESS: + fields += [n] + values += ['?'] + param += (def_access + f";{a_UserID}=+", ) + else: + fields += [n] + values += ['?'] + param += (a_ItemData[n], ) + + request = f'INSERT INTO {table_name}({",".join(fields)}) VALUES({",".join(values)})' + print('request', request, param) + res, error = self.m_Bot.SQLRequest(request, commit = True, return_error = True, param = param) self.OnChange() if error: - self.m_Log.Error(f'Пользоватлель {a_UserID}. Ошибка добавления записи в таблицу {table_name} ({a_ItemData[photo_field]}, {a_ItemData[name_field]}, {a_ItemData[desc_field]}, {def_access}).') + self.m_Log.Error(f'Пользователь {a_UserID}. Ошибка добавления записи в таблицу {request} {param}.') else: - self.m_Log.Success(f'Пользоватлель {a_UserID}. Добавлена запись в таблицу {table_name} ({a_ItemData[photo_field]}, {a_ItemData[name_field]}, {a_ItemData[desc_field]}, {def_access}).') + self.m_Log.Success(f'Пользователь {a_UserID}. Добавлена запись в таблицу {request} {param}.') return res, error + def SelectSourceTemplate(self, a_PrevPrefix, a_ButtonName): + parent_id_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.PARENT_ID) + return bd_item_select.DBItemSelectSource(self.m_Bot, self.m_Table.GetName(), parent_id_field, a_PrevPrefix, a_ButtonName) + def RegisterSelect(self, a_ButtonName, access_mode, only_parent = False): a_Prefix = None if self.m_ParentModName: parent_mod = self.GetModule(self.m_ParentModName) a_Prefix = parent_mod.RegisterSelect(a_ButtonName, access_mode, only_parent = False) - if not only_parent: - a_Prefix = bd_item_select.NextSelectBDItemRegisterHandlers(self.m_Bot, \ - a_Prefix, \ - self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.PARENT_ID), \ - self.m_Table.GetName(), \ - self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.KEY), \ - self.m_GetButtonNameAndKeyValueAndAccessFunc, \ - self.GetMessage(Messages.SELECT), \ - self.m_GetAccessFunc,\ - access_mode = access_mode\ - ) - else: - if not only_parent: - a_PrefixBase = a_ButtonName.GetDesc() - a_Prefix = bd_item_select.FirstSelectBDItemRegisterHandlers(self.m_Bot, \ - a_PrefixBase, \ - a_ButtonName, \ - self.m_Table.GetName(), \ - self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.KEY), \ + + if not only_parent: + a_Prefix = bd_item_select.SelectRegisterHandlers(self.m_Bot, \ + self.SelectSourceTemplate(a_Prefix, a_ButtonName), \ self.m_GetButtonNameAndKeyValueAndAccessFunc, \ self.GetMessage(Messages.SELECT), \ self.m_GetAccessFunc,\ access_mode = access_mode\ ) + return a_Prefix + def AdditionalKeyboardForEditTemplate(self, a_Field): + if a_Field.m_Type == bd_table.TableFieldType.ENUM: + def KeyboardButtons(a_Message, a_UserGroups): + cur_buttons = [] + for s in a_Field.m_Enum: + cur_buttons += [keyboard.ButtonWithAccess(self.GetButton(EnumButton(s)), user_access.AccessMode.EDIT, self.GetAccess()),] + return keyboard.MakeButtons(self.m_Bot, cur_buttons, a_UserGroups) + return KeyboardButtons + return None + + def PostProccessingForFieldForEditTemplate(self, a_Field): + if a_Field.m_Type == bd_table.TableFieldType.ENUM: + def PostProccessing(a_Message): + for s in a_Field.m_Enum: + if a_Message == str(self.GetButton(EnumButton(s))): + return str(s) + return a_Message + return PostProccessing + return None + + async def OnChangeField(self, a_Field, a_ItemID, a_ItemData, a_EditUserID): + pass + + def RegisterEdit(self, a_Field, a_AccessMode = user_access.AccessMode.EDIT): + a_ButtonName = self.GetButton(EditButton(a_Field.m_Destiny)) + a_EditMessage = self.GetMessage(EditMessage(a_Field.m_Destiny)) + a_FieldName = a_Field.m_Name + + a_FieldType = bd_item.FieldType.text + if a_Field.m_Type == bd_table.TableFieldType.PHOTO: + a_FieldType = bd_item.FieldType.photo + + if not a_ButtonName or not a_EditMessage: + return + + async def OnChange(a_ItemID, a_ItemData, a_EditUserID): + await self.OnChangeField(a_Field, a_ItemID, a_ItemData, a_EditUserID) + return self.OnChange() + + table_name = self.m_Table.GetName() + key_name = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.KEY) + edit_keyboard_func = self.m_GetEditKeyboardButtonsFunc + GetButtonNameAndKeyValueAndAccess = self.m_GetButtonNameAndKeyValueAndAccessFunc + GetAccess = self.m_GetAccessFunc + + a_Prefix = self.RegisterSelect(a_ButtonName, a_AccessMode, only_parent = True) + + bd_item_edit.EditBDItemRegisterHandlers(self.m_Bot, \ + self.SelectSourceTemplate(a_Prefix, a_ButtonName), \ + MakeFSMForEdit(self.GetName(), a_FieldName), \ + self.GetMessage(Messages.SELECT_TO_EDIT), \ + self.ShowMessageTemplate(a_EditMessage), \ + self.ShowMessageTemplate(self.GetMessage(Messages.SUCCESS_EDIT)), \ + table_name, \ + key_name, \ + a_FieldName, \ + self.PostProccessingForFieldForEditTemplate(a_Field),\ + GetButtonNameAndKeyValueAndAccess, \ + GetAccess, \ + self.AdditionalKeyboardForEditTemplate(a_Field),\ + edit_keyboard_func, \ + OnChange,\ + access_mode = a_AccessMode, \ + field_type = a_FieldType\ + ) + def RegisterHandlers(self): super().RegisterHandlers() table_name = self.m_Table.GetName() @@ -306,31 +380,23 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): a_ButtonName = self.GetButton(ButtonNames.LIST) if a_ButtonName: a_Prefix = self.RegisterSelect(a_ButtonName, user_access.AccessMode.VIEW, only_parent = True) - if a_Prefix: - bd_item_view.LastSelectAndShowBDItemRegisterHandlers(self.m_Bot, \ - a_Prefix,\ - parent_id_field, \ - table_name,\ - key_name, \ - self.ShowMessageTemplate(self.GetMessage(Messages.OPEN), GetViewItemInlineKeyboardTemplate), \ - GetButtonNameAndKeyValueAndAccess, \ - self.GetMessage(Messages.SELECT), \ - GetAccess, \ - defaul_keyboard_func, \ - access_mode = user_access.AccessMode.VIEW\ - ) - else: - bd_item_view.FirstSelectAndShowBDItemRegisterHandlers(self.m_Bot, \ - a_ButtonName, \ - table_name, \ - key_name, \ - self.ShowMessageTemplate(self.GetMessage(Messages.OPEN), GetViewItemInlineKeyboardTemplate), \ - GetButtonNameAndKeyValueAndAccess, \ - self.GetMessage(Messages.SELECT), \ - GetAccess, \ - defaul_keyboard_func\ - ) self.m_SelectPrefix = a_Prefix + a_Prefix = bd_item_select.SelectRegisterHandlers(self.m_Bot,\ + self.SelectSourceTemplate(a_Prefix, a_ButtonName), \ + GetButtonNameAndKeyValueAndAccess,\ + self.GetMessage(Messages.SELECT),\ + GetAccess,\ + access_mode = user_access.AccessMode.VIEW\ + ) + bd_item_view.ShowBDItemRegisterHandlers(self.m_Bot,\ + a_Prefix,\ + table_name,\ + key_name,\ + self.ShowMessageTemplate(self.GetMessage(Messages.OPEN), GetViewItemInlineKeyboardTemplate, a_EnablePhoto = True),\ + GetAccess,\ + defaul_keyboard_func,\ + access_mode = user_access.AccessMode.VIEW\ + ) # Удаление a_ButtonName = self.GetButton(ButtonNames.DEL) @@ -362,9 +428,9 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): self.GetFSM(FSMs.CREATE).desc, \ self.GetFSM(FSMs.CREATE).photo,\ self.m_AddBDItemFunc, \ - self.ShowMessageTemplate(self.GetMessage(Messages.CREATE_NAME)), \ - self.ShowMessageTemplate(self.GetMessage(Messages.CREATE_DESC)), \ - self.ShowMessageTemplate(self.GetMessage(Messages.CREATE_PHOTO)), \ + self.ShowMessageTemplate(self.GetMessage(CreateMessage(bd_table.TableFieldDestiny.NAME))), \ + self.ShowMessageTemplate(self.GetMessage(CreateMessage(bd_table.TableFieldDestiny.DESC))), \ + self.ShowMessageTemplate(self.GetMessage(CreateMessage(bd_table.TableFieldDestiny.PHOTO))), \ self.ShowMessageTemplate(self.GetMessage(Messages.SUCCESS_CREATE)), \ a_Prefix,\ parent_table_name, \ @@ -379,37 +445,6 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): # Редактирование edit_keyboard_func = self.m_GetEditKeyboardButtonsFunc - def RegisterEdit(a_ButtonName, a_FSM, a_EditMessage, a_FieldName, a_FieldType, a_AccessMode = user_access.AccessMode.EDIT): - if not a_ButtonName: - return - - def OnChange(): - return self.OnChange() - - a_Prefix = self.RegisterSelect(a_ButtonName, a_AccessMode, only_parent = True) - check_func = bd_item.GetCheckForTextFunc(a_ButtonName) - if a_Prefix: - check_func = bd_item.GetCheckForPrefixFunc(a_Prefix) - #print(a_ButtonName, a_Prefix, check_func) - bd_item_edit.EditBDItemRegisterHandlers(self.m_Bot, \ - a_Prefix, \ - a_FSM, \ - check_func, \ - self.GetMessage(Messages.SELECT_TO_EDIT), \ - self.ShowMessageTemplate(a_EditMessage), \ - self.ShowMessageTemplate(self.GetMessage(Messages.SUCCESS_EDIT)), \ - table_name, \ - key_name, \ - parent_id_field, \ - a_FieldName, \ - GetButtonNameAndKeyValueAndAccess, \ - GetAccess, \ - edit_keyboard_func, \ - OnChange,\ - access_mode = a_AccessMode, \ - field_type = a_FieldType\ - ) - a_ButtonName = self.GetButton(ButtonNames.EDIT) if a_ButtonName: self.m_Bot.RegisterMessageHandler(\ @@ -423,11 +458,11 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): bd_item.GetCheckForTextFunc(a_ButtonName)\ ) - RegisterEdit(self.GetButton(ButtonNames.EDIT_NAME), self.GetFSM(FSMs.EDIT_NAME), self.GetMessage(Messages.EDIT_NAME), name_field, bd_item.FieldType.text) - RegisterEdit(self.GetButton(ButtonNames.EDIT_DESC), self.GetFSM(FSMs.EDIT_DESC), self.GetMessage(Messages.EDIT_DESC), desc_field, bd_item.FieldType.text) - RegisterEdit(self.GetButton(ButtonNames.EDIT_PHOTO), self.GetFSM(FSMs.EDIT_PHOTO), self.GetMessage(Messages.EDIT_PHOTO), photo_field, bd_item.FieldType.photo) - RegisterEdit(self.GetButton(ButtonNames.EDIT_ACCESS), self.GetFSM(FSMs.EDIT_ACCESS), self.GetMessage(Messages.EDIT_ACCESS), access_field, bd_item.FieldType.text) - RegisterEdit(self.GetButton(ButtonNames.EDIT_DEFAULT_ACCESS), self.GetFSM(FSMs.EDIT_DEFAULT_ACCESS), self.GetMessage(Messages.EDIT_DEFAULT_ACCESS), def_access_field, bd_item.FieldType.text) + address_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.ADDRESS) + status_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.STATUS) + + for f in self.m_Table.GetFields(): + self.RegisterEdit(f) def OnChange(self): pass diff --git a/bot_modules/needs.py b/bot_modules/needs.py index 993fe88..449f413 100644 --- a/bot_modules/needs.py +++ b/bot_modules/needs.py @@ -23,7 +23,7 @@ table = bd_table.Table(table_name, [ bd_table.TableField(key_name, bd_table.TableFieldDestiny.KEY, bd_table.TableFieldType.INT), bd_table.TableField(name_field, bd_table.TableFieldDestiny.NAME, bd_table.TableFieldType.STR), bd_table.TableField(desc_field, bd_table.TableFieldDestiny.DESC, bd_table.TableFieldType.STR), - bd_table.TableField(photo_field, bd_table.TableFieldDestiny.PHOTO, bd_table.TableFieldType.STR), + bd_table.TableField(photo_field, bd_table.TableFieldDestiny.PHOTO, bd_table.TableFieldType.PHOTO), bd_table.TableField(access_field, bd_table.TableFieldDestiny.ACCESS, bd_table.TableFieldType.STR), bd_table.TableField(create_datetime_field, bd_table.TableFieldDestiny.CREATE_DATE, bd_table.TableFieldType.STR), bd_table.TableField(parent_id_field, bd_table.TableFieldDestiny.PARENT_ID, bd_table.TableFieldType.INT), @@ -39,10 +39,10 @@ button_names = { mod_table_operate.ButtonNames.LIST: "📃 Список потребностей", mod_table_operate.ButtonNames.ADD: "☑ Добавить потребность", mod_table_operate.ButtonNames.EDIT: "🛠 Редактировать потребность", - mod_table_operate.ButtonNames.EDIT_PHOTO: "☐ Изменить изображение у потребности", - mod_table_operate.ButtonNames.EDIT_NAME: "≂ Изменить название у потребности", - mod_table_operate.ButtonNames.EDIT_DESC: "𝌴 Изменить описание у потребности", - mod_table_operate.ButtonNames.EDIT_ACCESS: "✋ Изменить доступ к потребности", + 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.ButtonNames.DEL: "❌ Удалить потребность", } @@ -64,17 +64,17 @@ messages = { Время создания: #{create_datetime_field} ''', - mod_table_operate.Messages.CREATE_NAME: ''' + mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.NAME): ''' Создание потребности. Шаг №1 Введите название потребности: ''', - mod_table_operate.Messages.CREATE_DESC: ''' + mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.DESC): ''' Создание потребности. Шаг №2 Введите описание потребности: ''', - mod_table_operate.Messages.CREATE_PHOTO: ''' + mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.PHOTO): ''' Создание потребности. Шаг №3 Загрузите обложку для потребности (Фото): @@ -87,23 +87,23 @@ messages = { mod_table_operate.Messages.SELECT_TO_EDIT: ''' Выберите потребность, которую вы хотите отредактировать. ''', - mod_table_operate.Messages.EDIT_PHOTO: ''' + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.PHOTO): ''' Загрузите новую обложку для потребности (Фото): Она будет отображаться в её описании. ''', - mod_table_operate.Messages.EDIT_NAME: f''' + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.NAME): f''' Текущее название потребности: #{name_field} Введите новое название потребности: ''', - mod_table_operate.Messages.EDIT_DESC: f''' + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.DESC): f''' Текущее описание потребности: #{desc_field} Введите новое описание потребности: ''', - mod_table_operate.Messages.EDIT_ACCESS: f''' + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.ACCESS): f''' Текущий доступ к потребности: #{access_field} diff --git a/bot_modules/orders.py b/bot_modules/orders.py new file mode 100644 index 0000000..e534a34 --- /dev/null +++ b/bot_modules/orders.py @@ -0,0 +1,258 @@ +# -*- coding: utf8 -*- +# Общественное достояние, 2023, Алексей Безбородов (Alexei Bezborodov) + +# Заказы + +from bot_sys import bot_bd, keyboard, user_access, bd_table +from bot_modules import mod_table_operate, mod_simple_message +from template import bd_item_select, bd_item_view, bd_item + +from enum import Enum +from enum import auto + +class OrderStatus(Enum): + NEW = auto() + PAY = auto() + ADDRESS = auto() + FINISH = auto() + +# --------------------------------------------------------- +# БД +module_name = 'orders' + +table_name = module_name +key_name = 'orderID' +name_field = 'orderName' +desc_field = 'orderDesc' +photo_field = 'orderPhoto' +photo_pay_field = 'orderPhotoPay' +status_field = 'orderStatus' +address_field = 'orderAddress' +access_field = 'orderAccess' +create_datetime_field = 'orderCreateDateTime' +parent_id_field = 'userID' + +table = bd_table.Table(table_name, [ + bd_table.TableField(key_name, bd_table.TableFieldDestiny.KEY, bd_table.TableFieldType.INT), + bd_table.TableField(name_field, bd_table.TableFieldDestiny.NAME, bd_table.TableFieldType.STR), + bd_table.TableField(desc_field, bd_table.TableFieldDestiny.DESC, bd_table.TableFieldType.STR), + bd_table.TableField(photo_field, bd_table.TableFieldDestiny.PHOTO, bd_table.TableFieldType.PHOTO), + bd_table.TableField(photo_pay_field, bd_table.TableFieldDestiny.PHOTO_PAY, bd_table.TableFieldType.PHOTO), + bd_table.TableField(status_field, bd_table.TableFieldDestiny.STATUS, bd_table.TableFieldType.ENUM, a_Enum = OrderStatus), + bd_table.TableField(address_field, bd_table.TableFieldDestiny.ADDRESS, bd_table.TableFieldType.STR), + bd_table.TableField(access_field, bd_table.TableFieldDestiny.ACCESS, bd_table.TableFieldType.STR), + bd_table.TableField(create_datetime_field, bd_table.TableFieldDestiny.CREATE_DATE, bd_table.TableFieldType.STR), + bd_table.TableField(parent_id_field, bd_table.TableFieldDestiny.PARENT_ID, bd_table.TableFieldType.INT), + ]) + +init_access = f'{user_access.user_access_group_new}=vea' + +# --------------------------------------------------------- +# Сообщения и кнопки + +class ButtonNames(Enum): + LIST_ALL = auto() + +button_names = { + mod_simple_message.ButtonNames.START: "‍🛒 Заказы", + mod_table_operate.ButtonNames.LIST: "📃 Список моих текущих заказов", + ButtonNames.LIST_ALL: "📃 Список всех моих заказов", + mod_table_operate.ButtonNames.ADD: "✅ Добавить заказ", + mod_table_operate.ButtonNames.EDIT: "🛠 Редактировать мой заказ", + mod_table_operate.EditButton(bd_table.TableFieldDestiny.PHOTO_PAY): "☐ Загрузить чек по оплате моего заказа", + 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.ADDRESS): "𝌴 Изменить адрес в моём заказе", + mod_table_operate.EditButton(bd_table.TableFieldDestiny.ACCESS): "✋ Изменить доступ к моему заказу", + mod_table_operate.ButtonNames.DEL: "❌ Удалить мой заказ", +} + +messages = { + mod_simple_message.Messages.START: f''' +{button_names[mod_simple_message.ButtonNames.START]} + +''', + mod_table_operate.Messages.SELECT: ''' +Пожалуйста, выберите заказ: +''', + mod_table_operate.Messages.ERROR_FIND: ''' +❌ Ошибка, заказ не найден +''', + mod_table_operate.Messages.OPEN: f''' +Заказ: #{name_field} + +Описание и состав заказа: #{desc_field} + +Статус: #{status_field} + +Адрес доставки: #{address_field} + +Время создания: #{create_datetime_field} +''', + mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.NAME): ''' +Создание заказа. Шаг №1 + +Введите название заказа: +''', + mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.DESC): ''' +Создание заказа. Шаг №2 + +Введите описание заказа: +''', + mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.PHOTO): ''' +Создание заказа. Шаг №3 + +Загрузите обложку для заказа (Фото): +Она будет отображаться в его описании. +''', + mod_table_operate.Messages.SUCCESS_CREATE: '''✅ Заказ успешно добавлен!''', + mod_table_operate.Messages.START_EDIT: ''' +Пожалуйста, выберите действие: +''', + mod_table_operate.Messages.SELECT_TO_EDIT: ''' +Выберите заказ, который вы хотите отредактировать. +''', + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.PHOTO_PAY): ''' +Загрузите чек по оплате заказа (фото): +''', + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.PHOTO): ''' +Загрузите новую обложку для заказа (Фото): +Она будет отображаться в его описании. +''', + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.NAME): f''' +Текущее название заказа: +#{name_field} + +Введите новое название заказа: +''', + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.DESC): f''' +Текущее описание заказа: +#{desc_field} + +Введите новое описание заказа: +''', + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.ADDRESS): f''' +Текущий адрес заказа: +#{desc_field} + +Введите новый адрес доставки заказа (укажите, кто, когда и где его сможет забрать): +''', + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.ACCESS): f''' +Текущий доступ к заказу: +#{access_field} + +{user_access.user_access_readme} + +Введите новую строку доступа: +''', + mod_table_operate.Messages.SUCCESS_EDIT: '''✅ Заказ успешно отредактирован!''', + mod_table_operate.Messages.SELECT_TO_DELETE: ''' +Выберите заказ, который вы хотите удалить. +Все задачи и потребности в этом заказе так же будут удалены! +''', + mod_table_operate.Messages.SUCCESS_DELETE: '''✅ Заказ успешно удалён!''', +} + +messages_order_status = { + mod_table_operate.EnumMessageForView(OrderStatus.NEW): f'''Заказ создан, ожидает модерации''', + mod_table_operate.EnumMessageForView(OrderStatus.PAY): f'''Заказ ожидает оплаты''', + mod_table_operate.EnumMessageForView(OrderStatus.ADDRESS): f'''Заказ ожидает указания адреса доставки''', + mod_table_operate.EnumMessageForView(OrderStatus.FINISH): f'''Заказ выполнен''', +} + +messages.update(messages_order_status) + +def GetCurItemsTemplate(a_Bot, a_TableName, a_UserIDFieldName, a_StatusFieldName): + def GetBDItems(a_Message, a_UserGroups, a_ParentID): + user_id = str(a_Message.from_user.id) + request = f'SELECT * FROM {a_TableName} WHERE {a_UserIDFieldName} = ? AND {a_StatusFieldName} != ?' + return a_Bot.SQLRequest(request, param = ([user_id, str(OrderStatus.FINISH)])) + return GetBDItems + +def GetBDItemsForUserTemplate(a_Bot, a_TableName, a_UserIDFieldName): + def GetBDItems(a_Message, a_UserGroups, a_ParentID): + user_id = str(a_Message.from_user.id) + return bd_item.GetBDItemsTemplate(a_Bot, a_TableName, a_UserIDFieldName)(user_id) + return GetBDItems + +class DBItemForUserSelectSource(bd_item_select.DBItemSelectSource): + def __init__(self, a_Bot, a_TableName, a_ParentIDFieldName, a_PrevPrefix, a_ButtonName, a_OnlyCurrent = False): + super().__init__(a_Bot, a_TableName, a_ParentIDFieldName, a_PrevPrefix, a_ButtonName) + self.m_OnlyCurrent = a_OnlyCurrent + + def GetItemsFunc(self): + if self.m_OnlyCurrent: + return GetCurItemsTemplate(self.m_Bot, self.m_TableName, self.m_ParentIDFieldName, status_field) + return GetBDItemsForUserTemplate(self.m_Bot, self.m_TableName, self.m_ParentIDFieldName) + + def IsFirst(self): + return True + +class ModuleOrders(mod_table_operate.TableOperateModule): + def __init__(self, a_Table, a_Messages, a_Buttons, a_ParentModName, a_ChildModName, a_InitAccess, a_ChildModuleNameList, a_EditModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log): + super().__init__(table, a_Messages, a_Buttons, a_ParentModName, a_ChildModName, a_InitAccess, a_ChildModuleNameList, a_EditModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log) + + def SelectSourceTemplate(self, a_PrevPrefix, a_ButtonName): + parent_id_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.PARENT_ID) + return DBItemForUserSelectSource(self.m_Bot, self.m_Table.GetName(), parent_id_field, a_PrevPrefix, a_ButtonName, a_OnlyCurrent = True) + + def SelectSourceForAllTemplate(self, a_PrevPrefix, a_ButtonName): + parent_id_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.PARENT_ID) + return DBItemForUserSelectSource(self.m_Bot, self.m_Table.GetName(), parent_id_field, a_PrevPrefix, a_ButtonName) + + def AddBDItemFunc(self, a_ItemData, a_UserID): + parent_id_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.PARENT_ID) + a_ItemData[parent_id_field] = a_UserID + a_ItemData[status_field] = str(OrderStatus.NEW) + a_ItemData[address_field] = '' + a_ItemData[photo_pay_field] = '0' + return super().AddBDItemFunc(a_ItemData, a_UserID) + + def GetStartKeyboardButtons(self, a_Message, a_UserGroups): + parent_buttons = super().GetStartKeyboardButtons(a_Message, a_UserGroups) + cur_buttons = [ + keyboard.ButtonWithAccess(self.GetButton(ButtonNames.LIST_ALL), user_access.AccessMode.VIEW, self.GetAccess()), + ] + return parent_buttons + keyboard.MakeButtons(self.m_Bot, cur_buttons, a_UserGroups) + + def RegisterHandlers(self): + super().RegisterHandlers() + table_name = self.m_Table.GetName() + key_name = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.KEY) + + def GetViewItemInlineKeyboardTemplate(a_ItemID): + return self.GetViewItemInlineKeyboardTemplate(a_ItemID) + + GetButtonNameAndKeyValueAndAccess = self.m_GetButtonNameAndKeyValueAndAccessFunc + GetAccess = self.m_GetAccessFunc + + default_keyboard_func = self.m_GetStartKeyboardButtonsFunc + + # Список всех заказов + a_ButtonName = self.GetButton(ButtonNames.LIST_ALL) + if a_ButtonName: + a_Prefix = self.RegisterSelect(a_ButtonName, user_access.AccessMode.VIEW, only_parent = True) + a_Prefix = bd_item_select.SelectRegisterHandlers(self.m_Bot,\ + self.SelectSourceForAllTemplate(a_Prefix, a_ButtonName), \ + GetButtonNameAndKeyValueAndAccess,\ + self.GetMessage(mod_table_operate.Messages.SELECT),\ + GetAccess,\ + access_mode = user_access.AccessMode.VIEW\ + ) + bd_item_view.ShowBDItemRegisterHandlers(self.m_Bot,\ + a_Prefix,\ + table_name,\ + key_name,\ + self.ShowMessageTemplate(self.GetMessage(mod_table_operate.Messages.OPEN),GetViewItemInlineKeyboardTemplate, a_EnablePhoto = True),\ + GetAccess,\ + default_keyboard_func,\ + access_mode = user_access.AccessMode.VIEW\ + ) + +class ModuleUserOrders(ModuleOrders): + def __init__(self, a_ParentModName, a_ChildModName, a_ChildModuleNameList, a_EditModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log): + super().__init__(table, messages, button_names, a_ParentModName, a_ChildModName, init_access, a_ChildModuleNameList, a_EditModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log) + + def GetName(self): + return module_name diff --git a/bot_modules/projects.py b/bot_modules/projects.py index ef5d54e..8a601ee 100644 --- a/bot_modules/projects.py +++ b/bot_modules/projects.py @@ -22,7 +22,7 @@ table = bd_table.Table(table_name, [ bd_table.TableField(key_name, bd_table.TableFieldDestiny.KEY, bd_table.TableFieldType.INT), bd_table.TableField(name_field, bd_table.TableFieldDestiny.NAME, bd_table.TableFieldType.STR), bd_table.TableField(desc_field, bd_table.TableFieldDestiny.DESC, bd_table.TableFieldType.STR), - bd_table.TableField(photo_field, bd_table.TableFieldDestiny.PHOTO, bd_table.TableFieldType.STR), + bd_table.TableField(photo_field, bd_table.TableFieldDestiny.PHOTO, bd_table.TableFieldType.PHOTO), bd_table.TableField(access_field, bd_table.TableFieldDestiny.ACCESS, bd_table.TableFieldType.STR), bd_table.TableField(create_datetime_field, bd_table.TableFieldDestiny.CREATE_DATE, bd_table.TableFieldType.STR), ]) @@ -37,10 +37,10 @@ button_names = { mod_table_operate.ButtonNames.LIST: "📃 Список проектов", mod_table_operate.ButtonNames.ADD: "✅ Добавить проект", mod_table_operate.ButtonNames.EDIT: "🛠 Редактировать проект", - mod_table_operate.ButtonNames.EDIT_PHOTO: "☐ Изменить изображение в проекте", - mod_table_operate.ButtonNames.EDIT_NAME: "≂ Изменить название в проекте", - mod_table_operate.ButtonNames.EDIT_DESC: "𝌴 Изменить описание в проекте", - mod_table_operate.ButtonNames.EDIT_ACCESS: "✋ Изменить доступ к проекту", + 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.ButtonNames.DEL: "❌ Удалить проект", } @@ -62,17 +62,17 @@ messages = { Время создания: #{create_datetime_field} ''', - mod_table_operate.Messages.CREATE_NAME: ''' + mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.NAME): ''' Создание проекта. Шаг №1 Введите название проекта: ''', - mod_table_operate.Messages.CREATE_DESC: ''' + mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.DESC): ''' Создание проекта. Шаг №2 Введите описание проекта: ''', - mod_table_operate.Messages.CREATE_PHOTO: ''' + mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.PHOTO): ''' Создание проекта. Шаг №3 Загрузите обложку для проекта (Фото): @@ -85,23 +85,23 @@ messages = { mod_table_operate.Messages.SELECT_TO_EDIT: ''' Выберите проект, который вы хотите отредактировать. ''', - mod_table_operate.Messages.EDIT_PHOTO: ''' + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.PHOTO): ''' Загрузите новую обложку для проекта (Фото): Она будет отображаться в его описании. ''', - mod_table_operate.Messages.EDIT_NAME: f''' + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.NAME): f''' Текущее название проекта: #{name_field} Введите новое название проекта: ''', - mod_table_operate.Messages.EDIT_DESC: f''' + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.DESC): f''' Текущее описание проекта: #{desc_field} Введите новое описание проекта: ''', - mod_table_operate.Messages.EDIT_ACCESS: f''' + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.ACCESS): f''' Текущий доступ к проекту: #{access_field} @@ -124,9 +124,3 @@ class ModuleProjects(mod_table_operate.TableOperateModule): def GetName(self): return module_name - def GetModuleButtons(self): - return super().GetModuleButtons() + [ - keyboard.ButtonWithAccess(self.GetButton(mod_table_operate.ButtonNames.LIST), user_access.AccessMode.VIEW, self.GetAccess()), - ] - - diff --git a/bot_modules/tasks.py b/bot_modules/tasks.py index 56b4c49..4234622 100644 --- a/bot_modules/tasks.py +++ b/bot_modules/tasks.py @@ -23,7 +23,7 @@ table = bd_table.Table(table_name, [ bd_table.TableField(key_name, bd_table.TableFieldDestiny.KEY, bd_table.TableFieldType.INT), bd_table.TableField(name_field, bd_table.TableFieldDestiny.NAME, bd_table.TableFieldType.STR), bd_table.TableField(desc_field, bd_table.TableFieldDestiny.DESC, bd_table.TableFieldType.STR), - bd_table.TableField(photo_field, bd_table.TableFieldDestiny.PHOTO, bd_table.TableFieldType.STR), + bd_table.TableField(photo_field, bd_table.TableFieldDestiny.PHOTO, bd_table.TableFieldType.PHOTO), bd_table.TableField(access_field, bd_table.TableFieldDestiny.ACCESS, bd_table.TableFieldType.STR), bd_table.TableField(create_datetime_field, bd_table.TableFieldDestiny.CREATE_DATE, bd_table.TableFieldType.STR), bd_table.TableField(parent_id_field, bd_table.TableFieldDestiny.PARENT_ID, bd_table.TableFieldType.INT), @@ -39,10 +39,10 @@ button_names = { mod_table_operate.ButtonNames.LIST: "📃 Список задач", mod_table_operate.ButtonNames.ADD: "☑ Добавить задачу", mod_table_operate.ButtonNames.EDIT: "🛠 Редактировать задачу", - mod_table_operate.ButtonNames.EDIT_PHOTO: "☐ Изменить изображение у задачи", - mod_table_operate.ButtonNames.EDIT_NAME: "≂ Изменить название у задачи", - mod_table_operate.ButtonNames.EDIT_DESC: "𝌴 Изменить описание у задачи", - mod_table_operate.ButtonNames.EDIT_ACCESS: "✋ Изменить доступ к задаче", + 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.ButtonNames.DEL: "❌ Удалить задачу", } @@ -64,17 +64,17 @@ messages = { Время создания: #{create_datetime_field} ''', - mod_table_operate.Messages.CREATE_NAME: ''' + mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.NAME): ''' Создание задачи. Шаг №1 Введите название задачи: ''', - mod_table_operate.Messages.CREATE_DESC: ''' + mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.DESC): ''' Создание задачи. Шаг №2 Введите описание задачи: ''', - mod_table_operate.Messages.CREATE_PHOTO: ''' + mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.PHOTO): ''' Создание задачи. Шаг №3 Загрузите обложку для задачи (Фото): @@ -87,23 +87,23 @@ messages = { mod_table_operate.Messages.SELECT_TO_EDIT: ''' Выберите задачу, которую вы хотите отредактировать. ''', - mod_table_operate.Messages.EDIT_PHOTO: ''' + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.PHOTO): ''' Загрузите новую обложку для задачи (Фото): Она будет отображаться в её описании. ''', - mod_table_operate.Messages.EDIT_NAME: f''' + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.NAME): f''' Текущее название задачи: #{name_field} Введите новое название задачи: ''', - mod_table_operate.Messages.EDIT_DESC: f''' + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.DESC): f''' Текущее описание задачи: #{desc_field} Введите новое описание задачи: ''', - mod_table_operate.Messages.EDIT_ACCESS: f''' + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.ACCESS): f''' Текущий доступ к задаче: #{access_field} diff --git a/bot_modules/user_in_groups.py b/bot_modules/user_in_groups.py index da376e6..a7bacda 100644 --- a/bot_modules/user_in_groups.py +++ b/bot_modules/user_in_groups.py @@ -55,7 +55,7 @@ button_names = { mod_simple_message.ButtonNames.START: "🗫 Пользователи в группах", mod_table_operate.ButtonNames.LIST: "📃 Список пользователей в группах", ButtonNames.ADD_USER: "✅ Добавить пользователя в группу", - mod_table_operate.ButtonNames.EDIT_ACCESS: "✋ Доступ к пользователю в группе", + mod_table_operate.EditButton(bd_table.TableFieldDestiny.ACCESS): "✋ Доступ к пользователю в группе", mod_table_operate.ButtonNames.DEL: "❌ Удалить пользователя из группы", } @@ -77,7 +77,7 @@ messages = { Время создания: #{create_datetime_field} ''', - mod_table_operate.Messages.CREATE_NAME: ''' + mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.NAME): ''' Создание пользователя в группе. Укажите ID пользователя: @@ -89,7 +89,7 @@ messages = { mod_table_operate.Messages.SELECT_TO_EDIT: ''' Выберите пользователя в группе, которого вы хотите отредактировать. ''', - mod_table_operate.Messages.EDIT_ACCESS: f''' + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.ACCESS): f''' Текущий доступ к пользователю в группе: #{access_field} @@ -118,19 +118,6 @@ class ModuleUserInGroups(mod_table_operate.TableOperateModule): ] return t_buttons + keyboard.MakeButtons(self.m_Bot, cur_buttons, a_UserGroups) - def AddBDItemFunc(self, a_ItemData, a_UserID): - def_access = access_utils.GetItemDefaultAccessForModule(self.m_Bot, self.GetName()) - res, error = self.m_Bot.SQLRequest(f'INSERT INTO {table_name}({name_field}, {access_field}, {parent_id_field}, {create_datetime_field}) VALUES(?, ?, ?, {bot_bd.GetBDDateTimeNow()})', - commit = True, return_error = True, param = (a_ItemData[name_field], def_access + f";{a_UserID}=+", a_ItemData[parent_id_field])) - - self.OnChange() - if error: - self.m_Log.Error(f'Пользоватлель {a_UserID}. Ошибка добавления записи в таблицу {table_name} ({a_ItemData[name_field]}, {def_access}).') - else: - self.m_Log.Success(f'Пользоватлель {a_UserID}. Добавлена запись в таблицу {table_name} ({a_ItemData[name_field]}, {def_access}).') - - return res, error - def RegisterHandlers(self): super().RegisterHandlers() GetButtonNameAndKeyValueAndAccess = self.m_GetButtonNameAndKeyValueAndAccessFunc @@ -158,7 +145,7 @@ class ModuleUserInGroups(mod_table_operate.TableOperateModule): check_func,\ FSMAddUserInGroups,\ self.m_AddBDItemFunc,\ - self.ShowMessageTemplate(self.GetMessage(mod_table_operate.Messages.CREATE_NAME)),\ + self.ShowMessageTemplate(self.GetMessage(mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.NAME))),\ self.ShowMessageTemplate(self.GetMessage(mod_table_operate.Messages.SUCCESS_CREATE)),\ a_Prefix,\ parent_table_name,\ diff --git a/bot_modules/users.py b/bot_modules/users.py index 1fcd569..f56386c 100644 --- a/bot_modules/users.py +++ b/bot_modules/users.py @@ -29,7 +29,7 @@ table = bd_table.Table(table_name, [ bd_table.TableField(name2_field, bd_table.TableFieldDestiny.DESC, bd_table.TableFieldType.STR), bd_table.TableField(is_bot_field, bd_table.TableFieldDestiny.DESC, bd_table.TableFieldType.STR), bd_table.TableField(language_code_field, bd_table.TableFieldDestiny.DESC, bd_table.TableFieldType.STR), - bd_table.TableField(photo_field, bd_table.TableFieldDestiny.PHOTO, bd_table.TableFieldType.STR), + bd_table.TableField(photo_field, bd_table.TableFieldDestiny.PHOTO, bd_table.TableFieldType.PHOTO), bd_table.TableField(access_field, bd_table.TableFieldDestiny.ACCESS, bd_table.TableFieldType.STR), bd_table.TableField(create_datetime_field, bd_table.TableFieldDestiny.CREATE_DATE, bd_table.TableFieldType.STR), ]) @@ -44,10 +44,10 @@ button_names = { mod_table_operate.ButtonNames.LIST: "📃 Список пользователей", # mod_table_operate.ButtonNames.ADD: "✅ Добавить пользователя", mod_table_operate.ButtonNames.EDIT: "🛠 Редактировать пользователя", - mod_table_operate.ButtonNames.EDIT_PHOTO: "☐ Изменить изображение в пользователяе", - mod_table_operate.ButtonNames.EDIT_NAME: "≂ Изменить название в пользователяе", - mod_table_operate.ButtonNames.EDIT_DESC: "𝌴 Изменить описание в пользователяе", - mod_table_operate.ButtonNames.EDIT_ACCESS: "✋ Изменить доступ к пользователю", + 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.ButtonNames.DEL: "❌ Удалить пользователя", } @@ -72,17 +72,17 @@ messages = { Код языка: #{language_code_field} Дата добавления: #{create_datetime_field} ''', - mod_table_operate.Messages.CREATE_NAME: ''' + mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.NAME): ''' Создание пользователя. Шаг №1 Введите название пользователя: ''', - mod_table_operate.Messages.CREATE_DESC: ''' + mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.DESC): ''' Создание пользователя. Шаг №2 Введите описание пользователя: ''', - mod_table_operate.Messages.CREATE_PHOTO: ''' + mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.PHOTO): ''' Создание пользователя. Шаг №3 Загрузите обложку для пользователя (Фото): @@ -95,23 +95,23 @@ messages = { mod_table_operate.Messages.SELECT_TO_EDIT: ''' Выберите пользователя, которого вы хотите отредактировать. ''', - mod_table_operate.Messages.EDIT_PHOTO: ''' + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.PHOTO): ''' Загрузите новую обложку для пользователя (Фото): Она будет отображаться в его описании. ''', - mod_table_operate.Messages.EDIT_NAME: f''' + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.NAME): f''' Текущее название пользователя: #{name_field} Введите новое название пользователя: ''', - mod_table_operate.Messages.EDIT_DESC: f''' + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.DESC): f''' Текущее описание пользователя: #{name1_field} Введите новое описание пользователя: ''', - mod_table_operate.Messages.EDIT_ACCESS: f''' + mod_table_operate.EditMessage(bd_table.TableFieldDestiny.ACCESS): f''' Текущий доступ к пользователю: #{access_field} diff --git a/bot_sys/aiogram_bot.py b/bot_sys/aiogram_bot.py index 6b4ccca..692c0a1 100644 --- a/bot_sys/aiogram_bot.py +++ b/bot_sys/aiogram_bot.py @@ -9,6 +9,16 @@ from aiogram.dispatcher import Dispatcher from aiogram.contrib.fsm_storage.memory import MemoryStorage from aiogram.utils import executor +def GetPhotoList(a_PhotoIDs): + if not a_PhotoIDs or a_PhotoIDs == 0: + return [] + photos = a_PhotoIDs.split(",") + result = [] + for p in photos: + if p != '0' and p != '': + result += [p] + return result + class AiogramBot(interfaces.IBot): def __init__(self, a_TelegramBotApiToken, a_BDFileName, a_RootIDs, a_Log): self.m_TelegramBotApiToken = a_TelegramBotApiToken @@ -39,19 +49,27 @@ class AiogramBot(interfaces.IBot): base_keyboards = [keyboard.MakeAiogramKeyboard(a_KeyboardButtons)] if inline_keyboards: base_keyboards = inline_keyboards - if a_PhotoIDs and a_PhotoIDs != 0 and a_PhotoIDs != '0': + photos = GetPhotoList(a_PhotoIDs) + if len(photos) > 0: + for p in photos[:-1]: + await self.m_TBot.send_photo( + a_UserID, + p, + '' + ) + p = photos[-1] if base_keyboards: for k in base_keyboards: await self.m_TBot.send_photo( a_UserID, - a_PhotoIDs, + p, a_Message, reply_markup = k ) else: await self.m_TBot.send_photo( a_UserID, - a_PhotoIDs, + p, a_Message ) else: diff --git a/bot_sys/bd_table.py b/bot_sys/bd_table.py index aaacb4f..d9c6bb9 100644 --- a/bot_sys/bd_table.py +++ b/bot_sys/bd_table.py @@ -6,8 +6,19 @@ from enum import auto # Тип поля в таблице class TableFieldType(Enum): - INT = 'INTEGER' - STR = 'TEXT' + INT = auto() + STR = auto() + ENUM = auto() + PHOTO = auto() + +def InitTableType(a_TableFieldType): + types = { + TableFieldType.INT: 'INTEGER', + TableFieldType.STR: 'TEXT', + TableFieldType.ENUM: 'TEXT', + TableFieldType.PHOTO: 'TEXT', + } + return types.get(a_TableFieldType, None) # Предназначение поля в таблице class TableFieldDestiny(Enum): @@ -15,17 +26,21 @@ class TableFieldDestiny(Enum): NAME = auto() DESC = auto() PHOTO = auto() + PHOTO_PAY = auto() ACCESS = auto() DEFAULT_ACCESS = auto() CREATE_DATE = auto() PARENT_ID = auto() + STATUS = auto() + ADDRESS = auto() OTHER = auto() class TableField: - def __init__(self, a_Name, a_Destiny : TableFieldDestiny, a_Type : TableFieldType): + def __init__(self, a_Name, a_Destiny : TableFieldDestiny, a_Type : TableFieldType, a_Enum = None): self.m_Name = a_Name self.m_Destiny = a_Destiny self.m_Type = a_Type + self.m_Enum = a_Enum class Table: def __init__(self, a_TableName, a_Fields : [TableField], a_UniqueFields = None): @@ -37,7 +52,7 @@ class Table: return self.m_TableName def GetFields(self): - return self.TableFieldType + return self.m_Fields def GetFieldsCount(self): return len(self.m_Fields) @@ -65,7 +80,7 @@ class Table: request = f'CREATE TABLE IF NOT EXISTS {self.GetName()}(' items = [] for f in self.m_Fields: - item = f.m_Name + ' ' + str(f.m_Type.value) + item = f.m_Name + ' ' + str(InitTableType(f.m_Type)) if f.m_Destiny == TableFieldDestiny.KEY: item += ' PRIMARY KEY' items += [item] @@ -84,14 +99,20 @@ class Table: result = result.replace(f'#{f.m_Name}', str(a_BDItem[i])) return result +class Status(Enum): + NEW = auto() + FINISH = auto() + def Test(): f1 = TableField('f1', TableFieldDestiny.KEY, TableFieldType.INT) f2 = TableField('f2', TableFieldDestiny.NAME, TableFieldType.STR) f3 = TableField('f3', TableFieldDestiny.DESC, TableFieldType.STR) + f4 = TableField('f4', TableFieldDestiny.STATUS, TableFieldType.ENUM, a_Enum = Status) table = Table('tname', [ f1, f2, - f3 + f3, + f4, ], [[f1], [f2, f3]] ) @@ -111,15 +132,21 @@ def Test(): assert table.GetFieldByDestiny(TableFieldDestiny.DESC).m_Destiny == TableFieldDestiny.DESC assert table.GetFieldByDestiny(TableFieldDestiny.DESC).m_Type == TableFieldType.STR assert table.GetFieldIDByDestiny(TableFieldDestiny.DESC) == 2 + assert table.GetFieldByDestiny(TableFieldDestiny.STATUS).m_Name == 'f4' + assert table.GetFieldNameByDestiny(TableFieldDestiny.STATUS) == 'f4' + assert table.GetFieldByDestiny(TableFieldDestiny.STATUS).m_Destiny == TableFieldDestiny.STATUS + assert table.GetFieldByDestiny(TableFieldDestiny.STATUS).m_Type == TableFieldType.ENUM + assert table.GetFieldIDByDestiny(TableFieldDestiny.STATUS) == 3 assert table.GetFieldByDestiny(TableFieldDestiny.PHOTO) == None assert table.GetFieldIDByDestiny(TableFieldDestiny.PHOTO) == None assert table.GetFieldNameByDestiny(TableFieldDestiny.PHOTO) == None - assert table.GetFieldsCount() == 3 + assert table.GetFieldsCount() == 4 + assert len(table.GetFields()) == 4 print(table.GetInitTableRequest()) - assert table.GetInitTableRequest() == 'CREATE TABLE IF NOT EXISTS tname(f1 INTEGER PRIMARY KEY, f2 TEXT, f3 TEXT, UNIQUE(f1), UNIQUE(f2, f3));' + assert table.GetInitTableRequest() == 'CREATE TABLE IF NOT EXISTS tname(f1 INTEGER PRIMARY KEY, f2 TEXT, f3 TEXT, f4 TEXT, UNIQUE(f1), UNIQUE(f2, f3));' - item = [10, 'i1', 'i2'] - assert table.ReplaceAllFieldTags('#f1 #f2 #f3', item) == '10 i1 i2' + item = [10, 'i2', 'i3', 'i4'] + assert table.ReplaceAllFieldTags('#f1 #f2 #f3 #f4', item) == '10 i2 i3 i4' diff --git a/bot_sys/bot_subscribes.py b/bot_sys/bot_subscribes.py new file mode 100644 index 0000000..523fe94 --- /dev/null +++ b/bot_sys/bot_subscribes.py @@ -0,0 +1,43 @@ +#-*-coding utf-8-*- +# Общественное достояние, 2023, Алексей Безбородов (Alexei Bezborodov) + +# Работа с подписками + +from enum import Enum +from enum import auto + +# Тип поля в таблице +class SubscribeType(Enum): + ADD = auto() + ANY_ITEM_DEL = auto() + ANY_ITEM_EDIT = auto() + ITEM_DEL = auto() + ITEM_EDIT = auto() + +class BotSubscribes + def __init__(self): + self.Clear() + + def GetSubscribes(self): + return self.m_Subscribes + + def Clear(self): + self.m_Subscribes = {} + + def CheckSubscribe(self, a_UserID, a_ModuleName, a_Type, a_ItemID = -1): + s = self.GetSubscribes() + su = s.get(a_UserID, None) + if su: + sub_um = su.get(a_ModuleName, None) + if sub_um: + t = su.get(a_ItemID, None) + return t + return None + + def AddSubscribe(self, a_UserID, a_ModuleName, a_Type, a_ItemID = -1): + s = self.GetSubscribes() + if not s.get(a_UserID, None): + s[a_UserID] = {} + if not s[a_UserID].get(a_ModuleName, None): + s[a_UserID][a_ModuleName] = {} + s[a_UserID][a_ModuleName][a_ItemID] = a_Type diff --git a/main.py b/main.py index 86c6f2e..e6de562 100644 --- a/main.py +++ b/main.py @@ -6,6 +6,7 @@ import os from bot_sys import config, log, aiogram_bot, bot_messages, bd_table, user_access from bot_modules import mod_agregator, start, profile, backup, users_groups_agregator, access, projects, tasks, needs, comments from bot_modules import languages, messages, buttons, users, groups, user_in_groups +from bot_modules import orders, all_orders log_start_message = 'Бот успешно запущен!' @@ -34,6 +35,8 @@ mod_buttons_name = buttons.module_name mod_users_name = users.module_name mod_groups_name = groups.module_name mod_user_in_groups_name = user_in_groups.module_name +mod_orders_name = orders.module_name +mod_all_orders_name = all_orders.module_name start_mod_list = [mod_start_name] mod_access = access.ModuleAccess(start_mod_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) @@ -87,6 +90,14 @@ child_mod_name_list = [mod_start_name] mod_buttons = buttons.ModuleButtons(mod_languages_name, None, child_mod_name_list, start_mod_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) g_ModuleAgregator.AddModule(mod_buttons) +child_mod_name_list = [mod_start_name] +mod_orders = orders.ModuleUserOrders(None, None, child_mod_name_list, start_mod_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) +g_ModuleAgregator.AddModule(mod_orders) + +child_mod_name_list = [mod_start_name] +mod_all_orders = all_orders.ModuleAllOrders(None, None, child_mod_name_list, start_mod_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) +g_ModuleAgregator.AddModule(mod_all_orders) + child_mod_name_list = [ mod_profile.GetName(), mod_backup.GetName(), @@ -94,6 +105,8 @@ child_mod_name_list = [ mod_access.GetName(), mod_project.GetName(), mod_languages.GetName(), + mod_orders.GetName(), + mod_all_orders.GetName(), ] mod_start = start.ModuleStart(child_mod_name_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) g_ModuleAgregator.AddModule(mod_start) @@ -127,8 +140,8 @@ for m in test_mods: m.Test() if __name__ == '__main__': -# os.system('clear') -# os.system('cls') + #os.system('clear') + #os.system('cls') g_Log.Success(log_start_message) g_Bot.StartPolling() diff --git a/template/bd_item.py b/template/bd_item.py index b0cadc6..5a08a84 100644 --- a/template/bd_item.py +++ b/template/bd_item.py @@ -42,6 +42,16 @@ def GetKeyDataFromCallbackMessage(a_Message, a_Prefix): key_item_id = str(a_Message.data).replace(a_Prefix, '') return key_item_id +def MixKeyboardFuncTemplate(a_Func1, a_Func2): + def KeyboardButtons(a_Message, a_UserGroups): + func = [a_Func1, a_Func2] + result = [] + for f in func: + if f: + result += f(a_Message, a_UserGroups) + return result + return KeyboardButtons + def GetCancelKeyboardButtonsTemplate(a_Bot, a_AccessFunc, a_AccessMode): def GetCancelKeyboardButtons(a_Message, a_UserGroups): cur_buttons = [ diff --git a/template/bd_item_add.py b/template/bd_item_add.py index 2bcb39d..54c6960 100644 --- a/template/bd_item_add.py +++ b/template/bd_item_add.py @@ -10,6 +10,9 @@ from template import simple_message, bd_item_select, bd_item cancel_message = ''' 🚫 Добавление отменено ''' +error_photo_type_message = ''' +🚫 Неверный формат изображений +''' def StartAddBDItemTemplate(a_Bot, a_FSM, a_FSMStart, a_MessageFunc, a_ParentTableName, a_ParentKeyFieldName, a_Prefix, a_AccessFunc, a_ButtonFunc, a_FinishButtonFunc, access_mode = user_access.AccessMode.ADD): async def StartAddBDItem(a_CallbackQuery, state): @@ -36,13 +39,13 @@ def StartAddBDItemTemplate(a_Bot, a_FSM, a_FSMStart, a_MessageFunc, a_ParentTabl return res_of_work_func return simple_message.SimpleMessageTemplate(a_Bot, StartAddBDItem, a_ButtonFunc, None, a_AccessFunc, access_mode) -def FinishAddBDItemTemplate(a_Bot, a_FSM, a_AddBDItemFunc, a_ParentTableName, a_ParentKeyFieldName, a_FieldName, a_MessageFunc, a_AccessFunc, a_ButtonFunc, access_mode = user_access.AccessMode.ADD, field_type = bd_item.FieldType.text): - return FinishOrNextAddBDItemTemplate(a_Bot, a_FSM, a_AddBDItemFunc, a_ParentTableName, a_ParentKeyFieldName, a_FieldName, a_MessageFunc, a_AccessFunc, a_ButtonFunc, a_ButtonFunc, True, access_mode = access_mode, field_type = field_type) +def FinishAddBDItemTemplate(a_Bot, a_FSM, a_AddBDItemFunc, a_ParentTableName, a_ParentKeyFieldName, a_FieldName, a_MessageFunc, a_PostProcessFunc, a_AccessFunc, a_ButtonFunc, access_mode = user_access.AccessMode.ADD, field_type = bd_item.FieldType.text): + return FinishOrNextAddBDItemTemplate(a_Bot, a_FSM, a_AddBDItemFunc, a_ParentTableName, a_ParentKeyFieldName, a_FieldName, a_MessageFunc, a_PostProcessFunc, a_AccessFunc, a_ButtonFunc, a_ButtonFunc, True, access_mode = access_mode, field_type = field_type) -def NextAddBDItemTemplate(a_Bot, a_FSM, a_AddBDItemFunc, a_ParentTableName, a_ParentKeyFieldName, a_FieldName, a_MessageFunc, a_AccessFunc, a_ButtonFunc, a_FinishButtonFunc, access_mode = user_access.AccessMode.ADD, field_type = bd_item.FieldType.text): - return FinishOrNextAddBDItemTemplate(a_Bot, a_FSM, a_AddBDItemFunc, a_ParentTableName, a_ParentKeyFieldName, a_FieldName, a_MessageFunc, a_AccessFunc, a_ButtonFunc, a_FinishButtonFunc, False, access_mode = access_mode, field_type = field_type) +def NextAddBDItemTemplate(a_Bot, a_FSM, a_AddBDItemFunc, a_ParentTableName, a_ParentKeyFieldName, a_FieldName, a_MessageFunc, a_PostProcessFunc, a_AccessFunc, a_ButtonFunc, a_FinishButtonFunc, access_mode = user_access.AccessMode.ADD, field_type = bd_item.FieldType.text): + return FinishOrNextAddBDItemTemplate(a_Bot, a_FSM, a_AddBDItemFunc, a_ParentTableName, a_ParentKeyFieldName, a_FieldName, a_MessageFunc, a_PostProcessFunc, a_AccessFunc, a_ButtonFunc, a_FinishButtonFunc, False, access_mode = access_mode, field_type = field_type) -def FinishOrNextAddBDItemTemplate(a_Bot, a_FSM, a_AddBDItemFunc, a_ParentTableName, a_ParentKeyFieldName, a_FieldName, a_MessageFunc, a_AccessFunc, a_ButtonFunc, a_FinishButtonFunc, a_Finish, access_mode = user_access.AccessMode.ADD, field_type = bd_item.FieldType.text): +def FinishOrNextAddBDItemTemplate(a_Bot, a_FSM, a_AddBDItemFunc, a_ParentTableName, a_ParentKeyFieldName, a_FieldName, a_MessageFunc, a_PostProcessFunc, a_AccessFunc, a_ButtonFunc, a_FinishButtonFunc, a_Finish, access_mode = user_access.AccessMode.ADD, field_type = bd_item.FieldType.text): async def FinishAddBDItem(a_Message, state): state_func = None if a_Finish: @@ -81,10 +84,13 @@ def FinishOrNextAddBDItemTemplate(a_Bot, a_FSM, a_AddBDItemFunc, a_ParentTableNa return simple_message.WorkFuncResult(bot_messages.MakeBotMessage(error_photo_type_message), keyboard_func = a_FinishButtonFunc) field_value = a_Message.photo[0].file_id else: - field_value = a_Message.text + result = a_Message.text + if a_PostProcessFunc: + result = a_PostProcessFunc(result) + field_value = result item_data[a_FieldName] = field_value if a_Finish: - res, error = a_AddBDItemFunc(item_data, user_id) + res, error = await a_AddBDItemFunc(item_data, user_id) await state_func() if error: return simple_message.WorkFuncResult(bot_messages.MakeBotMessage(error)) @@ -101,9 +107,9 @@ def AddBDItem3RegisterHandlers(a_Bot, a_StartCheckFunc, a_FSM, a_FSMName, a_FSMD reg_func(StartAddBDItemTemplate(a_Bot, a_FSM, a_FSMName, a_AddNameMessageFunc, a_ParentTableName, a_ParentKeyFieldName, a_ParentPrefix, a_AccessFunc, keyboard_cancel, a_ButtonFunc, access_mode), a_StartCheckFunc) # TODO: Сделать возможность не указывать все поля. пусть a_FSMName и a_NameField например могут быть пустыми. Возможно лучше вообще передавать список полей и их fsm - a_Bot.RegisterMessageHandler(NextAddBDItemTemplate(a_Bot, a_FSM, None, a_ParentTableName, a_ParentKeyFieldName, a_NameField, a_AddDescMessageFunc, a_AccessFunc, keyboard_cancel, a_ButtonFunc, access_mode, field_type = bd_item.FieldType.text), state = a_FSMName) - a_Bot.RegisterMessageHandler(NextAddBDItemTemplate(a_Bot, a_FSM, None, a_ParentTableName, a_ParentKeyFieldName, a_DescField, a_AddPhotoMessageFunc, a_AccessFunc, keyboard_skip_and_cancel, a_ButtonFunc, access_mode, field_type = bd_item.FieldType.text), state = a_FSMDesc) - a_Bot.RegisterMessageHandler(FinishAddBDItemTemplate(a_Bot, a_FSM, a_AddBDItemFunc, a_ParentTableName, a_ParentKeyFieldName, a_PhotoField, a_FinishMessageFunc, a_AccessFunc, a_ButtonFunc, access_mode, field_type = bd_item.FieldType.photo), content_types = ['photo', 'text'], state = a_FSMPhoto) + a_Bot.RegisterMessageHandler(NextAddBDItemTemplate(a_Bot, a_FSM, None, a_ParentTableName, a_ParentKeyFieldName, a_NameField, a_AddDescMessageFunc, None, a_AccessFunc, keyboard_cancel, a_ButtonFunc, access_mode, field_type = bd_item.FieldType.text), state = a_FSMName) + a_Bot.RegisterMessageHandler(NextAddBDItemTemplate(a_Bot, a_FSM, None, a_ParentTableName, a_ParentKeyFieldName, a_DescField, a_AddPhotoMessageFunc, None, a_AccessFunc, keyboard_skip_and_cancel, a_ButtonFunc, access_mode, field_type = bd_item.FieldType.text), state = a_FSMDesc) + a_Bot.RegisterMessageHandler(FinishAddBDItemTemplate(a_Bot, a_FSM, a_AddBDItemFunc, a_ParentTableName, a_ParentKeyFieldName, a_PhotoField, a_FinishMessageFunc, None, a_AccessFunc, a_ButtonFunc, access_mode, field_type = bd_item.FieldType.photo), content_types = ['photo', 'text'], state = a_FSMPhoto) def AddBDItem1RegisterHandlers(a_Bot, a_StartCheckFunc, a_FSM, a_AddBDItemFunc, a_AddMessageFunc, a_FinishMessageFunc, a_ParentPrefix, a_ParentTableName : str, a_ParentKeyFieldName, a_FieldName, a_GetButtonNameAndKeyValueAndAccessFunc, a_AccessFunc, a_ButtonFunc, a_FieldType, access_mode = user_access.AccessMode.ADD): keyboard_cancel = bd_item.GetCancelKeyboardButtonsTemplate(a_Bot, a_AccessFunc, access_mode) @@ -111,7 +117,7 @@ def AddBDItem1RegisterHandlers(a_Bot, a_StartCheckFunc, a_FSM, a_AddBDItemFunc, if a_ParentTableName: reg_func = a_Bot.RegisterCallbackHandler reg_func(StartAddBDItemTemplate(a_Bot, a_FSM, a_FSM.bd_item, a_AddMessageFunc, a_ParentTableName, a_ParentKeyFieldName, a_ParentPrefix, a_AccessFunc, keyboard_cancel, a_ButtonFunc, access_mode), a_StartCheckFunc) - finish_handler = FinishAddBDItemTemplate(a_Bot, a_FSM, a_AddBDItemFunc, a_ParentTableName, a_ParentKeyFieldName, a_FieldName, a_FinishMessageFunc, a_AccessFunc, a_ButtonFunc, access_mode, field_type = a_FieldType) + finish_handler = FinishAddBDItemTemplate(a_Bot, a_FSM, a_AddBDItemFunc, a_ParentTableName, a_ParentKeyFieldName, a_FieldName, a_FinishMessageFunc, None, a_AccessFunc, a_ButtonFunc, access_mode, field_type = a_FieldType) if a_FieldType == bd_item.FieldType.photo: a_Bot.RegisterMessageHandler(finish_handler, content_types = ['photo', 'text'], state = a_FSM.bd_item) else: diff --git a/template/bd_item_delete.py b/template/bd_item_delete.py index 7c7a355..51345ec 100644 --- a/template/bd_item_delete.py +++ b/template/bd_item_delete.py @@ -29,16 +29,6 @@ def DeleteBDItemTemplate(a_Bot, a_TableName, a_KeyName, a_PreDeleteWorkFunc, a_P return simple_message.SimpleMessageTemplate(a_Bot, DeleteBDItem, a_ButtonFunc, None, a_AccessFunc, access_mode) -def SelectAndDeleteBDItemRegisterHandlers(a_Bot, a_PrevPrefix, a_StartCheckFunc, a_TableName : str, a_KeyName, a_ParentIDFieldName,a_PreDeleteWorkFunc, a_PostDeleteWorkFunc, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, a_ButtonFunc, access_mode = user_access.AccessMode.DELETE): - reg_func = a_Bot.RegisterMessageHandler - if a_ParentIDFieldName: - reg_func = a_Bot.RegisterCallbackHandler - - a_Prefix = bd_item.HashPrefix(f'delete_{a_TableName}_{a_KeyName}:') - sel_handler = bd_item_select.SelectDBItemTemplate(a_Bot, a_TableName, a_ParentIDFieldName, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, a_PrevPrefix, a_Prefix, access_mode) - reg_func(sel_handler, a_StartCheckFunc) - a_Bot.RegisterCallbackHandler(DeleteBDItemTemplate(a_Bot, a_TableName, a_KeyName, a_PreDeleteWorkFunc, a_PostDeleteWorkFunc, a_Prefix, a_AccessFunc, a_ButtonFunc, access_mode), bd_item.GetCheckForPrefixFunc(a_Prefix)) - def DeleteBDItemRegisterHandlers(a_Bot, a_PrevPrefix, a_TableName : str, a_KeyName, a_PreDeleteWorkFunc, a_PostDeleteWorkFunc, a_AccessFunc, a_ButtonFunc, access_mode = user_access.AccessMode.DELETE): a_Bot.RegisterCallbackHandler(DeleteBDItemTemplate(a_Bot, a_TableName, a_KeyName, a_PreDeleteWorkFunc, a_PostDeleteWorkFunc, a_PrevPrefix, a_AccessFunc, a_ButtonFunc, access_mode), bd_item.GetCheckForPrefixFunc(a_PrevPrefix)) diff --git a/template/bd_item_edit.py b/template/bd_item_edit.py index a665349..9e877e7 100644 --- a/template/bd_item_edit.py +++ b/template/bd_item_edit.py @@ -18,8 +18,8 @@ error_photo_type_message = ''' def StartEditBDItemTemplate(a_Bot, a_FSM, a_MessageFunc, a_TableName, a_KeyName, a_Prefix, a_AccessFunc, a_ButtonFunc, a_FinishButtonFunc, access_mode = user_access.AccessMode.EDIT): return bd_item_add.StartAddBDItemTemplate(a_Bot, a_FSM, a_FSM.item_field, a_MessageFunc, a_TableName, a_KeyName, a_Prefix, a_AccessFunc, a_ButtonFunc, a_FinishButtonFunc, access_mode = access_mode) -def FinishEditBDItemTemplate(a_Bot, a_FSM, a_TableName, a_KeyName, a_FieldName, a_MessageFunc, a_AccessFunc, a_ButtonFunc, a_OnChangeFunc, access_mode = user_access.AccessMode.EDIT, field_type = bd_item.FieldType.text): - def EditBDItemFunc(a_ItemData, a_UserID): +def FinishEditBDItemTemplate(a_Bot, a_FSM, a_TableName, a_KeyName, a_FieldName, a_MessageFunc, a_PostProcessFunc, a_AccessFunc, a_ButtonFunc, a_OnChangeFunc, access_mode = user_access.AccessMode.EDIT, field_type = bd_item.FieldType.text): + async def EditBDItemFunc(a_ItemData, a_UserID): item_id = a_ItemData[a_KeyName] field_value = a_ItemData[a_FieldName] res, error = bd_item.EditBDItemInTableTemplate(a_Bot, a_TableName, a_KeyName, a_FieldName)(item_id, field_value) @@ -28,22 +28,18 @@ def FinishEditBDItemTemplate(a_Bot, a_FSM, a_TableName, a_KeyName, a_FieldName, else: a_Bot.GetLog().Success(f'Пользователь {a_UserID} изменил поле в таблице {a_TableName} ключу {a_KeyName}={item_id}. Новое значение поля {a_FieldName}={field_value}.') - a_OnChangeFunc() + await a_OnChangeFunc(item_id, a_ItemData, a_UserID) return res, error - return bd_item_add.FinishAddBDItemTemplate(a_Bot, a_FSM, EditBDItemFunc, a_TableName, a_KeyName, a_FieldName, a_MessageFunc, a_AccessFunc, a_ButtonFunc, access_mode = access_mode, field_type = field_type) - -def EditBDItemRegisterHandlers(a_Bot, a_PrevPrefix, a_FSM, a_StartCheckFunc, a_StartMessage, a_EditMessageFunc, a_FinishMessageFunc, a_TableName : str, a_KeyName, a_ParentIDFieldName, a_FieldName, a_GetButtonNameAndKeyValueAndAccessFunc, a_AccessFunc, a_ButtonFunc, a_OnChangeFunc, access_mode = user_access.AccessMode.EDIT, field_type = bd_item.FieldType.text): - reg_func = a_Bot.RegisterMessageHandler - if a_ParentIDFieldName: - reg_func = a_Bot.RegisterCallbackHandler - - keyboard_cancel = bd_item.GetCancelKeyboardButtonsTemplate(a_Bot, a_AccessFunc, access_mode) - a_Prefix = bd_item.HashPrefix(f'edit_{a_TableName}_{a_KeyName}_{a_FieldName}:') - sel_handler = bd_item_select.SelectDBItemTemplate(a_Bot, a_TableName, a_ParentIDFieldName, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, a_PrevPrefix, a_Prefix, access_mode) - reg_func(sel_handler, a_StartCheckFunc) - a_Bot.RegisterCallbackHandler(StartEditBDItemTemplate(a_Bot, a_FSM, a_EditMessageFunc, a_TableName, a_KeyName, a_Prefix, a_AccessFunc, keyboard_cancel, a_ButtonFunc, access_mode), bd_item.GetCheckForPrefixFunc(a_Prefix)) + return bd_item_add.FinishAddBDItemTemplate(a_Bot, a_FSM, EditBDItemFunc, a_TableName, a_KeyName, a_FieldName, a_MessageFunc, a_PostProcessFunc, a_AccessFunc, a_ButtonFunc, access_mode = access_mode, field_type = field_type) + +def EditBDItemRegisterHandlers(a_Bot, a_SelectSource, a_FSM, a_StartMessage, a_EditMessageFunc, a_FinishMessageFunc, a_TableName, a_KeyName, a_FieldName, a_PostProcessFunc, a_GetButtonNameAndKeyValueAndAccessFunc, a_AccessFunc, a_AdditionalButtonFunc, a_FinishButtonFunc, a_OnChangeFunc, access_mode = user_access.AccessMode.EDIT, field_type = bd_item.FieldType.text): + keyboard = bd_item.MixKeyboardFuncTemplate(a_AdditionalButtonFunc, bd_item.GetCancelKeyboardButtonsTemplate(a_Bot, a_AccessFunc, access_mode)) + + a_Prefix = bd_item_select.SelectRegisterHandlers(a_Bot, a_SelectSource, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, access_mode = access_mode) + + a_Bot.RegisterCallbackHandler(StartEditBDItemTemplate(a_Bot, a_FSM, a_EditMessageFunc, a_TableName, a_KeyName, a_Prefix, a_AccessFunc, keyboard, a_FinishButtonFunc, access_mode), bd_item.GetCheckForPrefixFunc(a_Prefix)) if field_type == bd_item.FieldType.photo: - a_Bot.RegisterMessageHandler(FinishEditBDItemTemplate(a_Bot, a_FSM, a_TableName, a_KeyName, a_FieldName, a_FinishMessageFunc, a_AccessFunc, a_ButtonFunc, a_OnChangeFunc, access_mode, field_type = field_type), content_types = ['photo', 'text'], state = a_FSM.item_field) + 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_AccessFunc, a_ButtonFunc, a_OnChangeFunc, access_mode, field_type = field_type), state = a_FSM.item_field) + 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) diff --git a/template/bd_item_select.py b/template/bd_item_select.py index 2e199bd..de6bea8 100644 --- a/template/bd_item_select.py +++ b/template/bd_item_select.py @@ -7,14 +7,12 @@ from bot_sys import user_access, bot_bd, keyboard from bot_modules import access_utils, groups_utils from template import simple_message, bd_item -def GetBDItemsListKeyboardButtonsTemplate(a_Bot, a_TableName : str, a_ParentIDFieldName, a_PrevPrefix, a_NextPrefix : str, a_GetButtonNameAndKeyValueAndAccessFunc, access_mode = user_access.AccessMode.VIEW): +from abc import ABC, abstractmethod + +def GetCustomListKeyboardButtonsTemplate(a_Bot, a_GetItemsFunc, a_PrevPrefix, a_NextPrefix : str, a_GetButtonNameAndKeyValueAndAccessFunc, access_mode = user_access.AccessMode.VIEW): def GetBDItemsListKeyboardButtons(a_Message, a_UserGroups): parent_id = bd_item.GetKeyDataFromCallbackMessage(a_Message, a_PrevPrefix) - items = [] - if a_ParentIDFieldName and parent_id and parent_id != '': - items = bd_item.GetBDItemsTemplate(a_Bot, a_TableName, a_ParentIDFieldName)(parent_id) - else: - items = bd_item.GetAllItemsTemplate(a_Bot, a_TableName)() + items = a_GetItemsFunc(a_Message, a_UserGroups, parent_id) items_button_list = [] for t in items: @@ -27,23 +25,78 @@ def GetBDItemsListKeyboardButtonsTemplate(a_Bot, a_TableName : str, a_ParentIDFi return keyboard.MakeInlineKeyboardButtons(a_Bot, items_button_list, a_UserGroups) return GetBDItemsListKeyboardButtons -def SelectDBItemTemplate(a_Bot, a_TableName : str, a_ParentIDFieldName, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, a_PrevPrefix, a_NextPrefix, access_mode = user_access.AccessMode.VIEW): - inline_keyboard_func = GetBDItemsListKeyboardButtonsTemplate(a_Bot, a_TableName, a_ParentIDFieldName, a_PrevPrefix, a_NextPrefix, a_GetButtonNameAndKeyValueAndAccessFunc) +def GetBDItemsTemplate(a_Bot, a_TableName : str, a_ParentIDFieldName): + def GetBDItems(a_Message, a_UserGroups, a_ParentID): + items = [] + if a_ParentIDFieldName and a_ParentID and a_ParentID != '': + items = bd_item.GetBDItemsTemplate(a_Bot, a_TableName, a_ParentIDFieldName)(a_ParentID) + else: + items = bd_item.GetAllItemsTemplate(a_Bot, a_TableName)() + + return items + return GetBDItems + +def SelectCustomTemplate(a_Bot, a_GetItemsFunc, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, a_PrevPrefix, a_NextPrefix, access_mode = user_access.AccessMode.VIEW): + inline_keyboard_func = GetCustomListKeyboardButtonsTemplate(a_Bot, a_GetItemsFunc, a_PrevPrefix, a_NextPrefix, a_GetButtonNameAndKeyValueAndAccessFunc) return simple_message.InfoMessageTemplate(a_Bot, a_StartMessage, None, inline_keyboard_func, a_AccessFunc, access_mode) -def FirstSelectBDItemRegisterHandlers(a_Bot, a_PrefixBase, a_ButtonName, a_TableName : str, a_KeyName, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, access_mode = user_access.AccessMode.VIEW): +class ISelectSource(ABC): + @abstractmethod + def IsFirst(self): + pass + + @abstractmethod + def GetItemsFunc(self): + pass + + @abstractmethod + def GetCheckFunc(self): + pass + + @abstractmethod + def GetPrevPrefix(self): + pass + + @abstractmethod + def GetPrefixBase(self): + pass + +class DBItemSelectSource(ISelectSource): + def __init__(self, a_Bot, a_TableName, a_ParentIDFieldName, a_PrevPrefix, a_ButtonName): + self.m_Bot = a_Bot + self.m_TableName = a_TableName + self.m_ParentIDFieldName = a_ParentIDFieldName + self.m_PrevPrefix = a_PrevPrefix + self.m_ButtonName = a_ButtonName + + def IsFirst(self): + return not self.m_ParentIDFieldName + + def GetItemsFunc(self): + return GetBDItemsTemplate(self.m_Bot, self.m_TableName, self.m_ParentIDFieldName) + + def GetCheckFunc(self): + if self.IsFirst(): + return bd_item.GetCheckForTextFunc(self.m_ButtonName) + return bd_item.GetCheckForPrefixFunc(self.m_PrevPrefix) + + def GetPrevPrefix(self): + return self.m_PrevPrefix - a_Prefix = bd_item.HashPrefix(f'first_select_{a_TableName}_{a_KeyName}_in_base_{a_PrefixBase}:') + def GetPrefixBase(self): + if self.m_PrevPrefix: + return self.m_PrevPrefix + return self.m_ButtonName - sel_handler = SelectDBItemTemplate(a_Bot, a_TableName, None, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, None, a_Prefix, access_mode = access_mode) - a_Bot.RegisterMessageHandler(sel_handler, bd_item.GetCheckForTextFunc(a_ButtonName)) +def SelectRegisterHandlers(a_Bot, a_SelectSource, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, access_mode = user_access.AccessMode.VIEW): + reg_func = a_Bot.RegisterMessageHandler + if not a_SelectSource.IsFirst(): + reg_func = a_Bot.RegisterCallbackHandler - return a_Prefix + a_NextPrefix = bd_item.HashPrefix(f'select_{a_SelectSource}_after_prefix_or_in_base_{a_SelectSource.GetPrefixBase()}:') -def NextSelectBDItemRegisterHandlers(a_Bot, a_PrevPrefix, a_ParentIDFieldName, a_TableName : str, a_KeyName, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, access_mode = user_access.AccessMode.VIEW): - a_Prefix = bd_item.HashPrefix(f'next_select_{a_TableName}_{a_KeyName}_{a_ParentIDFieldName}_after_prefix_{a_PrevPrefix}:') + sel_handler = SelectCustomTemplate(a_Bot, a_SelectSource.GetItemsFunc(), a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, a_SelectSource.GetPrevPrefix(), a_NextPrefix, access_mode = access_mode) + reg_func(sel_handler, a_SelectSource.GetCheckFunc()) - sel_handler = SelectDBItemTemplate(a_Bot, a_TableName, a_ParentIDFieldName, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, a_PrevPrefix, a_Prefix, access_mode = access_mode) - a_Bot.RegisterCallbackHandler(sel_handler, bd_item.GetCheckForPrefixFunc(a_PrevPrefix)) + return a_NextPrefix - return a_Prefix diff --git a/template/bd_item_view.py b/template/bd_item_view.py index e40b06f..6513d41 100644 --- a/template/bd_item_view.py +++ b/template/bd_item_view.py @@ -5,18 +5,10 @@ from bot_sys import user_access, bot_bd, keyboard from bot_modules import access_utils, groups_utils -from template import simple_message, bd_item_select, bd_item_delete, bd_item +from template import simple_message, bd_item_delete, bd_item def ShowBDItemTemplate(a_Bot, a_TableName, a_KeyName, a_WorkFunc, a_Prefix, a_AccessFunc, a_ButtonFunc, access_mode = user_access.AccessMode.VIEW): return bd_item_delete.DeleteBDItemTemplate(a_Bot, a_TableName, a_KeyName, a_WorkFunc, None, a_Prefix, a_AccessFunc, a_ButtonFunc, access_mode = access_mode, delete = False) def ShowBDItemRegisterHandlers(a_Bot, a_PrevPrefix, a_TableName : str, a_KeyName, a_ShowItemWorkFunc, a_AccessFunc, a_ButtonFunc, access_mode = user_access.AccessMode.VIEW): a_Bot.RegisterCallbackHandler(ShowBDItemTemplate(a_Bot, a_TableName, a_KeyName, a_ShowItemWorkFunc, a_PrevPrefix, a_AccessFunc, a_ButtonFunc, access_mode = access_mode), bd_item.GetCheckForPrefixFunc(a_PrevPrefix)) - -def FirstSelectAndShowBDItemRegisterHandlers(a_Bot, a_ButtonName, a_TableName : str, a_KeyName, a_ShowItemWorkFunc, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, a_ButtonFunc, access_mode = user_access.AccessMode.VIEW): - a_Prefix = bd_item_select.FirstSelectBDItemRegisterHandlers(a_Bot, '', a_ButtonName, a_TableName, a_KeyName, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, access_mode = access_mode) - ShowBDItemRegisterHandlers(a_Bot, a_Prefix, a_TableName, a_KeyName, a_ShowItemWorkFunc, a_AccessFunc, a_ButtonFunc, access_mode = access_mode) - -def LastSelectAndShowBDItemRegisterHandlers(a_Bot, a_PrevPrefix, a_ParentIDFieldName, a_TableName : str, a_KeyName, a_ShowItemWorkFunc, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, a_ButtonFunc, access_mode = user_access.AccessMode.VIEW): - a_Prefix = bd_item_select.NextSelectBDItemRegisterHandlers(a_Bot, a_PrevPrefix, a_ParentIDFieldName, a_TableName, a_KeyName, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, access_mode = access_mode) - ShowBDItemRegisterHandlers(a_Bot, a_Prefix, a_TableName, a_KeyName, a_ShowItemWorkFunc, a_AccessFunc, a_ButtonFunc, access_mode = access_mode)