From 0aa24beefc9b1fd2ba52e9875b64d6137ac37799 Mon Sep 17 00:00:00 2001 From: Alexei Date: Sat, 13 May 2023 09:26:55 +0300 Subject: [PATCH 01/25] =?UTF-8?q?=D0=98=D0=BD=D1=82=D0=B5=D1=80=D1=84?= =?UTF-8?q?=D0=B5=D0=B9=D1=81=D1=8B=20=D1=81=D0=B0=D0=BC=D0=BE=D0=B3=D0=BE?= =?UTF-8?q?=20=D0=B1=D0=BE=D1=82=D0=B0=20=D0=B8=20=D0=BD=D0=B0=D1=87=D0=B0?= =?UTF-8?q?=D0=BB=D0=BE=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D0=B4=D0=B5=D0=BB=D0=BA=D0=B8=20=D1=81=D0=B8=D0=BC=D0=BF=D0=BB?= =?UTF-8?q?=20=D0=BC=D0=B5=D1=81=D1=81=D0=B0=D0=B4=D0=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot_modules/access.py | 6 +++--- bot_modules/backup.py | 2 +- bot_modules/comments.py | 10 +++++----- bot_modules/groups.py | 4 ++-- bot_modules/languages.py | 16 ++++++++-------- bot_modules/messages.py | 16 ++++++++-------- bot_modules/needs.py | 16 ++++++++-------- bot_modules/profile.py | 2 +- bot_modules/projects.py | 16 ++++++++-------- bot_modules/start.py | 4 ++-- bot_modules/tasks.py | 14 +++++++------- bot_sys/aiogram_bot.py | 46 ++++++++++++++++++++++++++++++++++++++++++++++ bot_sys/bot_bd.py | 5 ++++- bot_sys/interfaces.py | 21 +++++++++++++++++++++ bot_sys/keyboard.py | 35 ++++++++++++++++++++++++++++------- template/bd_item_add.py | 4 ++-- template/bd_item_delete.py | 2 +- template/bd_item_select.py | 4 ++-- template/simple_message.py | 6 +++--- 19 files changed, 160 insertions(+), 69 deletions(-) create mode 100644 bot_sys/aiogram_bot.py create mode 100644 bot_sys/interfaces.py diff --git a/bot_modules/access.py b/bot_modules/access.py index a03c512..51fd0e6 100644 --- a/bot_modules/access.py +++ b/bot_modules/access.py @@ -136,7 +136,7 @@ def ShowMessageTemplate(a_StringMessage): return simple_message.WorkFuncResult(msg, item_access = a_Item[1]) return ShowMessage -def SimpleMessageTemplate(a_StringMessage): +def SimpleMessageTemplateLegacy(a_StringMessage): async def ShowMessage(a_CallbackQuery : types.CallbackQuery): return simple_message.WorkFuncResult(a_StringMessage) return ShowMessage @@ -178,8 +178,8 @@ def GetModuleButtons(): # Обработка кнопок def RegisterHandlers(dp : Dispatcher): defaul_keyboard_func = GetEditAccessKeyboardButtons - dp.register_message_handler(simple_message.InfoMessageTemplate(access_start_message, defaul_keyboard_func, GetAccess), text = access_button_name) - dp.register_message_handler(simple_message.InfoMessageTemplate(help_message, defaul_keyboard_func, GetAccess), text = help_button_name) + dp.register_message_handler(simple_message.InfoMessageTemplateLegacy(access_start_message, defaul_keyboard_func, GetAccess), text = access_button_name) + dp.register_message_handler(simple_message.InfoMessageTemplateLegacy(help_message, defaul_keyboard_func, GetAccess), text = help_button_name) sql_request.RequestToBDRegisterHandlers(dp, sql_request_button_name, request_start_message, FSMRequestToBDAccess, defaul_keyboard_func, user_access.AccessMode.ACCEES_EDIT, GetAccess) diff --git a/bot_modules/backup.py b/bot_modules/backup.py index 0fe5e61..800025d 100644 --- a/bot_modules/backup.py +++ b/bot_modules/backup.py @@ -81,7 +81,7 @@ def GetModuleButtons(): # Обработка кнопок def RegisterHandlers(dp : Dispatcher): - dp.register_message_handler(simple_message.InfoMessageTemplate(backup_message, GetBackupKeyboardButtons, GetAccess), text = backup_button_name) + dp.register_message_handler(simple_message.InfoMessageTemplateLegacy(backup_message, GetBackupKeyboardButtons, GetAccess), text = backup_button_name) dp.register_message_handler(file_message.BackupFileTemplate(bot_bd.GetBDFileName(), backup_bd_message, GetAccess, GetBackupKeyboardButtons, error_backup_message), text = backup_bd_button_name) dp.register_message_handler(file_message.BackupFileTemplate(log.g_log_file_name, backup_log_message, GetAccess, GetBackupKeyboardButtons, error_backup_message), text = backup_log_button_name) diff --git a/bot_modules/comments.py b/bot_modules/comments.py index 14c14cc..8b884cf 100644 --- a/bot_modules/comments.py +++ b/bot_modules/comments.py @@ -166,7 +166,7 @@ def ShowMessageTemplate(a_StringMessage): return simple_message.WorkFuncResult(msg, item_access = a_Item[2]) return ShowMessage -def SimpleMessageTemplate(a_StringMessage): +def SimpleMessageTemplateLegacy(a_StringMessage): async def ShowMessage(a_CallbackQuery : types.CallbackQuery, a_Item): return simple_message.WorkFuncResult(a_StringMessage) return ShowMessage @@ -252,7 +252,7 @@ def RegisterHandlers(dp : Dispatcher): # Стартовое сообщение - dp.register_message_handler(simple_message.SimpleMessageTemplate(CommentsOpen, defaul_keyboard_func, GetAccess), text = comments_button_name) + dp.register_message_handler(simple_message.SimpleMessageTemplateLegacy(CommentsOpen, defaul_keyboard_func, GetAccess), text = comments_button_name) # Список комментариев a_Prefix = RegisterSelectParent(list_comment_button_name, user_access.AccessMode.VIEW) @@ -291,8 +291,8 @@ def RegisterHandlers(dp : Dispatcher): bd_item.GetCheckForPrefixFunc(a_Prefix), \ FSMCreateComment, \ AddBDItemFunc, \ - SimpleMessageTemplate(comment_create_desc_message), \ - SimpleMessageTemplate(comment_success_create_message), \ + SimpleMessageTemplateLegacy(comment_create_desc_message), \ + SimpleMessageTemplateLegacy(comment_success_create_message), \ a_Prefix,\ needs.table_name, \ needs.key_name, \ @@ -325,7 +325,7 @@ def RegisterHandlers(dp : Dispatcher): # Редактирование комментариев edit_keyboard_func = GetEditCommentKeyboardButtons - dp.register_message_handler(simple_message.InfoMessageTemplate(comment_start_edit_message, edit_keyboard_func, GetAccess, access_mode = user_access.AccessMode.EDIT), text = edit_comment_button_name) + dp.register_message_handler(simple_message.InfoMessageTemplateLegacy(comment_start_edit_message, edit_keyboard_func, GetAccess, access_mode = user_access.AccessMode.EDIT), text = edit_comment_button_name) RegisterEdit(edit_comment_desc_button_name, FSMEditCommentDescItem, comment_edit_desc_message, desc_field, bd_item.FieldType.text) RegisterEdit(edit_comment_access_button_name, FSMEditCommentAccessItem, comment_edit_access_message, access_field, bd_item.FieldType.text) diff --git a/bot_modules/groups.py b/bot_modules/groups.py index 68e386e..d010d02 100644 --- a/bot_modules/groups.py +++ b/bot_modules/groups.py @@ -124,7 +124,7 @@ def GetModuleButtons(): # Обработка кнопок def RegisterHandlers(dp : Dispatcher): - dp.register_message_handler(simple_message.InfoMessageTemplate(group_start_message, GetEditGroupKeyboardButtons, GetAccess), text = user_group_button_name) - dp.register_message_handler(simple_message.InfoMessageTemplate(help_message, GetEditGroupKeyboardButtons, GetAccess), text = help_button_name) + dp.register_message_handler(simple_message.InfoMessageTemplateLegacy(group_start_message, GetEditGroupKeyboardButtons, GetAccess), text = user_group_button_name) + dp.register_message_handler(simple_message.InfoMessageTemplateLegacy(help_message, GetEditGroupKeyboardButtons, GetAccess), text = help_button_name) sql_request.RequestToBDRegisterHandlers(dp, sql_request_button_name, request_start_message, FSMRequestToBD, GetEditGroupKeyboardButtons, user_access.AccessMode.EDIT, GetAccess) diff --git a/bot_modules/languages.py b/bot_modules/languages.py index 250111f..a7062a3 100644 --- a/bot_modules/languages.py +++ b/bot_modules/languages.py @@ -185,7 +185,7 @@ def GetStartLanguageKeyboardButtons(a_Language, a_UserGroups): def GetViewItemInlineKeyboardTemplate(a_ItemID): def GetViewItemInlineKeyboard(a_Message, a_UserGroups): cur_buttons = [ - keyboard.InlineButton(messages.list_message_button_name, messages.select_messages_prefix, a_ItemID, GetAccess(), user_access.AccessMode.VIEW), + keyboard.InlineButtonWithAccess(messages.list_message_button_name, messages.select_messages_prefix, a_ItemID, GetAccess(), user_access.AccessMode.VIEW), ] return keyboard.MakeInlineKeyboard(cur_buttons, a_UserGroups) return GetViewItemInlineKeyboard @@ -216,7 +216,7 @@ def ShowMessageTemplate(a_StringLanguage, keyboard_template_func = None): return simple_message.WorkFuncResult(msg, photo_id = a_Item[3], item_access = a_Item[4], keyboard_func = keyboard_func) return ShowLanguage -def SimpleMessageTemplate(a_StringLanguage): +def SimpleMessageTemplateLegacy(a_StringLanguage): async def ShowLanguage(a_CallbackQuery : types.CallbackQuery, a_Item): return simple_message.WorkFuncResult(a_StringLanguage) return ShowLanguage @@ -298,7 +298,7 @@ def RegisterHandlers(dp : Dispatcher): defaul_keyboard_func = GetStartLanguageKeyboardButtons # Список языков - dp.register_message_handler(simple_message.SimpleMessageTemplate(LanguagesOpen, defaul_keyboard_func, GetAccess), text = languages_button_name) + dp.register_message_handler(simple_message.SimpleMessageTemplateLegacy(LanguagesOpen, defaul_keyboard_func, GetAccess), text = languages_button_name) bd_item_view.FirstSelectAndShowBDItemRegisterHandlers(dp, \ list_language_button_name, \ table_name, \ @@ -333,10 +333,10 @@ def RegisterHandlers(dp : Dispatcher): FSMCreateLanguage.desc, \ FSMCreateLanguage.photo,\ AddBDItemFunc, \ - SimpleMessageTemplate(language_create_name_message), \ - SimpleMessageTemplate(language_create_desc_message), \ - SimpleMessageTemplate(language_create_photo_message), \ - SimpleMessageTemplate(language_success_create_message), \ + SimpleMessageTemplateLegacy(language_create_name_message), \ + SimpleMessageTemplateLegacy(language_create_desc_message), \ + SimpleMessageTemplateLegacy(language_create_photo_message), \ + SimpleMessageTemplateLegacy(language_success_create_message), \ None,\ None, \ None, \ @@ -370,7 +370,7 @@ def RegisterHandlers(dp : Dispatcher): field_type = a_FieldType\ ) - dp.register_message_handler(simple_message.InfoMessageTemplate(language_start_edit_message, edit_keyboard_func, GetAccess, access_mode = user_access.AccessMode.EDIT), text = edit_language_button_name) + dp.register_message_handler(simple_message.InfoMessageTemplateLegacy(language_start_edit_message, edit_keyboard_func, GetAccess, access_mode = user_access.AccessMode.EDIT), text = edit_language_button_name) RegisterEdit(edit_language_photo_button_name, FSMEditLanguagePhotoItem, language_edit_photo_message, photo_field, bd_item.FieldType.photo) RegisterEdit(edit_language_name_button_name, FSMEditLanguageNameItem, language_edit_name_message, name_field, bd_item.FieldType.text) RegisterEdit(edit_language_desc_button_name, FSMEditLanguageDeskItem, language_edit_desc_message, desc_field, bd_item.FieldType.text) diff --git a/bot_modules/messages.py b/bot_modules/messages.py index ccf9fad..715f94d 100644 --- a/bot_modules/messages.py +++ b/bot_modules/messages.py @@ -193,7 +193,7 @@ def GetStartMessageKeyboardButtons(a_Message, a_UserGroups): def GetViewItemInlineKeyboardTemplate(a_ItemID): def GetViewItemInlineKeyboard(a_Message, a_UserGroups): cur_buttons = [ - #keyboard.InlineButton(needs.list_need_button_name, needs.select_needs_prefix, a_ItemID, GetAccess(), user_access.AccessMode.VIEW), + #keyboard.InlineButtonWithAccess(needs.list_need_button_name, needs.select_needs_prefix, a_ItemID, GetAccess(), user_access.AccessMode.VIEW), ] return keyboard.MakeInlineKeyboard(cur_buttons, a_UserGroups) return GetViewItemInlineKeyboard @@ -228,7 +228,7 @@ def ShowMessageTemplate(a_StringMessage, keyboard_template_func = None): return simple_message.WorkFuncResult(msg, photo_id = a_Item[3], item_access = a_Item[4], keyboard_func = keyboard_func) return ShowMessage -def SimpleMessageTemplate(a_StringMessage): +def SimpleMessageTemplateLegacy(a_StringMessage): async def ShowMessage(a_CallbackQuery : types.CallbackQuery, a_Item): return simple_message.WorkFuncResult(a_StringMessage) return ShowMessage @@ -314,7 +314,7 @@ def RegisterHandlers(dp : Dispatcher): ) # Стартовое сообщение - dp.register_message_handler(simple_message.SimpleMessageTemplate(MessagesOpen, defaul_keyboard_func, GetAccess), text = messages_button_name) + dp.register_message_handler(simple_message.SimpleMessageTemplateLegacy(MessagesOpen, defaul_keyboard_func, GetAccess), text = messages_button_name) # Список сообщений a_Prefix = RegisterSelectParent(list_message_button_name, user_access.AccessMode.VIEW) @@ -356,10 +356,10 @@ def RegisterHandlers(dp : Dispatcher): FSMCreateMessage.desc, \ FSMCreateMessage.photo,\ AddBDItemFunc, \ - SimpleMessageTemplate(message_create_name_message), \ - SimpleMessageTemplate(message_create_desc_message), \ - SimpleMessageTemplate(message_create_photo_message), \ - SimpleMessageTemplate(message_success_create_message), \ + SimpleMessageTemplateLegacy(message_create_name_message), \ + SimpleMessageTemplateLegacy(message_create_desc_message), \ + SimpleMessageTemplateLegacy(message_create_photo_message), \ + SimpleMessageTemplateLegacy(message_success_create_message), \ a_Prefix,\ languages.table_name, \ languages.key_name, \ @@ -393,7 +393,7 @@ def RegisterHandlers(dp : Dispatcher): # Редактирование сообщения edit_keyboard_func = GetEditMessageKeyboardButtons - dp.register_message_handler(simple_message.InfoMessageTemplate(message_start_edit_message, edit_keyboard_func, GetAccess, access_mode = user_access.AccessMode.EDIT), text = edit_message_button_name) + dp.register_message_handler(simple_message.InfoMessageTemplateLegacy(message_start_edit_message, edit_keyboard_func, GetAccess, access_mode = user_access.AccessMode.EDIT), text = edit_message_button_name) RegisterEdit(edit_message_photo_button_name, FSMEditMessagePhotoItem, message_edit_photo_message, photo_field, bd_item.FieldType.photo) RegisterEdit(edit_message_name_button_name, FSMEditMessageNameItem, message_edit_name_message, name_field, bd_item.FieldType.text) diff --git a/bot_modules/needs.py b/bot_modules/needs.py index e1245e9..b69ad28 100644 --- a/bot_modules/needs.py +++ b/bot_modules/needs.py @@ -192,7 +192,7 @@ def GetStartNeedKeyboardButtons(a_Message, a_UserGroups): def GetViewItemInlineKeyboardTemplate(a_ItemID): def GetViewItemInlineKeyboard(a_Message, a_UserGroups): cur_buttons = [ - keyboard.InlineButton(comments.list_comment_button_name, comments.select_comments_prefix, a_ItemID, GetAccess(), user_access.AccessMode.VIEW), + keyboard.InlineButtonWithAccess(comments.list_comment_button_name, comments.select_comments_prefix, a_ItemID, GetAccess(), user_access.AccessMode.VIEW), ] return keyboard.MakeInlineKeyboard(cur_buttons, a_UserGroups) return GetViewItemInlineKeyboard @@ -223,7 +223,7 @@ def ShowMessageTemplate(a_StringMessage, keyboard_template_func = None): return simple_message.WorkFuncResult(msg, photo_id = a_Item[3], item_access = a_Item[4], keyboard_func = keyboard_func) return ShowMessage -def SimpleMessageTemplate(a_StringMessage): +def SimpleMessageTemplateLegacy(a_StringMessage): async def ShowMessage(a_CallbackQuery : types.CallbackQuery, a_Item): return simple_message.WorkFuncResult(a_StringMessage) return ShowMessage @@ -299,7 +299,7 @@ def RegisterHandlers(dp : Dispatcher): # Стартовое сообщение - dp.register_message_handler(simple_message.SimpleMessageTemplate(NeedsOpen, defaul_keyboard_func, GetAccess), text = needs_button_name) + dp.register_message_handler(simple_message.SimpleMessageTemplateLegacy(NeedsOpen, defaul_keyboard_func, GetAccess), text = needs_button_name) # Список потребностей a_Prefix = RegisterSelectParent(list_need_button_name, user_access.AccessMode.VIEW) @@ -341,10 +341,10 @@ def RegisterHandlers(dp : Dispatcher): FSMCreateNeed.desc, \ FSMCreateNeed.photo,\ AddBDItemFunc, \ - SimpleMessageTemplate(need_create_name_message), \ - SimpleMessageTemplate(need_create_desc_message), \ - SimpleMessageTemplate(need_create_photo_message), \ - SimpleMessageTemplate(need_success_create_message), \ + SimpleMessageTemplateLegacy(need_create_name_message), \ + SimpleMessageTemplateLegacy(need_create_desc_message), \ + SimpleMessageTemplateLegacy(need_create_photo_message), \ + SimpleMessageTemplateLegacy(need_success_create_message), \ a_Prefix,\ tasks.table_name, \ tasks.key_name, \ @@ -378,7 +378,7 @@ def RegisterHandlers(dp : Dispatcher): # Редактирование потребностей edit_keyboard_func = GetEditNeedKeyboardButtons - dp.register_message_handler(simple_message.InfoMessageTemplate(need_start_edit_message, edit_keyboard_func, GetAccess, access_mode = user_access.AccessMode.EDIT), text = edit_need_button_name) + dp.register_message_handler(simple_message.InfoMessageTemplateLegacy(need_start_edit_message, edit_keyboard_func, GetAccess, access_mode = user_access.AccessMode.EDIT), text = edit_need_button_name) RegisterEdit(edit_need_photo_button_name, FSMEditNeedPhotoItem, need_edit_photo_message, photo_field, bd_item.FieldType.photo) RegisterEdit(edit_need_name_button_name, FSMEditNeedNameItem, need_edit_name_message, name_field, bd_item.FieldType.text) diff --git a/bot_modules/profile.py b/bot_modules/profile.py index 0b027f2..b910900 100644 --- a/bot_modules/profile.py +++ b/bot_modules/profile.py @@ -125,4 +125,4 @@ def GetModuleButtons(): # Обработка кнопок def RegisterHandlers(dp : Dispatcher): - dp.register_message_handler(simple_message.SimpleMessageTemplate(ProfileOpen, GetStartKeyboardButtons, GetAccess), text = user_profile_button_name) + dp.register_message_handler(simple_message.SimpleMessageTemplateLegacy(ProfileOpen, GetStartKeyboardButtons, GetAccess), text = user_profile_button_name) diff --git a/bot_modules/projects.py b/bot_modules/projects.py index 74c5135..799311f 100644 --- a/bot_modules/projects.py +++ b/bot_modules/projects.py @@ -190,7 +190,7 @@ def GetStartProjectKeyboardButtons(a_Message, a_UserGroups): def GetViewItemInlineKeyboardTemplate(a_ItemID): def GetViewItemInlineKeyboard(a_Message, a_UserGroups): cur_buttons = [ - keyboard.InlineButton(tasks.list_task_button_name, tasks.select_tasks_prefix, a_ItemID, GetAccess(), user_access.AccessMode.VIEW), + keyboard.InlineButtonWithAccess(tasks.list_task_button_name, tasks.select_tasks_prefix, a_ItemID, GetAccess(), user_access.AccessMode.VIEW), ] return keyboard.MakeInlineKeyboard(cur_buttons, a_UserGroups) return GetViewItemInlineKeyboard @@ -222,7 +222,7 @@ def ShowMessageTemplate(a_StringMessage, keyboard_template_func = None): return simple_message.WorkFuncResult(msg, photo_id = a_Item[3], item_access = a_Item[4], keyboard_func = keyboard_func) return ShowMessage -def SimpleMessageTemplate(a_StringMessage): +def SimpleMessageTemplateLegacy(a_StringMessage): async def ShowMessage(a_CallbackQuery : types.CallbackQuery, a_Item): return simple_message.WorkFuncResult(a_StringMessage) return ShowMessage @@ -276,7 +276,7 @@ def RegisterHandlers(dp : Dispatcher): defaul_keyboard_func = GetStartProjectKeyboardButtons # Список проектов - dp.register_message_handler(simple_message.SimpleMessageTemplate(ProjectsOpen, defaul_keyboard_func, GetAccess), text = projects_button_name) + dp.register_message_handler(simple_message.SimpleMessageTemplateLegacy(ProjectsOpen, defaul_keyboard_func, GetAccess), text = projects_button_name) bd_item_view.FirstSelectAndShowBDItemRegisterHandlers(dp, \ list_project_button_name, \ table_name, \ @@ -311,10 +311,10 @@ def RegisterHandlers(dp : Dispatcher): FSMCreateProject.desc, \ FSMCreateProject.photo,\ AddBDItemFunc, \ - SimpleMessageTemplate(project_create_name_message), \ - SimpleMessageTemplate(project_create_desc_message), \ - SimpleMessageTemplate(project_create_photo_message), \ - SimpleMessageTemplate(project_success_create_message), \ + SimpleMessageTemplateLegacy(project_create_name_message), \ + SimpleMessageTemplateLegacy(project_create_desc_message), \ + SimpleMessageTemplateLegacy(project_create_photo_message), \ + SimpleMessageTemplateLegacy(project_success_create_message), \ None,\ None, \ None, \ @@ -348,7 +348,7 @@ def RegisterHandlers(dp : Dispatcher): field_type = a_FieldType\ ) - dp.register_message_handler(simple_message.InfoMessageTemplate(project_start_edit_message, edit_keyboard_func, GetAccess, access_mode = user_access.AccessMode.EDIT), text = edit_project_button_name) + dp.register_message_handler(simple_message.InfoMessageTemplateLegacy(project_start_edit_message, edit_keyboard_func, GetAccess, access_mode = user_access.AccessMode.EDIT), text = edit_project_button_name) RegisterEdit(edit_project_photo_button_name, FSMEditProjectPhotoItem, project_edit_photo_message, photo_field, bd_item.FieldType.photo) RegisterEdit(edit_project_name_button_name, FSMEditProjectNameItem, project_edit_name_message, name_field, bd_item.FieldType.text) RegisterEdit(edit_project_desc_button_name, FSMEditProjectDeskItem, project_edit_desc_message, desc_field, bd_item.FieldType.text) diff --git a/bot_modules/start.py b/bot_modules/start.py index 52e77fe..5760b43 100644 --- a/bot_modules/start.py +++ b/bot_modules/start.py @@ -72,7 +72,7 @@ def GetModuleButtons(): # Обработка кнопок def RegisterHandlers(dp : Dispatcher): - dp.register_message_handler(simple_message.SimpleMessageTemplate(StartMenu, GetStartKeyboardButtons, GetAccess), commands = ['start']) - dp.register_message_handler(simple_message.SimpleMessageTemplate(StartMenu, GetStartKeyboardButtons, GetAccess), text = start_menu_button_name) + dp.register_message_handler(simple_message.SimpleMessageTemplateLegacy(StartMenu, GetStartKeyboardButtons, GetAccess), commands = ['start']) + dp.register_message_handler(simple_message.SimpleMessageTemplateLegacy(StartMenu, GetStartKeyboardButtons, GetAccess), text = start_menu_button_name) diff --git a/bot_modules/tasks.py b/bot_modules/tasks.py index 505aca4..386f472 100644 --- a/bot_modules/tasks.py +++ b/bot_modules/tasks.py @@ -224,7 +224,7 @@ def ShowMessageTemplate(a_StringMessage, keyboard_template_func = None): return simple_message.WorkFuncResult(msg, photo_id = a_Item[3], item_access = a_Item[4], keyboard_func = keyboard_func) return ShowMessage -def SimpleMessageTemplate(a_StringMessage): +def SimpleMessageTemplateLegacy(a_StringMessage): async def ShowMessage(a_CallbackQuery : types.CallbackQuery, a_Item): return simple_message.WorkFuncResult(a_StringMessage) return ShowMessage @@ -286,7 +286,7 @@ def RegisterHandlers(dp : Dispatcher): ) # Стартовое сообщение - dp.register_message_handler(simple_message.SimpleMessageTemplate(TasksOpen, defaul_keyboard_func, GetAccess), text = tasks_button_name) + dp.register_message_handler(simple_message.SimpleMessageTemplateLegacy(TasksOpen, defaul_keyboard_func, GetAccess), text = tasks_button_name) # Список задач a_Prefix = RegisterSelectParent(list_task_button_name, user_access.AccessMode.VIEW) @@ -328,10 +328,10 @@ def RegisterHandlers(dp : Dispatcher): FSMCreateTask.desc, \ FSMCreateTask.photo,\ AddBDItemFunc, \ - SimpleMessageTemplate(task_create_name_message), \ - SimpleMessageTemplate(task_create_desc_message), \ - SimpleMessageTemplate(task_create_photo_message), \ - SimpleMessageTemplate(task_success_create_message), \ + SimpleMessageTemplateLegacy(task_create_name_message), \ + SimpleMessageTemplateLegacy(task_create_desc_message), \ + SimpleMessageTemplateLegacy(task_create_photo_message), \ + SimpleMessageTemplateLegacy(task_success_create_message), \ a_Prefix,\ projects.table_name, \ projects.key_name, \ @@ -365,7 +365,7 @@ def RegisterHandlers(dp : Dispatcher): # Редактирование задачи edit_keyboard_func = GetEditTaskKeyboardButtons - dp.register_message_handler(simple_message.InfoMessageTemplate(task_start_edit_message, edit_keyboard_func, GetAccess, access_mode = user_access.AccessMode.EDIT), text = edit_task_button_name) + dp.register_message_handler(simple_message.InfoMessageTemplateLegacy(task_start_edit_message, edit_keyboard_func, GetAccess, access_mode = user_access.AccessMode.EDIT), text = edit_task_button_name) RegisterEdit(edit_task_photo_button_name, FSMEditTaskPhotoItem, task_edit_photo_message, photo_field, bd_item.FieldType.photo) RegisterEdit(edit_task_name_button_name, FSMEditTaskNameItem, task_edit_name_message, name_field, bd_item.FieldType.text) diff --git a/bot_sys/aiogram_bot.py b/bot_sys/aiogram_bot.py new file mode 100644 index 0000000..e134868 --- /dev/null +++ b/bot_sys/aiogram_bot.py @@ -0,0 +1,46 @@ +#-*-coding utf-8-*- +# Общественное достояние, 2023, Алексей Безбородов (Alexei Bezborodov) + +from bot_sys import interfaces, bot_bd, keyboard + +from aiogram import types +from aiogram import Bot +from aiogram.dispatcher import Dispatcher +from aiogram.contrib.fsm_storage.memory import MemoryStorage + +class AiogramBot(IBot): + def __init__(self, a_TelegramBotApiToken, a_BDFileName): + self.m_TelegramBotApiToken = a_TelegramBotApiToken + self.m_BDFileName = a_BDFileName + self.m_TBot = Bot(token=self.m_TelegramBotApiToken, parse_mode = types.ParseMode.HTML) + self.m_Storage = MemoryStorage() + self.m_Dispatcher = Dispatcher(self.m_TBot, storage = storage) + + def SQLRequest(self, a_Request : str, commit = False, return_error = False, param = None): + return bot_bd.SQLRequest(self.m_BDFileName, a_Request, commit = commit, return_error = return_error, param = param) + + async def SendMessage(self, a_UserID, a_Message, a_PhotoIDs, a_InlineKeyboardButtons, a_KeyboardButtons): + inline_keyboard = keyboard.MakeAiogramInlineKeyboard(a_InlineKeyboardButtons) + keyboard = keyboard.MakeAiogramKeyboard(a_KeyboardButtons) + if not keyboard: + keyboard = inline_keyboard + if a_PhotoIDs: + self.m_TBot.send_photo( + a_UserID, + a_PhotoIDs, + a_Message, + reply_markup = keyboard + ) + else: + self.m_TBot.send_message( + a_UserID, + a_Message, + reply_markup = keyboard + ) + + def RegisterMessageHandler(self, a_MessageHandler, a_CheckFunc): + self.m_Dispatcher.register_message_handler(a_MessageHandler, a_CheckFunc) + + def RegisterCallbackHandler(self, a_CallbackHandler, a_CheckFunc): + self.m_Dispatcher.register_callback_query_handler(a_CallbackHandler, a_CheckFunc) + diff --git a/bot_sys/bot_bd.py b/bot_sys/bot_bd.py index 1b59a51..368ed57 100644 --- a/bot_sys/bot_bd.py +++ b/bot_sys/bot_bd.py @@ -29,7 +29,10 @@ def SelectBDTemplate(a_TableName): return SelectBD def SQLRequestToBD(a_Request : str, commit = False, return_error = False, param = None): - db = sqlite3.connect(GetBDFileName()) + return SQLRequest(GetBDFileName(), a_Request, commit = commit, return_error = return_error, param = param) + +def SQLRequest(a_BDFileName, a_Request : str, commit = False, return_error = False, param = None): + db = sqlite3.connect(a_BDFileName) cursor = db.cursor() result = [] error = None diff --git a/bot_sys/interfaces.py b/bot_sys/interfaces.py new file mode 100644 index 0000000..e3012f7 --- /dev/null +++ b/bot_sys/interfaces.py @@ -0,0 +1,21 @@ +#-*-coding utf-8-*- +# Общественное достояние, 2023, Алексей Безбородов (Alexei Bezborodov) + +from abc import ABC, abstractmethod + +class IBot(ABC): + @abstractmethod + def SQLRequest(self, a_Request : str, commit = False, return_error = False, param = None): + pass + + @abstractmethod + async def SendMessage(self, a_UserID, a_Message, a_PhotoIDs, a_InlineKeyboardButtons, a_KeyboardButtons): + pass + + @abstractmethod + def RegisterMessageHandler(self, a_MessageHandler, a_CheckFunc): + pass + + @abstractmethod + def RegisterCallbackHandler(self, a_CallbackHandler, a_CheckFunc): + pass diff --git a/bot_sys/keyboard.py b/bot_sys/keyboard.py index 62e98df..c114e27 100644 --- a/bot_sys/keyboard.py +++ b/bot_sys/keyboard.py @@ -30,14 +30,19 @@ def Chunks(a_List, a_ChunkSize): def GetButtonInRowCount(a_AllKeyCount): return min(max(int(math.sqrt(a_AllKeyCount) // 1), 1), 4) -def MakeKeyboard(a_ButtonList : [ButtonWithAccess], a_UserGroups): +def MakeAiogramKeyboard(a_ButtonList : [[str]]): + return types.ReplyKeyboardMarkup(keyboard=a_ButtonList, resize_keyboard = True) + +def MakeButtons(a_ButtonList : [ButtonWithAccess], a_UserGroups): buttons = [] for b in a_ButtonList: if user_access.CheckAccessString(b.access_string, a_UserGroups, b.access_mode): buttons += [types.KeyboardButton(b.label)] step = GetButtonInRowCount(len(buttons)) - key = types.ReplyKeyboardMarkup(keyboard=Chunks(buttons, step), resize_keyboard = True) - return key + return Chunks(buttons, step) + +def MakeKeyboard(a_ButtonList : [ButtonWithAccess], a_UserGroups): + return MakeAiogramKeyboard(MakeButtons(a_ButtonList, a_UserGroups)) def MakeKeyboardRemove(): return types.ReplyKeyboardRemove() @@ -47,6 +52,11 @@ def MakeKeyboardForMods(a_ModList, a_UserGroups): return MakeKeyboard(buttons, a_UserGroups) class InlineButton: + def __init__(self, a_Label, a_CallBackData): + self.label = a_Label + self.callback_data = str(a_CallBackData) + +class InlineButtonWithAccess: def __init__(self, a_Label, a_CallBackPrefix, a_CallBackData, a_AccessString, a_AccessMode): self.label = a_Label self.callback_prefix = a_CallBackPrefix @@ -54,12 +64,23 @@ class InlineButton: self.access_string = a_AccessString self.access_mode = a_AccessMode -def MakeInlineKeyboard(a_ButtonList : [InlineButton], a_UserGroups): +def MakeAiogramInlineKeyboard(a_ButtonList : [InlineButton]): + buttons = [] + for row in a_ButtonList: + r = [] + for b in row: + r += [types.InlineKeyboardButton(text = b.label, callback_data = b.callback_data)] + buttons += r + inline_keyboard = InlineKeyboardMarkup(inline_keyboard=buttons) + return inline_keyboard + +def MakeInlineKeyboardButtons(a_ButtonList : [InlineButtonWithAccess], a_UserGroups): buttons = [] for b in a_ButtonList: if user_access.CheckAccessString(b.access_string, a_UserGroups, b.access_mode): - buttons += [types.InlineKeyboardButton(text = b.label, callback_data = f'{b.callback_prefix}{b.callback_data}')] + buttons += [InlineButton(b.label, f'{b.callback_prefix}{b.callback_data}')] step = GetButtonInRowCount(len(buttons)) - inline_keyboard = InlineKeyboardMarkup(inline_keyboard=Chunks(buttons, step)) - return inline_keyboard + return Chunks(buttons, step) +def MakeInlineKeyboard(a_ButtonList : [InlineButtonWithAccess], a_UserGroups): + return MakeAiogramInlineKeyboard(MakeInlineKeyboardButtons(a_ButtonList, a_UserGroups)) diff --git a/template/bd_item_add.py b/template/bd_item_add.py index 2ea4aa5..84fe313 100644 --- a/template/bd_item_add.py +++ b/template/bd_item_add.py @@ -39,7 +39,7 @@ def StartAddBDItemTemplate(a_FSM, a_FSMStart, a_MessageFunc, a_ParentTableName, check.keyboard_func = a_FinishButtonFunc return check return res_of_work_func - return simple_message.SimpleMessageTemplate(StartAddBDItem, a_ButtonFunc, a_AccessFunc, access_mode) + return simple_message.SimpleMessageTemplateLegacy(StartAddBDItem, a_ButtonFunc, a_AccessFunc, access_mode) def FinishAddBDItemTemplate(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_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) @@ -95,7 +95,7 @@ def FinishOrNextAddBDItemTemplate(a_FSM, a_AddBDItemFunc, a_ParentTableName, a_P return simple_message.WorkFuncResult(error) return res_of_work_func - return simple_message.SimpleMessageTemplate(FinishAddBDItem, a_ButtonFunc, a_AccessFunc, access_mode) + return simple_message.SimpleMessageTemplateLegacy(FinishAddBDItem, a_ButtonFunc, a_AccessFunc, access_mode) def AddBDItem3RegisterHandlers(dp, a_StartCheckFunc, a_FSM, a_FSMName, a_FSMDesc, a_FSMPhoto, a_AddBDItemFunc, a_AddNameMessageFunc, a_AddDescMessageFunc, a_AddPhotoMessageFunc, a_FinishMessageFunc, a_ParentPrefix, a_ParentTableName : str, a_ParentKeyFieldName, a_NameField, a_DescField, a_PhotoField, a_GetButtonNameAndKeyValueAndAccessFunc, a_AccessFunc, a_ButtonFunc, access_mode = user_access.AccessMode.ADD): keyboard_cancel = bd_item.GetCancelKeyboardButtonsTemplate(a_AccessFunc, access_mode) diff --git a/template/bd_item_delete.py b/template/bd_item_delete.py index 033c5de..6167bea 100644 --- a/template/bd_item_delete.py +++ b/template/bd_item_delete.py @@ -29,7 +29,7 @@ def DeleteBDItemTemplate(a_TableName, a_KeyName, a_PreDeleteWorkFunc, a_PostDele return await a_PostDeleteWorkFunc(a_CallbackQuery, item_id) - return simple_message.SimpleMessageTemplate(DeleteBDItem, a_ButtonFunc, a_AccessFunc, access_mode) + return simple_message.SimpleMessageTemplateLegacy(DeleteBDItem, a_ButtonFunc, a_AccessFunc, access_mode) def DeleteBDItemRegisterHandlers(dp, 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 = dp.register_message_handler diff --git a/template/bd_item_select.py b/template/bd_item_select.py index e5344e4..a39a00f 100644 --- a/template/bd_item_select.py +++ b/template/bd_item_select.py @@ -24,14 +24,14 @@ def GetBDItemsListKeyboardButtonsTemplate(a_TableName : str, a_ParentIDFieldName if access is None: access = '' if bname: - b = keyboard.InlineButton(bname, a_NextPrefix, key_value, access, access_mode) + b = keyboard.InlineButtonWithAccess(bname, a_NextPrefix, key_value, access, access_mode) items_button_list += [b] return keyboard.MakeInlineKeyboard(items_button_list, a_UserGroups) return GetBDItemsListKeyboardButtons def SelectDBItemTemplate(a_TableName : str, a_ParentIDFieldName, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, a_PrevPrefix, a_NextPrefix, access_mode = user_access.AccessMode.VIEW): keyboard_func = GetBDItemsListKeyboardButtonsTemplate(a_TableName, a_ParentIDFieldName, a_PrevPrefix, a_NextPrefix, a_GetButtonNameAndKeyValueAndAccessFunc) - return simple_message.InfoMessageTemplate(a_StartMessage, keyboard_func, a_AccessFunc, access_mode) + return simple_message.InfoMessageTemplateLegacy(a_StartMessage, keyboard_func, a_AccessFunc, access_mode) def FirstSelectBDItemRegisterHandlers(dp, a_PrefixBase, a_ButtonName, a_TableName : str, a_KeyName, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, access_mode = user_access.AccessMode.VIEW): diff --git a/template/simple_message.py b/template/simple_message.py index b01a6b9..a400720 100644 --- a/template/simple_message.py +++ b/template/simple_message.py @@ -18,13 +18,13 @@ class WorkFuncResult(): self.keyboard_func = keyboard_func -def InfoMessageTemplate(a_HelpMessage, a_GetButtonsFunc, a_AccessFunc, access_mode = user_access.AccessMode.VIEW): +def InfoMessageTemplateLegacy(a_HelpMessage, a_GetButtonsFunc, a_AccessFunc, access_mode = user_access.AccessMode.VIEW): async def GetMessage(a_Message : types.message, state = None): return WorkFuncResult(a_HelpMessage) - return SimpleMessageTemplate(GetMessage, a_GetButtonsFunc, a_AccessFunc, access_mode) + return SimpleMessageTemplateLegacy(GetMessage, a_GetButtonsFunc, a_AccessFunc, access_mode) -def SimpleMessageTemplate(a_WorkFunc, a_GetButtonsFunc, a_AccessFunc, access_mode = user_access.AccessMode.VIEW): +def SimpleMessageTemplateLegacy(a_WorkFunc, a_GetButtonsFunc, a_AccessFunc, access_mode = user_access.AccessMode.VIEW): async def SimpleMessage(a_Message : types.message, state = None): user_id = str(a_Message.from_user.id) user_groups = groups.GetUserGroupData(user_id) -- 2.11.0 From a2c65432ba2d46e543909fcc2aed6cb506d7d62a Mon Sep 17 00:00:00 2001 From: Alexei Date: Sat, 13 May 2023 13:37:24 +0300 Subject: [PATCH 02/25] SimpleMessages Access Interface --- bot_modules/mod_agregator.py | 13 +++ bot_modules/mod_interface.py | 25 ++++++ bot_sys/aiogram_bot.py | 41 ++++++++- bot_sys/bot_bd.py | 9 ++ bot_sys/interfaces.py | 20 +++++ bot_sys/user_access.py | 209 +++++++++++++++++++++++-------------------- template/simple_message.py | 63 +++++++------ 7 files changed, 255 insertions(+), 125 deletions(-) create mode 100644 bot_modules/mod_agregator.py create mode 100644 bot_modules/mod_interface.py diff --git a/bot_modules/mod_agregator.py b/bot_modules/mod_agregator.py new file mode 100644 index 0000000..1d7f8a2 --- /dev/null +++ b/bot_modules/mod_agregator.py @@ -0,0 +1,13 @@ +# -*- coding: utf8 -*- +# Общественное достояние, 2023, Алексей Безбородов (Alexei Bezborodov) + +class ModuleAgregator: + def __init__(self): + self.m_Modules = {} + + def GetModule(a_ModName): + return self.m_Modules[a_ModName] + + def AddModule(a_Module): + self.m_Modules[a_Module.GetName()] = a_Module + diff --git a/bot_modules/mod_interface.py b/bot_modules/mod_interface.py new file mode 100644 index 0000000..026deb3 --- /dev/null +++ b/bot_modules/mod_interface.py @@ -0,0 +1,25 @@ +# -*- coding: utf8 -*- +# Общественное достояние, 2023, Алексей Безбородов (Alexei Bezborodov) + +from abc import ABC, abstractmethod + +class IModule(ABC): + @abstractmethod + def GetName(): + pass + + @abstractmethod + def GetInitBDCommands(): + pass + + @abstractmethod + def GetAccess(): + pass + + @abstractmethod + def GetModuleButtons(): + pass + + @abstractmethod + def RegisterHandlers(): + pass diff --git a/bot_sys/aiogram_bot.py b/bot_sys/aiogram_bot.py index e134868..9c3927d 100644 --- a/bot_sys/aiogram_bot.py +++ b/bot_sys/aiogram_bot.py @@ -8,23 +8,58 @@ from aiogram import Bot from aiogram.dispatcher import Dispatcher from aiogram.contrib.fsm_storage.memory import MemoryStorage -class AiogramBot(IBot): - def __init__(self, a_TelegramBotApiToken, a_BDFileName): +class AiogramBot(interfaces.IBot): + def __init__(self, a_TelegramBotApiToken, a_BDFileName, a_RootIDs, a_Log): self.m_TelegramBotApiToken = a_TelegramBotApiToken self.m_BDFileName = a_BDFileName + self.m_RootIDs = a_RootIDs + self.m_Log = a_Log self.m_TBot = Bot(token=self.m_TelegramBotApiToken, parse_mode = types.ParseMode.HTML) self.m_Storage = MemoryStorage() self.m_Dispatcher = Dispatcher(self.m_TBot, storage = storage) + def GetRootIDs(): + return self.m_RootIDs + + def GetLog(): + return self.m_Log + def SQLRequest(self, a_Request : str, commit = False, return_error = False, param = None): return bot_bd.SQLRequest(self.m_BDFileName, a_Request, commit = commit, return_error = return_error, param = param) + def GetUserGroupData(a_UserID): + def GetGroupNamesForUser(a_UserID): + return SQLRequest('SELECT groupName FROM user_groups WHERE group_id=(SELECT group_id FROM user_in_groups WHERE user_id = ?)', param = [a_UserID]) + r = GetGroupNamesForUser(a_UserID) + groups = [] + for i in r: + if len(i) > 0: + groups += [i[0]] + return user_access.UserGroups(a_UserID, groups) + + def GetModulesAccessList(): + return bot_bd.RequestSelectTemplate(self.m_BDFileName, table_name)() + + def GetAccessForModule(a_ModuleName): + alist = GetModulesAccessList() + for i in alist: + if i[0] == a_ModuleName: + return i[1] + return '' + + def GetItemDefaultAccessForModule(a_ModuleName): + alist = GetModulesAccessList() + for i in alist: + if i[0] == a_ModuleName: + return i[2] + return '' + async def SendMessage(self, a_UserID, a_Message, a_PhotoIDs, a_InlineKeyboardButtons, a_KeyboardButtons): inline_keyboard = keyboard.MakeAiogramInlineKeyboard(a_InlineKeyboardButtons) keyboard = keyboard.MakeAiogramKeyboard(a_KeyboardButtons) if not keyboard: keyboard = inline_keyboard - if a_PhotoIDs: + if a_PhotoIDs and a_PhotoIDs != 0 or a_PhotoIDs != '0': self.m_TBot.send_photo( a_UserID, a_PhotoIDs, diff --git a/bot_sys/bot_bd.py b/bot_sys/bot_bd.py index 368ed57..ea9a266 100644 --- a/bot_sys/bot_bd.py +++ b/bot_sys/bot_bd.py @@ -31,6 +31,15 @@ def SelectBDTemplate(a_TableName): def SQLRequestToBD(a_Request : str, commit = False, return_error = False, param = None): return SQLRequest(GetBDFileName(), a_Request, commit = commit, return_error = return_error, param = param) +def RequestsExecute(a_BDFileName, a_Commands): + for cmd in a_Commands: + SQLRequest(a_BDFileName, cmd, commit = True) + +def RequestSelectTemplate(a_BDFileName, a_TableName): + def SelectBD(): + return SQLRequest(a_BDFileName, f'SELECT * FROM {a_TableName}') + return SelectBD + def SQLRequest(a_BDFileName, a_Request : str, commit = False, return_error = False, param = None): db = sqlite3.connect(a_BDFileName) cursor = db.cursor() diff --git a/bot_sys/interfaces.py b/bot_sys/interfaces.py index e3012f7..e39af40 100644 --- a/bot_sys/interfaces.py +++ b/bot_sys/interfaces.py @@ -5,10 +5,30 @@ from abc import ABC, abstractmethod class IBot(ABC): @abstractmethod + def GetRootIDs(): + pass + + @abstractmethod + def GetLog(): + pass + + @abstractmethod def SQLRequest(self, a_Request : str, commit = False, return_error = False, param = None): pass @abstractmethod + def GetUserGroupData(a_UserID): + pass + + @abstractmethod + def GetAccessForModule(a_ModuleName): + pass + + @abstractmethod + def GetItemDefaultAccessForModule(a_ModuleName): + pass + + @abstractmethod async def SendMessage(self, a_UserID, a_Message, a_PhotoIDs, a_InlineKeyboardButtons, a_KeyboardButtons): pass diff --git a/bot_sys/user_access.py b/bot_sys/user_access.py index 2823c7d..12e3c18 100644 --- a/bot_sys/user_access.py +++ b/bot_sys/user_access.py @@ -55,7 +55,11 @@ def CheckAccessItem(a_AccessItem : str, a_AccessMode : AccessMode): # Возвращает возможность доступа пользователю a_UserGroups в элемент с правами a_AccessValue по режиму доступа a_AccessMode def CheckAccessString(a_AccessValue : str, a_UserGroups : UserGroups, a_AccessMode : AccessMode): - if a_UserGroups.user_id in config.GetRootIDs(): + return CheckAccess(config.GetRootIDs(), a_AccessValue, a_UserGroups, a_AccessMode) + +# Возвращает возможность доступа пользователю a_UserGroups в элемент с правами a_AccessValue по режиму доступа a_AccessMode +def CheckAccess(a_RootIDs, a_AccessValue : str, a_UserGroups : UserGroups, a_AccessMode : AccessMode): + if a_UserGroups.user_id in a_RootIDs: return True for i in a_AccessValue.split(';'): d = i.split('=') @@ -72,99 +76,114 @@ def Test(): assert '1234' in ['123', '1234'] assert not '1234' in ['123', '12345'] + # root имеет полный доступ вне зависимости от a_AccessValue и a_UserGroups и a_AccessMode + roots = ['1234'] + for am in AccessMode.ADD, AccessMode.DELETE, AccessMode.EDIT, AccessMode.VIEW, AccessMode.ACCEES_EDIT: + assert CheckAccess(roots, '1234=+', UserGroups('1234', []), am) + assert CheckAccess(roots, '1234=-', UserGroups('1234', []), am) + assert CheckAccess(roots, '1234=+;gr1=+', UserGroups('1234', ['gr1']), am) + assert CheckAccess(roots, '1234=-;gr1=+', UserGroups('1234', ['gr1']), am) + assert CheckAccess(roots, '1234=+', UserGroups('123', []), am) + assert CheckAccess(roots, '1234=-', UserGroups('123', []), am) + assert CheckAccess(roots, '1234=+;gr1=+', UserGroups('123', ['gr']), am) + assert CheckAccess(roots, '1234=-;gr1=+', UserGroups('123', ['gr']), am) + assert CheckAccess(roots, '1234=+;gr=+', UserGroups('123', ['gr1']), am) + assert CheckAccess(roots, '1234=-;gr=+', UserGroups('123', ['gr1']), am) + + roots = ['12'] for am in AccessMode.ADD, AccessMode.DELETE, AccessMode.EDIT, AccessMode.VIEW, AccessMode.ACCEES_EDIT: - assert CheckAccessString('1234=+', UserGroups('1234', []), am) - assert not CheckAccessString('1234=-', UserGroups('1234', []), am) - assert CheckAccessString('1234=+;gr1=+', UserGroups('1234', ['gr1']), am) - assert CheckAccessString('1234=-;gr1=+', UserGroups('1234', ['gr1']), am) - assert not CheckAccessString('1234=+', UserGroups('123', []), am) - assert not CheckAccessString('1234=-', UserGroups('123', []), am) - assert not CheckAccessString('1234=+;gr1=+', UserGroups('123', ['gr']), am) - assert not CheckAccessString('1234=-;gr1=+', UserGroups('123', ['gr']), am) - assert not CheckAccessString('1234=+;gr=+', UserGroups('123', ['gr1']), am) - assert not CheckAccessString('1234=-;gr=+', UserGroups('123', ['gr1']), am) - - assert CheckAccessString('123=-;1234=a', UserGroups('1234', []), AccessMode.ADD) - assert CheckAccessString('123=-;1234=d', UserGroups('1234', []), AccessMode.DELETE) - assert CheckAccessString('123=-;1234=e', UserGroups('1234', []), AccessMode.EDIT) - assert CheckAccessString('123=-;1234=r', UserGroups('1234', []), AccessMode.ACCEES_EDIT) - assert CheckAccessString('123=-;1234=v', UserGroups('1234', []), AccessMode.VIEW) - assert CheckAccessString('123=-;gr1=a', UserGroups('1234', ['gr1']), AccessMode.ADD) - assert CheckAccessString('123=-;gr1=d', UserGroups('1234', ['gr1']), AccessMode.DELETE) - assert CheckAccessString('123=-;gr1=e', UserGroups('1234', ['gr1']), AccessMode.EDIT) - assert CheckAccessString('123=-;gr1=r', UserGroups('1234', ['gr1']), AccessMode.ACCEES_EDIT) - assert CheckAccessString('123=-;gr1=v', UserGroups('1234', ['gr1']), AccessMode.VIEW) - assert CheckAccessString('123=-;1234=daver', UserGroups('1234', []), AccessMode.ADD) - assert CheckAccessString('123=-;1234=dav', UserGroups('1234', []), AccessMode.DELETE) - assert CheckAccessString('123=-;1234=edv', UserGroups('1234', []), AccessMode.EDIT) - assert CheckAccessString('123=-;1234=rav', UserGroups('1234', []), AccessMode.ACCEES_EDIT) - assert CheckAccessString('123=-;1234=va', UserGroups('1234', []), AccessMode.VIEW) - assert CheckAccessString('123=-;gr1=avr', UserGroups('1234', ['gr1']), AccessMode.ADD) - assert CheckAccessString('123=-;gr1=daver', UserGroups('1234', ['gr1']), AccessMode.DELETE) - assert CheckAccessString('123=-;gr1=eva', UserGroups('1234', ['gr1']), AccessMode.EDIT) - assert CheckAccessString('123=-;gr1=re', UserGroups('1234', ['gr1']), AccessMode.ACCEES_EDIT) - assert CheckAccessString('123=-;gr1=vad', UserGroups('1234', ['gr1']), AccessMode.VIEW) - - assert not CheckAccessString('123=-;1234=d', UserGroups('1234', []), AccessMode.ADD) - assert not CheckAccessString('123=-;1234=a', UserGroups('1234', []), AccessMode.DELETE) - assert not CheckAccessString('123=-;1234=r', UserGroups('1234', []), AccessMode.EDIT) - assert not CheckAccessString('123=-;1234=v', UserGroups('1234', []), AccessMode.ACCEES_EDIT) - assert not CheckAccessString('123=-;1234=e', UserGroups('1234', []), AccessMode.VIEW) - assert not CheckAccessString('123=-;gr1=d', UserGroups('1234', ['gr']), AccessMode.ADD) - assert not CheckAccessString('123=-;gr1=a', UserGroups('1234', ['gr']), AccessMode.DELETE) - assert not CheckAccessString('123=-;gr1=v', UserGroups('1234', ['gr']), AccessMode.EDIT) - assert not CheckAccessString('123=-;gr1=e', UserGroups('1234', ['gr']), AccessMode.ACCEES_EDIT) - assert not CheckAccessString('123=-;gr1=r', UserGroups('1234', ['gr']), AccessMode.VIEW) - assert not CheckAccessString('123=-;1234=dver', UserGroups('1234', []), AccessMode.ADD) - assert not CheckAccessString('123=-;1234=av', UserGroups('1234', []), AccessMode.DELETE) - assert not CheckAccessString('123=-;1234=dv', UserGroups('1234', []), AccessMode.EDIT) - assert not CheckAccessString('123=-;1234=av', UserGroups('1234', []), AccessMode.ACCEES_EDIT) - assert not CheckAccessString('123=-;1234=a', UserGroups('1234', []), AccessMode.VIEW) - assert not CheckAccessString('123=-;gr1=vr', UserGroups('1234', ['gr']), AccessMode.ADD) - assert not CheckAccessString('123=-;gr1=aver', UserGroups('1234', ['gr']), AccessMode.DELETE) - assert not CheckAccessString('123=-;gr1=va', UserGroups('1234', ['gr']), AccessMode.EDIT) - assert not CheckAccessString('123=-;gr1=ea', UserGroups('1234', ['gr']), AccessMode.ACCEES_EDIT) - assert not CheckAccessString('123=-;gr1=ad', UserGroups('1234', ['gr']), AccessMode.VIEW) - - assert CheckAccessString(f'123=-;{user_access_group_all}=a', UserGroups('1234', []), AccessMode.ADD) - assert CheckAccessString(f'123=-;{user_access_group_all}=d', UserGroups('1234', []), AccessMode.DELETE) - assert CheckAccessString(f'123=-;{user_access_group_all}=e', UserGroups('1234', []), AccessMode.EDIT) - assert CheckAccessString(f'123=-;{user_access_group_all}=r', UserGroups('1234', []), AccessMode.ACCEES_EDIT) - assert CheckAccessString(f'123=-;{user_access_group_all}=v', UserGroups('1234', []), AccessMode.VIEW) - assert CheckAccessString(f'123=-;{user_access_group_all}=a', UserGroups('1234', ['gr1']), AccessMode.ADD) - assert CheckAccessString(f'123=-;{user_access_group_all}=d', UserGroups('1234', ['gr1']), AccessMode.DELETE) - assert CheckAccessString(f'123=-;{user_access_group_all}=e', UserGroups('1234', ['gr1']), AccessMode.EDIT) - assert CheckAccessString(f'123=-;{user_access_group_all}=r', UserGroups('1234', ['gr1']), AccessMode.ACCEES_EDIT) - assert CheckAccessString(f'123=-;{user_access_group_all}=v', UserGroups('1234', ['gr1']), AccessMode.VIEW) - assert CheckAccessString(f'123=-;{user_access_group_all}=daver', UserGroups('1234', []), AccessMode.ADD) - assert CheckAccessString(f'123=-;{user_access_group_all}=dav', UserGroups('1234', []), AccessMode.DELETE) - assert CheckAccessString(f'123=-;{user_access_group_all}=edv', UserGroups('1234', []), AccessMode.EDIT) - assert CheckAccessString(f'123=-;{user_access_group_all}=rav', UserGroups('1234', []), AccessMode.ACCEES_EDIT) - assert CheckAccessString(f'123=-;{user_access_group_all}=va', UserGroups('1234', []), AccessMode.VIEW) - assert CheckAccessString(f'123=-;{user_access_group_all}=avr', UserGroups('1234', ['gr1']), AccessMode.ADD) - assert CheckAccessString(f'123=-;{user_access_group_all}=daver', UserGroups('1234', ['gr1']), AccessMode.DELETE) - assert CheckAccessString(f'123=-;{user_access_group_all}=eva', UserGroups('1234', ['gr1']), AccessMode.EDIT) - assert CheckAccessString(f'123=-;{user_access_group_all}=re', UserGroups('1234', ['gr1']), AccessMode.ACCEES_EDIT) - assert CheckAccessString(f'123=-;{user_access_group_all}=vad', UserGroups('1234', ['gr1']), AccessMode.VIEW) - - assert not CheckAccessString(f'123=-;{user_access_group_all}=d', UserGroups('1234', []), AccessMode.ADD) - assert not CheckAccessString(f'123=-;{user_access_group_all}=a', UserGroups('1234', []), AccessMode.DELETE) - assert not CheckAccessString(f'123=-;{user_access_group_all}=r', UserGroups('1234', []), AccessMode.EDIT) - assert not CheckAccessString(f'123=-;{user_access_group_all}=v', UserGroups('1234', []), AccessMode.ACCEES_EDIT) - assert not CheckAccessString(f'123=-;{user_access_group_all}=e', UserGroups('1234', []), AccessMode.VIEW) - assert not CheckAccessString(f'123=-;gr1=d;{user_access_group_all}=-', UserGroups('1234', ['gr']), AccessMode.ADD) - assert not CheckAccessString(f'123=-;gr1=a;{user_access_group_all}=-', UserGroups('1234', ['gr']), AccessMode.DELETE) - assert not CheckAccessString(f'123=-;gr1=v;{user_access_group_all}=-', UserGroups('1234', ['gr']), AccessMode.EDIT) - assert not CheckAccessString(f'123=-;gr1=e;{user_access_group_all}=-', UserGroups('1234', ['gr']), AccessMode.ACCEES_EDIT) - assert not CheckAccessString(f'123=-;gr1=r;{user_access_group_all}=-', UserGroups('1234', ['gr']), AccessMode.VIEW) - assert not CheckAccessString(f'123=-;{user_access_group_all}=dver', UserGroups('1234', []), AccessMode.ADD) - assert not CheckAccessString(f'123=-;{user_access_group_all}=av', UserGroups('1234', []), AccessMode.DELETE) - assert not CheckAccessString(f'123=-;{user_access_group_all}=dv', UserGroups('1234', []), AccessMode.EDIT) - assert not CheckAccessString(f'123=-;{user_access_group_all}=av', UserGroups('1234', []), AccessMode.ACCEES_EDIT) - assert not CheckAccessString(f'123=-;{user_access_group_all}=a', UserGroups('1234', []), AccessMode.VIEW) - assert not CheckAccessString(f'123=-;{user_access_group_all}=vr', UserGroups('1234', ['gr']), AccessMode.ADD) - assert not CheckAccessString(f'123=-;{user_access_group_all}=aver', UserGroups('1234', ['gr']), AccessMode.DELETE) - assert not CheckAccessString(f'123=-;{user_access_group_all}=va', UserGroups('1234', ['gr']), AccessMode.EDIT) - assert not CheckAccessString(f'123=-;{user_access_group_all}=ea', UserGroups('1234', ['gr']), AccessMode.ACCEES_EDIT) - assert not CheckAccessString(f'123=-;{user_access_group_all}=ad', UserGroups('1234', ['gr']), AccessMode.VIEW) + assert CheckAccess(roots, '1234=+', UserGroups('1234', []), am) + assert not CheckAccess(roots, '1234=-', UserGroups('1234', []), am) + assert CheckAccess(roots, '1234=+;gr1=+', UserGroups('1234', ['gr1']), am) + assert CheckAccess(roots, '1234=-;gr1=+', UserGroups('1234', ['gr1']), am) + assert not CheckAccess(roots, '1234=+', UserGroups('123', []), am) + assert not CheckAccess(roots, '1234=-', UserGroups('123', []), am) + assert not CheckAccess(roots, '1234=+;gr1=+', UserGroups('123', ['gr']), am) + assert not CheckAccess(roots, '1234=-;gr1=+', UserGroups('123', ['gr']), am) + assert not CheckAccess(roots, '1234=+;gr=+', UserGroups('123', ['gr1']), am) + assert not CheckAccess(roots, '1234=-;gr=+', UserGroups('123', ['gr1']), am) + + assert CheckAccess(roots, '123=-;1234=a', UserGroups('1234', []), AccessMode.ADD) + assert CheckAccess(roots, '123=-;1234=d', UserGroups('1234', []), AccessMode.DELETE) + assert CheckAccess(roots, '123=-;1234=e', UserGroups('1234', []), AccessMode.EDIT) + assert CheckAccess(roots, '123=-;1234=r', UserGroups('1234', []), AccessMode.ACCEES_EDIT) + assert CheckAccess(roots, '123=-;1234=v', UserGroups('1234', []), AccessMode.VIEW) + assert CheckAccess(roots, '123=-;gr1=a', UserGroups('1234', ['gr1']), AccessMode.ADD) + assert CheckAccess(roots, '123=-;gr1=d', UserGroups('1234', ['gr1']), AccessMode.DELETE) + assert CheckAccess(roots, '123=-;gr1=e', UserGroups('1234', ['gr1']), AccessMode.EDIT) + assert CheckAccess(roots, '123=-;gr1=r', UserGroups('1234', ['gr1']), AccessMode.ACCEES_EDIT) + assert CheckAccess(roots, '123=-;gr1=v', UserGroups('1234', ['gr1']), AccessMode.VIEW) + assert CheckAccess(roots, '123=-;1234=daver', UserGroups('1234', []), AccessMode.ADD) + assert CheckAccess(roots, '123=-;1234=dav', UserGroups('1234', []), AccessMode.DELETE) + assert CheckAccess(roots, '123=-;1234=edv', UserGroups('1234', []), AccessMode.EDIT) + assert CheckAccess(roots, '123=-;1234=rav', UserGroups('1234', []), AccessMode.ACCEES_EDIT) + assert CheckAccess(roots, '123=-;1234=va', UserGroups('1234', []), AccessMode.VIEW) + assert CheckAccess(roots, '123=-;gr1=avr', UserGroups('1234', ['gr1']), AccessMode.ADD) + assert CheckAccess(roots, '123=-;gr1=daver', UserGroups('1234', ['gr1']), AccessMode.DELETE) + assert CheckAccess(roots, '123=-;gr1=eva', UserGroups('1234', ['gr1']), AccessMode.EDIT) + assert CheckAccess(roots, '123=-;gr1=re', UserGroups('1234', ['gr1']), AccessMode.ACCEES_EDIT) + assert CheckAccess(roots, '123=-;gr1=vad', UserGroups('1234', ['gr1']), AccessMode.VIEW) + + assert not CheckAccess(roots, '123=-;1234=d', UserGroups('1234', []), AccessMode.ADD) + assert not CheckAccess(roots, '123=-;1234=a', UserGroups('1234', []), AccessMode.DELETE) + assert not CheckAccess(roots, '123=-;1234=r', UserGroups('1234', []), AccessMode.EDIT) + assert not CheckAccess(roots, '123=-;1234=v', UserGroups('1234', []), AccessMode.ACCEES_EDIT) + assert not CheckAccess(roots, '123=-;1234=e', UserGroups('1234', []), AccessMode.VIEW) + assert not CheckAccess(roots, '123=-;gr1=d', UserGroups('1234', ['gr']), AccessMode.ADD) + assert not CheckAccess(roots, '123=-;gr1=a', UserGroups('1234', ['gr']), AccessMode.DELETE) + assert not CheckAccess(roots, '123=-;gr1=v', UserGroups('1234', ['gr']), AccessMode.EDIT) + assert not CheckAccess(roots, '123=-;gr1=e', UserGroups('1234', ['gr']), AccessMode.ACCEES_EDIT) + assert not CheckAccess(roots, '123=-;gr1=r', UserGroups('1234', ['gr']), AccessMode.VIEW) + assert not CheckAccess(roots, '123=-;1234=dver', UserGroups('1234', []), AccessMode.ADD) + assert not CheckAccess(roots, '123=-;1234=av', UserGroups('1234', []), AccessMode.DELETE) + assert not CheckAccess(roots, '123=-;1234=dv', UserGroups('1234', []), AccessMode.EDIT) + assert not CheckAccess(roots, '123=-;1234=av', UserGroups('1234', []), AccessMode.ACCEES_EDIT) + assert not CheckAccess(roots, '123=-;1234=a', UserGroups('1234', []), AccessMode.VIEW) + assert not CheckAccess(roots, '123=-;gr1=vr', UserGroups('1234', ['gr']), AccessMode.ADD) + assert not CheckAccess(roots, '123=-;gr1=aver', UserGroups('1234', ['gr']), AccessMode.DELETE) + assert not CheckAccess(roots, '123=-;gr1=va', UserGroups('1234', ['gr']), AccessMode.EDIT) + assert not CheckAccess(roots, '123=-;gr1=ea', UserGroups('1234', ['gr']), AccessMode.ACCEES_EDIT) + assert not CheckAccess(roots, '123=-;gr1=ad', UserGroups('1234', ['gr']), AccessMode.VIEW) + + assert CheckAccess(roots, f'123=-;{user_access_group_all}=a', UserGroups('1234', []), AccessMode.ADD) + assert CheckAccess(roots, f'123=-;{user_access_group_all}=d', UserGroups('1234', []), AccessMode.DELETE) + assert CheckAccess(roots, f'123=-;{user_access_group_all}=e', UserGroups('1234', []), AccessMode.EDIT) + assert CheckAccess(roots, f'123=-;{user_access_group_all}=r', UserGroups('1234', []), AccessMode.ACCEES_EDIT) + assert CheckAccess(roots, f'123=-;{user_access_group_all}=v', UserGroups('1234', []), AccessMode.VIEW) + assert CheckAccess(roots, f'123=-;{user_access_group_all}=a', UserGroups('1234', ['gr1']), AccessMode.ADD) + assert CheckAccess(roots, f'123=-;{user_access_group_all}=d', UserGroups('1234', ['gr1']), AccessMode.DELETE) + assert CheckAccess(roots, f'123=-;{user_access_group_all}=e', UserGroups('1234', ['gr1']), AccessMode.EDIT) + assert CheckAccess(roots, f'123=-;{user_access_group_all}=r', UserGroups('1234', ['gr1']), AccessMode.ACCEES_EDIT) + assert CheckAccess(roots, f'123=-;{user_access_group_all}=v', UserGroups('1234', ['gr1']), AccessMode.VIEW) + assert CheckAccess(roots, f'123=-;{user_access_group_all}=daver', UserGroups('1234', []), AccessMode.ADD) + assert CheckAccess(roots, f'123=-;{user_access_group_all}=dav', UserGroups('1234', []), AccessMode.DELETE) + assert CheckAccess(roots, f'123=-;{user_access_group_all}=edv', UserGroups('1234', []), AccessMode.EDIT) + assert CheckAccess(roots, f'123=-;{user_access_group_all}=rav', UserGroups('1234', []), AccessMode.ACCEES_EDIT) + assert CheckAccess(roots, f'123=-;{user_access_group_all}=va', UserGroups('1234', []), AccessMode.VIEW) + assert CheckAccess(roots, f'123=-;{user_access_group_all}=avr', UserGroups('1234', ['gr1']), AccessMode.ADD) + assert CheckAccess(roots, f'123=-;{user_access_group_all}=daver', UserGroups('1234', ['gr1']), AccessMode.DELETE) + assert CheckAccess(roots, f'123=-;{user_access_group_all}=eva', UserGroups('1234', ['gr1']), AccessMode.EDIT) + assert CheckAccess(roots, f'123=-;{user_access_group_all}=re', UserGroups('1234', ['gr1']), AccessMode.ACCEES_EDIT) + assert CheckAccess(roots, f'123=-;{user_access_group_all}=vad', UserGroups('1234', ['gr1']), AccessMode.VIEW) + + assert not CheckAccess(roots, f'123=-;{user_access_group_all}=d', UserGroups('1234', []), AccessMode.ADD) + assert not CheckAccess(roots, f'123=-;{user_access_group_all}=a', UserGroups('1234', []), AccessMode.DELETE) + assert not CheckAccess(roots, f'123=-;{user_access_group_all}=r', UserGroups('1234', []), AccessMode.EDIT) + assert not CheckAccess(roots, f'123=-;{user_access_group_all}=v', UserGroups('1234', []), AccessMode.ACCEES_EDIT) + assert not CheckAccess(roots, f'123=-;{user_access_group_all}=e', UserGroups('1234', []), AccessMode.VIEW) + assert not CheckAccess(roots, f'123=-;gr1=d;{user_access_group_all}=-', UserGroups('1234', ['gr']), AccessMode.ADD) + assert not CheckAccess(roots, f'123=-;gr1=a;{user_access_group_all}=-', UserGroups('1234', ['gr']), AccessMode.DELETE) + assert not CheckAccess(roots, f'123=-;gr1=v;{user_access_group_all}=-', UserGroups('1234', ['gr']), AccessMode.EDIT) + assert not CheckAccess(roots, f'123=-;gr1=e;{user_access_group_all}=-', UserGroups('1234', ['gr']), AccessMode.ACCEES_EDIT) + assert not CheckAccess(roots, f'123=-;gr1=r;{user_access_group_all}=-', UserGroups('1234', ['gr']), AccessMode.VIEW) + assert not CheckAccess(roots, f'123=-;{user_access_group_all}=dver', UserGroups('1234', []), AccessMode.ADD) + assert not CheckAccess(roots, f'123=-;{user_access_group_all}=av', UserGroups('1234', []), AccessMode.DELETE) + assert not CheckAccess(roots, f'123=-;{user_access_group_all}=dv', UserGroups('1234', []), AccessMode.EDIT) + assert not CheckAccess(roots, f'123=-;{user_access_group_all}=av', UserGroups('1234', []), AccessMode.ACCEES_EDIT) + assert not CheckAccess(roots, f'123=-;{user_access_group_all}=a', UserGroups('1234', []), AccessMode.VIEW) + assert not CheckAccess(roots, f'123=-;{user_access_group_all}=vr', UserGroups('1234', ['gr']), AccessMode.ADD) + assert not CheckAccess(roots, f'123=-;{user_access_group_all}=aver', UserGroups('1234', ['gr']), AccessMode.DELETE) + assert not CheckAccess(roots, f'123=-;{user_access_group_all}=va', UserGroups('1234', ['gr']), AccessMode.EDIT) + assert not CheckAccess(roots, f'123=-;{user_access_group_all}=ea', UserGroups('1234', ['gr']), AccessMode.ACCEES_EDIT) + assert not CheckAccess(roots, f'123=-;{user_access_group_all}=ad', UserGroups('1234', ['gr']), AccessMode.VIEW) diff --git a/template/simple_message.py b/template/simple_message.py index a400720..5f848b8 100644 --- a/template/simple_message.py +++ b/template/simple_message.py @@ -3,53 +3,62 @@ # Простые информационные сообщения -from bot_sys import user_access, config -from bot_modules import access, groups +from bot_sys import user_access +from bot_modules import access from aiogram import types -from aiogram import Bot -bot = Bot(token=config.GetTelegramBotApiToken(), parse_mode = types.ParseMode.HTML) - class WorkFuncResult(): - def __init__(self, a_StringMessage : str, photo_id = None, item_access = None, keyboard_func = None): + def __init__(self, a_StringMessage : str, photo_id = None, item_access = None): self.string_message = a_StringMessage self.photo_id = photo_id self.item_access = item_access - self.keyboard_func = keyboard_func - -def InfoMessageTemplateLegacy(a_HelpMessage, a_GetButtonsFunc, a_AccessFunc, access_mode = user_access.AccessMode.VIEW): +def InfoMessageTemplate(a_Bot, a_HelpMessage, a_GetButtonsFunc, a_GetInlineButtonsFunc, a_AccessFunc, access_mode = user_access.AccessMode.VIEW): async def GetMessage(a_Message : types.message, state = None): return WorkFuncResult(a_HelpMessage) - return SimpleMessageTemplateLegacy(GetMessage, a_GetButtonsFunc, a_AccessFunc, access_mode) + return SimpleMessageTemplate(a_Bot, GetMessage, a_GetButtonsFunc, a_GetInlineButtonsFunc, a_AccessFunc, access_mode = access_mode) + +def SimpleMessageTemplate(a_Bot, a_WorkFunc, a_GetButtonsFunc, a_GetInlineButtonsFunc, a_AccessFunc, access_mode = user_access.AccessMode.VIEW): + def ProxyGetButtonsTemplate(a_GetButtonsFunc): + def ReturnNone(): + return None + if a_GetButtonsFunc: + return a_GetButtonsFunc + else: + return ReturnNone + + async def AccessDeniedMessage(a_UserID, a_Message, user_groups): + return a_Bot.SendMessage( + a_UserID, + access.access_denied_message, + None, + None, + ProxyGetButtonsTemplate(a_GetButtonsFunc)(a_Message, user_groups) + ) -def SimpleMessageTemplateLegacy(a_WorkFunc, a_GetButtonsFunc, a_AccessFunc, access_mode = user_access.AccessMode.VIEW): async def SimpleMessage(a_Message : types.message, state = None): user_id = str(a_Message.from_user.id) - user_groups = groups.GetUserGroupData(user_id) - if not user_access.CheckAccessString(a_AccessFunc(), user_groups, access_mode): - return await bot.send_message(a_Message.from_user.id, access.access_denied_message, reply_markup = a_GetButtonsFunc(a_Message, user_groups)) + user_groups = a_Bot.GetUserGroupData(user_id) + if not user_access.CheckAccess(a_Bot.GetRootIDs(), a_AccessFunc(), user_groups, access_mode): + return await AccessDeniedMessage(user_id, a_Message, user_groups) res = await a_WorkFunc(a_Message, state = state) if res is None: return - - keyboard_func = a_GetButtonsFunc - if res.keyboard_func: - keyboard_func = res.keyboard_func - + msg = res.string_message if msg is None: return - photo_id = res.photo_id - - if not res.item_access is None and not user_access.CheckAccessString(res.item_access, user_groups, access_mode): - return await bot.send_message(a_Message.from_user.id, access.access_denied_message, reply_markup = keyboard_func(a_Message, user_groups)) - - if photo_id is None or photo_id == 0 or photo_id == '0': - return await bot.send_message(a_Message.from_user.id, msg, reply_markup = keyboard_func(a_Message, user_groups)) + if not res.item_access is None and not user_access.CheckAccess(a_Bot.GetRootIDs(), res.item_access, user_groups, access_mode): + return await AccessDeniedMessage(user_id, a_Message, user_groups) - await bot.send_photo(user_id, photo_id, msg, reply_markup = keyboard_func(a_Message, user_groups)) + await a_Bot.SendMessage( + user_id, + msg, + res.photo_id, + ProxyGetButtonsTemplate(a_GetInlineButtonsFunc)(a_Message, user_groups), + ProxyGetButtonsTemplate(a_GetButtonsFunc)(a_Message, user_groups) + ) return SimpleMessage -- 2.11.0 From b90f1a32cc3d2475644cb807dd4948e65193e55b Mon Sep 17 00:00:00 2001 From: Alexei Date: Sat, 13 May 2023 21:10:49 +0300 Subject: [PATCH 03/25] =?UTF-8?q?Start=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB?= =?UTF-8?q?=D1=8C=20=D0=B3=D0=BE=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot_modules/access_utils.py | 12 +++++ bot_modules/mod_agregator.py | 2 + bot_modules/mod_simple_message.py | 86 +++++++++++++++++++++++++++++++ bot_modules/start.py | 104 +++++++++++++------------------------- bot_sys/aiogram_bot.py | 8 ++- bot_sys/bot_messages.py | 68 +++++++++++++++++++++++++ bot_sys/interfaces.py | 5 ++ main.py | 49 ++++++++++-------- template/bd_item.py | 3 ++ template/simple_message.py | 14 ++--- 10 files changed, 254 insertions(+), 97 deletions(-) create mode 100644 bot_modules/access_utils.py create mode 100644 bot_modules/mod_simple_message.py create mode 100644 bot_sys/bot_messages.py diff --git a/bot_modules/access_utils.py b/bot_modules/access_utils.py new file mode 100644 index 0000000..abc3531 --- /dev/null +++ b/bot_modules/access_utils.py @@ -0,0 +1,12 @@ +# -*- coding: utf8 -*- +# Общественное достояние, 2023, Алексей Безбородов (Alexei Bezborodov) + +# Права пользователей. Утилиты + +table_name = 'module_access' +mod_name_field = 'modName' +moduleaccess_field = 'modAccess' +mod_default_access_field = 'itemDefaultAccess' + +def GetAccessForModuleRequest(module_name, access, default_access): + return f"INSERT OR IGNORE INTO {table_name} ({mod_name_field}, {moduleaccess_field}, {mod_default_access_field}) VALUES ('{module_name}', '{access}', '{default_access}');" diff --git a/bot_modules/mod_agregator.py b/bot_modules/mod_agregator.py index 1d7f8a2..715609a 100644 --- a/bot_modules/mod_agregator.py +++ b/bot_modules/mod_agregator.py @@ -11,3 +11,5 @@ class ModuleAgregator: def AddModule(a_Module): self.m_Modules[a_Module.GetName()] = a_Module + def GetModList(): + self.m_Modules.items() diff --git a/bot_modules/mod_simple_message.py b/bot_modules/mod_simple_message.py new file mode 100644 index 0000000..88b51c7 --- /dev/null +++ b/bot_modules/mod_simple_message.py @@ -0,0 +1,86 @@ +# -*- coding: utf8 -*- +# Общественное достояние, 2023, Алексей Безбородов (Alexei Bezborodov) + +# Простой модуль с одним сообщением + +from bot_sys import keyboard, user_access +from bot_modules import access_utils +from template import simple_message + +class SimpleMessageModule(mod_interface.IModule): + def __init__(self, a_StartMessage, a_StartButtonName, a_InitAccess, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log): + self.m_ChildModuleNameList = a_ChildModuleNameList + self.m_InitAccess = a_InitAccess + self.m_Bot = a_Bot + self.m_ModuleAgregator = a_ModuleAgregator + self.m_BotMessages = a_BotMessages + self.m_BotButtons = a_BotButtons + self.m_Log = a_Log + + self.m_StartButtonName = CreateButton(f'{GetName()}_start', a_StartButtonName) + self.m_StartMessage = CreateMessage(f'{GetName()}_start', a_StartMessage) + + async def StartMessageHandler(a_Message, state = None): + return self.StartMessageHandler(a_Message, state) + self.m_StartMessageHandlerFunc = StartMessageHandler + + def GetAccess(): + return self.GetAccess() + self.m_GetAccessFunc = GetAccess + + def GetStartKeyboardButtons(a_Message, a_UserGroups): + return self.GetStartKeyboardButtons(a_Message, a_UserGroups) + self.m_GetStartKeyboardButtonsFunc = GetStartKeyboardButtons + + self.m_StartMessageHandler = simple_message.SimpleMessageTemplate( + self.m_Bot, + self.m_StartMessageHandlerFunc, + None, + self.m_GetStartKeyboardButtonsFunc, + self.m_GetAccessFunc + ) + + # Основной обработчик главного сообщения + async def StartMessageHandler(a_Message, state = None): + return simple_message.WorkFuncResult(self.m_StartMessage) + + def CreateMessage(a_MessageName, a_MessageDesc): + msg = self.m_BotMessages.CreateMessage(a_MessageName, a_MessageDesc, self.m_Log.GetTimeNow()) + return msg + + def CreateButton(a_ButtonName, a_ButtonDesc): + btn = self.m_BotButtons.CreateMessage(a_ButtonName, a_ButtonDesc, self.m_Log.GetTimeNow()) + return btn + + def GetStartKeyboardButtons(a_Message, a_UserGroups): + def GetButtons(a_ModNameList): + buttons = [] + for n in a_ModNameList: + m = self.m_ModuleAgregator.GetModule(n) + b = m.GetModuleButtons() + if not b is None or len(b) != 0: + buttons += b + return buttons + + buttons = GetButtons(self.m_ChildModuleNameList) + return MakeButtons(buttons, a_UserGroups) + + def GetInitBDCommands(): + return [ + access_utils.GetAccessForModuleRequest(GetName(), self.m_InitAccess, self.m_InitAccess), + ] + + def GetAccess(): + return self.m_Bot.GetAccessForModule(module_name) + + def GetModuleButtons(): + return [ + keyboard.ButtonWithAccess(self.m_StartButtonName, user_access.AccessMode.VIEW, GetAccess()), + ] + + def RegisterHandlers(): + self.m_Bot.RegisterMessageHandler( + self.m_StartMessageHandler, + bd_item.GetCheckForTextFunc(self.m_StartButtonName) + ) + diff --git a/bot_modules/start.py b/bot_modules/start.py index 5760b43..ef6ced9 100644 --- a/bot_modules/start.py +++ b/bot_modules/start.py @@ -3,76 +3,44 @@ # Стартовое меню -from bot_sys import log, config, keyboard, user_access, user_messages -from bot_modules import profile, projects, groups, access, backup, languages -from template import simple_message +from bot_sys import user_access +from bot_modules import mod_simple_message -from aiogram.dispatcher import Dispatcher - -def MSG(a_MessageName, a_MessageDesc): - def UpdateMSG(a_Message : user_messages.Message): - print(a_Message.m_MessageName, a_Message.m_MessageDesc) - globals()[a_Message.m_MessageName] = a_Message - user_messages.MSG(a_MessageName, a_MessageDesc, UpdateMSG, log.GetTimeNow()) - -# --------------------------------------------------------- -# БД -module_name = 'start' - -init_bd_cmds = [ -f"INSERT OR IGNORE INTO module_access (modName, modAccess, itemDefaultAccess) VALUES ('{module_name}', '{user_access.user_access_group_all}=+', '{user_access.user_access_group_all}=+');" -] - -# --------------------------------------------------------- -# Сообщения - -MSG('start_message', ''' +class ModuleStart(mod_simple_message.SimpleMessageModule): + def __init__(self, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log): + msg = ''' Добро пожаловать! Выберите возможные действия на кнопках ниже ⌨''' -) - -start_menu_button_name = "☰ Главное меню" - -# --------------------------------------------------------- -# Работа с кнопками - -def GetStartKeyboardButtons(a_Message, a_UserGroups): - mods = [profile, projects, groups, access, backup, languages] - return keyboard.MakeKeyboardForMods(mods, a_UserGroups) - -# --------------------------------------------------------- -# Обработка сообщений - -# Первичное привестивие -async def StartMenu(a_Message, state = None): - user_id = str(a_Message.from_user.id) - user_name = str(a_Message.from_user.username) - first_name = str(a_Message.from_user.first_name) - last_name = str(a_Message.from_user.last_name) - is_bot = str(a_Message.from_user.is_bot) - language_code = str(a_Message.from_user.language_code) - profile.AddUser(user_id, user_name, first_name, last_name, is_bot, language_code) - log.Info(f'Пользователь {user_id} {user_name} авторизовался в боте. Полные данные {a_Message.from_user}.') - return simple_message.WorkFuncResult(start_message) - -# --------------------------------------------------------- -# API - -# Инициализация БД -def GetInitBDCommands(): - return init_bd_cmds - -def GetAccess(): - return access.GetAccessForModule(module_name) - -# Имена доступных кнопок -def GetModuleButtons(): - return [keyboard.ButtonWithAccess(start_menu_button_name, user_access.AccessMode.VIEW, GetAccess())] - -# Обработка кнопок -def RegisterHandlers(dp : Dispatcher): - dp.register_message_handler(simple_message.SimpleMessageTemplateLegacy(StartMenu, GetStartKeyboardButtons, GetAccess), commands = ['start']) - dp.register_message_handler(simple_message.SimpleMessageTemplateLegacy(StartMenu, GetStartKeyboardButtons, GetAccess), text = start_menu_button_name) - + start_menu_button_name = "☰ Главное меню" + a_InitAccess = f'{user_access.user_access_group_all}=+' + super().__init__(self, msg, start_menu_button_name, a_InitAccess, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log) + + def GetName(): + return 'start' + + # Основной обработчик главного сообщения + async def StartMessageHandler(a_Message, state = None): + user_id = str(a_Message.from_user.id) + user_name = str(a_Message.from_user.username) + first_name = str(a_Message.from_user.first_name) + last_name = str(a_Message.from_user.last_name) + is_bot = str(a_Message.from_user.is_bot) + language_code = str(a_Message.from_user.language_code) + profile.AddUser(user_id, user_name, first_name, last_name, is_bot, language_code) + self.m_Log.Info(f'Пользователь {user_id} {user_name} авторизовался в боте. Полные данные {a_Message.from_user}.') + return super().StartMessageHandler(a_Message, state) + + def RegisterHandlers(): + super().RegisterHandlers() + self.m_Bot.RegisterMessageHandler( + self.m_StartMessageHandler, + bd_item.GetCheckForCommandsFunc(['start']) + ) + + + +#def GetStartKeyboardButtons(a_Message, a_UserGroups): +# mods = [profile, projects, groups, access, backup, languages] +# return keyboard.MakeKeyboardForMods(mods, a_UserGroups) diff --git a/bot_sys/aiogram_bot.py b/bot_sys/aiogram_bot.py index 9c3927d..2c49bd3 100644 --- a/bot_sys/aiogram_bot.py +++ b/bot_sys/aiogram_bot.py @@ -7,6 +7,7 @@ from aiogram import types from aiogram import Bot from aiogram.dispatcher import Dispatcher from aiogram.contrib.fsm_storage.memory import MemoryStorage +from aiogram.utils import executor class AiogramBot(interfaces.IBot): def __init__(self, a_TelegramBotApiToken, a_BDFileName, a_RootIDs, a_Log): @@ -74,8 +75,11 @@ class AiogramBot(interfaces.IBot): ) def RegisterMessageHandler(self, a_MessageHandler, a_CheckFunc): - self.m_Dispatcher.register_message_handler(a_MessageHandler, a_CheckFunc) + self.m_Dispatcher.register_message_handler(a_MessageHandler, a_CheckFunc) def RegisterCallbackHandler(self, a_CallbackHandler, a_CheckFunc): - self.m_Dispatcher.register_callback_query_handler(a_CallbackHandler, a_CheckFunc) + self.m_Dispatcher.register_callback_query_handler(a_CallbackHandler, a_CheckFunc) + + def StartPolling(self): + executor.start_polling(self.m_Dispatcher) diff --git a/bot_sys/bot_messages.py b/bot_sys/bot_messages.py new file mode 100644 index 0000000..c84b528 --- /dev/null +++ b/bot_sys/bot_messages.py @@ -0,0 +1,68 @@ +#-*-coding utf-8-*- +# Общественное достояние, 2023, Алексей Безбородов (Alexei Bezborodov) + +# Работа с сообщениями + +class BotMessage: + def __init__(self, a_BotMessages, a_MessageName : str, a_MessageDesc : str, a_Language : str, a_PhotoID : str, a_DateTime): + self.m_BotMessages = a_BotMessages + self.m_MessageName = a_MessageName + self.m_MessageDesc = a_MessageDesc + self.m_Language = a_Language + self.m_PhotoID = a_PhotoID + self.m_DateTime = a_DateTime + + def GetName(): + return self.m_MessageName + + def GetDesc(): + return self.m_MessageDesc + + def GetLanguage(): + return self.m_Language + + def GetPhotoID(): + return self.m_PhotoID + + def __str__(self): + msg = GetMessageForLang(self.m_Language) + return msg.GetDesc() + + def GetMessageForLang(self, a_Language): + last_update = self.m_BotMessages.m_LastUpdate + new_msg = self + if self.m_DateTime < last_update: + msg = self.m_BotMessages.GetMessages() + if not msg.get(a_Language, None): + a_Language = self.m_Language + if not msg.get(a_Language, None): + a_Language = self.m_BotMessages.a_DefaultLanguage + new_msg = msg[a_Language].get(self.m_MessageName, self) + if a_Language == self.m_Language: + self.m_MessageDesc = new_msg.m_MessageDesc + self.m_Language = new_msg.m_Language + self.m_PhotoID = new_msg.m_PhotoID + self.m_DateTime = new_msg.m_DateTime + return new_msg + +class BotMessages: + def __init__(self, a_DefaultLanguage): + self.a_DefaultLanguage = a_DefaultLanguage + self.m_Messages = {} + self.m_LastUpdate = None + + def GetMessages(): + return self.m_Messages + + def UpdateSignal(a_DateTime): + self.m_LastUpdate = a_DateTime + + def CreateMessage(a_MessageName, a_MessageDesc, a_DateTime): + cur_msg = BotMessage(a_MessageName, a_MessageDesc, self.a_DefaultLanguage, 0, a_DateTime) + msg = GetMessages() + if not msg.get(self.a_DefaultLanguage, None): + msg[self.a_DefaultLanguage] = {} + if not msg[self.a_DefaultLanguage].get(a_MessageName, None): + msg[self.a_DefaultLanguage][a_MessageName] = cur_msg + return cur_msg + diff --git a/bot_sys/interfaces.py b/bot_sys/interfaces.py index e39af40..3638f12 100644 --- a/bot_sys/interfaces.py +++ b/bot_sys/interfaces.py @@ -39,3 +39,8 @@ class IBot(ABC): @abstractmethod def RegisterCallbackHandler(self, a_CallbackHandler, a_CheckFunc): pass + + @abstractmethod + def StartPolling(self): + pass + diff --git a/main.py b/main.py index f91a227..dee9567 100644 --- a/main.py +++ b/main.py @@ -4,36 +4,43 @@ log_start_message = 'Бот успешно запущен!' import os -from aiogram import Bot, types -from aiogram.utils import executor -from aiogram.dispatcher import Dispatcher -from aiogram.contrib.fsm_storage.memory import MemoryStorage -import sqlite3 -from bot_sys import config, log, bot_bd, user_access, user_messages -from bot_modules import profile, start, projects, groups, access, backup, tasks, needs, comments, messages, languages - -storage = MemoryStorage() -bot = Bot(token = config.GetTelegramBotApiToken(), parse_mode = types.ParseMode.HTML) -dp = Dispatcher(bot, storage = storage) + +from bot_sys import config, log, bot_bd, user_access, aiogram_bot, bot_messages +from bot_modules import mod_agregator, start #, projects, groups, access, backup, tasks, needs, comments, messages, profile, languages + +g_Log = log +g_Bot = aiogram_bot.AiogramBot(config.GetTelegramBotApiToken(), bot_bd.GetBDFileName(), config.GetRootIDs(), g_Log): + +default_language = 'ru' + +g_BotMessages = bot_messages.BotMessages(default_language) +g_BotButtons = bot_messages.BotMessages(default_language) + +g_ModuleAgregator = mod_agregator.ModuleAgregator() + +mod_start = start.ModuleStart([], g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) +g_ModuleAgregator.AddModule(mod_start) # Первичная инициализация модулей. Все модули должны быть прописаны в списке modules -modules = [tasks, access, profile, start, projects, groups, backup, needs, comments, messages, languages] +modules = g_ModuleAgregator.GetModList() # [start] #tasks, access, profile, projects, groups, backup, needs, comments, messages, languages] -init_bd_cmd = [] +init_bd_cmds = [] for m in modules: c = m.GetInitBDCommands() if not c is None: - init_bd_cmd += c + init_bd_cmds += c # Первичная инициализация базы данных -bot_bd.BDExecute(init_bd_cmd) +for c in init_bd_cmds: + g_Bot.SQLRequest(c, commit = True) -user_messages.UpdateSignal(log.GetTimeNow()) +g_BotMessages.UpdateSignal(g_Log.GetTimeNow()) +g_BotButtons.UpdateSignal(g_Log.GetTimeNow()) -languages.FlushLanguages() -messages.FlushMessages() +#languages.FlushLanguages() +#messages.FlushMessages() for m in modules: - m.RegisterHandlers(dp) + m.RegisterHandlers() # Юнит тесты модулей и файлов test_mods = [user_access] @@ -43,6 +50,6 @@ for m in test_mods: if __name__ == '__main__': # os.system('clear') # os.system('cls') - log.Success(log_start_message) + g_Log.Success(log_start_message) -executor.start_polling(dp) +g_Bot.StartPolling() diff --git a/template/bd_item.py b/template/bd_item.py index 1c6e1e0..610c04f 100644 --- a/template/bd_item.py +++ b/template/bd_item.py @@ -33,6 +33,9 @@ def GetCheckForPrefixFunc(a_Prefix): def GetCheckForTextFunc(a_Text): return lambda x: x.text == a_Text +def GetCheckForCommandsFunc(a_Commands): + return lambda x: x.commands == a_Commands + def GetKeyDataFromCallbackMessage(a_Message, a_Prefix): key_item_id = None if a_Prefix and hasattr(a_Message, 'data'): diff --git a/template/simple_message.py b/template/simple_message.py index 5f848b8..cfe8da3 100644 --- a/template/simple_message.py +++ b/template/simple_message.py @@ -8,9 +8,8 @@ from bot_modules import access from aiogram import types class WorkFuncResult(): - def __init__(self, a_StringMessage : str, photo_id = None, item_access = None): - self.string_message = a_StringMessage - self.photo_id = photo_id + def __init__(self, a_BotMessage, item_access = None): + self.m_BotMessage = a_BotMessage self.item_access = item_access def InfoMessageTemplate(a_Bot, a_HelpMessage, a_GetButtonsFunc, a_GetInlineButtonsFunc, a_AccessFunc, access_mode = user_access.AccessMode.VIEW): @@ -39,6 +38,7 @@ def SimpleMessageTemplate(a_Bot, a_WorkFunc, a_GetButtonsFunc, a_GetInlineButton async def SimpleMessage(a_Message : types.message, state = None): user_id = str(a_Message.from_user.id) + lang = str(a_Message.from_user.language_code) user_groups = a_Bot.GetUserGroupData(user_id) if not user_access.CheckAccess(a_Bot.GetRootIDs(), a_AccessFunc(), user_groups, access_mode): return await AccessDeniedMessage(user_id, a_Message, user_groups) @@ -47,17 +47,19 @@ def SimpleMessageTemplate(a_Bot, a_WorkFunc, a_GetButtonsFunc, a_GetInlineButton if res is None: return - msg = res.string_message + msg = res.m_BotMessage if msg is None: return if not res.item_access is None and not user_access.CheckAccess(a_Bot.GetRootIDs(), res.item_access, user_groups, access_mode): return await AccessDeniedMessage(user_id, a_Message, user_groups) + msg = msg.GetMessageForLang(lang) + await a_Bot.SendMessage( user_id, - msg, - res.photo_id, + msg.GetDesc(), + msg.GetPhotoID(), ProxyGetButtonsTemplate(a_GetInlineButtonsFunc)(a_Message, user_groups), ProxyGetButtonsTemplate(a_GetButtonsFunc)(a_Message, user_groups) ) -- 2.11.0 From 20600710be68c3db4a914a20cac5f713d54e3f18 Mon Sep 17 00:00:00 2001 From: Alexei Date: Sat, 13 May 2023 22:30:39 +0300 Subject: [PATCH 04/25] =?UTF-8?q?=D0=9C=D0=BE=D0=B4=D1=83=D0=BB=D1=8C=20?= =?UTF-8?q?=D1=81=D1=82=D0=B0=D1=80=D1=82=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=B0=D0=B5=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot_modules/access_utils.py | 29 +++++++++++++++++ bot_modules/mod_agregator.py | 8 ++--- bot_modules/mod_interface.py | 10 +++--- bot_modules/mod_simple_message.py | 36 +++++++++++----------- bot_modules/start.py | 23 ++++++++------ bot_sys/aiogram_bot.py | 65 +++++++++++++-------------------------- bot_sys/bot_messages.py | 18 +++++------ bot_sys/interfaces.py | 20 +++--------- bot_sys/user_access.py | 23 ++++++++++---- main.py | 2 +- template/simple_message.py | 6 ++-- 11 files changed, 125 insertions(+), 115 deletions(-) diff --git a/bot_modules/access_utils.py b/bot_modules/access_utils.py index abc3531..07248de 100644 --- a/bot_modules/access_utils.py +++ b/bot_modules/access_utils.py @@ -3,6 +3,8 @@ # Права пользователей. Утилиты +from bot_sys import user_access, bot_bd + table_name = 'module_access' mod_name_field = 'modName' moduleaccess_field = 'modAccess' @@ -10,3 +12,30 @@ mod_default_access_field = 'itemDefaultAccess' def GetAccessForModuleRequest(module_name, access, default_access): return f"INSERT OR IGNORE INTO {table_name} ({mod_name_field}, {moduleaccess_field}, {mod_default_access_field}) VALUES ('{module_name}', '{access}', '{default_access}');" + +def GetUserGroupData(a_Bot, a_UserID): + def GetGroupNamesForUser(a_UserID): + return a_Bot.SQLRequest('SELECT groupName FROM user_groups WHERE group_id=(SELECT group_id FROM user_in_groups WHERE user_id = ?)', param = [a_UserID]) + r = GetGroupNamesForUser(a_UserID) + groups = [] + for i in r: + if len(i) > 0: + groups += [i[0]] + return user_access.UserGroups(a_UserID, groups) + +def GetModulesAccessList(a_Bot): + return bot_bd.RequestSelectTemplate(a_Bot.m_BDFileName, table_name)() + +def GetAccessForModule(a_Bot, a_ModuleName): + alist = GetModulesAccessList(a_Bot) + for i in alist: + if i[0] == a_ModuleName: + return i[1] + return '' + +def GetItemDefaultAccessForModule(a_Bot, a_ModuleName): + alist = GetModulesAccessList(a_Bot) + for i in alist: + if i[0] == a_ModuleName: + return i[2] + return '' diff --git a/bot_modules/mod_agregator.py b/bot_modules/mod_agregator.py index 715609a..f2e3306 100644 --- a/bot_modules/mod_agregator.py +++ b/bot_modules/mod_agregator.py @@ -5,11 +5,11 @@ class ModuleAgregator: def __init__(self): self.m_Modules = {} - def GetModule(a_ModName): + def GetModule(self, a_ModName): return self.m_Modules[a_ModName] - def AddModule(a_Module): + def AddModule(self, a_Module): self.m_Modules[a_Module.GetName()] = a_Module - def GetModList(): - self.m_Modules.items() + def GetModList(self): + return self.m_Modules.values() diff --git a/bot_modules/mod_interface.py b/bot_modules/mod_interface.py index 026deb3..3423c78 100644 --- a/bot_modules/mod_interface.py +++ b/bot_modules/mod_interface.py @@ -5,21 +5,21 @@ from abc import ABC, abstractmethod class IModule(ABC): @abstractmethod - def GetName(): + def GetName(self): pass @abstractmethod - def GetInitBDCommands(): + def GetInitBDCommands(self): pass @abstractmethod - def GetAccess(): + def GetAccess(self): pass @abstractmethod - def GetModuleButtons(): + def GetModuleButtons(self): pass @abstractmethod - def RegisterHandlers(): + def RegisterHandlers(self): pass diff --git a/bot_modules/mod_simple_message.py b/bot_modules/mod_simple_message.py index 88b51c7..f7030bf 100644 --- a/bot_modules/mod_simple_message.py +++ b/bot_modules/mod_simple_message.py @@ -3,12 +3,12 @@ # Простой модуль с одним сообщением -from bot_sys import keyboard, user_access -from bot_modules import access_utils -from template import simple_message +from bot_sys import keyboard, user_access, keyboard +from bot_modules import access_utils, mod_interface +from template import simple_message, bd_item class SimpleMessageModule(mod_interface.IModule): - def __init__(self, a_StartMessage, a_StartButtonName, a_InitAccess, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log): + def __init__(self, a_StartMessage, a_StartButtonName, a_InitAccess, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log): self.m_ChildModuleNameList = a_ChildModuleNameList self.m_InitAccess = a_InitAccess self.m_Bot = a_Bot @@ -17,11 +17,11 @@ class SimpleMessageModule(mod_interface.IModule): self.m_BotButtons = a_BotButtons self.m_Log = a_Log - self.m_StartButtonName = CreateButton(f'{GetName()}_start', a_StartButtonName) - self.m_StartMessage = CreateMessage(f'{GetName()}_start', a_StartMessage) + self.m_StartButtonName = self.CreateButton(f'{self.GetName()}_start', a_StartButtonName) + self.m_StartMessage = self.CreateMessage(f'{self.GetName()}_start', a_StartMessage) async def StartMessageHandler(a_Message, state = None): - return self.StartMessageHandler(a_Message, state) + return await self.StartMessageHandler(a_Message, state) self.m_StartMessageHandlerFunc = StartMessageHandler def GetAccess(): @@ -41,18 +41,18 @@ class SimpleMessageModule(mod_interface.IModule): ) # Основной обработчик главного сообщения - async def StartMessageHandler(a_Message, state = None): + async def StartMessageHandler(self, a_Message, state = None): return simple_message.WorkFuncResult(self.m_StartMessage) - def CreateMessage(a_MessageName, a_MessageDesc): + def CreateMessage(self, a_MessageName, a_MessageDesc): msg = self.m_BotMessages.CreateMessage(a_MessageName, a_MessageDesc, self.m_Log.GetTimeNow()) return msg - def CreateButton(a_ButtonName, a_ButtonDesc): + def CreateButton(self, a_ButtonName, a_ButtonDesc): btn = self.m_BotButtons.CreateMessage(a_ButtonName, a_ButtonDesc, self.m_Log.GetTimeNow()) return btn - def GetStartKeyboardButtons(a_Message, a_UserGroups): + def GetStartKeyboardButtons(self, a_Message, a_UserGroups): def GetButtons(a_ModNameList): buttons = [] for n in a_ModNameList: @@ -63,22 +63,22 @@ class SimpleMessageModule(mod_interface.IModule): return buttons buttons = GetButtons(self.m_ChildModuleNameList) - return MakeButtons(buttons, a_UserGroups) + return keyboard.MakeButtons(buttons, a_UserGroups) - def GetInitBDCommands(): + def GetInitBDCommands(self): return [ - access_utils.GetAccessForModuleRequest(GetName(), self.m_InitAccess, self.m_InitAccess), + access_utils.GetAccessForModuleRequest(self.GetName(), self.m_InitAccess, self.m_InitAccess), ] - def GetAccess(): - return self.m_Bot.GetAccessForModule(module_name) + def GetAccess(self): + return access_utils.GetAccessForModule(self.m_Bot, self.GetName()) - def GetModuleButtons(): + def GetModuleButtons(self): return [ keyboard.ButtonWithAccess(self.m_StartButtonName, user_access.AccessMode.VIEW, GetAccess()), ] - def RegisterHandlers(): + def RegisterHandlers(self): self.m_Bot.RegisterMessageHandler( self.m_StartMessageHandler, bd_item.GetCheckForTextFunc(self.m_StartButtonName) diff --git a/bot_modules/start.py b/bot_modules/start.py index ef6ced9..fab84aa 100644 --- a/bot_modules/start.py +++ b/bot_modules/start.py @@ -5,37 +5,40 @@ from bot_sys import user_access from bot_modules import mod_simple_message +from template import bd_item -class ModuleStart(mod_simple_message.SimpleMessageModule): - def __init__(self, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log): - msg = ''' +start_message = ''' Добро пожаловать! Выберите возможные действия на кнопках ниже ⌨''' + +class ModuleStart(mod_simple_message.SimpleMessageModule): + def __init__(self, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log): start_menu_button_name = "☰ Главное меню" a_InitAccess = f'{user_access.user_access_group_all}=+' - super().__init__(self, msg, start_menu_button_name, a_InitAccess, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log) + super().__init__(start_message, start_menu_button_name, a_InitAccess, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log) - def GetName(): + def GetName(self): return 'start' # Основной обработчик главного сообщения - async def StartMessageHandler(a_Message, state = None): + async def StartMessageHandler(self, a_Message, state = None): user_id = str(a_Message.from_user.id) user_name = str(a_Message.from_user.username) first_name = str(a_Message.from_user.first_name) last_name = str(a_Message.from_user.last_name) is_bot = str(a_Message.from_user.is_bot) language_code = str(a_Message.from_user.language_code) - profile.AddUser(user_id, user_name, first_name, last_name, is_bot, language_code) + #profile.AddUser(user_id, user_name, first_name, last_name, is_bot, language_code) self.m_Log.Info(f'Пользователь {user_id} {user_name} авторизовался в боте. Полные данные {a_Message.from_user}.') - return super().StartMessageHandler(a_Message, state) + return await super().StartMessageHandler(a_Message, state) - def RegisterHandlers(): + def RegisterHandlers(self): super().RegisterHandlers() self.m_Bot.RegisterMessageHandler( self.m_StartMessageHandler, - bd_item.GetCheckForCommandsFunc(['start']) + None, + commands = ['start'] ) diff --git a/bot_sys/aiogram_bot.py b/bot_sys/aiogram_bot.py index 2c49bd3..a2994f8 100644 --- a/bot_sys/aiogram_bot.py +++ b/bot_sys/aiogram_bot.py @@ -1,7 +1,7 @@ #-*-coding utf-8-*- # Общественное достояние, 2023, Алексей Безбородов (Alexei Bezborodov) -from bot_sys import interfaces, bot_bd, keyboard +from bot_sys import interfaces, bot_bd, keyboard, user_access from aiogram import types from aiogram import Bot @@ -17,68 +17,47 @@ class AiogramBot(interfaces.IBot): self.m_Log = a_Log self.m_TBot = Bot(token=self.m_TelegramBotApiToken, parse_mode = types.ParseMode.HTML) self.m_Storage = MemoryStorage() - self.m_Dispatcher = Dispatcher(self.m_TBot, storage = storage) + self.m_Dispatcher = Dispatcher(self.m_TBot, storage = self.m_Storage) - def GetRootIDs(): + def GetRootIDs(self): return self.m_RootIDs - def GetLog(): + def GetLog(self): return self.m_Log def SQLRequest(self, a_Request : str, commit = False, return_error = False, param = None): return bot_bd.SQLRequest(self.m_BDFileName, a_Request, commit = commit, return_error = return_error, param = param) - def GetUserGroupData(a_UserID): - def GetGroupNamesForUser(a_UserID): - return SQLRequest('SELECT groupName FROM user_groups WHERE group_id=(SELECT group_id FROM user_in_groups WHERE user_id = ?)', param = [a_UserID]) - r = GetGroupNamesForUser(a_UserID) - groups = [] - for i in r: - if len(i) > 0: - groups += [i[0]] - return user_access.UserGroups(a_UserID, groups) - - def GetModulesAccessList(): - return bot_bd.RequestSelectTemplate(self.m_BDFileName, table_name)() - - def GetAccessForModule(a_ModuleName): - alist = GetModulesAccessList() - for i in alist: - if i[0] == a_ModuleName: - return i[1] - return '' - - def GetItemDefaultAccessForModule(a_ModuleName): - alist = GetModulesAccessList() - for i in alist: - if i[0] == a_ModuleName: - return i[2] - return '' - async def SendMessage(self, a_UserID, a_Message, a_PhotoIDs, a_InlineKeyboardButtons, a_KeyboardButtons): inline_keyboard = keyboard.MakeAiogramInlineKeyboard(a_InlineKeyboardButtons) - keyboard = keyboard.MakeAiogramKeyboard(a_KeyboardButtons) - if not keyboard: - keyboard = inline_keyboard - if a_PhotoIDs and a_PhotoIDs != 0 or a_PhotoIDs != '0': - self.m_TBot.send_photo( + base_keyboard = keyboard.MakeAiogramKeyboard(a_KeyboardButtons) + if a_InlineKeyboardButtons: + base_keyboard = inline_keyboard + if a_PhotoIDs and a_PhotoIDs != 0 and a_PhotoIDs != '0': + await self.m_TBot.send_photo( a_UserID, a_PhotoIDs, a_Message, - reply_markup = keyboard + reply_markup = base_keyboard ) else: - self.m_TBot.send_message( + await self.m_TBot.send_message( a_UserID, a_Message, - reply_markup = keyboard + reply_markup = base_keyboard ) - def RegisterMessageHandler(self, a_MessageHandler, a_CheckFunc): - self.m_Dispatcher.register_message_handler(a_MessageHandler, a_CheckFunc) + def RegisterMessageHandler(self, a_MessageHandler, a_CheckFunc, commands=None, regexp=None, content_types=None, state=None): + if a_CheckFunc: + self.m_Dispatcher.register_message_handler(a_MessageHandler, a_CheckFunc, commands=commands, regexp=regexp, content_types=content_types, state=state) + else: + self.m_Dispatcher.register_message_handler(a_MessageHandler, commands=commands, regexp=regexp, content_types=content_types, state=state) - def RegisterCallbackHandler(self, a_CallbackHandler, a_CheckFunc): - self.m_Dispatcher.register_callback_query_handler(a_CallbackHandler, a_CheckFunc) + def RegisterCallbackHandler(self, a_CallbackHandler, a_CheckFunc, commands=None, regexp=None, content_types=None, state=None): + if a_CheckFunc: + self.register_callback_query_handler.register_message_handler(a_CallbackHandler, a_CheckFunc, commands=commands, regexp=regexp, content_types=content_types, state=state) + else: + self.register_callback_query_handler.register_message_handler(a_CallbackHandler, commands=commands, regexp=regexp, content_types=content_types, state=state) def StartPolling(self): executor.start_polling(self.m_Dispatcher) diff --git a/bot_sys/bot_messages.py b/bot_sys/bot_messages.py index c84b528..ef1fb34 100644 --- a/bot_sys/bot_messages.py +++ b/bot_sys/bot_messages.py @@ -12,16 +12,16 @@ class BotMessage: self.m_PhotoID = a_PhotoID self.m_DateTime = a_DateTime - def GetName(): + def GetName(self): return self.m_MessageName - def GetDesc(): + def GetDesc(self): return self.m_MessageDesc - def GetLanguage(): + def GetLanguage(self): return self.m_Language - def GetPhotoID(): + def GetPhotoID(self): return self.m_PhotoID def __str__(self): @@ -51,15 +51,15 @@ class BotMessages: self.m_Messages = {} self.m_LastUpdate = None - def GetMessages(): + def GetMessages(self): return self.m_Messages - def UpdateSignal(a_DateTime): + def UpdateSignal(self, a_DateTime): self.m_LastUpdate = a_DateTime - def CreateMessage(a_MessageName, a_MessageDesc, a_DateTime): - cur_msg = BotMessage(a_MessageName, a_MessageDesc, self.a_DefaultLanguage, 0, a_DateTime) - msg = GetMessages() + def CreateMessage(self, a_MessageName, a_MessageDesc, a_DateTime): + cur_msg = BotMessage(self, a_MessageName, a_MessageDesc, self.a_DefaultLanguage, 0, a_DateTime) + msg = self.GetMessages() if not msg.get(self.a_DefaultLanguage, None): msg[self.a_DefaultLanguage] = {} if not msg[self.a_DefaultLanguage].get(a_MessageName, None): diff --git a/bot_sys/interfaces.py b/bot_sys/interfaces.py index 3638f12..d57fd92 100644 --- a/bot_sys/interfaces.py +++ b/bot_sys/interfaces.py @@ -5,11 +5,11 @@ from abc import ABC, abstractmethod class IBot(ABC): @abstractmethod - def GetRootIDs(): + def GetRootIDs(self): pass @abstractmethod - def GetLog(): + def GetLog(self): pass @abstractmethod @@ -17,27 +17,15 @@ class IBot(ABC): pass @abstractmethod - def GetUserGroupData(a_UserID): - pass - - @abstractmethod - def GetAccessForModule(a_ModuleName): - pass - - @abstractmethod - def GetItemDefaultAccessForModule(a_ModuleName): - pass - - @abstractmethod async def SendMessage(self, a_UserID, a_Message, a_PhotoIDs, a_InlineKeyboardButtons, a_KeyboardButtons): pass @abstractmethod - def RegisterMessageHandler(self, a_MessageHandler, a_CheckFunc): + def RegisterMessageHandler(self, a_MessageHandler, a_CheckFunc, commands=None, regexp=None, content_types=None, state=None): pass @abstractmethod - def RegisterCallbackHandler(self, a_CallbackHandler, a_CheckFunc): + def RegisterCallbackHandler(self, a_CallbackHandler, a_CheckFunc, commands=None, regexp=None, content_types=None, state=None): pass @abstractmethod diff --git a/bot_sys/user_access.py b/bot_sys/user_access.py index 12e3c18..c4fbd67 100644 --- a/bot_sys/user_access.py +++ b/bot_sys/user_access.py @@ -83,12 +83,23 @@ def Test(): assert CheckAccess(roots, '1234=-', UserGroups('1234', []), am) assert CheckAccess(roots, '1234=+;gr1=+', UserGroups('1234', ['gr1']), am) assert CheckAccess(roots, '1234=-;gr1=+', UserGroups('1234', ['gr1']), am) - assert CheckAccess(roots, '1234=+', UserGroups('123', []), am) - assert CheckAccess(roots, '1234=-', UserGroups('123', []), am) - assert CheckAccess(roots, '1234=+;gr1=+', UserGroups('123', ['gr']), am) - assert CheckAccess(roots, '1234=-;gr1=+', UserGroups('123', ['gr']), am) - assert CheckAccess(roots, '1234=+;gr=+', UserGroups('123', ['gr1']), am) - assert CheckAccess(roots, '1234=-;gr=+', UserGroups('123', ['gr1']), am) + assert CheckAccess(roots, '1234=+', UserGroups('1234', []), am) + assert CheckAccess(roots, '1234=-', UserGroups('1234', []), am) + assert CheckAccess(roots, '1234=+;gr1=+', UserGroups('1234', ['gr']), am) + assert CheckAccess(roots, '1234=-;gr1=+', UserGroups('1234', ['gr']), am) + assert CheckAccess(roots, '1234=+;gr=+', UserGroups('1234', ['gr1']), am) + assert CheckAccess(roots, '1234=-;gr=+', UserGroups('1234', ['gr1']), am) + + assert CheckAccess(roots, '123=+', UserGroups('1234', []), am) + assert CheckAccess(roots, '124=-', UserGroups('1234', []), am) + assert CheckAccess(roots, '134=+;gr1=+', UserGroups('1234', ['gr1']), am) + assert CheckAccess(roots, '134=-;gr1=+', UserGroups('1234', ['gr1']), am) + assert CheckAccess(roots, '124=+', UserGroups('1234', []), am) + assert CheckAccess(roots, '124=-', UserGroups('1234', []), am) + assert CheckAccess(roots, '134=+;gr1=+', UserGroups('1234', ['gr']), am) + assert CheckAccess(roots, '134=-;gr1=+', UserGroups('1234', ['gr']), am) + assert CheckAccess(roots, '124=+;gr=+', UserGroups('1234', ['gr1']), am) + assert CheckAccess(roots, '124=-;gr=+', UserGroups('1234', ['gr1']), am) roots = ['12'] for am in AccessMode.ADD, AccessMode.DELETE, AccessMode.EDIT, AccessMode.VIEW, AccessMode.ACCEES_EDIT: diff --git a/main.py b/main.py index dee9567..c93b3f0 100644 --- a/main.py +++ b/main.py @@ -9,7 +9,7 @@ from bot_sys import config, log, bot_bd, user_access, aiogram_bot, bot_messages from bot_modules import mod_agregator, start #, projects, groups, access, backup, tasks, needs, comments, messages, profile, languages g_Log = log -g_Bot = aiogram_bot.AiogramBot(config.GetTelegramBotApiToken(), bot_bd.GetBDFileName(), config.GetRootIDs(), g_Log): +g_Bot = aiogram_bot.AiogramBot(config.GetTelegramBotApiToken(), bot_bd.GetBDFileName(), config.GetRootIDs(), g_Log) default_language = 'ru' diff --git a/template/simple_message.py b/template/simple_message.py index cfe8da3..0a5f4a5 100644 --- a/template/simple_message.py +++ b/template/simple_message.py @@ -4,7 +4,7 @@ # Простые информационные сообщения from bot_sys import user_access -from bot_modules import access +from bot_modules import access, access_utils from aiogram import types class WorkFuncResult(): @@ -20,7 +20,7 @@ def InfoMessageTemplate(a_Bot, a_HelpMessage, a_GetButtonsFunc, a_GetInlineButto def SimpleMessageTemplate(a_Bot, a_WorkFunc, a_GetButtonsFunc, a_GetInlineButtonsFunc, a_AccessFunc, access_mode = user_access.AccessMode.VIEW): def ProxyGetButtonsTemplate(a_GetButtonsFunc): - def ReturnNone(): + def ReturnNone(a_Message, user_groups): return None if a_GetButtonsFunc: return a_GetButtonsFunc @@ -39,7 +39,7 @@ def SimpleMessageTemplate(a_Bot, a_WorkFunc, a_GetButtonsFunc, a_GetInlineButton async def SimpleMessage(a_Message : types.message, state = None): user_id = str(a_Message.from_user.id) lang = str(a_Message.from_user.language_code) - user_groups = a_Bot.GetUserGroupData(user_id) + user_groups = access_utils.GetUserGroupData(a_Bot, user_id) if not user_access.CheckAccess(a_Bot.GetRootIDs(), a_AccessFunc(), user_groups, access_mode): return await AccessDeniedMessage(user_id, a_Message, user_groups) -- 2.11.0 From 1e016c297dd6af2edfeae7e70d87fee181f7f7d1 Mon Sep 17 00:00:00 2001 From: Alexei Date: Sat, 13 May 2023 23:44:16 +0300 Subject: [PATCH 05/25] =?UTF-8?q?=D0=9C=D0=BE=D0=B4=D1=83=D0=BB=D1=8C=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D1=84=D0=B0=D0=B9=D0=BB=20=D1=80=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D0=B0=D0=B5=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot_modules/mod_simple_message.py | 4 +- bot_modules/profile.py | 134 +++++++++++++++----------------------- bot_modules/start.py | 9 +-- bot_sys/aiogram_bot.py | 9 ++- bot_sys/bot_messages.py | 7 +- bot_sys/keyboard.py | 4 +- main.py | 11 +++- template/bd_item.py | 2 +- template/simple_message.py | 8 +-- 9 files changed, 86 insertions(+), 102 deletions(-) diff --git a/bot_modules/mod_simple_message.py b/bot_modules/mod_simple_message.py index f7030bf..2bc56eb 100644 --- a/bot_modules/mod_simple_message.py +++ b/bot_modules/mod_simple_message.py @@ -35,8 +35,8 @@ class SimpleMessageModule(mod_interface.IModule): self.m_StartMessageHandler = simple_message.SimpleMessageTemplate( self.m_Bot, self.m_StartMessageHandlerFunc, - None, self.m_GetStartKeyboardButtonsFunc, + None, self.m_GetAccessFunc ) @@ -75,7 +75,7 @@ class SimpleMessageModule(mod_interface.IModule): def GetModuleButtons(self): return [ - keyboard.ButtonWithAccess(self.m_StartButtonName, user_access.AccessMode.VIEW, GetAccess()), + keyboard.ButtonWithAccess(self.m_StartButtonName, user_access.AccessMode.VIEW, self.GetAccess()), ] def RegisterHandlers(self): diff --git a/bot_modules/profile.py b/bot_modules/profile.py index b910900..2b958cf 100644 --- a/bot_modules/profile.py +++ b/bot_modules/profile.py @@ -3,12 +3,9 @@ # Профиль пользователя -from bot_sys import bot_bd, log, config, keyboard, user_access, user_messages -from bot_modules import start, access, groups -from template import simple_message - -from aiogram import types -from aiogram.dispatcher import Dispatcher +from bot_sys import user_access, bot_bd +from bot_modules import mod_simple_message, groups, access_utils +from template import bd_item, simple_message # --------------------------------------------------------- # БД @@ -24,30 +21,7 @@ language_code_field = 'userLanguageCode' access_field = 'userAccess' create_datetime_field = 'createDateTime' -init_bd_cmds = [f"""CREATE TABLE IF NOT EXISTS {table_name}( - {key_name} INTEGER, - {name_field} TEXT, - {name1_field} TEXT, - {name2_field} TEXT, - {is_bot_field} TEXT, - {language_code_field} TEXT, - {access_field} TEXT, - {create_datetime_field} TEXT, - UNIQUE({key_name}) -);""", -f"INSERT OR IGNORE INTO module_access (modName, modAccess, itemDefaultAccess) VALUES ('{module_name}', '{user_access.user_access_group_new}=+', '{user_access.user_access_group_new}=+');" -] - -def MSG(a_MessageName, a_MessageDesc): - def UpdateMSG(a_Message : user_messages.Message): - print(a_Message.m_MessageName, a_Message.m_MessageDesc) - globals()[a_Message.m_MessageName] = a_Message - user_messages.MSG(a_MessageName, a_MessageDesc, UpdateMSG, log.GetTimeNow()) - -# --------------------------------------------------------- -# Сообщения - -MSG('profile_message', f''' +start_message = f''' 📰 Профиль: ID: #{key_name} @@ -56,25 +30,41 @@ MSG('profile_message', f''' Имя2: #{name2_field} Код языка: #{language_code_field} Дата добавления: #{create_datetime_field} -''') - -user_profile_button_name = "📰 Профиль" - -# --------------------------------------------------------- -# Работа с кнопками - -def GetStartKeyboardButtons(a_Message, a_UserGroups): - mods = [start] - return keyboard.MakeKeyboardForMods(mods, a_UserGroups) - -# --------------------------------------------------------- -# Обработка сообщений - -async def ProfileOpen(a_Message, state = None): - user_info = GetUserInfo(a_Message.from_user.id) - msg = profile_message - if not user_info is None: - msg = str(msg).\ +''' + +start_menu_button_name = "📰 Профиль" + +class ModuleProfile(mod_simple_message.SimpleMessageModule): + def __init__(self, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log): + a_InitAccess = f'{user_access.user_access_group_new}=+' + super().__init__(start_message, start_menu_button_name, a_InitAccess, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log) + + def GetInitBDCommands(self): + return super(). GetInitBDCommands() + [ + f"""CREATE TABLE IF NOT EXISTS {table_name}( + {key_name} INTEGER, + {name_field} TEXT, + {name1_field} TEXT, + {name2_field} TEXT, + {is_bot_field} TEXT, + {language_code_field} TEXT, + {access_field} TEXT, + {create_datetime_field} TEXT, + UNIQUE({key_name}) + );""", + ] + + def GetName(self): + return module_name + + # Основной обработчик главного сообщения + async def StartMessageHandler(self, a_Message, state = None): + user_info = GetUserInfo(self.m_Bot, a_Message.from_user.id) + lang = str(a_Message.from_user.language_code) + msg = self.m_StartMessage + msg = msg.GetMessageForLang(lang).StaticCopy() + if not user_info is None: + msg.m_MessageDesc = msg.GetDesc().\ replace(f'#{key_name}', str(user_info[0])).\ replace(f'#{name_field}', str(user_info[1])).\ replace(f'#{name1_field}', str(user_info[2])).\ @@ -83,46 +73,28 @@ async def ProfileOpen(a_Message, state = None): replace(f'#{language_code_field}', str(user_info[5])).\ replace(f'#{access_field}', str(user_info[6])).\ replace(f'#{create_datetime_field}', str(user_info[7])) - return simple_message.WorkFuncResult(msg, item_access = str(user_info[6])) - return simple_message.WorkFuncResult(msg) + return simple_message.WorkFuncResult(msg, item_access = str(user_info[6])) + return await super().StartMessageHandler(a_Message, state) + -# --------------------------------------------------------- # Работа с базой данных пользователей # Добавление пользователя, если он уже есть, то игнорируем -def AddUser(a_UserID, a_UserName, a_UserName1, a_UserName2, a_UserIsBot, a_LanguageCode): - bot_bd.SQLRequestToBD(f"INSERT OR IGNORE INTO users ({key_name}, {name_field}, {name1_field}, {name2_field}, {is_bot_field}, {language_code_field}, {access_field}, {create_datetime_field}) VALUES (?, ?, ?, ?, ?, ?, ?, {bot_bd.GetBDDateTimeNow()});", - commit=True, param = (a_UserID, a_UserName, a_UserName1, a_UserName2, a_UserIsBot, a_LanguageCode, access.GetItemDefaultAccessForModule(module_name))) - - user_groups = groups.GetUserGroupData(a_UserID) +def AddUser(a_Bot, a_UserID, a_UserName, a_UserName1, a_UserName2, a_UserIsBot, a_LanguageCode): + a_Bot.SQLRequest(f"INSERT OR IGNORE INTO users ({key_name}, {name_field}, {name1_field}, {name2_field}, {is_bot_field}, {language_code_field}, {access_field}, {create_datetime_field}) VALUES (?, ?, ?, ?, ?, ?, ?, {bot_bd.GetBDDateTimeNow()});", + commit=True, param = (a_UserID, a_UserName, a_UserName1, a_UserName2, a_UserIsBot, a_LanguageCode, access_utils.GetItemDefaultAccessForModule(a_Bot, module_name))) +''' + user_groups = access_utils.GetUserGroupData(a_Bot, a_UserID) # Если пользователь не состоит ни в одной группе, то добавляем его в группу user_access.user_access_group_new if len(user_groups.group_names_list) == 0: - new_group_id = bot_bd.SQLRequestToBD(f'SELECT {groups.key_table_groups_name} FROM {groups.table_groups_name} WHERE {groups.name_table_groups_field} = ?', + new_group_id = a_Bot.SQLRequest(f'SELECT {groups.key_table_groups_name} FROM {groups.table_groups_name} WHERE {groups.name_table_groups_field} = ?', param = [user_access.user_access_group_new]) if new_group_id and new_group_id[0]: - bot_bd.SQLRequestToBD(f"INSERT OR IGNORE INTO {groups.table_user_in_groups_name} ({groups.user_id_field}, {groups.key_table_groups_name}, {groups.access_field}, {groups.create_datetime_field}) VALUES (?, ?, ?, {bot_bd.GetBDDateTimeNow()});", - commit=True, param = (a_UserID, new_group_id[0][0], access.GetItemDefaultAccessForModule(module_name))) - -def GetUserInfo(a_UserID): - user_info = bot_bd.SQLRequestToBD('SELECT * FROM users WHERE user_id = ?', param = [a_UserID]) + a_Bot.SQLRequest(f"INSERT OR IGNORE INTO {groups.table_user_in_groups_name} ({groups.user_id_field}, {groups.key_table_groups_name}, {groups.access_field}, {groups.create_datetime_field}) VALUES (?, ?, ?, {bot_bd.GetBDDateTimeNow()});", + commit=True, param = (a_UserID, new_group_id[0][0], access_utils.GetItemDefaultAccessForModule(a_Bot, module_name))) +''' +def GetUserInfo(a_Bot, a_UserID): + user_info = a_Bot.SQLRequest('SELECT * FROM users WHERE user_id = ?', param = [a_UserID]) if len(user_info) != 0: return user_info[0] return None - -# --------------------------------------------------------- -# API - -# Инициализация БД -def GetInitBDCommands(): - return init_bd_cmds - -def GetAccess(): - return access.GetAccessForModule(module_name) - -# Доступные кнопки -def GetModuleButtons(): - return [keyboard.ButtonWithAccess(user_profile_button_name, user_access.AccessMode.VIEW, GetAccess())] - -# Обработка кнопок -def RegisterHandlers(dp : Dispatcher): - dp.register_message_handler(simple_message.SimpleMessageTemplateLegacy(ProfileOpen, GetStartKeyboardButtons, GetAccess), text = user_profile_button_name) diff --git a/bot_modules/start.py b/bot_modules/start.py index fab84aa..34f3514 100644 --- a/bot_modules/start.py +++ b/bot_modules/start.py @@ -4,7 +4,7 @@ # Стартовое меню from bot_sys import user_access -from bot_modules import mod_simple_message +from bot_modules import mod_simple_message, profile from template import bd_item start_message = ''' @@ -29,7 +29,7 @@ class ModuleStart(mod_simple_message.SimpleMessageModule): last_name = str(a_Message.from_user.last_name) is_bot = str(a_Message.from_user.is_bot) language_code = str(a_Message.from_user.language_code) - #profile.AddUser(user_id, user_name, first_name, last_name, is_bot, language_code) + profile.AddUser(self.m_Bot, user_id, user_name, first_name, last_name, is_bot, language_code) self.m_Log.Info(f'Пользователь {user_id} {user_name} авторизовался в боте. Полные данные {a_Message.from_user}.') return await super().StartMessageHandler(a_Message, state) @@ -42,8 +42,3 @@ class ModuleStart(mod_simple_message.SimpleMessageModule): ) - -#def GetStartKeyboardButtons(a_Message, a_UserGroups): -# mods = [profile, projects, groups, access, backup, languages] -# return keyboard.MakeKeyboardForMods(mods, a_UserGroups) - diff --git a/bot_sys/aiogram_bot.py b/bot_sys/aiogram_bot.py index a2994f8..cf18b35 100644 --- a/bot_sys/aiogram_bot.py +++ b/bot_sys/aiogram_bot.py @@ -29,9 +29,13 @@ class AiogramBot(interfaces.IBot): return bot_bd.SQLRequest(self.m_BDFileName, a_Request, commit = commit, return_error = return_error, param = param) async def SendMessage(self, a_UserID, a_Message, a_PhotoIDs, a_InlineKeyboardButtons, a_KeyboardButtons): - inline_keyboard = keyboard.MakeAiogramInlineKeyboard(a_InlineKeyboardButtons) - base_keyboard = keyboard.MakeAiogramKeyboard(a_KeyboardButtons) + inline_keyboard = None if a_InlineKeyboardButtons: + inline_keyboard = keyboard.MakeAiogramInlineKeyboard(a_InlineKeyboardButtons) + base_keyboard = None + if a_KeyboardButtons: + base_keyboard = keyboard.MakeAiogramKeyboard(a_KeyboardButtons) + if inline_keyboard: base_keyboard = inline_keyboard if a_PhotoIDs and a_PhotoIDs != 0 and a_PhotoIDs != '0': await self.m_TBot.send_photo( @@ -41,6 +45,7 @@ class AiogramBot(interfaces.IBot): reply_markup = base_keyboard ) else: + #print('SendMessage', a_UserID, a_Message, a_PhotoIDs, a_InlineKeyboardButtons, a_KeyboardButtons, base_keyboard) await self.m_TBot.send_message( a_UserID, a_Message, diff --git a/bot_sys/bot_messages.py b/bot_sys/bot_messages.py index ef1fb34..2f8b968 100644 --- a/bot_sys/bot_messages.py +++ b/bot_sys/bot_messages.py @@ -12,6 +12,9 @@ class BotMessage: self.m_PhotoID = a_PhotoID self.m_DateTime = a_DateTime + def StaticCopy(self): + return BotMessage(None, self.m_MessageName, self.m_MessageDesc, self.m_Language, self.m_PhotoID, self.m_DateTime) + def GetName(self): return self.m_MessageName @@ -25,10 +28,12 @@ class BotMessage: return self.m_PhotoID def __str__(self): - msg = GetMessageForLang(self.m_Language) + msg = self.GetMessageForLang(self.m_Language) return msg.GetDesc() def GetMessageForLang(self, a_Language): + if not self.m_BotMessages: + return self last_update = self.m_BotMessages.m_LastUpdate new_msg = self if self.m_DateTime < last_update: diff --git a/bot_sys/keyboard.py b/bot_sys/keyboard.py index c114e27..ba3a38e 100644 --- a/bot_sys/keyboard.py +++ b/bot_sys/keyboard.py @@ -37,7 +37,7 @@ def MakeButtons(a_ButtonList : [ButtonWithAccess], a_UserGroups): buttons = [] for b in a_ButtonList: if user_access.CheckAccessString(b.access_string, a_UserGroups, b.access_mode): - buttons += [types.KeyboardButton(b.label)] + buttons += [types.KeyboardButton(str(b.label))] step = GetButtonInRowCount(len(buttons)) return Chunks(buttons, step) @@ -69,7 +69,7 @@ def MakeAiogramInlineKeyboard(a_ButtonList : [InlineButton]): for row in a_ButtonList: r = [] for b in row: - r += [types.InlineKeyboardButton(text = b.label, callback_data = b.callback_data)] + r += [types.InlineKeyboardButton(text = str(b.label), callback_data = b.callback_data)] buttons += r inline_keyboard = InlineKeyboardMarkup(inline_keyboard=buttons) return inline_keyboard diff --git a/main.py b/main.py index c93b3f0..0f29a7c 100644 --- a/main.py +++ b/main.py @@ -6,7 +6,7 @@ log_start_message = 'Бот успешно запущен!' import os from bot_sys import config, log, bot_bd, user_access, aiogram_bot, bot_messages -from bot_modules import mod_agregator, start #, projects, groups, access, backup, tasks, needs, comments, messages, profile, languages +from bot_modules import mod_agregator, start, profile #, projects, groups, access, backup, tasks, needs, comments, messages, , languages g_Log = log g_Bot = aiogram_bot.AiogramBot(config.GetTelegramBotApiToken(), bot_bd.GetBDFileName(), config.GetRootIDs(), g_Log) @@ -18,7 +18,13 @@ g_BotButtons = bot_messages.BotMessages(default_language) g_ModuleAgregator = mod_agregator.ModuleAgregator() -mod_start = start.ModuleStart([], g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) +mod_start_name = 'start' + +mod_profile = profile.ModuleProfile([mod_start_name], g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) +g_ModuleAgregator.AddModule(mod_profile) + +start_mod_name_list = [mod_profile.GetName()]#, 'projects', 'groups', 'access', 'backup', 'languages'] +mod_start = start.ModuleStart(start_mod_name_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) g_ModuleAgregator.AddModule(mod_start) # Первичная инициализация модулей. Все модули должны быть прописаны в списке modules @@ -40,6 +46,7 @@ g_BotButtons.UpdateSignal(g_Log.GetTimeNow()) #messages.FlushMessages() for m in modules: + print(m) m.RegisterHandlers() # Юнит тесты модулей и файлов diff --git a/template/bd_item.py b/template/bd_item.py index 610c04f..060457d 100644 --- a/template/bd_item.py +++ b/template/bd_item.py @@ -31,7 +31,7 @@ def GetCheckForPrefixFunc(a_Prefix): return lambda x: x.data.startswith(a_Prefix) def GetCheckForTextFunc(a_Text): - return lambda x: x.text == a_Text + return lambda x: x.text == str(a_Text) def GetCheckForCommandsFunc(a_Commands): return lambda x: x.commands == a_Commands diff --git a/template/simple_message.py b/template/simple_message.py index 0a5f4a5..7a56bb3 100644 --- a/template/simple_message.py +++ b/template/simple_message.py @@ -19,11 +19,11 @@ def InfoMessageTemplate(a_Bot, a_HelpMessage, a_GetButtonsFunc, a_GetInlineButto return SimpleMessageTemplate(a_Bot, GetMessage, a_GetButtonsFunc, a_GetInlineButtonsFunc, a_AccessFunc, access_mode = access_mode) def SimpleMessageTemplate(a_Bot, a_WorkFunc, a_GetButtonsFunc, a_GetInlineButtonsFunc, a_AccessFunc, access_mode = user_access.AccessMode.VIEW): - def ProxyGetButtonsTemplate(a_GetButtonsFunc): + def ProxyGetButtonsTemplate(a_GetButtonsFunc1): def ReturnNone(a_Message, user_groups): return None - if a_GetButtonsFunc: - return a_GetButtonsFunc + if a_GetButtonsFunc1: + return a_GetButtonsFunc1 else: return ReturnNone @@ -54,7 +54,7 @@ def SimpleMessageTemplate(a_Bot, a_WorkFunc, a_GetButtonsFunc, a_GetInlineButton if not res.item_access is None and not user_access.CheckAccess(a_Bot.GetRootIDs(), res.item_access, user_groups, access_mode): return await AccessDeniedMessage(user_id, a_Message, user_groups) - msg = msg.GetMessageForLang(lang) + msg = msg.GetMessageForLang(lang).StaticCopy() await a_Bot.SendMessage( user_id, -- 2.11.0 From 0a0171ff398e389ddbe2a1e8e02638c4eb7ea642 Mon Sep 17 00:00:00 2001 From: Alexei Date: Sun, 14 May 2023 08:52:46 +0300 Subject: [PATCH 06/25] Del access_utils --- bot_modules/access.py | 23 +++++++++++++++++++++- bot_modules/access_utils.py | 41 --------------------------------------- bot_modules/groups.py | 13 ++++++++++++- bot_modules/mod_simple_message.py | 14 ++++++------- bot_modules/profile.py | 8 ++++---- template/simple_message.py | 4 ++-- 6 files changed, 47 insertions(+), 56 deletions(-) delete mode 100644 bot_modules/access_utils.py diff --git a/bot_modules/access.py b/bot_modules/access.py index 51fd0e6..e9ce2e2 100644 --- a/bot_modules/access.py +++ b/bot_modules/access.py @@ -106,7 +106,7 @@ moduleaccess_success_edit_message = '''✅ Проект успешно отре # --------------------------------------------------------- # Работа с кнопками - +''' def GetEditAccessKeyboardButtons(a_Message, a_UserGroups): cur_buttons = [ keyboard.ButtonWithAccess(sql_request_button_name, user_access.AccessMode.ACCEES_EDIT, GetAccess()), @@ -204,3 +204,24 @@ def RegisterHandlers(dp : Dispatcher): ) RegisterEdit(edit_moduleaccess_access_button_name, FSMEditAccessItem, moduleaccess_edit_access_message, moduleaccess_field, bd_item.FieldType.text, user_access.AccessMode.ACCEES_EDIT) RegisterEdit(edit_moduleaccess_default_access_button_name, FSMEditDefaultAccessItem, moduleaccess_edit_default_access_message, mod_default_access_field, bd_item.FieldType.text, user_access.AccessMode.EDIT) + +''' +def GetAccessForModuleRequest(module_name, access, default_access): + return f"INSERT OR IGNORE INTO {table_name} ({mod_name_field}, {moduleaccess_field}, {mod_default_access_field}) VALUES ('{module_name}', '{access}', '{default_access}');" + +def GetModulesAccessList(a_Bot): + return bot_bd.RequestSelectTemplate(a_Bot.m_BDFileName, table_name)() + +def GetAccessForModule(a_Bot, a_ModuleName): + alist = GetModulesAccessList(a_Bot) + for i in alist: + if i[0] == a_ModuleName: + return i[1] + return '' + +def GetItemDefaultAccessForModule(a_Bot, a_ModuleName): + alist = GetModulesAccessList(a_Bot) + for i in alist: + if i[0] == a_ModuleName: + return i[2] + return '' diff --git a/bot_modules/access_utils.py b/bot_modules/access_utils.py deleted file mode 100644 index 07248de..0000000 --- a/bot_modules/access_utils.py +++ /dev/null @@ -1,41 +0,0 @@ -# -*- coding: utf8 -*- -# Общественное достояние, 2023, Алексей Безбородов (Alexei Bezborodov) - -# Права пользователей. Утилиты - -from bot_sys import user_access, bot_bd - -table_name = 'module_access' -mod_name_field = 'modName' -moduleaccess_field = 'modAccess' -mod_default_access_field = 'itemDefaultAccess' - -def GetAccessForModuleRequest(module_name, access, default_access): - return f"INSERT OR IGNORE INTO {table_name} ({mod_name_field}, {moduleaccess_field}, {mod_default_access_field}) VALUES ('{module_name}', '{access}', '{default_access}');" - -def GetUserGroupData(a_Bot, a_UserID): - def GetGroupNamesForUser(a_UserID): - return a_Bot.SQLRequest('SELECT groupName FROM user_groups WHERE group_id=(SELECT group_id FROM user_in_groups WHERE user_id = ?)', param = [a_UserID]) - r = GetGroupNamesForUser(a_UserID) - groups = [] - for i in r: - if len(i) > 0: - groups += [i[0]] - return user_access.UserGroups(a_UserID, groups) - -def GetModulesAccessList(a_Bot): - return bot_bd.RequestSelectTemplate(a_Bot.m_BDFileName, table_name)() - -def GetAccessForModule(a_Bot, a_ModuleName): - alist = GetModulesAccessList(a_Bot) - for i in alist: - if i[0] == a_ModuleName: - return i[1] - return '' - -def GetItemDefaultAccessForModule(a_Bot, a_ModuleName): - alist = GetModulesAccessList(a_Bot) - for i in alist: - if i[0] == a_ModuleName: - return i[2] - return '' diff --git a/bot_modules/groups.py b/bot_modules/groups.py index d010d02..d6f3b49 100644 --- a/bot_modules/groups.py +++ b/bot_modules/groups.py @@ -79,7 +79,7 @@ help_button_name = "📄 Информация по группам" # --------------------------------------------------------- # Работа с кнопками - +''' def GetEditGroupKeyboardButtons(a_Message, a_UserGroups): cur_buttons = [ keyboard.ButtonWithAccess(sql_request_button_name, user_access.AccessMode.EDIT, GetAccess()), @@ -128,3 +128,14 @@ def RegisterHandlers(dp : Dispatcher): dp.register_message_handler(simple_message.InfoMessageTemplateLegacy(help_message, GetEditGroupKeyboardButtons, GetAccess), text = help_button_name) sql_request.RequestToBDRegisterHandlers(dp, sql_request_button_name, request_start_message, FSMRequestToBD, GetEditGroupKeyboardButtons, user_access.AccessMode.EDIT, GetAccess) +''' + +def GetUserGroupData(a_Bot, a_UserID): + def GetGroupNamesForUser(a_UserID): + return a_Bot.SQLRequest('SELECT groupName FROM user_groups WHERE group_id=(SELECT group_id FROM user_in_groups WHERE user_id = ?)', param = [a_UserID]) + r = GetGroupNamesForUser(a_UserID) + groups = [] + for i in r: + if len(i) > 0: + groups += [i[0]] + return user_access.UserGroups(a_UserID, groups) diff --git a/bot_modules/mod_simple_message.py b/bot_modules/mod_simple_message.py index 2bc56eb..2e7bd0f 100644 --- a/bot_modules/mod_simple_message.py +++ b/bot_modules/mod_simple_message.py @@ -4,7 +4,7 @@ # Простой модуль с одним сообщением from bot_sys import keyboard, user_access, keyboard -from bot_modules import access_utils, mod_interface +from bot_modules import access, mod_interface from template import simple_message, bd_item class SimpleMessageModule(mod_interface.IModule): @@ -17,8 +17,8 @@ class SimpleMessageModule(mod_interface.IModule): self.m_BotButtons = a_BotButtons self.m_Log = a_Log - self.m_StartButtonName = self.CreateButton(f'{self.GetName()}_start', a_StartButtonName) - self.m_StartMessage = self.CreateMessage(f'{self.GetName()}_start', a_StartMessage) + self.m_StartButtonName = self.CreateButton('start', a_StartButtonName) + self.m_StartMessage = self.CreateMessage('start', a_StartMessage) async def StartMessageHandler(a_Message, state = None): return await self.StartMessageHandler(a_Message, state) @@ -45,11 +45,11 @@ class SimpleMessageModule(mod_interface.IModule): return simple_message.WorkFuncResult(self.m_StartMessage) def CreateMessage(self, a_MessageName, a_MessageDesc): - msg = self.m_BotMessages.CreateMessage(a_MessageName, a_MessageDesc, self.m_Log.GetTimeNow()) + msg = self.m_BotMessages.CreateMessage(f'{self.GetName()}_{a_MessageName}', a_MessageDesc, self.m_Log.GetTimeNow()) return msg def CreateButton(self, a_ButtonName, a_ButtonDesc): - btn = self.m_BotButtons.CreateMessage(a_ButtonName, a_ButtonDesc, self.m_Log.GetTimeNow()) + btn = self.m_BotButtons.CreateMessage(f'{self.GetName()}_{a_ButtonName}', a_ButtonDesc, self.m_Log.GetTimeNow()) return btn def GetStartKeyboardButtons(self, a_Message, a_UserGroups): @@ -67,11 +67,11 @@ class SimpleMessageModule(mod_interface.IModule): def GetInitBDCommands(self): return [ - access_utils.GetAccessForModuleRequest(self.GetName(), self.m_InitAccess, self.m_InitAccess), + access.GetAccessForModuleRequest(self.GetName(), self.m_InitAccess, self.m_InitAccess), ] def GetAccess(self): - return access_utils.GetAccessForModule(self.m_Bot, self.GetName()) + return access.GetAccessForModule(self.m_Bot, self.GetName()) def GetModuleButtons(self): return [ diff --git a/bot_modules/profile.py b/bot_modules/profile.py index 2b958cf..cbb65f1 100644 --- a/bot_modules/profile.py +++ b/bot_modules/profile.py @@ -4,7 +4,7 @@ # Профиль пользователя from bot_sys import user_access, bot_bd -from bot_modules import mod_simple_message, groups, access_utils +from bot_modules import mod_simple_message, groups, access from template import bd_item, simple_message # --------------------------------------------------------- @@ -82,16 +82,16 @@ class ModuleProfile(mod_simple_message.SimpleMessageModule): # Добавление пользователя, если он уже есть, то игнорируем def AddUser(a_Bot, a_UserID, a_UserName, a_UserName1, a_UserName2, a_UserIsBot, a_LanguageCode): a_Bot.SQLRequest(f"INSERT OR IGNORE INTO users ({key_name}, {name_field}, {name1_field}, {name2_field}, {is_bot_field}, {language_code_field}, {access_field}, {create_datetime_field}) VALUES (?, ?, ?, ?, ?, ?, ?, {bot_bd.GetBDDateTimeNow()});", - commit=True, param = (a_UserID, a_UserName, a_UserName1, a_UserName2, a_UserIsBot, a_LanguageCode, access_utils.GetItemDefaultAccessForModule(a_Bot, module_name))) + commit=True, param = (a_UserID, a_UserName, a_UserName1, a_UserName2, a_UserIsBot, a_LanguageCode, access.GetItemDefaultAccessForModule(a_Bot, module_name))) ''' - user_groups = access_utils.GetUserGroupData(a_Bot, a_UserID) + user_groups = access.GetUserGroupData(a_Bot, a_UserID) # Если пользователь не состоит ни в одной группе, то добавляем его в группу user_access.user_access_group_new if len(user_groups.group_names_list) == 0: new_group_id = a_Bot.SQLRequest(f'SELECT {groups.key_table_groups_name} FROM {groups.table_groups_name} WHERE {groups.name_table_groups_field} = ?', param = [user_access.user_access_group_new]) if new_group_id and new_group_id[0]: a_Bot.SQLRequest(f"INSERT OR IGNORE INTO {groups.table_user_in_groups_name} ({groups.user_id_field}, {groups.key_table_groups_name}, {groups.access_field}, {groups.create_datetime_field}) VALUES (?, ?, ?, {bot_bd.GetBDDateTimeNow()});", - commit=True, param = (a_UserID, new_group_id[0][0], access_utils.GetItemDefaultAccessForModule(a_Bot, module_name))) + commit=True, param = (a_UserID, new_group_id[0][0], access.GetItemDefaultAccessForModule(a_Bot, module_name))) ''' def GetUserInfo(a_Bot, a_UserID): user_info = a_Bot.SQLRequest('SELECT * FROM users WHERE user_id = ?', param = [a_UserID]) diff --git a/template/simple_message.py b/template/simple_message.py index 7a56bb3..f8a68a6 100644 --- a/template/simple_message.py +++ b/template/simple_message.py @@ -4,7 +4,7 @@ # Простые информационные сообщения from bot_sys import user_access -from bot_modules import access, access_utils +from bot_modules import access, groups from aiogram import types class WorkFuncResult(): @@ -39,7 +39,7 @@ def SimpleMessageTemplate(a_Bot, a_WorkFunc, a_GetButtonsFunc, a_GetInlineButton async def SimpleMessage(a_Message : types.message, state = None): user_id = str(a_Message.from_user.id) lang = str(a_Message.from_user.language_code) - user_groups = access_utils.GetUserGroupData(a_Bot, user_id) + user_groups = groups.GetUserGroupData(a_Bot, user_id) if not user_access.CheckAccess(a_Bot.GetRootIDs(), a_AccessFunc(), user_groups, access_mode): return await AccessDeniedMessage(user_id, a_Message, user_groups) -- 2.11.0 From 69eaa4af359a0ecf26013cfac415bcbec0e55f5d Mon Sep 17 00:00:00 2001 From: Alexei Date: Sun, 14 May 2023 10:20:31 +0300 Subject: [PATCH 07/25] =?UTF-8?q?=D0=9C=D0=BE=D0=B4=D1=83=D0=BB=D1=8C=20?= =?UTF-8?q?=D0=B1=D1=8D=D0=BA=D0=B0=D0=BF=D0=B0=20=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=B0=D0=B5=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot_modules/backup.py | 116 ++++++++++++++++++++------------------ bot_modules/mod_simple_message.py | 4 +- bot_modules/profile.py | 5 +- bot_modules/start.py | 8 ++- bot_sys/aiogram_bot.py | 19 ++++++- bot_sys/interfaces.py | 6 +- bot_sys/keyboard.py | 5 +- main.py | 10 +++- template/file_message.py | 42 ++++++++------ template/simple_message.py | 42 +++++++------- 10 files changed, 153 insertions(+), 104 deletions(-) diff --git a/bot_modules/backup.py b/bot_modules/backup.py index 800025d..552e036 100644 --- a/bot_modules/backup.py +++ b/bot_modules/backup.py @@ -3,33 +3,22 @@ # Бэкапы пользователя -from bot_sys import bot_bd, log, config, keyboard, user_access -from bot_modules import start, access, groups -from template import file_message, simple_message - -from aiogram import Bot, types - -import sqlite3 - -from aiogram.dispatcher import Dispatcher - -bot = Bot(token=config.GetTelegramBotApiToken(), parse_mode=types.ParseMode.HTML) +from bot_sys import user_access, keyboard +from bot_modules import mod_simple_message, profile +from template import bd_item, file_message # --------------------------------------------------------- # БД module_name = 'backup' -init_bd_cmds = [ -f"INSERT OR IGNORE INTO module_access (modName, modAccess, itemDefaultAccess) VALUES ('{module_name}', '{user_access.user_access_group_new}=-', '{user_access.user_access_group_new}=-');" -] - # --------------------------------------------------------- # Сообщения - -backup_message = ''' +start_message = ''' Здесь вы можете выполнить специальные операции по сервисному обслуживанию ''' +start_menu_button_name = "📦 Резервные копии и логи" + backup_bd_message = ''' 📀 Резервная копия базы данных 🕰 @time @@ -44,44 +33,61 @@ error_backup_message = ''' ❌ Ошибка резервного копирования ''' -backup_button_name = "📦 Резервные копии и логи" backup_bd_button_name = "📀 Резервные копия базы" backup_log_button_name = "📃 Логи" -# --------------------------------------------------------- -# Работа с кнопками - -def GetBackupKeyboardButtons(a_Message, a_UserGroups): - cur_buttons = [ - keyboard.ButtonWithAccess(backup_bd_button_name, user_access.AccessMode.EDIT, GetAccess()), - keyboard.ButtonWithAccess(backup_log_button_name, user_access.AccessMode.EDIT, GetAccess()) - ] - mods = [start] - return keyboard.MakeKeyboard(keyboard.GetButtons(mods) + cur_buttons, a_UserGroups) - -# --------------------------------------------------------- -# Обработка сообщений - -# --------------------------------------------------------- -# Работа с базой данных пользователей - -# --------------------------------------------------------- -# API - -# Инициализация БД -def GetInitBDCommands(): - return init_bd_cmds - -def GetAccess(): - return access.GetAccessForModule(module_name) - -# Доступные кнопки -def GetModuleButtons(): - return [keyboard.ButtonWithAccess(backup_button_name, user_access.AccessMode.VIEW, GetAccess())] - -# Обработка кнопок -def RegisterHandlers(dp : Dispatcher): - dp.register_message_handler(simple_message.InfoMessageTemplateLegacy(backup_message, GetBackupKeyboardButtons, GetAccess), text = backup_button_name) - - dp.register_message_handler(file_message.BackupFileTemplate(bot_bd.GetBDFileName(), backup_bd_message, GetAccess, GetBackupKeyboardButtons, error_backup_message), text = backup_bd_button_name) - dp.register_message_handler(file_message.BackupFileTemplate(log.g_log_file_name, backup_log_message, GetAccess, GetBackupKeyboardButtons, error_backup_message), text = backup_log_button_name) +init_access = f'{user_access.user_access_group_new}=-' + +class ModuleBackup(mod_simple_message.SimpleMessageModule): + def __init__(self, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log): + super().__init__(start_message, start_menu_button_name, init_access, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log) + self.m_BackupBDButtonName = self.CreateButton('backup bd', backup_bd_button_name) + self.m_BackupBDMessage = self.CreateMessage('backup bd', backup_bd_message) + + self.m_BackupLogButtonName = self.CreateButton('backup log', backup_log_button_name) + self.m_BackupLogMessage = self.CreateMessage('backup log', backup_log_message) + + self.m_BackupErrorMessage = self.CreateMessage('backup error', error_backup_message) + + self.m_BackupBDMessageHandler = file_message.BackupFileTemplate( + self.m_Bot, + self.m_Bot.m_BDFileName, + self.m_BackupBDMessage, + self.m_GetAccessFunc, + self.m_GetStartKeyboardButtonsFunc, + None, + self.m_BackupErrorMessage, + access_mode = user_access.AccessMode.EDIT + ) + self.m_BackupLogMessageHandler = file_message.BackupFileTemplate( + self.m_Bot, + self.m_Bot.GetLog().g_log_file_name, + self.m_BackupLogMessage, + self.m_GetAccessFunc, + self.m_GetStartKeyboardButtonsFunc, + None, + self.m_BackupErrorMessage, + access_mode = user_access.AccessMode.EDIT + ) + + def GetName(self): + return module_name + + def GetStartKeyboardButtons(self, a_Message, a_UserGroups): + mod_buttons = super().GetStartKeyboardButtons(a_Message, a_UserGroups) + cur_buttons = [ + keyboard.ButtonWithAccess(self.m_BackupBDButtonName, user_access.AccessMode.EDIT, self.GetAccess()), + keyboard.ButtonWithAccess(self.m_BackupLogButtonName , user_access.AccessMode.EDIT, self.GetAccess()) + ] + return mod_buttons + keyboard.MakeButtons(cur_buttons, a_UserGroups) + + def RegisterHandlers(self): + super().RegisterHandlers() + self.m_Bot.RegisterMessageHandler( + self.m_BackupBDMessageHandler, + bd_item.GetCheckForTextFunc(self.m_BackupBDButtonName) + ) + self.m_Bot.RegisterMessageHandler( + self.m_BackupLogMessageHandler, + bd_item.GetCheckForTextFunc(self.m_BackupLogButtonName) + ) diff --git a/bot_modules/mod_simple_message.py b/bot_modules/mod_simple_message.py index 2e7bd0f..c3e6995 100644 --- a/bot_modules/mod_simple_message.py +++ b/bot_modules/mod_simple_message.py @@ -45,11 +45,11 @@ class SimpleMessageModule(mod_interface.IModule): return simple_message.WorkFuncResult(self.m_StartMessage) def CreateMessage(self, a_MessageName, a_MessageDesc): - msg = self.m_BotMessages.CreateMessage(f'{self.GetName()}_{a_MessageName}', a_MessageDesc, self.m_Log.GetTimeNow()) + msg = self.m_BotMessages.CreateMessage(f'{self.GetName()} {a_MessageName}', a_MessageDesc, self.m_Log.GetTimeNow()) return msg def CreateButton(self, a_ButtonName, a_ButtonDesc): - btn = self.m_BotButtons.CreateMessage(f'{self.GetName()}_{a_ButtonName}', a_ButtonDesc, self.m_Log.GetTimeNow()) + btn = self.m_BotButtons.CreateMessage(f'{self.GetName()} {a_ButtonName}', a_ButtonDesc, self.m_Log.GetTimeNow()) return btn def GetStartKeyboardButtons(self, a_Message, a_UserGroups): diff --git a/bot_modules/profile.py b/bot_modules/profile.py index cbb65f1..842fd4c 100644 --- a/bot_modules/profile.py +++ b/bot_modules/profile.py @@ -34,10 +34,11 @@ start_message = f''' start_menu_button_name = "📰 Профиль" +init_access = f'{user_access.user_access_group_new}=+' + class ModuleProfile(mod_simple_message.SimpleMessageModule): def __init__(self, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log): - a_InitAccess = f'{user_access.user_access_group_new}=+' - super().__init__(start_message, start_menu_button_name, a_InitAccess, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log) + super().__init__(start_message, start_menu_button_name, init_access, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log) def GetInitBDCommands(self): return super(). GetInitBDCommands() + [ diff --git a/bot_modules/start.py b/bot_modules/start.py index 34f3514..be1ef0a 100644 --- a/bot_modules/start.py +++ b/bot_modules/start.py @@ -12,11 +12,13 @@ start_message = ''' Выберите возможные действия на кнопках ниже ⌨''' +start_menu_button_name = "☰ Главное меню" + +init_access = f'{user_access.user_access_group_all}=+' + class ModuleStart(mod_simple_message.SimpleMessageModule): def __init__(self, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log): - start_menu_button_name = "☰ Главное меню" - a_InitAccess = f'{user_access.user_access_group_all}=+' - super().__init__(start_message, start_menu_button_name, a_InitAccess, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log) + super().__init__(start_message, start_menu_button_name, init_access, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log) def GetName(self): return 'start' diff --git a/bot_sys/aiogram_bot.py b/bot_sys/aiogram_bot.py index cf18b35..717f75f 100644 --- a/bot_sys/aiogram_bot.py +++ b/bot_sys/aiogram_bot.py @@ -28,7 +28,7 @@ class AiogramBot(interfaces.IBot): def SQLRequest(self, a_Request : str, commit = False, return_error = False, param = None): return bot_bd.SQLRequest(self.m_BDFileName, a_Request, commit = commit, return_error = return_error, param = param) - async def SendMessage(self, a_UserID, a_Message, a_PhotoIDs, a_InlineKeyboardButtons, a_KeyboardButtons): + async def SendMessage(self, a_UserID, a_Message, a_PhotoIDs, a_KeyboardButtons, a_InlineKeyboardButtons): inline_keyboard = None if a_InlineKeyboardButtons: inline_keyboard = keyboard.MakeAiogramInlineKeyboard(a_InlineKeyboardButtons) @@ -52,6 +52,23 @@ class AiogramBot(interfaces.IBot): reply_markup = base_keyboard ) + async def SendDocument(self, a_UserID, a_Document, a_Caption, a_KeyboardButtons, a_InlineKeyboardButtons): + inline_keyboard = None + if a_InlineKeyboardButtons: + inline_keyboard = keyboard.MakeAiogramInlineKeyboard(a_InlineKeyboardButtons) + base_keyboard = None + if a_KeyboardButtons: + base_keyboard = keyboard.MakeAiogramKeyboard(a_KeyboardButtons) + if inline_keyboard: + base_keyboard = inline_keyboard + await self.m_TBot.send_document( + a_UserID, + a_Document, + caption = a_Caption, + reply_markup = base_keyboard + ) + + def RegisterMessageHandler(self, a_MessageHandler, a_CheckFunc, commands=None, regexp=None, content_types=None, state=None): if a_CheckFunc: self.m_Dispatcher.register_message_handler(a_MessageHandler, a_CheckFunc, commands=commands, regexp=regexp, content_types=content_types, state=state) diff --git a/bot_sys/interfaces.py b/bot_sys/interfaces.py index d57fd92..0b279d9 100644 --- a/bot_sys/interfaces.py +++ b/bot_sys/interfaces.py @@ -17,7 +17,11 @@ class IBot(ABC): pass @abstractmethod - async def SendMessage(self, a_UserID, a_Message, a_PhotoIDs, a_InlineKeyboardButtons, a_KeyboardButtons): + async def SendMessage(self, a_UserID, a_Message, a_PhotoIDs, a_KeyboardButtons, a_InlineKeyboardButtons): + pass + + @abstractmethod + async def SendDocument(self, a_UserID, a_Document, a_Caption, a_KeyboardButtons, a_InlineKeyboardButtons): pass @abstractmethod diff --git a/bot_sys/keyboard.py b/bot_sys/keyboard.py index ba3a38e..56871e3 100644 --- a/bot_sys/keyboard.py +++ b/bot_sys/keyboard.py @@ -24,8 +24,10 @@ def GetButtons(a_ModList): import math def Chunks(a_List, a_ChunkSize): + chunk_list = [] for i in range(0, len(a_List), a_ChunkSize): - yield a_List[i: i + a_ChunkSize] + chunk_list += [a_List[i: i + a_ChunkSize]] + return chunk_list def GetButtonInRowCount(a_AllKeyCount): return min(max(int(math.sqrt(a_AllKeyCount) // 1), 1), 4) @@ -33,6 +35,7 @@ def GetButtonInRowCount(a_AllKeyCount): def MakeAiogramKeyboard(a_ButtonList : [[str]]): return types.ReplyKeyboardMarkup(keyboard=a_ButtonList, resize_keyboard = True) +# TODO перенести KeyboardButton в MakeAiogramKeyboard def MakeButtons(a_ButtonList : [ButtonWithAccess], a_UserGroups): buttons = [] for b in a_ButtonList: diff --git a/main.py b/main.py index 0f29a7c..b85eb32 100644 --- a/main.py +++ b/main.py @@ -6,7 +6,7 @@ log_start_message = 'Бот успешно запущен!' import os from bot_sys import config, log, bot_bd, user_access, aiogram_bot, bot_messages -from bot_modules import mod_agregator, start, profile #, projects, groups, access, backup, tasks, needs, comments, messages, , languages +from bot_modules import mod_agregator, start, profile, backup #, projects, groups, access, , tasks, needs, comments, messages, , languages g_Log = log g_Bot = aiogram_bot.AiogramBot(config.GetTelegramBotApiToken(), bot_bd.GetBDFileName(), config.GetRootIDs(), g_Log) @@ -23,7 +23,13 @@ mod_start_name = 'start' mod_profile = profile.ModuleProfile([mod_start_name], g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) g_ModuleAgregator.AddModule(mod_profile) -start_mod_name_list = [mod_profile.GetName()]#, 'projects', 'groups', 'access', 'backup', 'languages'] +mod_backup = backup.ModuleBackup([mod_start_name], g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) +g_ModuleAgregator.AddModule(mod_backup) + +start_mod_name_list = [#, 'projects', 'groups', 'access', , 'languages'] + mod_profile.GetName(), + mod_backup.GetName(), + ] mod_start = start.ModuleStart(start_mod_name_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) g_ModuleAgregator.AddModule(mod_start) diff --git a/template/file_message.py b/template/file_message.py index aa69670..14c4bee 100644 --- a/template/file_message.py +++ b/template/file_message.py @@ -5,31 +5,41 @@ from bot_sys import log, config, user_access from bot_modules import access, groups -from aiogram import Bot, types +from template import simple_message -from aiogram.dispatcher import Dispatcher - -bot = Bot(token=config.GetTelegramBotApiToken(), parse_mode=types.ParseMode.HTML) - -def BackupFileTemplate(a_Path, a_CaptionMessage, a_AccessFunc, a_ButtonFunc, a_ErrorMessage): +def BackupFileTemplate(a_Bot, a_Path, a_CaptionMessage, a_AccessFunc, a_GetButtonsFunc, a_GetInlineButtonsFunc, a_ErrorMessage, access_mode = user_access.AccessMode.EDIT): async def BackupFile(a_Message): user_id = str(a_Message.from_user.id) - user_groups= groups.GetUserGroupData(user_id) - if not user_access.CheckAccessString(a_AccessFunc(), user_groups, user_access.AccessMode.EDIT): - return await a_Message.answer(access.access_denied_message, reply_markup = a_ButtonFunc(a_Message, user_groups)) + user_groups= groups.GetUserGroupData(a_Bot, user_id) + if not user_access.CheckAccessString(a_AccessFunc(), user_groups, access_mode): + return await simple_message.AccessDeniedMessage(a_Bot, a_GetButtonsFunc, user_id, a_Message, user_groups) - document = await GetFile(a_Path) + document = await GetFile(a_Bot, a_Path) if document is None: - return await a_Message.answer(user_id, error_backup_message, reply_markup = a_ButtonFunc(a_Message, user_groups)) - - await bot.send_document(user_id, document, caption = a_CaptionMessage.replace('@time', log.GetTime()), reply_markup = a_ButtonFunc(a_Message, user_groups)) + return a_Bot.SendMessage( + user_id, + a_ErrorMessage, + None, + simple_message.ProxyGetButtonsTemplate(a_GetButtonsFunc)(a_Message, user_groups), + None + ) + msg = a_CaptionMessage.GetDesc() + msg = msg.replace('@time', a_Bot.GetLog().GetTime()) + + await a_Bot.SendDocument( + user_id, + document, + msg, + simple_message.ProxyGetButtonsTemplate(a_GetButtonsFunc)(a_Message, user_groups), + simple_message.ProxyGetButtonsTemplate(a_GetInlineButtonsFunc)(a_Message, user_groups) + ) return BackupFile -async def GetFile(a_Path): +async def GetFile(a_Bot, a_Path): try: document = open(a_Path, 'rb') - log.Success(f'Загружен файл {a_Path}') + a_Bot.GetLog().Success(f'Загружен файл {a_Path}') return document except Exception as e: - log.Error(f'Не удалось загрузить файл {a_Path}. Ошибка {str(e)}') + a_Bot.GetLog().Error(f'Не удалось загрузить файл {a_Path}. Ошибка {str(e)}') return None diff --git a/template/simple_message.py b/template/simple_message.py index f8a68a6..69525e4 100644 --- a/template/simple_message.py +++ b/template/simple_message.py @@ -7,6 +7,23 @@ from bot_sys import user_access from bot_modules import access, groups from aiogram import types +def ProxyGetButtonsTemplate(a_GetButtonsFunc1): + def ReturnNone(a_Message, user_groups): + return None + if a_GetButtonsFunc1: + return a_GetButtonsFunc1 + else: + return ReturnNone + +async def AccessDeniedMessage(a_Bot, a_GetButtonsFunc, a_UserID, a_Message, user_groups): + return a_Bot.SendMessage( + a_UserID, + access.access_denied_message, + None, + ProxyGetButtonsTemplate(a_GetButtonsFunc)(a_Message, user_groups), + None + ) + class WorkFuncResult(): def __init__(self, a_BotMessage, item_access = None): self.m_BotMessage = a_BotMessage @@ -19,29 +36,12 @@ def InfoMessageTemplate(a_Bot, a_HelpMessage, a_GetButtonsFunc, a_GetInlineButto return SimpleMessageTemplate(a_Bot, GetMessage, a_GetButtonsFunc, a_GetInlineButtonsFunc, a_AccessFunc, access_mode = access_mode) def SimpleMessageTemplate(a_Bot, a_WorkFunc, a_GetButtonsFunc, a_GetInlineButtonsFunc, a_AccessFunc, access_mode = user_access.AccessMode.VIEW): - def ProxyGetButtonsTemplate(a_GetButtonsFunc1): - def ReturnNone(a_Message, user_groups): - return None - if a_GetButtonsFunc1: - return a_GetButtonsFunc1 - else: - return ReturnNone - - async def AccessDeniedMessage(a_UserID, a_Message, user_groups): - return a_Bot.SendMessage( - a_UserID, - access.access_denied_message, - None, - None, - ProxyGetButtonsTemplate(a_GetButtonsFunc)(a_Message, user_groups) - ) - async def SimpleMessage(a_Message : types.message, state = None): user_id = str(a_Message.from_user.id) lang = str(a_Message.from_user.language_code) user_groups = groups.GetUserGroupData(a_Bot, user_id) if not user_access.CheckAccess(a_Bot.GetRootIDs(), a_AccessFunc(), user_groups, access_mode): - return await AccessDeniedMessage(user_id, a_Message, user_groups) + return await AccessDeniedMessage(a_Bot, a_GetButtonsFunc, user_id, a_Message, user_groups) res = await a_WorkFunc(a_Message, state = state) if res is None: @@ -52,7 +52,7 @@ def SimpleMessageTemplate(a_Bot, a_WorkFunc, a_GetButtonsFunc, a_GetInlineButton return if not res.item_access is None and not user_access.CheckAccess(a_Bot.GetRootIDs(), res.item_access, user_groups, access_mode): - return await AccessDeniedMessage(user_id, a_Message, user_groups) + return await AccessDeniedMessage(a_Bot, a_GetButtonsFunc, user_id, a_Message, user_groups) msg = msg.GetMessageForLang(lang).StaticCopy() @@ -60,7 +60,7 @@ def SimpleMessageTemplate(a_Bot, a_WorkFunc, a_GetButtonsFunc, a_GetInlineButton user_id, msg.GetDesc(), msg.GetPhotoID(), - ProxyGetButtonsTemplate(a_GetInlineButtonsFunc)(a_Message, user_groups), - ProxyGetButtonsTemplate(a_GetButtonsFunc)(a_Message, user_groups) + ProxyGetButtonsTemplate(a_GetButtonsFunc)(a_Message, user_groups), + ProxyGetButtonsTemplate(a_GetInlineButtonsFunc)(a_Message, user_groups) ) return SimpleMessage -- 2.11.0 From b29224bba0023ce7427f48599d40ab619c475d11 Mon Sep 17 00:00:00 2001 From: Alexei Date: Sun, 14 May 2023 14:07:09 +0300 Subject: [PATCH 08/25] =?UTF-8?q?=D0=93=D1=80=D1=83=D0=BF=D0=BF=D1=8B=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5?= =?UTF-8?q?=D0=BB=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot_modules/access.py | 6 +- bot_modules/access_utils.py | 37 +++++++++ bot_modules/groups.py | 156 +++++++++++++++++--------------------- bot_modules/groups_utils.py | 16 ++++ bot_modules/mod_simple_message.py | 8 +- bot_sys/aiogram_bot.py | 8 +- bot_sys/bot_messages.py | 3 + bot_sys/interfaces.py | 2 +- main.py | 6 +- template/bd_item.py | 6 +- template/file_message.py | 13 +--- template/simple_message.py | 18 +++-- template/sql_request.py | 62 ++++++++------- 13 files changed, 194 insertions(+), 147 deletions(-) create mode 100644 bot_modules/access_utils.py create mode 100644 bot_modules/groups_utils.py diff --git a/bot_modules/access.py b/bot_modules/access.py index e9ce2e2..bbaf65c 100644 --- a/bot_modules/access.py +++ b/bot_modules/access.py @@ -4,7 +4,7 @@ # Права пользователей from bot_sys import bot_bd, log, config, keyboard, user_access -from bot_modules import start, groups +from bot_modules import access_utils from template import simple_message, sql_request, bd_item_edit, bd_item from aiogram.dispatcher import FSMContext @@ -68,10 +68,6 @@ help_message = ''' modAccess - строка ''' + user_access.user_access_readme -access_denied_message = ''' -❌ Доступ запрещён! -''' - access_button_name = "⛀ Доступ пользователей" sql_request_button_name = "⛁ Запрос к БД для редактирования доступа" help_button_name = "📄 Информация по редактированию доступа" diff --git a/bot_modules/access_utils.py b/bot_modules/access_utils.py new file mode 100644 index 0000000..81da334 --- /dev/null +++ b/bot_modules/access_utils.py @@ -0,0 +1,37 @@ +# -*- coding: utf8 -*- +# Общественное достояние, 2023, Алексей Безбородов (Alexei Bezborodov) + +# Права пользователей + +from bot_sys import bot_bd + +# --------------------------------------------------------- +# БД +table_name = 'module_access' +mod_name_field = 'modName' +moduleaccess_field = 'modAccess' +mod_default_access_field = 'itemDefaultAccess' + +access_denied_message = ''' +❌ Доступ запрещён! +''' + +def GetAccessForModuleRequest(module_name, access, default_access): + return f"INSERT OR IGNORE INTO {table_name} ({mod_name_field}, {moduleaccess_field}, {mod_default_access_field}) VALUES ('{module_name}', '{access}', '{default_access}');" + +def GetModulesAccessList(a_Bot): + return bot_bd.RequestSelectTemplate(a_Bot.m_BDFileName, table_name)() + +def GetAccessForModule(a_Bot, a_ModuleName): + alist = GetModulesAccessList(a_Bot) + for i in alist: + if i[0] == a_ModuleName: + return i[1] + return '' + +def GetItemDefaultAccessForModule(a_Bot, a_ModuleName): + alist = GetModulesAccessList(a_Bot) + for i in alist: + if i[0] == a_ModuleName: + return i[2] + return '' diff --git a/bot_modules/groups.py b/bot_modules/groups.py index d6f3b49..4b606e0 100644 --- a/bot_modules/groups.py +++ b/bot_modules/groups.py @@ -3,13 +3,12 @@ # Группы пользователей -from bot_sys import bot_bd, log, config, keyboard, user_access -from bot_modules import start, access -from template import simple_message, sql_request +from bot_sys import keyboard, user_access, bot_bd +from bot_modules import mod_simple_message +from template import simple_message, sql_request, bd_item from aiogram.dispatcher import FSMContext from aiogram.dispatcher.filters.state import State, StatesGroup -from aiogram.dispatcher import Dispatcher class FSMRequestToBD(StatesGroup): sqlRequest = State() @@ -27,29 +26,10 @@ user_id_field = 'user_id' access_field = 'access' create_datetime_field = 'createDateTime' -init_bd_cmds = [f"""CREATE TABLE IF NOT EXISTS {table_groups_name}( - {key_table_groups_name} INTEGER PRIMARY KEY NOT NULL, - {name_table_groups_field} TEXT, - {access_field} TEXT, - {create_datetime_field} TEXT, - UNIQUE({key_table_groups_name}), - UNIQUE({name_table_groups_field}) -);""", -f"""CREATE TABLE IF NOT EXISTS {table_user_in_groups_name}( - {user_id_field} INTEGER, - {key_table_groups_name} INTEGER, - {access_field} TEXT, - {create_datetime_field} TEXT, - UNIQUE({user_id_field}, {key_table_groups_name}) -);""", -f"INSERT OR IGNORE INTO module_access (modName, modAccess, itemDefaultAccess) VALUES ('{module_name}', '{user_access.user_access_group_new}=-', '{user_access.user_access_group_new}=-');", -f"INSERT OR IGNORE INTO {table_groups_name} ({name_table_groups_field}, {access_field}, {create_datetime_field}) VALUES ('{user_access.user_access_group_new}', '{user_access.user_access_group_new}=-', {bot_bd.GetBDDateTimeNow()});" -] - # --------------------------------------------------------- # Сообщения -group_start_message = ''' +start_message = ''' Группы пользователей находятся в стадии разработки Пока можете воспользоваться хардкорным способом через запросы к БД @@ -73,69 +53,73 @@ help_message = ''' `user_in_groups(user_id, group_id)` - содержит соответсвия ID пользователей и групп ''' -user_group_button_name = "‍️️▦ Группы пользователей" +start_menu_button_name = "‍️️▦ Группы пользователей" sql_request_button_name = "⛃ Запрос к БД для редактирования групп" help_button_name = "📄 Информация по группам" -# --------------------------------------------------------- -# Работа с кнопками -''' -def GetEditGroupKeyboardButtons(a_Message, a_UserGroups): - cur_buttons = [ - keyboard.ButtonWithAccess(sql_request_button_name, user_access.AccessMode.EDIT, GetAccess()), - keyboard.ButtonWithAccess(help_button_name, user_access.AccessMode.VIEW, GetAccess()) - ] - mods = [start] - return keyboard.MakeKeyboard(keyboard.GetButtons(mods) + cur_buttons, a_UserGroups) - -# --------------------------------------------------------- -# Обработка сообщений - -# --------------------------------------------------------- -# Работа с базой данных групп - -def GetGroupIDForUser(a_UserID): - return bot_bd.SQLRequestToBD('SELECT group_id FROM user_in_groups WHERE user_id = ?', param = [a_UserID]) - -def GetGroupNamesForUser(a_UserID): - return bot_bd.SQLRequestToBD('SELECT groupName FROM user_groups WHERE group_id=(SELECT group_id FROM user_in_groups WHERE user_id = ?)', param = [a_UserID]) - -# --------------------------------------------------------- -# API - -def GetUserGroupData(a_UserID): - r = GetGroupNamesForUser(a_UserID) - groups = [] - for i in r: - if len(i) > 0: - groups += [i[0]] - return user_access.UserGroups(a_UserID, groups) - -# Инициализация БД -def GetInitBDCommands(): - return init_bd_cmds - -def GetAccess(): - return access.GetAccessForModule(module_name) - -# Доступные кнопки -def GetModuleButtons(): - return [keyboard.ButtonWithAccess(user_group_button_name, user_access.AccessMode.VIEW, GetAccess())] - -# Обработка кнопок -def RegisterHandlers(dp : Dispatcher): - dp.register_message_handler(simple_message.InfoMessageTemplateLegacy(group_start_message, GetEditGroupKeyboardButtons, GetAccess), text = user_group_button_name) - dp.register_message_handler(simple_message.InfoMessageTemplateLegacy(help_message, GetEditGroupKeyboardButtons, GetAccess), text = help_button_name) - - sql_request.RequestToBDRegisterHandlers(dp, sql_request_button_name, request_start_message, FSMRequestToBD, GetEditGroupKeyboardButtons, user_access.AccessMode.EDIT, GetAccess) -''' +init_access = '{user_access.user_access_group_new}=-' + +class ModuleGroups(mod_simple_message.SimpleMessageModule): + def __init__(self, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log): + super().__init__(start_message, start_menu_button_name, init_access, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log) + self.m_SqlRequestButtonName = self.CreateButton('sql request', sql_request_button_name) + self.m_RequestStartMessage = self.CreateMessage('equest start', request_start_message) + + self.m_HelpButtonName = self.CreateButton('help', help_button_name) + self.m_HelpMessage = self.CreateMessage('help', help_message) + + self.m_HelpMessageHandler = simple_message.InfoMessageTemplate( + self.m_Bot, + self.m_HelpMessage, + self.m_GetStartKeyboardButtonsFunc, + None, + self.m_GetAccessFunc + ) + + def GetInitBDCommands(self): + return super(). GetInitBDCommands() + [ + f"""CREATE TABLE IF NOT EXISTS {table_groups_name}( + {key_table_groups_name} INTEGER PRIMARY KEY NOT NULL, + {name_table_groups_field} TEXT, + {access_field} TEXT, + {create_datetime_field} TEXT, + UNIQUE({key_table_groups_name}), + UNIQUE({name_table_groups_field}) + );""", + f"""CREATE TABLE IF NOT EXISTS {table_user_in_groups_name}( + {user_id_field} INTEGER, + {key_table_groups_name} INTEGER, + {access_field} TEXT, + {create_datetime_field} TEXT, + UNIQUE({user_id_field}, {key_table_groups_name}) + );""", + f"INSERT OR IGNORE INTO {table_groups_name} ({name_table_groups_field}, {access_field}, {create_datetime_field}) VALUES ('{user_access.user_access_group_new}', '{user_access.user_access_group_new}=-', {bot_bd.GetBDDateTimeNow()});" + ] + + def GetName(self): + return module_name + + def GetStartKeyboardButtons(self, a_Message, a_UserGroups): + mod_buttons = super().GetStartKeyboardButtons(a_Message, a_UserGroups) + cur_buttons = [ + keyboard.ButtonWithAccess(self.m_SqlRequestButtonName, user_access.AccessMode.EDIT, self.GetAccess()), + keyboard.ButtonWithAccess(self.m_HelpButtonName , user_access.AccessMode.VIEW, self.GetAccess()) + ] + return mod_buttons + keyboard.MakeButtons(cur_buttons, a_UserGroups) + + def RegisterHandlers(self): + super().RegisterHandlers() + sql_request.RequestToBDRegisterHandlers( + self.m_Bot, + self.m_SqlRequestButtonName, + self.m_RequestStartMessage, + FSMRequestToBD, + self.m_GetStartKeyboardButtonsFunc, + user_access.AccessMode.EDIT, + self.m_GetAccessFunc + ) + self.m_Bot.RegisterMessageHandler( + self.m_HelpMessageHandler, + bd_item.GetCheckForTextFunc(self.m_HelpButtonName) + ) -def GetUserGroupData(a_Bot, a_UserID): - def GetGroupNamesForUser(a_UserID): - return a_Bot.SQLRequest('SELECT groupName FROM user_groups WHERE group_id=(SELECT group_id FROM user_in_groups WHERE user_id = ?)', param = [a_UserID]) - r = GetGroupNamesForUser(a_UserID) - groups = [] - for i in r: - if len(i) > 0: - groups += [i[0]] - return user_access.UserGroups(a_UserID, groups) diff --git a/bot_modules/groups_utils.py b/bot_modules/groups_utils.py new file mode 100644 index 0000000..e80e53e --- /dev/null +++ b/bot_modules/groups_utils.py @@ -0,0 +1,16 @@ +# -*- coding: utf8 -*- +# Общественное достояние, 2023, Алексей Безбородов (Alexei Bezborodov) + +# Группы пользователей + +from bot_sys import user_access + +def GetUserGroupData(a_Bot, a_UserID): + def GetGroupNamesForUser(a_UserID): + return a_Bot.SQLRequest('SELECT groupName FROM user_groups WHERE group_id=(SELECT group_id FROM user_in_groups WHERE user_id = ?)', param = [a_UserID]) + r = GetGroupNamesForUser(a_UserID) + groups = [] + for i in r: + if len(i) > 0: + groups += [i[0]] + return user_access.UserGroups(a_UserID, groups) diff --git a/bot_modules/mod_simple_message.py b/bot_modules/mod_simple_message.py index c3e6995..48f23b3 100644 --- a/bot_modules/mod_simple_message.py +++ b/bot_modules/mod_simple_message.py @@ -3,8 +3,8 @@ # Простой модуль с одним сообщением -from bot_sys import keyboard, user_access, keyboard -from bot_modules import access, mod_interface +from bot_sys import keyboard, user_access +from bot_modules import access_utils, mod_interface from template import simple_message, bd_item class SimpleMessageModule(mod_interface.IModule): @@ -67,11 +67,11 @@ class SimpleMessageModule(mod_interface.IModule): def GetInitBDCommands(self): return [ - access.GetAccessForModuleRequest(self.GetName(), self.m_InitAccess, self.m_InitAccess), + access_utils.GetAccessForModuleRequest(self.GetName(), self.m_InitAccess, self.m_InitAccess), ] def GetAccess(self): - return access.GetAccessForModule(self.m_Bot, self.GetName()) + return access_utils.GetAccessForModule(self.m_Bot, self.GetName()) def GetModuleButtons(self): return [ diff --git a/bot_sys/aiogram_bot.py b/bot_sys/aiogram_bot.py index 717f75f..7974aae 100644 --- a/bot_sys/aiogram_bot.py +++ b/bot_sys/aiogram_bot.py @@ -28,7 +28,9 @@ class AiogramBot(interfaces.IBot): def SQLRequest(self, a_Request : str, commit = False, return_error = False, param = None): return bot_bd.SQLRequest(self.m_BDFileName, a_Request, commit = commit, return_error = return_error, param = param) - async def SendMessage(self, a_UserID, a_Message, a_PhotoIDs, a_KeyboardButtons, a_InlineKeyboardButtons): + async def SendMessage(self, a_UserID, a_Message, a_PhotoIDs, a_KeyboardButtons, a_InlineKeyboardButtons, parse_mode = None): + if not parse_mode: + parse_mode = types.ParseMode.HTML inline_keyboard = None if a_InlineKeyboardButtons: inline_keyboard = keyboard.MakeAiogramInlineKeyboard(a_InlineKeyboardButtons) @@ -49,7 +51,8 @@ class AiogramBot(interfaces.IBot): await self.m_TBot.send_message( a_UserID, a_Message, - reply_markup = base_keyboard + reply_markup = base_keyboard, + parse_mode = parse_mode ) async def SendDocument(self, a_UserID, a_Document, a_Caption, a_KeyboardButtons, a_InlineKeyboardButtons): @@ -68,7 +71,6 @@ class AiogramBot(interfaces.IBot): reply_markup = base_keyboard ) - def RegisterMessageHandler(self, a_MessageHandler, a_CheckFunc, commands=None, regexp=None, content_types=None, state=None): if a_CheckFunc: self.m_Dispatcher.register_message_handler(a_MessageHandler, a_CheckFunc, commands=commands, regexp=regexp, content_types=content_types, state=state) diff --git a/bot_sys/bot_messages.py b/bot_sys/bot_messages.py index 2f8b968..1412d6a 100644 --- a/bot_sys/bot_messages.py +++ b/bot_sys/bot_messages.py @@ -50,6 +50,9 @@ class BotMessage: self.m_DateTime = new_msg.m_DateTime return new_msg +def MakeBotMessage(a_MessageDesc): + return BotMessage(None, '', a_MessageDesc, None, 0, None) + class BotMessages: def __init__(self, a_DefaultLanguage): self.a_DefaultLanguage = a_DefaultLanguage diff --git a/bot_sys/interfaces.py b/bot_sys/interfaces.py index 0b279d9..2cf5681 100644 --- a/bot_sys/interfaces.py +++ b/bot_sys/interfaces.py @@ -17,7 +17,7 @@ class IBot(ABC): pass @abstractmethod - async def SendMessage(self, a_UserID, a_Message, a_PhotoIDs, a_KeyboardButtons, a_InlineKeyboardButtons): + async def SendMessage(self, a_UserID, a_Message, a_PhotoIDs, a_KeyboardButtons, a_InlineKeyboardButtons, parse_mode=None): pass @abstractmethod diff --git a/main.py b/main.py index b85eb32..58015fa 100644 --- a/main.py +++ b/main.py @@ -6,7 +6,7 @@ log_start_message = 'Бот успешно запущен!' import os from bot_sys import config, log, bot_bd, user_access, aiogram_bot, bot_messages -from bot_modules import mod_agregator, start, profile, backup #, projects, groups, access, , tasks, needs, comments, messages, , languages +from bot_modules import mod_agregator, start, profile, backup, groups #, projects, , access, , tasks, needs, comments, messages, , languages g_Log = log g_Bot = aiogram_bot.AiogramBot(config.GetTelegramBotApiToken(), bot_bd.GetBDFileName(), config.GetRootIDs(), g_Log) @@ -26,9 +26,13 @@ g_ModuleAgregator.AddModule(mod_profile) mod_backup = backup.ModuleBackup([mod_start_name], g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) g_ModuleAgregator.AddModule(mod_backup) +mod_groups = groups.ModuleGroups([mod_start_name], g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) +g_ModuleAgregator.AddModule(mod_groups) + start_mod_name_list = [#, 'projects', 'groups', 'access', , 'languages'] mod_profile.GetName(), mod_backup.GetName(), + mod_groups.GetName(), ] mod_start = start.ModuleStart(start_mod_name_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) g_ModuleAgregator.AddModule(mod_start) diff --git a/template/bd_item.py b/template/bd_item.py index 060457d..3ff6add 100644 --- a/template/bd_item.py +++ b/template/bd_item.py @@ -5,7 +5,7 @@ from enum import Enum from bot_sys import user_access, bot_bd, keyboard, log -from bot_modules import groups, access +from bot_modules import groups_utils, access_utils from template import simple_message from aiogram import types @@ -82,7 +82,7 @@ def EditBDItemInTableTemplate(a_TableName : str, a_KeyName : str, a_FieldName : def CheckAccessBDItemTemplate(a_TableName, a_KeyName, a_KeyValue, a_WorkFunc, a_AccessMode : user_access.AccessMode): async def CheckAccessBDItem(a_CallbackQuery : types.CallbackQuery): user_id = str(a_CallbackQuery.from_user.id) - user_groups = groups.GetUserGroupData(user_id) + user_groups = groups_utils.GetUserGroupData(user_id) item_id = a_KeyValue item = GetBDItemsTemplate(a_TableName, a_KeyName)(item_id) if len(item) < 1: @@ -95,7 +95,7 @@ def CheckAccessBDItemTemplate(a_TableName, a_KeyName, a_KeyValue, a_WorkFunc, a_ return result_work_func, result_work_func if not result_work_func.item_access is None and not user_access.CheckAccessString(result_work_func.item_access, user_groups, a_AccessMode): - return simple_message.WorkFuncResult(access.access_denied_message), None + return simple_message.WorkFuncResult(access_utils.access_denied_message), None return None, result_work_func return CheckAccessBDItem diff --git a/template/file_message.py b/template/file_message.py index 14c4bee..2869bda 100644 --- a/template/file_message.py +++ b/template/file_message.py @@ -4,25 +4,20 @@ # Сообщения для работы с файлами from bot_sys import log, config, user_access -from bot_modules import access, groups +from bot_modules import groups_utils from template import simple_message def BackupFileTemplate(a_Bot, a_Path, a_CaptionMessage, a_AccessFunc, a_GetButtonsFunc, a_GetInlineButtonsFunc, a_ErrorMessage, access_mode = user_access.AccessMode.EDIT): async def BackupFile(a_Message): user_id = str(a_Message.from_user.id) - user_groups= groups.GetUserGroupData(a_Bot, user_id) + user_groups= groups_utils.GetUserGroupData(a_Bot, user_id) if not user_access.CheckAccessString(a_AccessFunc(), user_groups, access_mode): return await simple_message.AccessDeniedMessage(a_Bot, a_GetButtonsFunc, user_id, a_Message, user_groups) document = await GetFile(a_Bot, a_Path) if document is None: - return a_Bot.SendMessage( - user_id, - a_ErrorMessage, - None, - simple_message.ProxyGetButtonsTemplate(a_GetButtonsFunc)(a_Message, user_groups), - None - ) + return simple_message.SendMessage(a_Bot, a_ErrorMessage, a_GetButtonsFunc, None, user_id, a_Message, user_groups) + msg = a_CaptionMessage.GetDesc() msg = msg.replace('@time', a_Bot.GetLog().GetTime()) diff --git a/template/simple_message.py b/template/simple_message.py index 69525e4..ba4c85a 100644 --- a/template/simple_message.py +++ b/template/simple_message.py @@ -4,7 +4,7 @@ # Простые информационные сообщения from bot_sys import user_access -from bot_modules import access, groups +from bot_modules import access_utils, groups_utils from aiogram import types def ProxyGetButtonsTemplate(a_GetButtonsFunc1): @@ -15,15 +15,19 @@ def ProxyGetButtonsTemplate(a_GetButtonsFunc1): else: return ReturnNone -async def AccessDeniedMessage(a_Bot, a_GetButtonsFunc, a_UserID, a_Message, user_groups): - return a_Bot.SendMessage( +async def SendMessage(a_Bot, a_BotMessage, a_GetButtonsFunc, a_GetInlineButtonsFunc, a_UserID, a_Message, user_groups, parse_mode=None): + return await a_Bot.SendMessage( a_UserID, - access.access_denied_message, - None, + a_BotMessage.GetDesc(), + a_BotMessage.GetPhotoID(), ProxyGetButtonsTemplate(a_GetButtonsFunc)(a_Message, user_groups), - None + ProxyGetButtonsTemplate(a_GetInlineButtonsFunc)(a_Message, user_groups), + parse_mode = parse_mode ) +async def AccessDeniedMessage(a_Bot, a_GetButtonsFunc, a_UserID, a_Message, user_groups): + return await SendMessage(a_Bot, bot_messages.MakeBotMessage(access_utils.access_denied_message), a_GetButtonsFunc, None, a_UserID, a_Message, user_groups) + class WorkFuncResult(): def __init__(self, a_BotMessage, item_access = None): self.m_BotMessage = a_BotMessage @@ -39,7 +43,7 @@ def SimpleMessageTemplate(a_Bot, a_WorkFunc, a_GetButtonsFunc, a_GetInlineButton async def SimpleMessage(a_Message : types.message, state = None): user_id = str(a_Message.from_user.id) lang = str(a_Message.from_user.language_code) - user_groups = groups.GetUserGroupData(a_Bot, user_id) + user_groups = groups_utils.GetUserGroupData(a_Bot, user_id) if not user_access.CheckAccess(a_Bot.GetRootIDs(), a_AccessFunc(), user_groups, access_mode): return await AccessDeniedMessage(a_Bot, a_GetButtonsFunc, user_id, a_Message, user_groups) diff --git a/template/sql_request.py b/template/sql_request.py index e498ac9..cab7580 100644 --- a/template/sql_request.py +++ b/template/sql_request.py @@ -3,11 +3,9 @@ # Сообщения для работы с sql запросами -from bot_sys import bot_bd, log, config, user_access, keyboard -from bot_modules import access, groups - -from aiogram import types -from aiogram.dispatcher import FSMContext +from bot_sys import user_access, keyboard +from bot_modules import groups_utils +from template import bd_item, simple_message canсel_button_name = "🚫 Отменить" @@ -15,46 +13,54 @@ cancel_message = ''' 🚫 Запрос к БД отменён ''' -def GetCancelKeyboardButtons(a_Message, a_UserGroups, a_AccessFunc, a_AccessMode): - cur_buttons = [ - keyboard.ButtonWithAccess(canсel_button_name, a_AccessMode, a_AccessFunc()) - ] - return keyboard.MakeKeyboard(cur_buttons, a_UserGroups) +def GetCancelKeyboardButtonsTemplate(a_AccessFunc, a_AccessMode): + def GetCancelKeyboardButtons(a_Message, a_UserGroups): + print ('canсel_button_name', canсel_button_name) + cur_buttons = [ + keyboard.ButtonWithAccess(canсel_button_name, a_AccessMode, a_AccessFunc()) + ] + return keyboard.MakeButtons(cur_buttons, a_UserGroups) + +# TODO CheckAccessString -> CheckAccess -def RequestToBDTemplate(a_StartMessage, a_AccessFunc, a_FSM, a_AccessMode): - async def RequestToBDStart(a_Message : types.message): +def RequestToBDTemplate(a_Bot, a_StartMessage, a_GetButtonsFunc, a_AccessFunc, a_FSM, a_AccessMode): + async def RequestToBDStart(a_Message): user_id = str(a_Message.from_user.id) - user_groups = groups.GetUserGroupData(user_id) + user_groups = groups_utils.GetUserGroupData(a_Bot, user_id) if not user_access.CheckAccessString(a_AccessFunc(), user_groups, a_AccessMode): - return await a_Message.answer(access.access_denied_message, reply_markup = GetCancelKeyboardButtons(a_Message, user_groups, a_AccessFunc, a_AccessMode)) + return await simple_message.AccessDeniedMessage(a_Bot, a_GetButtonsFunc, user_id, a_Message, user_groups) + await a_FSM.sqlRequest.set() - await a_Message.answer(a_StartMessage, reply_markup = GetCancelKeyboardButtons(a_Message, user_groups, a_AccessFunc, a_AccessMode), parse_mode='Markdown') + print ('a_FSM.sqlRequest.set()', a_StartMessage) + await simple_message.SendMessage(a_Bot, a_StartMessage, GetCancelKeyboardButtonsTemplate(a_AccessFunc, a_AccessMode), None, user_id, a_Message, user_groups, parse_mode='Markdown') return RequestToBDStart -def RequestToBDFinishTemplate(a_GetButtonsFunc, a_AccessFunc, a_AccessMode): - async def RequestToBDFinish(a_Message : types.message, state : FSMContext): +def RequestToBDFinishTemplate(a_Bot, a_GetButtonsFunc, a_AccessFunc, a_AccessMode): + async def RequestToBDFinish(a_Message, state): user_id = str(a_Message.from_user.id) - user_groups = groups.GetUserGroupData(user_id) + user_groups = groups.GetUserGroupData(a_Bot, user_id) if not user_access.CheckAccessString(a_AccessFunc(), user_groups, a_AccessMode): - return await a_Message.answer(access.access_denied_message, reply_markup = a_GetButtonsFunc(a_Message, user_groups)) + return await simple_message.AccessDeniedMessage(a_Bot, a_GetButtonsFunc, user_id, a_Message, user_groups) + result = '' async with state.proxy() as prjData: if a_Message.text == canсel_button_name: await state.finish() - return await a_Message.answer(cancel_message, reply_markup = a_GetButtonsFunc(a_Message, user_groups)) + return await simple_message.SendMessage(a_Bot, keyboard.MakeBotMessage(cancel_message), a_GetButtonsFunc, None, user_id, a_Message, user_groups) sql_request = a_Message.text - log.Success(f'Сделан запрос [{sql_request}] пользователем {a_Message.from_user.id}.') - result, error = bot_bd.SQLRequestToBD(sql_request, commit = True, return_error = True) + a_Bot.GetLog().Success(f'Сделан запрос [{sql_request}] пользователем {a_Message.from_user.id}.') + result, error = a_Bot.SQLReques(sql_request, commit = True, return_error = True) if not error is None: - log.Error(f'Ошибка при выполнении запроса [{sql_request}] от пользователя {a_Message.from_user.id} ответ следующий [{str(error)}].') + a_Bot.GetLog().Error(f'Ошибка при выполнении запроса [{sql_request}] от пользователя {a_Message.from_user.id} ответ следующий [{str(error)}].') result = str(error) else: - log.Success(f'Результат запроса [{sql_request}] от пользователя {a_Message.from_user.id} следующий [{result}].') + a_Bot.GetLog().Success(f'Результат запроса [{sql_request}] от пользователя {a_Message.from_user.id} следующий [{result}].') await state.finish() - await a_Message.answer(str(result), reply_markup = a_GetButtonsFunc(a_Message, user_groups)) + await simple_message.SendMessage(a_Bot, keyboard.MakeBotMessage(str(result)), a_GetButtonsFunc, None, user_id, a_Message, user_groups) + return RequestToBDFinish -def RequestToBDRegisterHandlers(dp, a_RequestButtonName, a_RequestStartMessage, a_FSM, a_GetButtonsFunc, a_AccessMode, a_AccessFunc): - dp.register_message_handler(RequestToBDTemplate(a_RequestStartMessage, a_AccessFunc, a_FSM, a_AccessMode), text = a_RequestButtonName) - dp.register_message_handler(RequestToBDFinishTemplate(a_GetButtonsFunc, a_AccessFunc, a_AccessMode), state = a_FSM.sqlRequest) +def RequestToBDRegisterHandlers(a_Bot, a_RequestButtonName, a_RequestStartMessage, a_FSM, a_GetButtonsFunc, a_AccessMode, a_AccessFunc): + a_Bot.RegisterMessageHandler(RequestToBDTemplate(a_Bot, a_RequestStartMessage, a_GetButtonsFunc, a_AccessFunc, a_FSM, a_AccessMode), bd_item.GetCheckForTextFunc(a_RequestButtonName)) + a_Bot.RegisterMessageHandler(RequestToBDFinishTemplate(a_Bot, a_GetButtonsFunc, a_AccessFunc, a_AccessMode), None, state = a_FSM.sqlRequest) -- 2.11.0 From 0a44bae31764fa246a88d6184717350f3a2f7090 Mon Sep 17 00:00:00 2001 From: Alexei Date: Sun, 14 May 2023 14:40:36 +0300 Subject: [PATCH 09/25] =?UTF-8?q?=D0=93=D1=80=D1=83=D0=BF=D0=BF=D1=8B=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D0=BD=D0=BE=D1=81=D1=82=D1=8C=D1=8E=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D1=8E=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- template/sql_request.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/template/sql_request.py b/template/sql_request.py index cab7580..f50696b 100644 --- a/template/sql_request.py +++ b/template/sql_request.py @@ -3,7 +3,7 @@ # Сообщения для работы с sql запросами -from bot_sys import user_access, keyboard +from bot_sys import user_access, keyboard, bot_messages from bot_modules import groups_utils from template import bd_item, simple_message @@ -20,6 +20,7 @@ def GetCancelKeyboardButtonsTemplate(a_AccessFunc, a_AccessMode): keyboard.ButtonWithAccess(canсel_button_name, a_AccessMode, a_AccessFunc()) ] return keyboard.MakeButtons(cur_buttons, a_UserGroups) + return GetCancelKeyboardButtons # TODO CheckAccessString -> CheckAccess @@ -38,7 +39,7 @@ def RequestToBDTemplate(a_Bot, a_StartMessage, a_GetButtonsFunc, a_AccessFunc, a def RequestToBDFinishTemplate(a_Bot, a_GetButtonsFunc, a_AccessFunc, a_AccessMode): async def RequestToBDFinish(a_Message, state): user_id = str(a_Message.from_user.id) - user_groups = groups.GetUserGroupData(a_Bot, user_id) + user_groups = groups_utils.GetUserGroupData(a_Bot, user_id) if not user_access.CheckAccessString(a_AccessFunc(), user_groups, a_AccessMode): return await simple_message.AccessDeniedMessage(a_Bot, a_GetButtonsFunc, user_id, a_Message, user_groups) @@ -46,18 +47,18 @@ def RequestToBDFinishTemplate(a_Bot, a_GetButtonsFunc, a_AccessFunc, a_AccessMod async with state.proxy() as prjData: if a_Message.text == canсel_button_name: await state.finish() - return await simple_message.SendMessage(a_Bot, keyboard.MakeBotMessage(cancel_message), a_GetButtonsFunc, None, user_id, a_Message, user_groups) + return await simple_message.SendMessage(a_Bot, bot_messages.MakeBotMessage(cancel_message), a_GetButtonsFunc, None, user_id, a_Message, user_groups) sql_request = a_Message.text a_Bot.GetLog().Success(f'Сделан запрос [{sql_request}] пользователем {a_Message.from_user.id}.') - result, error = a_Bot.SQLReques(sql_request, commit = True, return_error = True) + result, error = a_Bot.SQLRequest(sql_request, commit = True, return_error = True) if not error is None: a_Bot.GetLog().Error(f'Ошибка при выполнении запроса [{sql_request}] от пользователя {a_Message.from_user.id} ответ следующий [{str(error)}].') result = str(error) else: a_Bot.GetLog().Success(f'Результат запроса [{sql_request}] от пользователя {a_Message.from_user.id} следующий [{result}].') await state.finish() - await simple_message.SendMessage(a_Bot, keyboard.MakeBotMessage(str(result)), a_GetButtonsFunc, None, user_id, a_Message, user_groups) + await simple_message.SendMessage(a_Bot, bot_messages.MakeBotMessage(str(result)), a_GetButtonsFunc, None, user_id, a_Message, user_groups) return RequestToBDFinish -- 2.11.0 From 468acf9230d8ae5af520da3dc107c0ecffc2f2ec Mon Sep 17 00:00:00 2001 From: Alexei Date: Sun, 14 May 2023 23:10:58 +0300 Subject: [PATCH 10/25] =?UTF-8?q?=D0=9C=D0=BE=D0=B4=D1=83=D0=BB=D1=8C=20?= =?UTF-8?q?=D0=B4=D0=BE=D1=81=D1=82=D1=83=D0=BF=D0=B0=20=D0=BA=20=D0=BC?= =?UTF-8?q?=D0=BE=D0=B4=D1=83=D0=BB=D1=8F=D0=BC=20=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=B0=D0=B5=D1=82.=20=D0=9D=D0=B5=20=D0=B4=D0=BE=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BD=D1=86=D0=B0.=20=D0=9D=D0=B5=20=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D0=B0=D0=B5=D1=82=20=D1=80=D0=B5=D0=B4=D0=B0?= =?UTF-8?q?=D0=BA=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot_modules/access.py | 98 ++++++++++++++++++++++++++++++++------------------ bot_modules/backup.py | 4 +-- bot_modules/groups.py | 6 ++-- bot_modules/profile.py | 12 +++---- bot_modules/start.py | 4 +-- main.py | 6 +++- 6 files changed, 82 insertions(+), 48 deletions(-) diff --git a/bot_modules/access.py b/bot_modules/access.py index bbaf65c..b413b54 100644 --- a/bot_modules/access.py +++ b/bot_modules/access.py @@ -3,14 +3,12 @@ # Права пользователей -from bot_sys import bot_bd, log, config, keyboard, user_access -from bot_modules import access_utils -from template import simple_message, sql_request, bd_item_edit, bd_item +from bot_sys import keyboard, user_access, bot_bd +from bot_modules import mod_simple_message +from template import simple_message, sql_request, bd_item from aiogram.dispatcher import FSMContext from aiogram.dispatcher.filters.state import State, StatesGroup -from aiogram.dispatcher import Dispatcher -from aiogram import types class FSMRequestToBDAccess(StatesGroup): sqlRequest = State() @@ -33,19 +31,10 @@ mod_default_access_field = 'itemDefaultAccess' #TODO: Автоматическое создание init_bd_cmds, необходимо table_name, mod_name_field ... объединить в объект -init_bd_cmds = [f"""CREATE TABLE IF NOT EXISTS {table_name}( - {mod_name_field} TEXT, - {moduleaccess_field} TEXT, - {mod_default_access_field} TEXT, - UNIQUE({mod_name_field}) -);""", -f"INSERT OR IGNORE INTO {table_name} ({mod_name_field}, {moduleaccess_field}, {mod_default_access_field}) VALUES ('{module_name}', '{user_access.user_access_group_new}=-', '{user_access.user_access_group_new}=-');" -] - # --------------------------------------------------------- # Сообщения -access_start_message = ''' +start_message = ''' Права пользователей находятся в стадии разработки Пока можете воспользоваться хардкорным способом через запросы к БД @@ -68,7 +57,7 @@ help_message = ''' modAccess - строка ''' + user_access.user_access_readme -access_button_name = "⛀ Доступ пользователей" +start_button_name = "⛀ Доступ пользователей" sql_request_button_name = "⛁ Запрос к БД для редактирования доступа" help_button_name = "📄 Информация по редактированию доступа" @@ -100,6 +89,65 @@ moduleaccess_edit_default_access_message = f''' moduleaccess_success_edit_message = '''✅ Проект успешно отредактирован!''' +init_access = f'{user_access.user_access_group_new}=-' + +class ModuleAccess(mod_simple_message.SimpleMessageModule): + def __init__(self, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log): + super().__init__(start_message, start_button_name, init_access, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log) + self.m_SqlRequestButtonName = self.CreateButton('sql request', sql_request_button_name) + self.m_RequestStartMessage = self.CreateMessage('equest start', request_start_message) + + self.m_HelpButtonName = self.CreateButton('help', help_button_name) + self.m_HelpMessage = self.CreateMessage('help', help_message) + + self.m_HelpMessageHandler = simple_message.InfoMessageTemplate( + self.m_Bot, + self.m_HelpMessage, + self.m_GetStartKeyboardButtonsFunc, + None, + self.m_GetAccessFunc + ) + + def GetInitBDCommands(self): + return super(). GetInitBDCommands() + [ + f"""CREATE TABLE IF NOT EXISTS {table_name}( + {mod_name_field} TEXT, + {moduleaccess_field} TEXT, + {mod_default_access_field} TEXT, + UNIQUE({mod_name_field}) + );""", + ] + + def GetName(self): + return module_name + + def GetStartKeyboardButtons(self, a_Message, a_UserGroups): + mod_buttons = super().GetStartKeyboardButtons(a_Message, a_UserGroups) + cur_buttons = [ + keyboard.ButtonWithAccess(self.m_SqlRequestButtonName, user_access.AccessMode.EDIT, self.GetAccess()), + keyboard.ButtonWithAccess(self.m_HelpButtonName , user_access.AccessMode.VIEW, self.GetAccess()) + ] + return mod_buttons + keyboard.MakeButtons(cur_buttons, a_UserGroups) + + def RegisterHandlers(self): + super().RegisterHandlers() + sql_request.RequestToBDRegisterHandlers( + self.m_Bot, + self.m_SqlRequestButtonName, + self.m_RequestStartMessage, + FSMRequestToBDAccess, + self.m_GetStartKeyboardButtonsFunc, + user_access.AccessMode.EDIT, + self.m_GetAccessFunc + ) + self.m_Bot.RegisterMessageHandler( + self.m_HelpMessageHandler, + bd_item.GetCheckForTextFunc(self.m_HelpButtonName) + ) + + + + # --------------------------------------------------------- # Работа с кнопками ''' @@ -202,22 +250,4 @@ def RegisterHandlers(dp : Dispatcher): RegisterEdit(edit_moduleaccess_default_access_button_name, FSMEditDefaultAccessItem, moduleaccess_edit_default_access_message, mod_default_access_field, bd_item.FieldType.text, user_access.AccessMode.EDIT) ''' -def GetAccessForModuleRequest(module_name, access, default_access): - return f"INSERT OR IGNORE INTO {table_name} ({mod_name_field}, {moduleaccess_field}, {mod_default_access_field}) VALUES ('{module_name}', '{access}', '{default_access}');" - -def GetModulesAccessList(a_Bot): - return bot_bd.RequestSelectTemplate(a_Bot.m_BDFileName, table_name)() -def GetAccessForModule(a_Bot, a_ModuleName): - alist = GetModulesAccessList(a_Bot) - for i in alist: - if i[0] == a_ModuleName: - return i[1] - return '' - -def GetItemDefaultAccessForModule(a_Bot, a_ModuleName): - alist = GetModulesAccessList(a_Bot) - for i in alist: - if i[0] == a_ModuleName: - return i[2] - return '' diff --git a/bot_modules/backup.py b/bot_modules/backup.py index 552e036..75fb9b9 100644 --- a/bot_modules/backup.py +++ b/bot_modules/backup.py @@ -17,7 +17,7 @@ start_message = ''' Здесь вы можете выполнить специальные операции по сервисному обслуживанию ''' -start_menu_button_name = "📦 Резервные копии и логи" +start_button_name = "📦 Резервные копии и логи" backup_bd_message = ''' 📀 Резервная копия базы данных @@ -40,7 +40,7 @@ init_access = f'{user_access.user_access_group_new}=-' class ModuleBackup(mod_simple_message.SimpleMessageModule): def __init__(self, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log): - super().__init__(start_message, start_menu_button_name, init_access, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log) + super().__init__(start_message, start_button_name, init_access, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log) self.m_BackupBDButtonName = self.CreateButton('backup bd', backup_bd_button_name) self.m_BackupBDMessage = self.CreateMessage('backup bd', backup_bd_message) diff --git a/bot_modules/groups.py b/bot_modules/groups.py index 4b606e0..01b702c 100644 --- a/bot_modules/groups.py +++ b/bot_modules/groups.py @@ -53,15 +53,15 @@ help_message = ''' `user_in_groups(user_id, group_id)` - содержит соответсвия ID пользователей и групп ''' -start_menu_button_name = "‍️️▦ Группы пользователей" +start_button_name = "‍️️▦ Группы пользователей" sql_request_button_name = "⛃ Запрос к БД для редактирования групп" help_button_name = "📄 Информация по группам" -init_access = '{user_access.user_access_group_new}=-' +init_access = f'{user_access.user_access_group_new}=-' class ModuleGroups(mod_simple_message.SimpleMessageModule): def __init__(self, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log): - super().__init__(start_message, start_menu_button_name, init_access, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log) + super().__init__(start_message, start_button_name, init_access, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log) self.m_SqlRequestButtonName = self.CreateButton('sql request', sql_request_button_name) self.m_RequestStartMessage = self.CreateMessage('equest start', request_start_message) diff --git a/bot_modules/profile.py b/bot_modules/profile.py index 842fd4c..5ed35e7 100644 --- a/bot_modules/profile.py +++ b/bot_modules/profile.py @@ -4,7 +4,7 @@ # Профиль пользователя from bot_sys import user_access, bot_bd -from bot_modules import mod_simple_message, groups, access +from bot_modules import mod_simple_message, groups, access, access_utils from template import bd_item, simple_message # --------------------------------------------------------- @@ -32,13 +32,13 @@ start_message = f''' Дата добавления: #{create_datetime_field} ''' -start_menu_button_name = "📰 Профиль" +start_button_name = "📰 Профиль" init_access = f'{user_access.user_access_group_new}=+' class ModuleProfile(mod_simple_message.SimpleMessageModule): def __init__(self, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log): - super().__init__(start_message, start_menu_button_name, init_access, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log) + super().__init__(start_message, start_button_name, init_access, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log) def GetInitBDCommands(self): return super(). GetInitBDCommands() + [ @@ -83,16 +83,16 @@ class ModuleProfile(mod_simple_message.SimpleMessageModule): # Добавление пользователя, если он уже есть, то игнорируем def AddUser(a_Bot, a_UserID, a_UserName, a_UserName1, a_UserName2, a_UserIsBot, a_LanguageCode): a_Bot.SQLRequest(f"INSERT OR IGNORE INTO users ({key_name}, {name_field}, {name1_field}, {name2_field}, {is_bot_field}, {language_code_field}, {access_field}, {create_datetime_field}) VALUES (?, ?, ?, ?, ?, ?, ?, {bot_bd.GetBDDateTimeNow()});", - commit=True, param = (a_UserID, a_UserName, a_UserName1, a_UserName2, a_UserIsBot, a_LanguageCode, access.GetItemDefaultAccessForModule(a_Bot, module_name))) + commit=True, param = (a_UserID, a_UserName, a_UserName1, a_UserName2, a_UserIsBot, a_LanguageCode, access_utils.GetItemDefaultAccessForModule(a_Bot, module_name))) ''' - user_groups = access.GetUserGroupData(a_Bot, a_UserID) + user_groups = access_utils.GetUserGroupData(a_Bot, a_UserID) # Если пользователь не состоит ни в одной группе, то добавляем его в группу user_access.user_access_group_new if len(user_groups.group_names_list) == 0: new_group_id = a_Bot.SQLRequest(f'SELECT {groups.key_table_groups_name} FROM {groups.table_groups_name} WHERE {groups.name_table_groups_field} = ?', param = [user_access.user_access_group_new]) if new_group_id and new_group_id[0]: a_Bot.SQLRequest(f"INSERT OR IGNORE INTO {groups.table_user_in_groups_name} ({groups.user_id_field}, {groups.key_table_groups_name}, {groups.access_field}, {groups.create_datetime_field}) VALUES (?, ?, ?, {bot_bd.GetBDDateTimeNow()});", - commit=True, param = (a_UserID, new_group_id[0][0], access.GetItemDefaultAccessForModule(a_Bot, module_name))) + commit=True, param = (a_UserID, new_group_id[0][0], access_utils.GetItemDefaultAccessForModule(a_Bot, module_name))) ''' def GetUserInfo(a_Bot, a_UserID): user_info = a_Bot.SQLRequest('SELECT * FROM users WHERE user_id = ?', param = [a_UserID]) diff --git a/bot_modules/start.py b/bot_modules/start.py index be1ef0a..5c3f945 100644 --- a/bot_modules/start.py +++ b/bot_modules/start.py @@ -12,13 +12,13 @@ start_message = ''' Выберите возможные действия на кнопках ниже ⌨''' -start_menu_button_name = "☰ Главное меню" +start_button_name = "☰ Главное меню" init_access = f'{user_access.user_access_group_all}=+' class ModuleStart(mod_simple_message.SimpleMessageModule): def __init__(self, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log): - super().__init__(start_message, start_menu_button_name, init_access, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log) + super().__init__(start_message, start_button_name, init_access, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log) def GetName(self): return 'start' diff --git a/main.py b/main.py index 58015fa..f3271f3 100644 --- a/main.py +++ b/main.py @@ -6,7 +6,7 @@ log_start_message = 'Бот успешно запущен!' import os from bot_sys import config, log, bot_bd, user_access, aiogram_bot, bot_messages -from bot_modules import mod_agregator, start, profile, backup, groups #, projects, , access, , tasks, needs, comments, messages, , languages +from bot_modules import mod_agregator, start, profile, backup, groups, access #, projects, , access, , tasks, needs, comments, messages, , languages g_Log = log g_Bot = aiogram_bot.AiogramBot(config.GetTelegramBotApiToken(), bot_bd.GetBDFileName(), config.GetRootIDs(), g_Log) @@ -29,10 +29,14 @@ g_ModuleAgregator.AddModule(mod_backup) mod_groups = groups.ModuleGroups([mod_start_name], g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) g_ModuleAgregator.AddModule(mod_groups) +mod_access = access.ModuleAccess([mod_start_name], g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) +g_ModuleAgregator.AddModule(mod_access) + start_mod_name_list = [#, 'projects', 'groups', 'access', , 'languages'] mod_profile.GetName(), mod_backup.GetName(), mod_groups.GetName(), + mod_access.GetName(), ] mod_start = start.ModuleStart(start_mod_name_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) g_ModuleAgregator.AddModule(mod_start) -- 2.11.0 From 1ac4d98e1357c9b33533ec18a7d3d8400512e7b5 Mon Sep 17 00:00:00 2001 From: Alexei Date: Mon, 15 May 2023 18:50:56 +0300 Subject: [PATCH 11/25] bd_table --- bot_modules/access.py | 14 ++++---- bot_modules/profile.py | 49 +++++++++++-------------- bot_modules/tasks.py | 12 ++++++- bot_sys/bd_table.py | 97 ++++++++++++++++++++++++++++++++++++++++++++++++++ main.py | 16 ++++----- 5 files changed, 144 insertions(+), 44 deletions(-) create mode 100644 bot_sys/bd_table.py diff --git a/bot_modules/access.py b/bot_modules/access.py index b413b54..a0c331d 100644 --- a/bot_modules/access.py +++ b/bot_modules/access.py @@ -4,7 +4,7 @@ # Права пользователей from bot_sys import keyboard, user_access, bot_bd -from bot_modules import mod_simple_message +from bot_modules import mod_simple_message, access_utils from template import simple_message, sql_request, bd_item from aiogram.dispatcher import FSMContext @@ -24,10 +24,10 @@ class FSMEditDefaultAccessItem(StatesGroup): # БД module_name = 'access' -table_name = 'module_access' -mod_name_field = 'modName' -moduleaccess_field = 'modAccess' -mod_default_access_field = 'itemDefaultAccess' +table_name = access_utils.table_name +mod_name_field = access_utils.mod_name_field +moduleaccess_field = access_utils.moduleaccess_field +mod_default_access_field = access_utils.mod_default_access_field #TODO: Автоматическое создание init_bd_cmds, необходимо table_name, mod_name_field ... объединить в объект @@ -109,14 +109,14 @@ class ModuleAccess(mod_simple_message.SimpleMessageModule): ) def GetInitBDCommands(self): - return super(). GetInitBDCommands() + [ + return [ f"""CREATE TABLE IF NOT EXISTS {table_name}( {mod_name_field} TEXT, {moduleaccess_field} TEXT, {mod_default_access_field} TEXT, UNIQUE({mod_name_field}) );""", - ] + ] + super().GetInitBDCommands() def GetName(self): return module_name diff --git a/bot_modules/profile.py b/bot_modules/profile.py index 5ed35e7..0a9c798 100644 --- a/bot_modules/profile.py +++ b/bot_modules/profile.py @@ -3,8 +3,8 @@ # Профиль пользователя -from bot_sys import user_access, bot_bd -from bot_modules import mod_simple_message, groups, access, access_utils +from bot_sys import user_access, bot_bd, bd_table +from bot_modules import mod_simple_message, groups, access, access_utils, groups_utils from template import bd_item, simple_message # --------------------------------------------------------- @@ -21,6 +21,17 @@ language_code_field = 'userLanguageCode' access_field = 'userAccess' create_datetime_field = 'createDateTime' +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(name1_field, bd_table.TableFieldDestiny.DESC, bd_table.TableFieldType.STR), + 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(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), + ]) + start_message = f''' 📰 Профиль: @@ -42,17 +53,7 @@ class ModuleProfile(mod_simple_message.SimpleMessageModule): def GetInitBDCommands(self): return super(). GetInitBDCommands() + [ - f"""CREATE TABLE IF NOT EXISTS {table_name}( - {key_name} INTEGER, - {name_field} TEXT, - {name1_field} TEXT, - {name2_field} TEXT, - {is_bot_field} TEXT, - {language_code_field} TEXT, - {access_field} TEXT, - {create_datetime_field} TEXT, - UNIQUE({key_name}) - );""", + table.GetInitTableRequest(), ] def GetName(self): @@ -62,19 +63,11 @@ class ModuleProfile(mod_simple_message.SimpleMessageModule): async def StartMessageHandler(self, a_Message, state = None): user_info = GetUserInfo(self.m_Bot, a_Message.from_user.id) lang = str(a_Message.from_user.language_code) - msg = self.m_StartMessage - msg = msg.GetMessageForLang(lang).StaticCopy() if not user_info is None: - msg.m_MessageDesc = msg.GetDesc().\ - replace(f'#{key_name}', str(user_info[0])).\ - replace(f'#{name_field}', str(user_info[1])).\ - replace(f'#{name1_field}', str(user_info[2])).\ - replace(f'#{name2_field}', str(user_info[3])).\ - replace(f'#{is_bot_field}', str(user_info[4])).\ - replace(f'#{language_code_field}', str(user_info[5])).\ - replace(f'#{access_field}', str(user_info[6])).\ - replace(f'#{create_datetime_field}', str(user_info[7])) - return simple_message.WorkFuncResult(msg, item_access = str(user_info[6])) + msg = self.m_StartMessage + msg = msg.GetMessageForLang(lang).StaticCopy() + msg.m_MessageDesc = table.ReplaceAllFieldTags(msg.GetDesc(), user_info) + return simple_message.WorkFuncResult(msg, item_access = str(user_info[table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.ACCESS)])) return await super().StartMessageHandler(a_Message, state) @@ -84,8 +77,8 @@ class ModuleProfile(mod_simple_message.SimpleMessageModule): def AddUser(a_Bot, a_UserID, a_UserName, a_UserName1, a_UserName2, a_UserIsBot, a_LanguageCode): a_Bot.SQLRequest(f"INSERT OR IGNORE INTO users ({key_name}, {name_field}, {name1_field}, {name2_field}, {is_bot_field}, {language_code_field}, {access_field}, {create_datetime_field}) VALUES (?, ?, ?, ?, ?, ?, ?, {bot_bd.GetBDDateTimeNow()});", commit=True, param = (a_UserID, a_UserName, a_UserName1, a_UserName2, a_UserIsBot, a_LanguageCode, access_utils.GetItemDefaultAccessForModule(a_Bot, module_name))) -''' - user_groups = access_utils.GetUserGroupData(a_Bot, a_UserID) + + user_groups = groups_utils.GetUserGroupData(a_Bot, a_UserID) # Если пользователь не состоит ни в одной группе, то добавляем его в группу user_access.user_access_group_new if len(user_groups.group_names_list) == 0: new_group_id = a_Bot.SQLRequest(f'SELECT {groups.key_table_groups_name} FROM {groups.table_groups_name} WHERE {groups.name_table_groups_field} = ?', @@ -93,7 +86,7 @@ def AddUser(a_Bot, a_UserID, a_UserName, a_UserName1, a_UserName2, a_UserIsBot, if new_group_id and new_group_id[0]: a_Bot.SQLRequest(f"INSERT OR IGNORE INTO {groups.table_user_in_groups_name} ({groups.user_id_field}, {groups.key_table_groups_name}, {groups.access_field}, {groups.create_datetime_field}) VALUES (?, ?, ?, {bot_bd.GetBDDateTimeNow()});", commit=True, param = (a_UserID, new_group_id[0][0], access_utils.GetItemDefaultAccessForModule(a_Bot, module_name))) -''' + def GetUserInfo(a_Bot, a_UserID): user_info = a_Bot.SQLRequest('SELECT * FROM users WHERE user_id = ?', param = [a_UserID]) if len(user_info) != 0: diff --git a/bot_modules/tasks.py b/bot_modules/tasks.py index 386f472..b3ed5f8 100644 --- a/bot_modules/tasks.py +++ b/bot_modules/tasks.py @@ -3,7 +3,7 @@ # Задачи -from bot_sys import bot_bd, log, keyboard, user_access +from bot_sys import bot_bd, bd_table, keyboard, user_access from bot_modules import start, access, groups, projects, needs, comments from template import bd_item_view, simple_message, bd_item_delete, bd_item_edit, bd_item, bd_item_add, bd_item_select @@ -47,6 +47,16 @@ access_field = 'taskAccess' create_datetime_field = 'taskCreateDateTime' parent_id_field = 'projectID' +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(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_bd_cmds = [f'''CREATE TABLE IF NOT EXISTS {table_name}( {key_name} INTEGER PRIMARY KEY, {name_field} TEXT, diff --git a/bot_sys/bd_table.py b/bot_sys/bd_table.py new file mode 100644 index 0000000..280894e --- /dev/null +++ b/bot_sys/bd_table.py @@ -0,0 +1,97 @@ +#-*-coding utf-8-*- +# Общественное достояние, 2023, Алексей Безбородов (Alexei Bezborodov) + +from enum import Enum +from enum import auto + +# Тип поля в таблице +class TableFieldType(Enum): + INT = 'INTEGER' + STR = 'TEXT' + +# Предназначение поля в таблице +class TableFieldDestiny(Enum): + KEY = auto() + NAME = auto() + DESC = auto() + PHOTO = auto() + ACCESS = auto() + CREATE_DATE = auto() + PARENT_ID = auto() + OTHER = auto() + +class TableField: + def __init__(self, a_Name, a_Destiny : TableFieldDestiny, a_Type : TableFieldType): + self.m_Name = a_Name + self.m_Destiny = a_Destiny + self.m_Type = a_Type + +class Table: + def __init__(self, a_TableName, a_Fields : [TableField]): + self.m_TableName = a_TableName + self.m_Fields = a_Fields + + def GetName(self): + return self.m_TableName + + def GetFields(self): + return self.TableFieldType + + def GetFieldByDestiny(self, a_Destiny): + for f in self.m_Fields: + if f.m_Destiny == a_Destiny: + return f + return None + + def GetFieldIDByDestiny(self, a_Destiny): + for i in range(len(self.m_Fields)): + f = self.m_Fields[i] + if f.m_Destiny == a_Destiny: + return i + return None + + def GetInitTableRequest(self): + request = f'CREATE TABLE IF NOT EXISTS {self.GetName()}(' + fields = [] + for f in self.m_Fields: + key_str = '' + if f.m_Destiny == TableFieldDestiny.KEY: + key_str = 'PRIMARY KEY' + fields += [' '.join([f.m_Name, str(f.m_Type.value), key_str])] + return request + ', '.join(fields) + ');' + + def ReplaceAllFieldTags(self, a_String, a_BDItem): + result = a_String + for i in range(len(self.m_Fields)): + f = self.m_Fields[i] + result = result.replace(f'#{f.m_Name}', str(a_BDItem[i])) + return result + +def Test(): + table = Table('tname', [ + TableField('f1', TableFieldDestiny.KEY, TableFieldType.INT), + TableField('f2', TableFieldDestiny.NAME, TableFieldType.STR), + TableField('f3', TableFieldDestiny.DESC, TableFieldType.STR), + ]) + assert table.GetName() == 'tname' + assert table.GetFieldByDestiny(TableFieldDestiny.KEY).m_Name == 'f1' + assert table.GetFieldByDestiny(TableFieldDestiny.KEY).m_Destiny == TableFieldDestiny.KEY + assert table.GetFieldByDestiny(TableFieldDestiny.KEY).m_Type == TableFieldType.INT + assert table.GetFieldIDByDestiny(TableFieldDestiny.KEY) == 0 + assert table.GetFieldByDestiny(TableFieldDestiny.NAME).m_Name == 'f2' + assert table.GetFieldByDestiny(TableFieldDestiny.NAME).m_Destiny == TableFieldDestiny.NAME + assert table.GetFieldByDestiny(TableFieldDestiny.NAME).m_Type == TableFieldType.STR + assert table.GetFieldIDByDestiny(TableFieldDestiny.NAME) == 1 + assert table.GetFieldByDestiny(TableFieldDestiny.DESC).m_Name == 'f3' + 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.PHOTO) == None + assert table.GetFieldIDByDestiny(TableFieldDestiny.PHOTO) == None + + assert table.GetInitTableRequest() == 'CREATE TABLE IF NOT EXISTS tname(f1 INTEGER PRIMARY KEY, f2 TEXT , f3 TEXT );' + + item = [10, 'i1', 'i2'] + print( table.ReplaceAllFieldTags('#f1 #f2 #f3', item)) + assert table.ReplaceAllFieldTags('#f1 #f2 #f3', item) == '10 i1 i2' diff --git a/main.py b/main.py index f3271f3..ec5c5e7 100644 --- a/main.py +++ b/main.py @@ -5,7 +5,7 @@ log_start_message = 'Бот успешно запущен!' import os -from bot_sys import config, log, bot_bd, user_access, aiogram_bot, bot_messages +from bot_sys import config, log, bot_bd, user_access, aiogram_bot, bot_messages, bd_table from bot_modules import mod_agregator, start, profile, backup, groups, access #, projects, , access, , tasks, needs, comments, messages, , languages g_Log = log @@ -20,18 +20,18 @@ g_ModuleAgregator = mod_agregator.ModuleAgregator() mod_start_name = 'start' +mod_access = access.ModuleAccess([mod_start_name], g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) +g_ModuleAgregator.AddModule(mod_access) + +mod_groups = groups.ModuleGroups([mod_start_name], g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) +g_ModuleAgregator.AddModule(mod_groups) + mod_profile = profile.ModuleProfile([mod_start_name], g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) g_ModuleAgregator.AddModule(mod_profile) mod_backup = backup.ModuleBackup([mod_start_name], g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) g_ModuleAgregator.AddModule(mod_backup) -mod_groups = groups.ModuleGroups([mod_start_name], g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) -g_ModuleAgregator.AddModule(mod_groups) - -mod_access = access.ModuleAccess([mod_start_name], g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) -g_ModuleAgregator.AddModule(mod_access) - start_mod_name_list = [#, 'projects', 'groups', 'access', , 'languages'] mod_profile.GetName(), mod_backup.GetName(), @@ -64,7 +64,7 @@ for m in modules: m.RegisterHandlers() # Юнит тесты модулей и файлов -test_mods = [user_access] +test_mods = [user_access, bd_table] for m in test_mods: m.Test() -- 2.11.0 From ad5cfc41ad4faa4bdc94e0700ea599b6a0aa448a Mon Sep 17 00:00:00 2001 From: Alexei Date: Mon, 15 May 2023 23:45:19 +0300 Subject: [PATCH 12/25] mod_table_operate --- bot_modules/mod_simple_message.py | 23 +-- bot_modules/mod_table_operate.py | 356 ++++++++++++++++++++++++++++++++++++++ bot_modules/profile.py | 2 +- bot_sys/bd_table.py | 3 + bot_sys/bot_messages.py | 6 + bot_sys/keyboard.py | 2 + 6 files changed, 381 insertions(+), 11 deletions(-) create mode 100644 bot_modules/mod_table_operate.py diff --git a/bot_modules/mod_simple_message.py b/bot_modules/mod_simple_message.py index 48f23b3..6c56b3f 100644 --- a/bot_modules/mod_simple_message.py +++ b/bot_modules/mod_simple_message.py @@ -52,17 +52,20 @@ class SimpleMessageModule(mod_interface.IModule): btn = self.m_BotButtons.CreateMessage(f'{self.GetName()} {a_ButtonName}', a_ButtonDesc, self.m_Log.GetTimeNow()) return btn + def GetModule(self, a_ModName): + return self.m_ModuleAgregator.GetModule(a_ModName) + + def GetButtons(self, a_ModNameList): + buttons = [] + for n in a_ModNameList: + m = self.m_ModuleAgregator.GetModule(n) + b = m.GetModuleButtons() + if not b is None or len(b) != 0: + buttons += b + return buttons + def GetStartKeyboardButtons(self, a_Message, a_UserGroups): - def GetButtons(a_ModNameList): - buttons = [] - for n in a_ModNameList: - m = self.m_ModuleAgregator.GetModule(n) - b = m.GetModuleButtons() - if not b is None or len(b) != 0: - buttons += b - return buttons - - buttons = GetButtons(self.m_ChildModuleNameList) + buttons = self.GetButtons(self.m_ChildModuleNameList) return keyboard.MakeButtons(buttons, a_UserGroups) def GetInitBDCommands(self): diff --git a/bot_modules/mod_table_operate.py b/bot_modules/mod_table_operate.py new file mode 100644 index 0000000..5c0e22e --- /dev/null +++ b/bot_modules/mod_table_operate.py @@ -0,0 +1,356 @@ +# -*- coding: utf8 -*- +# Общественное достояние, 2023, Алексей Безбородов (Alexei Bezborodov) + +# Простой модуль с одним сообщением + +from bot_sys import keyboard, user_access +from bot_modules import access_utils, mod_interface +from template import simple_message, bd_item + +from enum import Enum +from enum import auto + +class ButtonNames(Enum): + START = auto() + LIST = auto() + ADD = auto() + EDIT = auto() + EDIT_PHOTO = auto() + EDIT_NAME = auto() + EDIT_DESC = auto() + EDIT_ACCESS = auto() + DEL = auto() + +class Messages(Enum): + START = auto() + 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() + SUCCESS_EDIT = auto() + SELECT_TO_DELETE = auto() + SUCCESS_DELETE = auto() + +class FSMs: + def __init__(self, a_FSMCreate, a_FSMEditName, a_FSMEditDesc, a_FSMEditPhoto, a_FSMEditAccess): + self.m_FSMCreate = a_FSMCreate + self.m_FSMEditName = a_FSMEditName + self.m_FSMEditDesc = a_FSMEditDesc + self.m_FSMEditPhoto = a_FSMEditPhoto + self.m_FSMEditAccess = a_FSMEditAccess + + +# Предназначение поля в таблице +class TableFieldDestiny(Enum): + KEY = auto() + +class TableOperateModule(mod_simple_message.SimpleMessageModule): + def __init__(self, a_Table, a_Messages, a_Buttons, a_FSMs, a_ParentModName, a_ChildModName, a_InitAccess, a_ChildModuleNameList, a_EditModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log): + super().__init__(a_Messages[0], a_Buttons[0], a_InitAccess, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log) + self.m_Table = a_Table + self.m_FSMs = a_FSMs + self.m_EditModuleNameList = a_EditModuleNameList + self.m_ChildModName = a_ChildModName + self.m_ParentModName = a_ParentModName + self.m_SelectPrefix = '' + + self.m_Buttons = {} + for name, button_name in a_Buttons.items(): + self.m_Buttons[name] = self.CreateButton(name, button_name) + + self.m_Messages = {} + for name, message in a_Messages.items(): + self.m_Messages[name] = self.CreateMessage(name, message) + + def GetEditKeyboardButtons(a_Message, a_UserGroups): + return self.GetEditKeyboardButtons(a_Message, a_UserGroups) + self.m_GetEditKeyboardButtonsFunc = GetEditKeyboardButtons + + def GetButtonNameAndKeyValueAndAccess(a_Item): + return self.GetButtonNameAndKeyValueAndAccess(a_Item) + self.m_GetButtonNameAndKeyValueAndAccessFunc = GetButtonNameAndKeyValueAndAccess + + async def PreDelete(a_CallbackQuery : types.CallbackQuery, a_Item): + return self.PreDelete(a_Item) + self.m_PreDeleteFunc = PreDelete + + async def PostDelete(a_CallbackQuery : types.CallbackQuery, a_ItemID): + return self.PostDelete(a_Item) + self.m_PostDeleteFunc = PostDelete + + def AddBDItemFunc(a_ItemData, a_UserID): + return self.AddBDItemFunc(a_Item) + self.m_AddBDItemFunc = AddBDItemFunc + + + def GetButton(self, a_ButtonName): + return self.m_Buttons[a_ButtonName] + + def GetMessage(self, a_MessageNames): + return self.m_Messages[a_MessageNames] + + def GetInitBDCommands(self): + return super(). GetInitBDCommands() + [ + self.m_Table.GetInitTableRequest(), + ] + + def GetStartKeyboardButtons(self, a_Message, a_UserGroups): + mod_buttons = super().GetStartKeyboardButtons(a_Message, a_UserGroups) + cur_buttons = [ + keyboard.ButtonWithAccess(self.GetButton(ButtonNames.LIST), user_access.AccessMode.VIEW, GetAccess()), + keyboard.ButtonWithAccess(self.GetButton(ButtonNames.ADD), user_access.AccessMode.ADD, GetAccess()), + keyboard.ButtonWithAccess(self.GetButton(ButtonNames.DEL), user_access.AccessMode.DELETE, GetAccess()), + keyboard.ButtonWithAccess(self.GetButton(ButtonNames.EDIT), user_access.AccessMode.EDIT, GetAccess()) + ] + return mod_buttons + keyboard.MakeButtons(cur_buttons, a_UserGroups) + + def GetEditKeyboardButtons(self, a_Message, a_UserGroups): + mod_buttons = self.GetButtons(self.m_EditModuleNameList) + cur_buttons = [ + keyboard.ButtonWithAccess(self.GetButton(ButtonNames.EDIT_PHOTO), user_access.AccessMode.VIEW, GetAccess()), + keyboard.ButtonWithAccess(self.GetButton(ButtonNames.EDIT_NAME), user_access.AccessMode.ADD, GetAccess()), + keyboard.ButtonWithAccess(self.GetButton(ButtonNames.EDIT_DESC), user_access.AccessMode.DELETE, GetAccess()), + keyboard.ButtonWithAccess(self.GetButton(ButtonNames.EDIT_ACCESS), user_access.AccessMode.EDIT, GetAccess()) + ] + return mod_buttons + keyboard.MakeButtons(cur_buttons, a_UserGroups) + + def GetViewItemInlineKeyboardTemplate(self, a_ItemID): + def GetViewItemInlineKeyboard(a_Message, a_UserGroups): + return self.GetViewItemInlineKeyboard(a_Message, a_UserGroups, a_ItemID) + return GetViewItemInlineKeyboard + + def GetSelectPrefix(self): + return self.m_SelectPrefix + + def GetViewItemInlineKeyboard(self, a_Message, a_UserGroups, a_ItemID): + if not self.m_ChildModName: + return None + child_mod = self.GetModule(self.m_ChildModName) + cur_buttons = [ + keyboard.InlineButton(child_mod.GetButton(ButtonNames.LIST), child_mod.GetSelectPrefix(), a_ItemID, GetAccess(), user_access.AccessMode.VIEW), + ] + return keyboard.MakeInlineKeyboardButtons(cur_buttons, a_UserGroups) + + def GetButtonNameAndKeyValueAndAccess(self, a_Item): + return \ + a_Item[self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.NAME)], + a_Item[self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.KEY)], + a_Item[self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.ACCESS)] + + def ShowMessageTemplate(self, a_MessageName : Message, keyboard_template_func = None): + async def ShowMessage(a_CallbackQuery : types.CallbackQuery, a_Item): + if len(a_Item) < self.m_Table.GetFieldsCount(): + return simple_message.WorkFuncResult(self.GetMessage(Messages.ERROR_FIND)) + + msg = self.GetMessage(a_MessageName).StaticCopy() + msg.UpdateDesc(table.ReplaceAllFieldTags(msg.GetDesc(), a_Item)) + msg.UpdatePhotoID(a_Item[self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.PHOTO)]) + + keyboard_func = None + if keyboard_template_func: + keyboard_func = keyboard_template_func(a_Item[self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.KEY)]) + return simple_message.WorkFuncResult(msg, item_access = a_Item[self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.ACCESS)], keyboard_func = keyboard_func) + return ShowMessage + + # TODO: delete? + def SimpleMessageTemplate(self, a_MessageName : Message): + 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) + access = a_Item[self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.ACCESS)] + return simple_message.WorkFuncResult(self.GetMessage(Messages.SUCCESS_DELETE), None, item_access = access) + + async def TaskPostDelete(self, a_CallbackQuery, a_ItemID): + self.m_Log.Success(f'Задача №{a_ItemID} была удалена пользователем {a_CallbackQuery.from_user.id}.') + #TODO: удалить вложенные + return simple_message.WorkFuncResult(self.GetMessage(Messages.SUCCESS_DELETE)) + + def AddBDItemFunc(self, a_ItemData, a_UserID): + table_name = self.m_Table.GetName() + name_field = self.m_Table.GetFieldByDestiny(bd_table.TableFieldDestiny.NAME) + photo_field = self.m_Table.GetFieldByDestiny(bd_table.TableFieldDestiny.PHOTO) + desc_field = self.m_Table.GetFieldByDestiny(bd_table.TableFieldDestiny.DESC) + access_field = self.m_Table.GetFieldByDestiny(bd_table.TableFieldDestiny.ACCESS) + create_datetime_field = self.m_Table.GetFieldByDestiny(bd_table.TableFieldDestiny.CREATE_DATE) + parent_id_field = self.m_Table.GetFieldByDestiny(bd_table.TableFieldDestiny.PARENT_ID) + + def_access = access_utils.GetItemDefaultAccessForModule(self.m_Bot, self.GetName()) + 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])) + + 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}).') + else: + self.m_Log.Success(f'Пользоватлель {a_UserID}. Добавлена запись в таблицу {table_name} ({a_ItemData[photo_field]}, {a_ItemData[name_field]}, {a_ItemData[desc_field]}, {def_access}).') + + return res, error + + def RegisterSelect(self, a_ButtonName, access_mode): + if self.m_ParentModName: + parent_mod = self.GetModule(self.m_ParentModName) + a_Prefix = parent_mod.RegisterSelect(a_ButtonName, access_mode) + a_Prefix = bd_item_select.NextSelectBDItemRegisterHandlers(self.m_Bot, \ + a_Prefix, \ + self.m_Table.GetFieldByDestiny(bd_table.TableFieldDestiny.PARENT_ID), \ + self.m_Table.GetName(), \ + self.m_Table.GetFieldByDestiny(bd_table.TableFieldDestiny.KEY), \ + self.m_GetButtonNameAndKeyValueAndAccessFunc, \ + self.GetMessage(Messages.SELECT), \ + self.m_GetAccessFunc,\ + access_mode = access_mode\ + ) + else: + 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.GetFieldByDestiny(bd_table.TableFieldDestiny.KEY), \ + self.m_GetButtonNameAndKeyValueAndAccessFunc, \ + self.GetMessage(Messages.SELECT), \ + self.m_GetAccessFunc,\ + access_mode = access_mode\ + ) + return a_Prefix + + def RegisterHandlers(self): + super().RegisterHandlers() + table_name = self.m_Table.GetName() + key_name = self.m_Table.GetFieldByDestiny(bd_table.TableFieldDestiny.KEY) + name_field = self.m_Table.GetFieldByDestiny(bd_table.TableFieldDestiny.NAME) + desc_field = self.m_Table.GetFieldByDestiny(bd_table.TableFieldDestiny.DESC) + photo_field = self.m_Table.GetFieldByDestiny(bd_table.TableFieldDestiny.PHOTO) + access_field = self.m_Table.GetFieldByDestiny(bd_table.TableFieldDestiny.ACCESS) + parent_id_field = self.m_Table.GetFieldByDestiny(bd_table.TableFieldDestiny.PARENT_ID) + + parent_table_name = None + parent_key_name = None + if self.m_ParentModName: + parent_mod = self.GetModule(self.m_ParentModName) + parent_table_name = parent_mod.m_Table.GetName() + parent_key_name = parent_mod.m_Table.GetFieldByDestiny(bd_table.TableFieldDestiny.KEY) + + def GetViewItemInlineKeyboardTemplate(a_ItemID): + def GetViewItemInlineKeyboard(a_ItemID): + return self.GetViewItemInlineKeyboardTemplate(a_ItemID) + return GetViewItemInlineKeyboard + + GetButtonNameAndKeyValueAndAccess = self.m_GetButtonNameAndKeyValueAndAccessFunc + GetAccess = self.m_GetAccessFunc + + defaul_keyboard_func = self.m_GetStartTaskKeyboardButtonsFunc + + sql_request.RequestToBDRegisterHandlers( + self.m_Bot, + self.m_SqlRequestButtonName, + self.m_RequestStartMessage, + FSMRequestToBDAccess, + self.m_GetStartKeyboardButtonsFunc, + user_access.AccessMode.EDIT, + self.m_GetAccessFunc + ) + + # Список + a_Prefix = RegisterSelectParent(self.GetButton(ButtonNames.LIST), user_access.AccessMode.VIEW) + 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\ + ) + self.m_SelectPrefix = a_Prefix + + # Удаление + a_Prefix = RegisterSelectParent(self.GetButton(ButtonNames.DEL), user_access.AccessMode.DELETE) + bd_item_delete.DeleteBDItemRegisterHandlers(self.m_Bot, \ + a_Prefix, \ + bd_item.GetCheckForPrefixFunc(a_Prefix), \ + table_name, \ + key_name, \ + parent_id_field, \ + self.m_PreDeleteFunc, \ + self.m_PostDeleteFunc, \ + GetButtonNameAndKeyValueAndAccess, \ + self.GetMessage(Messages.SELECT), \ + GetAccess, \ + defaul_keyboard_func\ + ) + + # Добавление + a_Prefix = RegisterSelectParent(self.GetButton(ButtonNames.ADD), user_access.AccessMode.ADD) + bd_item_add.AddBDItem3RegisterHandlers(self.m_Bot, \ + bd_item.GetCheckForPrefixFunc(a_Prefix), \ + self.m_FSMs.m_FSMCreate, \ + self.m_FSMs.m_FSMCreate.name,\ + self.m_FSMs.m_FSMCreate.desc, \ + self.m_FSMs.m_FSMCreate.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(Messages.SUCCESS_CREATE)), \ + a_Prefix,\ + parent_table_name, \ + parent_key_name, \ + name_field, \ + desc_field, \ + photo_field, \ + GetButtonNameAndKeyValueAndAccess, \ + GetAccess, \ + self.m_GetStartTaskKeyboardButtonsFunc\ + ) + + # Редактирование + edit_keyboard_func = self.m_GetEditTaskKeyboardButtonsFunc + def RegisterEdit(a_ButtonName, a_FSM, a_EditMessage, a_FieldName, a_FieldType, a_AccessMode = user_access.AccessMode.EDIT): + a_Prefix = RegisterSelectParent(a_ButtonName, a_AccessMode) + bd_item_edit.EditBDItemRegisterHandlers(self.m_Bot, \ + a_Prefix, \ + a_FSM, \ + bd_item.GetCheckForPrefixFunc(a_Prefix), \ + 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, \ + access_mode = a_AccessMode, \ + field_type = a_FieldType\ + ) + + self.m_Bot.RegisterMessageHandler(\ + simple_message.InfoMessageTemplateLegacy(\ + self.GetMessage(Messages.START_EDIT),\ + edit_keyboard_func,\ + GetAccess,\ + access_mode = user_access.AccessMode.EDIT),\ + bd_item.GetCheckForTextFunc(self.GetButton(ButtonNames.EDIT))\ + ) + + RegisterEdit(self.GetButton(ButtonNames.EDIT_NAME), self.m_FSMs.m_FSMEditName, self.GetMessage(Messages.EDIT_NAME), name_field, bd_item.FieldType.text) + RegisterEdit(self.GetButton(ButtonNames.EDIT_DESC), self.m_FSMs.m_FSMEditDesc, self.GetMessage(Messages.EDIT_DESC), desc_field, bd_item.FieldType.text) + RegisterEdit(self.GetButton(ButtonNames.EDIT_PHOTO), self.m_FSMs.m_FSMEditPhoto, self.GetMessage(Messages.EDIT_PHOTO), photo_field, bd_item.FieldType.photo) + RegisterEdit(self.GetButton(ButtonNames.EDIT_ACCESS), self.m_FSMs.m_FSMEditAccess, self.GetMessage(Messages.EDIT_ACCESS), access_field, bd_item.FieldType.text) diff --git a/bot_modules/profile.py b/bot_modules/profile.py index 0a9c798..183656e 100644 --- a/bot_modules/profile.py +++ b/bot_modules/profile.py @@ -66,7 +66,7 @@ class ModuleProfile(mod_simple_message.SimpleMessageModule): if not user_info is None: msg = self.m_StartMessage msg = msg.GetMessageForLang(lang).StaticCopy() - msg.m_MessageDesc = table.ReplaceAllFieldTags(msg.GetDesc(), user_info) + msg.UpdateDesc(table.ReplaceAllFieldTags(msg.GetDesc(), user_info)) return simple_message.WorkFuncResult(msg, item_access = str(user_info[table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.ACCESS)])) return await super().StartMessageHandler(a_Message, state) diff --git a/bot_sys/bd_table.py b/bot_sys/bd_table.py index 280894e..f68b393 100644 --- a/bot_sys/bd_table.py +++ b/bot_sys/bd_table.py @@ -37,6 +37,9 @@ class Table: def GetFields(self): return self.TableFieldType + def GetFieldsCount(self): + return len(self.TableFieldType) + def GetFieldByDestiny(self, a_Destiny): for f in self.m_Fields: if f.m_Destiny == a_Destiny: diff --git a/bot_sys/bot_messages.py b/bot_sys/bot_messages.py index 1412d6a..fca952f 100644 --- a/bot_sys/bot_messages.py +++ b/bot_sys/bot_messages.py @@ -21,12 +21,18 @@ class BotMessage: def GetDesc(self): return self.m_MessageDesc + def UpdateDesc(self, a_Desc): + self.m_MessageDesc = a_Desc + def GetLanguage(self): return self.m_Language def GetPhotoID(self): return self.m_PhotoID + def UpdatePhotoID(self, a_PhotoID): + self.m_PhotoID = a_PhotoID + def __str__(self): msg = self.GetMessageForLang(self.m_Language) return msg.GetDesc() diff --git a/bot_sys/keyboard.py b/bot_sys/keyboard.py index 56871e3..706ddc6 100644 --- a/bot_sys/keyboard.py +++ b/bot_sys/keyboard.py @@ -39,6 +39,8 @@ def MakeAiogramKeyboard(a_ButtonList : [[str]]): def MakeButtons(a_ButtonList : [ButtonWithAccess], a_UserGroups): buttons = [] for b in a_ButtonList: + if not b.label: + continue if user_access.CheckAccessString(b.access_string, a_UserGroups, b.access_mode): buttons += [types.KeyboardButton(str(b.label))] step = GetButtonInRowCount(len(buttons)) -- 2.11.0 From 03410326b0cc295edf1632525f957583be6ed6ea Mon Sep 17 00:00:00 2001 From: Alexei Date: Mon, 15 May 2023 23:56:27 +0300 Subject: [PATCH 13/25] =?UTF-8?q?mod=5Ftable=5Foperate.=20=D0=9F=D0=BE?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=BD=D0=B5=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=B0=D0=B5=D1=82.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot_modules/mod_table_operate.py | 131 +++++++++++++++++++++------------------ 1 file changed, 70 insertions(+), 61 deletions(-) diff --git a/bot_modules/mod_table_operate.py b/bot_modules/mod_table_operate.py index 5c0e22e..825972b 100644 --- a/bot_modules/mod_table_operate.py +++ b/bot_modules/mod_table_operate.py @@ -1,7 +1,7 @@ # -*- coding: utf8 -*- # Общественное достояние, 2023, Алексей Безбородов (Alexei Bezborodov) -# Простой модуль с одним сообщением +# Модуль для редактирования и просмотра таблицы в БД from bot_sys import keyboard, user_access from bot_modules import access_utils, mod_interface @@ -48,7 +48,6 @@ class FSMs: self.m_FSMEditPhoto = a_FSMEditPhoto self.m_FSMEditAccess = a_FSMEditAccess - # Предназначение поля в таблице class TableFieldDestiny(Enum): KEY = auto() @@ -93,10 +92,10 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): def GetButton(self, a_ButtonName): - return self.m_Buttons[a_ButtonName] + return self.m_Buttons.get(a_ButtonName, None) def GetMessage(self, a_MessageNames): - return self.m_Messages[a_MessageNames] + return self.m_Messages.get(a_MessageNames, None) def GetInitBDCommands(self): return super(). GetInitBDCommands() + [ @@ -264,65 +263,73 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): ) # Список - a_Prefix = RegisterSelectParent(self.GetButton(ButtonNames.LIST), user_access.AccessMode.VIEW) + a_ButtonName = self.GetButton(ButtonNames.LIST) + if a_ButtonName: + a_Prefix = self.RegisterSelect(a_ButtonName, user_access.AccessMode.VIEW) 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\ - ) + 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\ + ) self.m_SelectPrefix = a_Prefix # Удаление - a_Prefix = RegisterSelectParent(self.GetButton(ButtonNames.DEL), user_access.AccessMode.DELETE) - bd_item_delete.DeleteBDItemRegisterHandlers(self.m_Bot, \ - a_Prefix, \ - bd_item.GetCheckForPrefixFunc(a_Prefix), \ - table_name, \ - key_name, \ - parent_id_field, \ - self.m_PreDeleteFunc, \ - self.m_PostDeleteFunc, \ - GetButtonNameAndKeyValueAndAccess, \ - self.GetMessage(Messages.SELECT), \ - GetAccess, \ - defaul_keyboard_func\ - ) + a_ButtonName = self.GetButton(ButtonNames.DEL) + if a_ButtonName: + a_Prefix = self.RegisterSelect(a_ButtonName, user_access.AccessMode.DELETE) + bd_item_delete.DeleteBDItemRegisterHandlers(self.m_Bot, \ + a_Prefix, \ + bd_item.GetCheckForPrefixFunc(a_Prefix), \ + table_name, \ + key_name, \ + parent_id_field, \ + self.m_PreDeleteFunc, \ + self.m_PostDeleteFunc, \ + GetButtonNameAndKeyValueAndAccess, \ + self.GetMessage(Messages.SELECT), \ + GetAccess, \ + defaul_keyboard_func\ + ) # Добавление - a_Prefix = RegisterSelectParent(self.GetButton(ButtonNames.ADD), user_access.AccessMode.ADD) - bd_item_add.AddBDItem3RegisterHandlers(self.m_Bot, \ - bd_item.GetCheckForPrefixFunc(a_Prefix), \ - self.m_FSMs.m_FSMCreate, \ - self.m_FSMs.m_FSMCreate.name,\ - self.m_FSMs.m_FSMCreate.desc, \ - self.m_FSMs.m_FSMCreate.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(Messages.SUCCESS_CREATE)), \ - a_Prefix,\ - parent_table_name, \ - parent_key_name, \ - name_field, \ - desc_field, \ - photo_field, \ - GetButtonNameAndKeyValueAndAccess, \ - GetAccess, \ - self.m_GetStartTaskKeyboardButtonsFunc\ - ) + a_ButtonName = self.GetButton(ButtonNames.ADD) + if a_ButtonName: + a_Prefix = self.RegisterSelect(a_ButtonName, user_access.AccessMode.ADD) + bd_item_add.AddBDItem3RegisterHandlers(self.m_Bot, \ + bd_item.GetCheckForPrefixFunc(a_Prefix), \ + self.m_FSMs.m_FSMCreate, \ + self.m_FSMs.m_FSMCreate.name,\ + self.m_FSMs.m_FSMCreate.desc, \ + self.m_FSMs.m_FSMCreate.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(Messages.SUCCESS_CREATE)), \ + a_Prefix,\ + parent_table_name, \ + parent_key_name, \ + name_field, \ + desc_field, \ + photo_field, \ + GetButtonNameAndKeyValueAndAccess, \ + GetAccess, \ + self.m_GetStartTaskKeyboardButtonsFunc\ + ) # Редактирование edit_keyboard_func = self.m_GetEditTaskKeyboardButtonsFunc def RegisterEdit(a_ButtonName, a_FSM, a_EditMessage, a_FieldName, a_FieldType, a_AccessMode = user_access.AccessMode.EDIT): - a_Prefix = RegisterSelectParent(a_ButtonName, a_AccessMode) + if not a_ButtonName: + return + a_Prefix = self.RegisterSelect(a_ButtonName, a_AccessMode) bd_item_edit.EditBDItemRegisterHandlers(self.m_Bot, \ a_Prefix, \ a_FSM, \ @@ -341,14 +348,16 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): field_type = a_FieldType\ ) - self.m_Bot.RegisterMessageHandler(\ - simple_message.InfoMessageTemplateLegacy(\ - self.GetMessage(Messages.START_EDIT),\ - edit_keyboard_func,\ - GetAccess,\ - access_mode = user_access.AccessMode.EDIT),\ - bd_item.GetCheckForTextFunc(self.GetButton(ButtonNames.EDIT))\ - ) + a_ButtonName = self.GetButton(ButtonNames.EDIT) + if a_ButtonName: + self.m_Bot.RegisterMessageHandler(\ + simple_message.InfoMessageTemplateLegacy(\ + self.GetMessage(Messages.START_EDIT),\ + edit_keyboard_func,\ + GetAccess,\ + access_mode = user_access.AccessMode.EDIT),\ + bd_item.GetCheckForTextFunc(a_ButtonName)\ + ) RegisterEdit(self.GetButton(ButtonNames.EDIT_NAME), self.m_FSMs.m_FSMEditName, self.GetMessage(Messages.EDIT_NAME), name_field, bd_item.FieldType.text) RegisterEdit(self.GetButton(ButtonNames.EDIT_DESC), self.m_FSMs.m_FSMEditDesc, self.GetMessage(Messages.EDIT_DESC), desc_field, bd_item.FieldType.text) -- 2.11.0 From 27d2a3d92bea9b18ffe6ba0dd087d1c68abdac06 Mon Sep 17 00:00:00 2001 From: Alexei Date: Tue, 16 May 2023 10:50:20 +0300 Subject: [PATCH 14/25] =?UTF-8?q?=D0=9C=D0=BE=D0=B4=D1=83=D0=BB=D1=8C=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=BE=D0=B2.=20=D0=9F?= =?UTF-8?q?=D0=BE=D0=BA=D0=B0=20=D0=BD=D0=B5=20=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=B0=D0=B5=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot_modules/mod_table_operate.py | 52 +++--- bot_modules/projects.py | 340 ++++++++------------------------------- bot_sys/aiogram_bot.py | 8 +- bot_sys/interfaces.py | 4 +- main.py | 23 ++- template/bd_item.py | 36 ++--- template/bd_item_add.py | 71 ++++---- template/bd_item_delete.py | 28 ++-- template/bd_item_edit.py | 36 ++--- template/bd_item_select.py | 30 ++-- template/bd_item_view.py | 24 ++- template/simple_message.py | 9 +- 12 files changed, 224 insertions(+), 437 deletions(-) diff --git a/bot_modules/mod_table_operate.py b/bot_modules/mod_table_operate.py index 825972b..96e70c6 100644 --- a/bot_modules/mod_table_operate.py +++ b/bot_modules/mod_table_operate.py @@ -3,9 +3,9 @@ # Модуль для редактирования и просмотра таблицы в БД -from bot_sys import keyboard, user_access -from bot_modules import access_utils, mod_interface -from template import simple_message, bd_item +from bot_sys import keyboard, user_access, bd_table +from bot_modules import access_utils, mod_simple_message +from template import simple_message, bd_item, bd_item_select, bd_item_view, bd_item_delete, bd_item_add, bd_item_edit from enum import Enum from enum import auto @@ -48,13 +48,9 @@ class FSMs: self.m_FSMEditPhoto = a_FSMEditPhoto self.m_FSMEditAccess = a_FSMEditAccess -# Предназначение поля в таблице -class TableFieldDestiny(Enum): - KEY = auto() - class TableOperateModule(mod_simple_message.SimpleMessageModule): def __init__(self, a_Table, a_Messages, a_Buttons, a_FSMs, a_ParentModName, a_ChildModName, a_InitAccess, a_ChildModuleNameList, a_EditModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log): - super().__init__(a_Messages[0], a_Buttons[0], a_InitAccess, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log) + super().__init__(a_Messages[Messages.START], a_Buttons[ButtonNames.START], a_InitAccess, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log) self.m_Table = a_Table self.m_FSMs = a_FSMs self.m_EditModuleNameList = a_EditModuleNameList @@ -78,12 +74,12 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): return self.GetButtonNameAndKeyValueAndAccess(a_Item) self.m_GetButtonNameAndKeyValueAndAccessFunc = GetButtonNameAndKeyValueAndAccess - async def PreDelete(a_CallbackQuery : types.CallbackQuery, a_Item): - return self.PreDelete(a_Item) + async def PreDelete(a_CallbackQuery, a_Item): + return await self.PreDelete(a_Item) self.m_PreDeleteFunc = PreDelete - async def PostDelete(a_CallbackQuery : types.CallbackQuery, a_ItemID): - return self.PostDelete(a_Item) + async def PostDelete(a_CallbackQuery, a_ItemID): + return await self.PostDelete(a_Item) self.m_PostDeleteFunc = PostDelete def AddBDItemFunc(a_ItemData, a_UserID): @@ -141,12 +137,12 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): def GetButtonNameAndKeyValueAndAccess(self, a_Item): return \ - a_Item[self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.NAME)], - a_Item[self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.KEY)], + a_Item[self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.NAME)],\ + a_Item[self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.KEY)],\ a_Item[self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.ACCESS)] - def ShowMessageTemplate(self, a_MessageName : Message, keyboard_template_func = None): - async def ShowMessage(a_CallbackQuery : types.CallbackQuery, a_Item): + def ShowMessageTemplate(self, a_MessageName : Messages, keyboard_template_func = None): + async def ShowMessage(a_CallbackQuery, a_Item): if len(a_Item) < self.m_Table.GetFieldsCount(): return simple_message.WorkFuncResult(self.GetMessage(Messages.ERROR_FIND)) @@ -161,7 +157,7 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): return ShowMessage # TODO: delete? - def SimpleMessageTemplate(self, a_MessageName : Message): + def SimpleMessageTemplate(self, a_MessageName : Messages): async def ShowMessage(a_CallbackQuery, a_Item): return simple_message.WorkFuncResult(self.GetMessage(a_MessageName)) return ShowMessage @@ -250,17 +246,7 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): GetButtonNameAndKeyValueAndAccess = self.m_GetButtonNameAndKeyValueAndAccessFunc GetAccess = self.m_GetAccessFunc - defaul_keyboard_func = self.m_GetStartTaskKeyboardButtonsFunc - - sql_request.RequestToBDRegisterHandlers( - self.m_Bot, - self.m_SqlRequestButtonName, - self.m_RequestStartMessage, - FSMRequestToBDAccess, - self.m_GetStartKeyboardButtonsFunc, - user_access.AccessMode.EDIT, - self.m_GetAccessFunc - ) + defaul_keyboard_func = self.m_GetStartKeyboardButtonsFunc # Список a_ButtonName = self.GetButton(ButtonNames.LIST) @@ -302,7 +288,7 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): a_ButtonName = self.GetButton(ButtonNames.ADD) if a_ButtonName: a_Prefix = self.RegisterSelect(a_ButtonName, user_access.AccessMode.ADD) - bd_item_add.AddBDItem3RegisterHandlers(self.m_Bot, \ + bd_item_add.AddBDItem3RegisterHandlers(self.m_Bot, \ bd_item.GetCheckForPrefixFunc(a_Prefix), \ self.m_FSMs.m_FSMCreate, \ self.m_FSMs.m_FSMCreate.name,\ @@ -321,11 +307,11 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): photo_field, \ GetButtonNameAndKeyValueAndAccess, \ GetAccess, \ - self.m_GetStartTaskKeyboardButtonsFunc\ + self.m_GetStartKeyboardButtonsFunc\ ) # Редактирование - edit_keyboard_func = self.m_GetEditTaskKeyboardButtonsFunc + 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 @@ -351,9 +337,11 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): a_ButtonName = self.GetButton(ButtonNames.EDIT) if a_ButtonName: self.m_Bot.RegisterMessageHandler(\ - simple_message.InfoMessageTemplateLegacy(\ + simple_message.InfoMessageTemplate(\ + self.m_Bot,\ self.GetMessage(Messages.START_EDIT),\ edit_keyboard_func,\ + None,\ GetAccess,\ access_mode = user_access.AccessMode.EDIT),\ bd_item.GetCheckForTextFunc(a_ButtonName)\ diff --git a/bot_modules/projects.py b/bot_modules/projects.py index 799311f..0f884a6 100644 --- a/bot_modules/projects.py +++ b/bot_modules/projects.py @@ -3,16 +3,11 @@ # Проекты -from bot_sys import bot_bd, log, keyboard, user_access, user_messages -from bot_modules import start, access, groups, tasks, needs, comments -from template import bd_item_view, simple_message, bd_item_delete, bd_item_edit, bd_item, bd_item_add - -from aiogram import types +from bot_sys import bot_bd, keyboard, user_access, user_messages, bd_table +from bot_modules import mod_table_operate from aiogram.dispatcher import FSMContext from aiogram.dispatcher.filters.state import State, StatesGroup -from aiogram.dispatcher import Dispatcher -import sqlite3 class FSMCreateProject(StatesGroup): name = State() @@ -25,7 +20,7 @@ class FSMEditProjectPhotoItem(StatesGroup): class FSMEditProjectNameItem(StatesGroup): item_field = State() -class FSMEditProjectDeskItem(StatesGroup): +class FSMEditProjectDescItem(StatesGroup): item_field = State() class FSMEditProjectAccessItem(StatesGroup): @@ -42,314 +37,117 @@ photo_field = 'projectPhoto' access_field = 'projectAccess' create_datetime_field = 'projectCreateDateTime' -init_bd_cmds = [f'''CREATE TABLE IF NOT EXISTS {table_name}( - {key_name} INTEGER PRIMARY KEY, - {name_field} TEXT, - {desc_field} TEXT, - {photo_field} TEXT, - {access_field} TEXT, - {create_datetime_field} TEXT - )''', -f"INSERT OR IGNORE INTO module_access (modName, modAccess, itemDefaultAccess) VALUES ('{module_name}', '{user_access.user_access_group_new}=va', '{user_access.user_access_group_new}=va');" -] +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(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), + ]) -def MSG(a_MessageName, a_MessageDesc): - def UpdateMSG(a_Message : user_messages.Message): - print(a_Message.m_MessageName, a_Message.m_MessageDesc) - globals()[a_Message.m_MessageName] = a_Message - user_messages.MSG(a_MessageName, a_MessageDesc, UpdateMSG, log.GetTimeNow()) +init_access = f'{user_access.user_access_group_new}=va' -# --------------------------------------------------------- -# Сообщения +fsm = mod_table_operate.FSMs(FSMCreateProject, FSMEditProjectNameItem, FSMEditProjectDescItem, FSMEditProjectPhotoItem, FSMEditProjectAccessItem) -projects_button_name = "🟥 Проекты" -MSG('base_project_message',''' +# --------------------------------------------------------- +# Сообщения и кнопки + +button_names = { + mod_table_operate.ButtonNames.START: "🟥 Проекты", + 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.ButtonNames.DEL: "❌ Удалить проект", +} + +messages = { + mod_table_operate.Messages.START: ''' 🟥 Проекты -''') - -list_project_button_name = "📃 Список проектов" -MSG('select_project_message',''' +''', + mod_table_operate.Messages.SELECT: ''' Пожалуйста, выберите проект: -''') - -MSG('error_find_proj_message',''' +''', + mod_table_operate.Messages.ERROR_FIND: ''' ❌ Ошибка, проект не найден -''') - -MSG('project_open_message',f''' +''', + mod_table_operate.Messages.OPEN: f''' Проект: #{name_field} #{desc_field} Время создания: #{create_datetime_field} -''') - -# Создание проекта - -add_project_button_name = "✅ Добавить проект" -MSG('project_create_name_message',''' +''', + mod_table_operate.Messages.CREATE_NAME: ''' Создание проекта. Шаг №1 Введите название проекта: -''') - -MSG('project_create_desc_message',''' +''', + mod_table_operate.Messages.CREATE_DESC: ''' Создание проекта. Шаг №2 Введите описание проекта: -''') - -MSG('project_create_photo_message',''' +''', + mod_table_operate.Messages.CREATE_PHOTO: ''' Создание проекта. Шаг №3 Загрузите обложку для проекта (Фото): Она будет отображаться в его описании. -''') - -MSG('project_success_create_message','''✅ Проект успешно добавлен!''') - -# Редактирование проекта. - -edit_project_button_name = "🛠 Редактировать проект" -MSG('project_start_edit_message', ''' +''', + mod_table_operate.Messages.SUCCESS_CREATE: '''✅ Проект успешно добавлен!''', + mod_table_operate.Messages.START_EDIT: ''' Пожалуйста, выберите действие: -''') - -MSG('project_select_to_edit_message',''' +''', + mod_table_operate.Messages.SELECT_TO_EDIT: ''' Выберите проект, который вы хотите отредактировать. -''') - -edit_project_photo_button_name = "☐ Изменить изображение в проекте" -MSG('project_edit_photo_message',''' +''', + mod_table_operate.Messages.EDIT_PHOTO: ''' Загрузите новую обложку для проекта (Фото): Она будет отображаться в его описании. -''') - -edit_project_name_button_name = "≂ Изменить название в проекте" -MSG('project_edit_name_message',f''' +''', + mod_table_operate.Messages.EDIT_NAME: f''' Текущее название проекта: #{name_field} Введите новое название проекта: -''') - -edit_project_desc_button_name = "𝌴 Изменить описание в проекте" -MSG('project_edit_desc_message',f''' +''', + mod_table_operate.Messages.EDIT_DESC: f''' Текущее описание проекта: #{desc_field} Введите новое описание проекта: -''') - -edit_project_access_button_name = "✋ Изменить доступ к проекту" -MSG('project_edit_access_message',f''' +''', + mod_table_operate.Messages.EDIT_ACCESS: f''' Текущий доступ к проекту: #{access_field} {user_access.user_access_readme} Введите новую строку доступа: -''') - -MSG('project_success_edit_message','''✅ Проект успешно отредактирован!''') - -# Удаление проекта - -del_project_button_name = "❌ Удалить проект" -MSG('project_select_to_delete_message',''' +''', + mod_table_operate.Messages.SUCCESS_EDIT: '''✅ Проект успешно отредактирован!''', + mod_table_operate.Messages.SELECT_TO_DELETE: ''' Выберите проект, который вы хотите удалить. Все задачи и потребности в этом проекте так же будут удалены! -''') - -MSG('project_success_delete_message','''✅ Проект успешно удалён!''') +''', + mod_table_operate.Messages.SUCCESS_DELETE: '''✅ Проект успешно удалён!''', +} -# --------------------------------------------------------- -# Работа с кнопками - -def GetEditProjectKeyboardButtons(a_Message, a_UserGroups): - cur_buttons = GetModuleButtons() + [ - keyboard.ButtonWithAccess(edit_project_photo_button_name, user_access.AccessMode.EDIT, GetAccess()), - keyboard.ButtonWithAccess(edit_project_name_button_name, user_access.AccessMode.EDIT, GetAccess()), - keyboard.ButtonWithAccess(edit_project_desc_button_name, user_access.AccessMode.EDIT, GetAccess()), - keyboard.ButtonWithAccess(edit_project_access_button_name, user_access.AccessMode.ACCEES_EDIT, GetAccess()), - ] - mods = [start] - return keyboard.MakeKeyboard(keyboard.GetButtons(mods) + cur_buttons, a_UserGroups) +class ModuleProjects(mod_table_operate.TableOperateModule): + 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, fsm, a_ParentModName, a_ChildModName, init_access, a_ChildModuleNameList, a_EditModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log) -def GetStartProjectKeyboardButtons(a_Message, a_UserGroups): - cur_buttons = [ - keyboard.ButtonWithAccess(list_project_button_name, user_access.AccessMode.VIEW, GetAccess()), - keyboard.ButtonWithAccess(add_project_button_name, user_access.AccessMode.ADD, GetAccess()), - keyboard.ButtonWithAccess(del_project_button_name, user_access.AccessMode.DELETE, GetAccess()), - keyboard.ButtonWithAccess(edit_project_button_name, user_access.AccessMode.EDIT, GetAccess()) - ] - mods = [start, tasks, needs, comments] - return keyboard.MakeKeyboard(keyboard.GetButtons(mods) + cur_buttons, a_UserGroups) + def GetName(self): + return module_name -def GetViewItemInlineKeyboardTemplate(a_ItemID): - def GetViewItemInlineKeyboard(a_Message, a_UserGroups): - cur_buttons = [ - keyboard.InlineButtonWithAccess(tasks.list_task_button_name, tasks.select_tasks_prefix, a_ItemID, GetAccess(), user_access.AccessMode.VIEW), + def GetModuleButtons(self): + return super().GetModuleButtons() + [ + keyboard.ButtonWithAccess(self.GetButton(ButtonNames.LIST), user_access.AccessMode.VIEW, self.GetAccess()), ] - return keyboard.MakeInlineKeyboard(cur_buttons, a_UserGroups) - return GetViewItemInlineKeyboard - -# --------------------------------------------------------- -# Обработка сообщений - -# стартовое сообщение -async def ProjectsOpen(a_Message : types.message, state = None): - return simple_message.WorkFuncResult(base_project_message) - -def GetButtonNameAndKeyValueAndAccess(a_Item): - # projectName projectID projectAccess - return a_Item[1], a_Item[0], a_Item[4] - -def ShowMessageTemplate(a_StringMessage, keyboard_template_func = None): - async def ShowMessage(a_CallbackQuery : types.CallbackQuery, a_Item): - if (len(a_Item) < 6): - return simple_message.WorkFuncResult(error_find_proj_message) - - msg = str(a_StringMessage).\ - replace(f'#{name_field}', a_Item[1]).\ - replace(f'#{desc_field}', a_Item[2]).\ - replace(f'#{create_datetime_field}', a_Item[5]).\ - replace(f'#{access_field}', a_Item[4]) - keyboard_func = None - if keyboard_template_func: - keyboard_func = keyboard_template_func(a_Item[0]) - return simple_message.WorkFuncResult(msg, photo_id = a_Item[3], item_access = a_Item[4], keyboard_func = keyboard_func) - return ShowMessage - -def SimpleMessageTemplateLegacy(a_StringMessage): - async def ShowMessage(a_CallbackQuery : types.CallbackQuery, a_Item): - return simple_message.WorkFuncResult(a_StringMessage) - return ShowMessage - -# Удаление проекта - -async def ProjectPreDelete(a_CallbackQuery : types.CallbackQuery, a_Item): - if (len(a_Item) < 6): - return simple_message.WorkFuncResult(error_find_proj_message) - access = a_Item[4] - return simple_message.WorkFuncResult('', None, item_access = access) - -async def ProjectPostDelete(a_CallbackQuery : types.CallbackQuery, a_ItemID): - log.Success(f'Проект №{a_ItemID} был удалён пользователем {a_CallbackQuery.from_user.id}.') - #TODO: удалить вложенные - return simple_message.WorkFuncResult(project_success_delete_message) - -# --------------------------------------------------------- -# Работа с базой данных проектов - -def AddBDItemFunc(a_ItemData, a_UserID): - res, error = bot_bd.SQLRequestToBD(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], access.GetItemDefaultAccessForModule(module_name) + f";{a_UserID}=+")) - - if error: - log.Error(f'Пользоватлель {a_UserID}. Ошибка добавления записи в таблицу {table_name} ({a_ItemData[photo_field]}, {a_ItemData[name_field]}, {a_ItemData[desc_field]}, {access.GetItemDefaultAccessForModule(module_name)}).') - else: - log.Success(f'Пользоватлель {a_UserID}. Добавлена запись в таблицу {table_name} ({a_ItemData[photo_field]}, {a_ItemData[name_field]}, {a_ItemData[desc_field]}, {access.GetItemDefaultAccessForModule(module_name)}).') - - return res, error - -# --------------------------------------------------------- -# API - -# Инициализация БД -def GetInitBDCommands(): - return init_bd_cmds - -def GetAccess(): - return access.GetAccessForModule(module_name) - -# Доступные кнопки -def GetModuleButtons(): - return [ - keyboard.ButtonWithAccess(projects_button_name, user_access.AccessMode.VIEW, GetAccess()), - keyboard.ButtonWithAccess(list_project_button_name, user_access.AccessMode.VIEW, GetAccess()), - ] - -# Обработка кнопок -def RegisterHandlers(dp : Dispatcher): - defaul_keyboard_func = GetStartProjectKeyboardButtons - - # Список проектов - dp.register_message_handler(simple_message.SimpleMessageTemplateLegacy(ProjectsOpen, defaul_keyboard_func, GetAccess), text = projects_button_name) - bd_item_view.FirstSelectAndShowBDItemRegisterHandlers(dp, \ - list_project_button_name, \ - table_name, \ - key_name, \ - ShowMessageTemplate(project_open_message, GetViewItemInlineKeyboardTemplate), \ - GetButtonNameAndKeyValueAndAccess, \ - select_project_message, \ - GetAccess, \ - defaul_keyboard_func\ - ) - - # Удаление проекта - bd_item_delete.DeleteBDItemRegisterHandlers(dp, \ - None, \ - bd_item.GetCheckForTextFunc(del_project_button_name), \ - table_name, \ - key_name, \ - None, \ - ProjectPreDelete, \ - ProjectPostDelete, \ - GetButtonNameAndKeyValueAndAccess, \ - select_project_message, \ - GetAccess, \ - defaul_keyboard_func\ - ) - - # Добавление проекта - bd_item_add.AddBDItem3RegisterHandlers(dp, \ - bd_item.GetCheckForTextFunc(add_project_button_name), \ - FSMCreateProject,\ - FSMCreateProject.name,\ - FSMCreateProject.desc, \ - FSMCreateProject.photo,\ - AddBDItemFunc, \ - SimpleMessageTemplateLegacy(project_create_name_message), \ - SimpleMessageTemplateLegacy(project_create_desc_message), \ - SimpleMessageTemplateLegacy(project_create_photo_message), \ - SimpleMessageTemplateLegacy(project_success_create_message), \ - None,\ - None, \ - None, \ - name_field, \ - desc_field, \ - photo_field, \ - GetButtonNameAndKeyValueAndAccess, \ - GetAccess, \ - GetStartProjectKeyboardButtons\ - ) - - # Редактирование проекта - edit_keyboard_func = GetEditProjectKeyboardButtons - def RegisterEdit(a_ButtonName, a_FSM, a_EditMessage, a_FieldName, a_FieldType, a_AccessMode = user_access.AccessMode.EDIT): - bd_item_edit.EditBDItemRegisterHandlers(dp, \ - None, \ - a_FSM, \ - bd_item.GetCheckForTextFunc(a_ButtonName), \ - project_select_to_edit_message, \ - ShowMessageTemplate(a_EditMessage), \ - ShowMessageTemplate(project_success_edit_message), \ - table_name, \ - key_name, \ - None, \ - a_FieldName, \ - GetButtonNameAndKeyValueAndAccess, \ - GetAccess, \ - edit_keyboard_func, \ - access_mode = a_AccessMode, \ - field_type = a_FieldType\ - ) - dp.register_message_handler(simple_message.InfoMessageTemplateLegacy(project_start_edit_message, edit_keyboard_func, GetAccess, access_mode = user_access.AccessMode.EDIT), text = edit_project_button_name) - RegisterEdit(edit_project_photo_button_name, FSMEditProjectPhotoItem, project_edit_photo_message, photo_field, bd_item.FieldType.photo) - RegisterEdit(edit_project_name_button_name, FSMEditProjectNameItem, project_edit_name_message, name_field, bd_item.FieldType.text) - RegisterEdit(edit_project_desc_button_name, FSMEditProjectDeskItem, project_edit_desc_message, desc_field, bd_item.FieldType.text) - RegisterEdit(edit_project_access_button_name, FSMEditProjectAccessItem, project_edit_access_message, access_field, bd_item.FieldType.text) diff --git a/bot_sys/aiogram_bot.py b/bot_sys/aiogram_bot.py index 7974aae..c13656c 100644 --- a/bot_sys/aiogram_bot.py +++ b/bot_sys/aiogram_bot.py @@ -71,17 +71,17 @@ class AiogramBot(interfaces.IBot): reply_markup = base_keyboard ) - def RegisterMessageHandler(self, a_MessageHandler, a_CheckFunc, commands=None, regexp=None, content_types=None, state=None): + def RegisterMessageHandler(self, a_MessageHandler, a_CheckFunc=None, commands=None, regexp=None, content_types=None, state=None): if a_CheckFunc: self.m_Dispatcher.register_message_handler(a_MessageHandler, a_CheckFunc, commands=commands, regexp=regexp, content_types=content_types, state=state) else: self.m_Dispatcher.register_message_handler(a_MessageHandler, commands=commands, regexp=regexp, content_types=content_types, state=state) - def RegisterCallbackHandler(self, a_CallbackHandler, a_CheckFunc, commands=None, regexp=None, content_types=None, state=None): + def RegisterCallbackHandler(self, a_CallbackHandler, a_CheckFunc=None, commands=None, regexp=None, content_types=None, state=None): if a_CheckFunc: - self.register_callback_query_handler.register_message_handler(a_CallbackHandler, a_CheckFunc, commands=commands, regexp=regexp, content_types=content_types, state=state) + self.m_Dispatcher.register_callback_query_handler(a_CallbackHandler, a_CheckFunc, commands=commands, regexp=regexp, content_types=content_types, state=state) else: - self.register_callback_query_handler.register_message_handler(a_CallbackHandler, commands=commands, regexp=regexp, content_types=content_types, state=state) + self.m_Dispatcher.register_callback_query_handler(a_CallbackHandler, commands=commands, regexp=regexp, content_types=content_types, state=state) def StartPolling(self): executor.start_polling(self.m_Dispatcher) diff --git a/bot_sys/interfaces.py b/bot_sys/interfaces.py index 2cf5681..e65a760 100644 --- a/bot_sys/interfaces.py +++ b/bot_sys/interfaces.py @@ -25,11 +25,11 @@ class IBot(ABC): pass @abstractmethod - def RegisterMessageHandler(self, a_MessageHandler, a_CheckFunc, commands=None, regexp=None, content_types=None, state=None): + def RegisterMessageHandler(self, a_MessageHandler, a_CheckFunc=None, commands=None, regexp=None, content_types=None, state=None): pass @abstractmethod - def RegisterCallbackHandler(self, a_CallbackHandler, a_CheckFunc, commands=None, regexp=None, content_types=None, state=None): + def RegisterCallbackHandler(self, a_CallbackHandler, a_CheckFunc=None, commands=None, regexp=None, content_types=None, state=None): pass @abstractmethod diff --git a/main.py b/main.py index ec5c5e7..1b5ec47 100644 --- a/main.py +++ b/main.py @@ -6,7 +6,7 @@ log_start_message = 'Бот успешно запущен!' import os from bot_sys import config, log, bot_bd, user_access, aiogram_bot, bot_messages, bd_table -from bot_modules import mod_agregator, start, profile, backup, groups, access #, projects, , access, , tasks, needs, comments, messages, , languages +from bot_modules import mod_agregator, start, profile, backup, groups, access, projects #, projects, , access, , tasks, needs, comments, messages, , languages g_Log = log g_Bot = aiogram_bot.AiogramBot(config.GetTelegramBotApiToken(), bot_bd.GetBDFileName(), config.GetRootIDs(), g_Log) @@ -19,24 +19,35 @@ g_BotButtons = bot_messages.BotMessages(default_language) g_ModuleAgregator = mod_agregator.ModuleAgregator() mod_start_name = 'start' +mod_tasks_name = 'tasks' +mod_needs_name = 'needs' +mod_comments_name = 'comments' +mod_projects_name = 'projects' -mod_access = access.ModuleAccess([mod_start_name], g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) +start_mod_list = [mod_start_name] + +mod_access = access.ModuleAccess(start_mod_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) g_ModuleAgregator.AddModule(mod_access) -mod_groups = groups.ModuleGroups([mod_start_name], g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) +mod_groups = groups.ModuleGroups(start_mod_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) g_ModuleAgregator.AddModule(mod_groups) -mod_profile = profile.ModuleProfile([mod_start_name], g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) +mod_profile = profile.ModuleProfile(start_mod_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) g_ModuleAgregator.AddModule(mod_profile) -mod_backup = backup.ModuleBackup([mod_start_name], g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) +mod_backup = backup.ModuleBackup(start_mod_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) g_ModuleAgregator.AddModule(mod_backup) -start_mod_name_list = [#, 'projects', 'groups', 'access', , 'languages'] +start_mod_name_list = [mod_start_name, mod_tasks_name, mod_needs_name, mod_comments_name] +mod_project = projects.ModuleProjects(None, None, start_mod_name_list, start_mod_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) +g_ModuleAgregator.AddModule(mod_project) + +start_mod_name_list = [#, '', , '', , 'languages'] mod_profile.GetName(), mod_backup.GetName(), mod_groups.GetName(), mod_access.GetName(), + mod_project.GetName(), ] mod_start = start.ModuleStart(start_mod_name_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) g_ModuleAgregator.AddModule(mod_start) diff --git a/template/bd_item.py b/template/bd_item.py index 3ff6add..695030e 100644 --- a/template/bd_item.py +++ b/template/bd_item.py @@ -4,7 +4,7 @@ # Работа с элементом в БД from enum import Enum -from bot_sys import user_access, bot_bd, keyboard, log +from bot_sys import user_access, bot_bd, keyboard, bot_messages from bot_modules import groups_utils, access_utils from template import simple_message @@ -20,7 +20,7 @@ canсel_button_name = "🚫 Отменить" def HashPrefix(a_Str): # callback data в сообщении имеет ограниченную длину, поэтому сокращаем префикс - #log.Info(f'HashPrefix {md5(a_Str)[0:8]}: - {a_Str}') + #a_Bot.GetLog().Info(f'HashPrefix {md5(a_Str)[0:8]}: - {a_Str}') return f'{md5(a_Str)[0:8]}:' class FieldType(Enum): @@ -47,7 +47,7 @@ def GetCancelKeyboardButtonsTemplate(a_AccessFunc, a_AccessMode): cur_buttons = [ keyboard.ButtonWithAccess(canсel_button_name, a_AccessMode, a_AccessFunc()), ] - return keyboard.MakeKeyboard(cur_buttons, a_UserGroups) + return keyboard.MakeInlineKeyboardButtons(cur_buttons, a_UserGroups) return GetCancelKeyboardButtons def GetSkipAndCancelKeyboardButtonsTemplate(a_AccessFunc, a_AccessMode): @@ -56,46 +56,46 @@ def GetSkipAndCancelKeyboardButtonsTemplate(a_AccessFunc, a_AccessMode): keyboard.ButtonWithAccess(skip_button_name, a_AccessMode, a_AccessFunc()), keyboard.ButtonWithAccess(canсel_button_name, a_AccessMode, a_AccessFunc()), ] - return keyboard.MakeKeyboard(cur_buttons, a_UserGroups) + return keyboard.MakeInlineKeyboardButtons(cur_buttons, a_UserGroups) return GetSkipAndCancelKeyboardButtons -def GetAllItemsTemplate(a_TableName): +def GetAllItemsTemplate(a_Bot, a_TableName): def GetAllItems(): - return bot_bd.SelectBDTemplate(a_TableName)() + return bot_bd.SelectBDTemplate(a_Bot, a_TableName)() return GetAllItems -def GetBDItemsTemplate(a_TableName : str, a_KeyName : str): +def GetBDItemsTemplate(a_Bot, a_TableName : str, a_KeyName : str): def GetBDItem(a_KeyValue): - return bot_bd.SQLRequestToBD(f'SELECT * FROM {a_TableName} WHERE {a_KeyName} = ?', param = ([a_KeyValue])) + return a_Bot.SQLRequest(f'SELECT * FROM {a_TableName} WHERE {a_KeyName} = ?', param = ([a_KeyValue])) return GetBDItem -def DeleteBDItemInTableTemplate(a_TableName : str, a_KeyName : str): +def DeleteBDItemInTableTemplate(a_Bot, a_TableName : str, a_KeyName : str): def DeleteBDItem(a_KeyValue): - return bot_bd.SQLRequestToBD(f'DELETE FROM {a_TableName} WHERE {a_KeyName} = ?', commit = True, return_error = True, param = ([a_KeyValue])) + return a_Bot.SQLRequest(f'DELETE FROM {a_TableName} WHERE {a_KeyName} = ?', commit = True, return_error = True, param = ([a_KeyValue])) return DeleteBDItem -def EditBDItemInTableTemplate(a_TableName : str, a_KeyName : str, a_FieldName : str): +def EditBDItemInTableTemplate(a_Bot, a_TableName : str, a_KeyName : str, a_FieldName : str): def EditBDItemInTable(a_KeyValue, a_FieldValue): - return bot_bd.SQLRequestToBD(f'UPDATE {a_TableName} SET {a_FieldName}=? WHERE {a_KeyName} = ?', commit = True, return_error = True, param = ([a_FieldValue, a_KeyValue])) + return a_Bot.SQLRequest(f'UPDATE {a_TableName} SET {a_FieldName}=? WHERE {a_KeyName} = ?', commit = True, return_error = True, param = ([a_FieldValue, a_KeyValue])) return EditBDItemInTable -def CheckAccessBDItemTemplate(a_TableName, a_KeyName, a_KeyValue, a_WorkFunc, a_AccessMode : user_access.AccessMode): +def CheckAccessBDItemTemplate(a_Bot, a_TableName, a_KeyName, a_KeyValue, a_WorkFunc, a_AccessMode : user_access.AccessMode): async def CheckAccessBDItem(a_CallbackQuery : types.CallbackQuery): user_id = str(a_CallbackQuery.from_user.id) - user_groups = groups_utils.GetUserGroupData(user_id) + user_groups = groups_utils.GetUserGroupData(a_Bot, user_id) item_id = a_KeyValue - item = GetBDItemsTemplate(a_TableName, a_KeyName)(item_id) + item = GetBDItemsTemplate(a_Bot, a_TableName, a_KeyName)(item_id) if len(item) < 1: msg = item_not_found.replace('{item_id}', str(item_id)).replace('{a_TableName}', a_TableName) - log.Error(msg) - return simple_message.WorkFuncResult(msg), None + a_Bot.GetLog().Error(msg) + return simple_message.WorkFuncResult(bot_messages.MakeBotMessage(msg)), None result_work_func = await a_WorkFunc(a_CallbackQuery, item[0]) if result_work_func is None or result_work_func.string_message is None: return result_work_func, result_work_func if not result_work_func.item_access is None and not user_access.CheckAccessString(result_work_func.item_access, user_groups, a_AccessMode): - return simple_message.WorkFuncResult(access_utils.access_denied_message), None + return simple_message.WorkFuncResult(bot_messages.MakeBotMessage(access_utils.access_denied_message)), None return None, result_work_func return CheckAccessBDItem diff --git a/template/bd_item_add.py b/template/bd_item_add.py index 84fe313..394a950 100644 --- a/template/bd_item_add.py +++ b/template/bd_item_add.py @@ -3,23 +3,18 @@ # Добавление элемента в БД -from bot_sys import user_access, bot_bd, log -from bot_modules import access, groups +from bot_sys import user_access, bot_bd, bot_messages +from bot_modules import access_utils, groups_utils from template import simple_message, bd_item_select, bd_item -from aiogram import types -from aiogram.dispatcher import FSMContext -from aiogram.dispatcher.filters.state import State, StatesGroup - - cancel_message = ''' 🚫 Добавление отменено ''' -def StartAddBDItemTemplate(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 : types.CallbackQuery, state : FSMContext): +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): user_id = str(a_CallbackQuery.from_user.id) - user_groups = groups.GetUserGroupData(user_id) + user_groups = groups.GetUserGroupData(a_Bot, user_id) parent_id = bd_item.GetKeyDataFromCallbackMessage(a_CallbackQuery, a_Prefix) res_of_work_func = None check = None @@ -30,7 +25,7 @@ def StartAddBDItemTemplate(a_FSM, a_FSMStart, a_MessageFunc, a_ParentTableName, item_data[a_ParentKeyFieldName] = parent_id if parent_id: - check, res_of_work_func = await bd_item.CheckAccessBDItemTemplate(a_ParentTableName, a_ParentKeyFieldName, parent_id, a_MessageFunc, access_mode)(a_CallbackQuery) + check, res_of_work_func = await bd_item.CheckAccessBDItemTemplate(a_Bot, a_ParentTableName, a_ParentKeyFieldName, parent_id, a_MessageFunc, access_mode)(a_CallbackQuery) else: res_of_work_func = await a_MessageFunc(a_CallbackQuery, None) @@ -39,36 +34,36 @@ def StartAddBDItemTemplate(a_FSM, a_FSMStart, a_MessageFunc, a_ParentTableName, check.keyboard_func = a_FinishButtonFunc return check return res_of_work_func - return simple_message.SimpleMessageTemplateLegacy(StartAddBDItem, a_ButtonFunc, a_AccessFunc, access_mode) + return simple_message.SimpleMessageTemplate(a_Bot, StartAddBDItem, a_ButtonFunc, None, a_AccessFunc, access_mode) -def FinishAddBDItemTemplate(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_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_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 NextAddBDItemTemplate(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_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_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 FinishOrNextAddBDItemTemplate(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): - async def FinishAddBDItem(a_Message : types.CallbackQuery, state : FSMContext): +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): + async def FinishAddBDItem(a_Message, state): state_func = None if a_Finish: state_func = state.finish else: state_func = a_FSM.next user_id = str(a_Message.from_user.id) - user_groups = groups.GetUserGroupData(user_id) + user_groups = groups.GetUserGroupData(a_Bot, user_id) error = None res_of_work_func = None check = None async with state.proxy() as item_data: if a_Message.text == bd_item.canсel_button_name: await state.finish() - return simple_message.WorkFuncResult(cancel_message, keyboard_func = a_FinishButtonFunc) + return simple_message.WorkFuncResult(bot_messages.MakeBotMessage(cancel_message), keyboard_func = a_FinishButtonFunc) parent_id = None if a_ParentKeyFieldName: parent_id = item_data[a_ParentKeyFieldName] if parent_id: - check, res_of_work_func = await bd_item.CheckAccessBDItemTemplate(a_ParentTableName, a_ParentKeyFieldName, parent_id, a_MessageFunc, access_mode)(a_Message) + check, res_of_work_func = await bd_item.CheckAccessBDItemTemplate(a_Bot, a_ParentTableName, a_ParentKeyFieldName, parent_id, a_MessageFunc, access_mode)(a_Message) else: res_of_work_func = await a_MessageFunc(a_Message, None) @@ -83,7 +78,7 @@ def FinishOrNextAddBDItemTemplate(a_FSM, a_AddBDItemFunc, a_ParentTableName, a_P else: if a_Message.photo == None or len(a_Message.photo) == 0: await state.finish() - return simple_message.WorkFuncResult(error_photo_type_message, keyboard_func = a_FinishButtonFunc) + 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 @@ -92,31 +87,31 @@ def FinishOrNextAddBDItemTemplate(a_FSM, a_AddBDItemFunc, a_ParentTableName, a_P res, error = a_AddBDItemFunc(item_data, user_id) await state_func() if error: - return simple_message.WorkFuncResult(error) + return simple_message.WorkFuncResult(bot_messages.MakeBotMessage(error)) return res_of_work_func - return simple_message.SimpleMessageTemplateLegacy(FinishAddBDItem, a_ButtonFunc, a_AccessFunc, access_mode) + return simple_message.SimpleMessageTemplate(a_Bot, FinishAddBDItem, a_ButtonFunc, None, a_AccessFunc, access_mode) -def AddBDItem3RegisterHandlers(dp, a_StartCheckFunc, a_FSM, a_FSMName, a_FSMDesc, a_FSMPhoto, a_AddBDItemFunc, a_AddNameMessageFunc, a_AddDescMessageFunc, a_AddPhotoMessageFunc, a_FinishMessageFunc, a_ParentPrefix, a_ParentTableName : str, a_ParentKeyFieldName, a_NameField, a_DescField, a_PhotoField, a_GetButtonNameAndKeyValueAndAccessFunc, a_AccessFunc, a_ButtonFunc, access_mode = user_access.AccessMode.ADD): +def AddBDItem3RegisterHandlers(a_Bot, a_StartCheckFunc, a_FSM, a_FSMName, a_FSMDesc, a_FSMPhoto, a_AddBDItemFunc, a_AddNameMessageFunc, a_AddDescMessageFunc, a_AddPhotoMessageFunc, a_FinishMessageFunc, a_ParentPrefix, a_ParentTableName : str, a_ParentKeyFieldName, a_NameField, a_DescField, a_PhotoField, a_GetButtonNameAndKeyValueAndAccessFunc, a_AccessFunc, a_ButtonFunc, access_mode = user_access.AccessMode.ADD): keyboard_cancel = bd_item.GetCancelKeyboardButtonsTemplate(a_AccessFunc, access_mode) keyboard_skip_and_cancel = bd_item.GetSkipAndCancelKeyboardButtonsTemplate(a_AccessFunc, access_mode) - reg_func = dp.register_message_handler + reg_func = a_Bot.RegisterMessageHandler if a_ParentTableName: - reg_func = dp.register_callback_query_handler - reg_func(StartAddBDItemTemplate(a_FSM, a_FSMName, a_AddNameMessageFunc, a_ParentTableName, a_ParentKeyFieldName, a_ParentPrefix, a_AccessFunc, keyboard_cancel, a_ButtonFunc, access_mode), a_StartCheckFunc) + reg_func = a_Bot.RegisterCallbackHandler + 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) - dp.register_message_handler(NextAddBDItemTemplate(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) - dp.register_message_handler(NextAddBDItemTemplate(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) - dp.register_message_handler(FinishAddBDItemTemplate(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, 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) -def AddBDItem1RegisterHandlers(dp, 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): +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_AccessFunc, access_mode) - reg_func = dp.register_message_handler + reg_func = a_Bot.RegisterMessageHandler if a_ParentTableName: - reg_func = dp.register_callback_query_handler - reg_func(StartAddBDItemTemplate(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_FSM, a_AddBDItemFunc, a_ParentTableName, a_ParentKeyFieldName, a_FieldName, a_FinishMessageFunc, a_AccessFunc, a_ButtonFunc, access_mode, field_type = a_FieldType) + 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) if a_FieldType == bd_item.FieldType.photo: - dp.register_message_handler(finish_handler, content_types = ['photo', 'text'], state = a_FSM.bd_item) + a_Bot.RegisterMessageHandler(finish_handler, content_types = ['photo', 'text'], state = a_FSM.bd_item) else: - dp.register_message_handler(finish_handler, state = a_FSM.bd_item) + a_Bot.RegisterMessageHandler(finish_handler, state = a_FSM.bd_item) diff --git a/template/bd_item_delete.py b/template/bd_item_delete.py index 6167bea..4228e7e 100644 --- a/template/bd_item_delete.py +++ b/template/bd_item_delete.py @@ -4,40 +4,38 @@ # удаление элемента в БД from bot_sys import user_access, bot_bd, keyboard -from bot_modules import access, groups +from bot_modules import access_utils, groups_utils from template import simple_message, bd_item_select, bd_item -from aiogram import types - -def DeleteBDItemTemplate(a_TableName, a_KeyName, a_PreDeleteWorkFunc, a_PostDeleteWorkFunc, a_Prefix, a_AccessFunc, a_ButtonFunc, delete = True, access_mode = user_access.AccessMode.DELETE): - async def DeleteBDItem(a_CallbackQuery : types.CallbackQuery, state = None): +def DeleteBDItemTemplate(a_Bot, a_TableName, a_KeyName, a_PreDeleteWorkFunc, a_PostDeleteWorkFunc, a_Prefix, a_AccessFunc, a_ButtonFunc, delete = True, access_mode = user_access.AccessMode.DELETE): + async def DeleteBDItem(a_CallbackQuery, state = None): user_id = str(a_CallbackQuery.from_user.id) - user_groups = groups.GetUserGroupData(user_id) + user_groups = groups.GetUserGroupData(a_Bot, user_id) item_id = str(a_CallbackQuery.data).replace(a_Prefix, '') - check, res_of_pre_del = await bd_item.CheckAccessBDItemTemplate(a_TableName, a_KeyName, item_id, a_PreDeleteWorkFunc, access_mode)(a_CallbackQuery) + check, res_of_pre_del = await bd_item.CheckAccessBDItemTemplate(a_Bot, a_TableName, a_KeyName, item_id, a_PreDeleteWorkFunc, access_mode)(a_CallbackQuery) if not check is None: return check if not delete: return res_of_pre_del - result, error = bd_item.DeleteBDItemInTableTemplate(a_TableName, a_KeyName)(item_id) + result, error = bd_item.DeleteBDItemInTableTemplate(a_Bot, a_TableName, a_KeyName)(item_id) if not error is None: msg = error - log.Error(error) + a_Bot.GetLog().Error(error) return simple_message.WorkFuncResult(error) return await a_PostDeleteWorkFunc(a_CallbackQuery, item_id) - return simple_message.SimpleMessageTemplateLegacy(DeleteBDItem, a_ButtonFunc, a_AccessFunc, access_mode) + return simple_message.SimpleMessageTemplate(a_Bot, DeleteBDItem, a_ButtonFunc, None, a_AccessFunc, access_mode) -def DeleteBDItemRegisterHandlers(dp, 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 = dp.register_message_handler +def DeleteBDItemRegisterHandlers(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 = dp.register_callback_query_handler + reg_func = a_Bot.RegisterCallbackHandler a_Prefix = bd_item.HashPrefix(f'delete_{a_TableName}_{a_KeyName}:') - sel_handler = bd_item_select.SelectDBItemTemplate(a_TableName, a_ParentIDFieldName, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, a_PrevPrefix, a_Prefix, access_mode) + 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) - dp.register_callback_query_handler(DeleteBDItemTemplate(a_TableName, a_KeyName, a_PreDeleteWorkFunc, a_PostDeleteWorkFunc, a_Prefix, a_AccessFunc, a_ButtonFunc, access_mode), bd_item.GetCheckForPrefixFunc(a_Prefix)) + 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)) diff --git a/template/bd_item_edit.py b/template/bd_item_edit.py index 99e3e44..aa3fec4 100644 --- a/template/bd_item_edit.py +++ b/template/bd_item_edit.py @@ -3,14 +3,10 @@ # Редактирование элемента в БД -from bot_sys import user_access, bot_bd, log -from bot_modules import access, groups +from bot_sys import user_access, bot_bd +from bot_modules import access_utils, groups_utils from template import simple_message, bd_item_select, bd_item, bd_item_add -from aiogram import types -from aiogram.dispatcher import FSMContext -from aiogram.dispatcher.filters.state import State, StatesGroup - cancel_message = ''' 🚫 Редактирование отменено ''' @@ -19,33 +15,33 @@ error_photo_type_message = ''' 🚫 Фотографий не найдено ''' -def StartEditBDItemTemplate(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_FSM, a_FSM.item_field, a_MessageFunc, a_TableName, a_KeyName, a_Prefix, a_AccessFunc, a_ButtonFunc, a_FinishButtonFunc, access_mode = access_mode) +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_FSM, a_TableName, a_KeyName, a_FieldName, a_MessageFunc, a_AccessFunc, a_ButtonFunc, access_mode = user_access.AccessMode.EDIT, field_type = bd_item.FieldType.text): +def FinishEditBDItemTemplate(a_Bot, a_FSM, a_TableName, a_KeyName, a_FieldName, a_MessageFunc, a_AccessFunc, a_ButtonFunc, access_mode = user_access.AccessMode.EDIT, field_type = bd_item.FieldType.text): def EditBDItemFunc(a_ItemData, a_UserID): item_id = a_ItemData[a_KeyName] field_value = a_ItemData[a_FieldName] - res, error = bd_item.EditBDItemInTableTemplate(a_TableName, a_KeyName, a_FieldName)(item_id, field_value) + res, error = bd_item.EditBDItemInTableTemplate(a_Bot, a_TableName, a_KeyName, a_FieldName)(item_id, field_value) if error: - log.Error(f'Пользователю {a_UserID} не удалось изменить поле в таблице {a_TableName} ключу {a_KeyName}={item_id}. Новое значение поля {a_FieldName}={field_value}. Ошибка: {error}') + a_Bot.GetLog().Error(f'Пользователю {a_UserID} не удалось изменить поле в таблице {a_TableName} ключу {a_KeyName}={item_id}. Новое значение поля {a_FieldName}={field_value}. Ошибка: {error}') else: - log.Success(f'Пользователь {a_UserID} изменил поле в таблице {a_TableName} ключу {a_KeyName}={item_id}. Новое значение поля {a_FieldName}={field_value}.') + a_Bot.GetLog().Success(f'Пользователь {a_UserID} изменил поле в таблице {a_TableName} ключу {a_KeyName}={item_id}. Новое значение поля {a_FieldName}={field_value}.') return res, error - return bd_item_add.FinishAddBDItemTemplate(a_FSM, EditBDItemFunc, a_TableName, a_KeyName, a_FieldName, a_MessageFunc, a_AccessFunc, a_ButtonFunc, access_mode = access_mode, field_type = field_type) + 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(dp, 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, access_mode = user_access.AccessMode.EDIT, field_type = bd_item.FieldType.text): - reg_func = dp.register_message_handler +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, access_mode = user_access.AccessMode.EDIT, field_type = bd_item.FieldType.text): + reg_func = a_Bot.RegisterMessageHandler if a_ParentIDFieldName: - reg_func = dp.register_callback_query_handler + reg_func = a_Bot.RegisterCallbackHandler keyboard_cancel = bd_item.GetCancelKeyboardButtonsTemplate(a_AccessFunc, access_mode) a_Prefix = bd_item.HashPrefix(f'edit_{a_TableName}_{a_KeyName}_{a_FieldName}:') - sel_handler = bd_item_select.SelectDBItemTemplate(a_TableName, a_ParentIDFieldName, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, a_PrevPrefix, a_Prefix, access_mode) + 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) - dp.register_callback_query_handler(StartEditBDItemTemplate(a_FSM, a_EditMessageFunc, a_TableName, a_KeyName, a_Prefix, a_AccessFunc, keyboard_cancel, a_ButtonFunc, access_mode), bd_item.GetCheckForPrefixFunc(a_Prefix)) + 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)) if field_type == bd_item.FieldType.photo: - dp.register_message_handler(FinishEditBDItemTemplate(a_FSM, a_TableName, a_KeyName, a_FieldName, a_FinishMessageFunc, a_AccessFunc, a_ButtonFunc, 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_AccessFunc, a_ButtonFunc, access_mode, field_type = field_type), content_types = ['photo', 'text'], state = a_FSM.item_field) else: - dp.register_message_handler(FinishEditBDItemTemplate(a_FSM, a_TableName, a_KeyName, a_FieldName, a_FinishMessageFunc, a_AccessFunc, a_ButtonFunc, 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_AccessFunc, a_ButtonFunc, 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 a39a00f..0109ee5 100644 --- a/template/bd_item_select.py +++ b/template/bd_item_select.py @@ -4,19 +4,17 @@ # Просмотр элемента в БД from bot_sys import user_access, bot_bd, keyboard -from bot_modules import access, groups +from bot_modules import access_utils, groups_utils from template import simple_message, bd_item -from aiogram import types - -def GetBDItemsListKeyboardButtonsTemplate(a_TableName : str, a_ParentIDFieldName, a_PrevPrefix, a_NextPrefix : str, a_GetButtonNameAndKeyValueAndAccessFunc, access_mode = user_access.AccessMode.VIEW): +def GetBDItemsListKeyboardButtonsTemplate(a_Bot, a_TableName : str, a_ParentIDFieldName, 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_TableName, a_ParentIDFieldName)(parent_id) + items = bd_item.GetBDItemsTemplate(a_Bot, a_TableName, a_ParentIDFieldName)(parent_id) else: - items = bd_item.GetAllItemsTemplate(a_TableName)() + items = bd_item.GetAllItemsTemplate(a_Bot, a_TableName)() items_button_list = [] for t in items: @@ -26,26 +24,26 @@ def GetBDItemsListKeyboardButtonsTemplate(a_TableName : str, a_ParentIDFieldName if bname: b = keyboard.InlineButtonWithAccess(bname, a_NextPrefix, key_value, access, access_mode) items_button_list += [b] - return keyboard.MakeInlineKeyboard(items_button_list, a_UserGroups) + return keyboard.MakeInlineKeyboardButtons(items_button_list, a_UserGroups) return GetBDItemsListKeyboardButtons -def SelectDBItemTemplate(a_TableName : str, a_ParentIDFieldName, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, a_PrevPrefix, a_NextPrefix, access_mode = user_access.AccessMode.VIEW): - keyboard_func = GetBDItemsListKeyboardButtonsTemplate(a_TableName, a_ParentIDFieldName, a_PrevPrefix, a_NextPrefix, a_GetButtonNameAndKeyValueAndAccessFunc) - return simple_message.InfoMessageTemplateLegacy(a_StartMessage, keyboard_func, a_AccessFunc, access_mode) +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): + keyboard_func = GetBDItemsListKeyboardButtonsTemplate(a_Bot, a_TableName, a_ParentIDFieldName, a_PrevPrefix, a_NextPrefix, a_GetButtonNameAndKeyValueAndAccessFunc) + return simple_message.InfoMessageTemplate(a_Bot, a_StartMessage, keyboard_func, None, a_AccessFunc, access_mode) -def FirstSelectBDItemRegisterHandlers(dp, a_PrefixBase, a_ButtonName, a_TableName : str, a_KeyName, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, access_mode = user_access.AccessMode.VIEW): +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): a_Prefix = bd_item.HashPrefix(f'first_select_{a_TableName}_{a_KeyName}_in_base_{a_PrefixBase}:') - sel_handler = SelectDBItemTemplate(a_TableName, None, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, None, a_Prefix, access_mode = access_mode) - dp.register_message_handler(sel_handler, text = a_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)) return a_Prefix -def NextSelectBDItemRegisterHandlers(dp, a_PrevPrefix, a_ParentIDFieldName, a_TableName : str, a_KeyName, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, access_mode = user_access.AccessMode.VIEW): +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 = SelectDBItemTemplate(a_TableName, a_ParentIDFieldName, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, a_PrevPrefix, a_Prefix, access_mode = access_mode) - dp.register_callback_query_handler(sel_handler, bd_item.GetCheckForPrefixFunc(a_PrevPrefix)) + 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_Prefix diff --git a/template/bd_item_view.py b/template/bd_item_view.py index 6e896be..e40b06f 100644 --- a/template/bd_item_view.py +++ b/template/bd_item_view.py @@ -4,21 +4,19 @@ # Просмотр элемента в БД from bot_sys import user_access, bot_bd, keyboard -from bot_modules import access, groups +from bot_modules import access_utils, groups_utils from template import simple_message, bd_item_select, bd_item_delete, bd_item -from aiogram import types +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 ShowBDItemTemplate(a_TableName, a_KeyName, a_WorkFunc, a_Prefix, a_AccessFunc, a_ButtonFunc, access_mode = user_access.AccessMode.VIEW): - return bd_item_delete.DeleteBDItemTemplate(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 ShowBDItemRegisterHandlers(dp, a_PrevPrefix, a_TableName : str, a_KeyName, a_ShowItemWorkFunc, a_AccessFunc, a_ButtonFunc, access_mode = user_access.AccessMode.VIEW): - dp.register_callback_query_handler(ShowBDItemTemplate(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 FirstSelectAndShowBDItemRegisterHandlers(dp, 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(dp, '', a_ButtonName, a_TableName, a_KeyName, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, access_mode = access_mode) - ShowBDItemRegisterHandlers(dp, a_Prefix, a_TableName, a_KeyName, a_ShowItemWorkFunc, a_AccessFunc, a_ButtonFunc, access_mode = access_mode) - -def LastSelectAndShowBDItemRegisterHandlers(dp, 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(dp, a_PrevPrefix, a_ParentIDFieldName, a_TableName, a_KeyName, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, access_mode = access_mode) - ShowBDItemRegisterHandlers(dp, 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) diff --git a/template/simple_message.py b/template/simple_message.py index ba4c85a..957cf6b 100644 --- a/template/simple_message.py +++ b/template/simple_message.py @@ -29,9 +29,10 @@ async def AccessDeniedMessage(a_Bot, a_GetButtonsFunc, a_UserID, a_Message, user return await SendMessage(a_Bot, bot_messages.MakeBotMessage(access_utils.access_denied_message), a_GetButtonsFunc, None, a_UserID, a_Message, user_groups) class WorkFuncResult(): - def __init__(self, a_BotMessage, item_access = None): + def __init__(self, a_BotMessage, keyboard_func = None, item_access = None): self.m_BotMessage = a_BotMessage self.item_access = item_access + self.keyboard_func = keyboard_func def InfoMessageTemplate(a_Bot, a_HelpMessage, a_GetButtonsFunc, a_GetInlineButtonsFunc, a_AccessFunc, access_mode = user_access.AccessMode.VIEW): async def GetMessage(a_Message : types.message, state = None): @@ -51,6 +52,10 @@ def SimpleMessageTemplate(a_Bot, a_WorkFunc, a_GetButtonsFunc, a_GetInlineButton if res is None: return + keyboard_func = a_GetInlineButtonsFunc + if res.keyboard_func: + keyboard_func = res.keyboard_func + msg = res.m_BotMessage if msg is None: return @@ -65,6 +70,6 @@ def SimpleMessageTemplate(a_Bot, a_WorkFunc, a_GetButtonsFunc, a_GetInlineButton msg.GetDesc(), msg.GetPhotoID(), ProxyGetButtonsTemplate(a_GetButtonsFunc)(a_Message, user_groups), - ProxyGetButtonsTemplate(a_GetInlineButtonsFunc)(a_Message, user_groups) + ProxyGetButtonsTemplate(keyboard_func)(a_Message, user_groups) ) return SimpleMessage -- 2.11.0 From 74760c35f16b89f364e6d8ca329f1428ea2a8906 Mon Sep 17 00:00:00 2001 From: Alexei Date: Wed, 17 May 2023 11:47:43 +0300 Subject: [PATCH 15/25] =?UTF-8?q?=D0=92=20=D0=BF=D1=80=D0=BE=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D0=B0=D1=85=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D0=B5?= =?UTF-8?q?=D1=82=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5,=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=B8=20=D0=BF=D1=80=D0=BE=D1=81=D0=BC=D0=BE=D1=82=D1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot_modules/mod_table_operate.py | 197 ++++++++++++++++++++++----------------- bot_modules/projects.py | 2 +- bot_sys/bd_table.py | 15 ++- bot_sys/bot_bd.py | 11 +-- bot_sys/keyboard.py | 2 +- main.py | 2 +- template/bd_item.py | 6 +- template/bd_item_add.py | 4 +- template/bd_item_delete.py | 7 +- template/bd_item_select.py | 3 +- 10 files changed, 140 insertions(+), 109 deletions(-) diff --git a/bot_modules/mod_table_operate.py b/bot_modules/mod_table_operate.py index 96e70c6..d7b8355 100644 --- a/bot_modules/mod_table_operate.py +++ b/bot_modules/mod_table_operate.py @@ -3,7 +3,7 @@ # Модуль для редактирования и просмотра таблицы в БД -from bot_sys import keyboard, user_access, bd_table +from bot_sys import keyboard, user_access, bd_table, bot_bd from bot_modules import access_utils, mod_simple_message from template import simple_message, bd_item, bd_item_select, bd_item_view, bd_item_delete, bd_item_add, bd_item_edit @@ -75,15 +75,15 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): self.m_GetButtonNameAndKeyValueAndAccessFunc = GetButtonNameAndKeyValueAndAccess async def PreDelete(a_CallbackQuery, a_Item): - return await self.PreDelete(a_Item) + return await self.PreDelete(a_CallbackQuery, a_Item) self.m_PreDeleteFunc = PreDelete async def PostDelete(a_CallbackQuery, a_ItemID): - return await self.PostDelete(a_Item) + return await self.PostDelete(a_CallbackQuery, a_ItemID) self.m_PostDeleteFunc = PostDelete def AddBDItemFunc(a_ItemData, a_UserID): - return self.AddBDItemFunc(a_Item) + return self.AddBDItemFunc(a_ItemData, a_UserID) self.m_AddBDItemFunc = AddBDItemFunc @@ -101,20 +101,20 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): def GetStartKeyboardButtons(self, a_Message, a_UserGroups): mod_buttons = super().GetStartKeyboardButtons(a_Message, a_UserGroups) cur_buttons = [ - keyboard.ButtonWithAccess(self.GetButton(ButtonNames.LIST), user_access.AccessMode.VIEW, GetAccess()), - keyboard.ButtonWithAccess(self.GetButton(ButtonNames.ADD), user_access.AccessMode.ADD, GetAccess()), - keyboard.ButtonWithAccess(self.GetButton(ButtonNames.DEL), user_access.AccessMode.DELETE, GetAccess()), - keyboard.ButtonWithAccess(self.GetButton(ButtonNames.EDIT), user_access.AccessMode.EDIT, GetAccess()) + keyboard.ButtonWithAccess(self.GetButton(ButtonNames.LIST), user_access.AccessMode.VIEW, self.GetAccess()), + keyboard.ButtonWithAccess(self.GetButton(ButtonNames.ADD), user_access.AccessMode.ADD, self.GetAccess()), + keyboard.ButtonWithAccess(self.GetButton(ButtonNames.DEL), user_access.AccessMode.DELETE, self.GetAccess()), + keyboard.ButtonWithAccess(self.GetButton(ButtonNames.EDIT), user_access.AccessMode.EDIT, self.GetAccess()) ] return mod_buttons + keyboard.MakeButtons(cur_buttons, a_UserGroups) def GetEditKeyboardButtons(self, a_Message, a_UserGroups): mod_buttons = self.GetButtons(self.m_EditModuleNameList) cur_buttons = [ - keyboard.ButtonWithAccess(self.GetButton(ButtonNames.EDIT_PHOTO), user_access.AccessMode.VIEW, GetAccess()), - keyboard.ButtonWithAccess(self.GetButton(ButtonNames.EDIT_NAME), user_access.AccessMode.ADD, GetAccess()), - keyboard.ButtonWithAccess(self.GetButton(ButtonNames.EDIT_DESC), user_access.AccessMode.DELETE, GetAccess()), - keyboard.ButtonWithAccess(self.GetButton(ButtonNames.EDIT_ACCESS), user_access.AccessMode.EDIT, GetAccess()) + 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.EDIT, self.GetAccess()) ] return mod_buttons + keyboard.MakeButtons(cur_buttons, a_UserGroups) @@ -131,7 +131,7 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): return None child_mod = self.GetModule(self.m_ChildModName) cur_buttons = [ - keyboard.InlineButton(child_mod.GetButton(ButtonNames.LIST), child_mod.GetSelectPrefix(), a_ItemID, GetAccess(), user_access.AccessMode.VIEW), + keyboard.InlineButton(child_mod.GetButton(ButtonNames.LIST), child_mod.GetSelectPrefix(), a_ItemID, self.GetAccess(), user_access.AccessMode.VIEW), ] return keyboard.MakeInlineKeyboardButtons(cur_buttons, a_UserGroups) @@ -141,19 +141,22 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): a_Item[self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.KEY)],\ a_Item[self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.ACCESS)] - def ShowMessageTemplate(self, a_MessageName : Messages, keyboard_template_func = None): + def ShowMessageTemplate(self, a_Message, keyboard_template_func = None): async def ShowMessage(a_CallbackQuery, a_Item): - if len(a_Item) < self.m_Table.GetFieldsCount(): - return simple_message.WorkFuncResult(self.GetMessage(Messages.ERROR_FIND)) - - msg = self.GetMessage(a_MessageName).StaticCopy() - msg.UpdateDesc(table.ReplaceAllFieldTags(msg.GetDesc(), a_Item)) - msg.UpdatePhotoID(a_Item[self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.PHOTO)]) - + msg = a_Message.StaticCopy() + # TODO: добавить поддержку языка в a_MessageName keyboard_func = None - if keyboard_template_func: - keyboard_func = keyboard_template_func(a_Item[self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.KEY)]) - return simple_message.WorkFuncResult(msg, item_access = a_Item[self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.ACCESS)], keyboard_func = keyboard_func) + item_access = None + if a_Item: + if len(a_Item) < self.m_Table.GetFieldsCount(): + return simple_message.WorkFuncResult(self.GetMessage(Messages.ERROR_FIND)) + msg.UpdateDesc(self.m_Table.ReplaceAllFieldTags(msg.GetDesc(), a_Item)) + msg.UpdatePhotoID(a_Item[self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.PHOTO)]) + item_access = a_Item[self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.ACCESS)] + if keyboard_template_func: + keyboard_func = keyboard_template_func(a_Item[self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.KEY)]) + + return simple_message.WorkFuncResult(msg, item_access = item_access, keyboard_func = keyboard_func) return ShowMessage # TODO: delete? @@ -168,23 +171,29 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): access = a_Item[self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.ACCESS)] return simple_message.WorkFuncResult(self.GetMessage(Messages.SUCCESS_DELETE), None, item_access = access) - async def TaskPostDelete(self, a_CallbackQuery, a_ItemID): + async def PostDelete(self, a_CallbackQuery, a_ItemID): self.m_Log.Success(f'Задача №{a_ItemID} была удалена пользователем {a_CallbackQuery.from_user.id}.') #TODO: удалить вложенные return simple_message.WorkFuncResult(self.GetMessage(Messages.SUCCESS_DELETE)) def AddBDItemFunc(self, a_ItemData, a_UserID): table_name = self.m_Table.GetName() - name_field = self.m_Table.GetFieldByDestiny(bd_table.TableFieldDestiny.NAME) - photo_field = self.m_Table.GetFieldByDestiny(bd_table.TableFieldDestiny.PHOTO) - desc_field = self.m_Table.GetFieldByDestiny(bd_table.TableFieldDestiny.DESC) - access_field = self.m_Table.GetFieldByDestiny(bd_table.TableFieldDestiny.ACCESS) - create_datetime_field = self.m_Table.GetFieldByDestiny(bd_table.TableFieldDestiny.CREATE_DATE) - parent_id_field = self.m_Table.GetFieldByDestiny(bd_table.TableFieldDestiny.PARENT_ID) - + name_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.NAME) + photo_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.PHOTO) + desc_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.DESC) + access_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.ACCESS) + 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()) - 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])) + #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}=+")) 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}).') @@ -193,55 +202,56 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): return res, error - def RegisterSelect(self, a_ButtonName, access_mode): + 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) - a_Prefix = bd_item_select.NextSelectBDItemRegisterHandlers(self.m_Bot, \ - a_Prefix, \ - self.m_Table.GetFieldByDestiny(bd_table.TableFieldDestiny.PARENT_ID), \ - self.m_Table.GetName(), \ - self.m_Table.GetFieldByDestiny(bd_table.TableFieldDestiny.KEY), \ - self.m_GetButtonNameAndKeyValueAndAccessFunc, \ - self.GetMessage(Messages.SELECT), \ - self.m_GetAccessFunc,\ - access_mode = access_mode\ - ) + 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: - 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.GetFieldByDestiny(bd_table.TableFieldDestiny.KEY), \ - self.m_GetButtonNameAndKeyValueAndAccessFunc, \ - self.GetMessage(Messages.SELECT), \ - self.m_GetAccessFunc,\ - access_mode = access_mode\ - ) + 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), \ + self.m_GetButtonNameAndKeyValueAndAccessFunc, \ + self.GetMessage(Messages.SELECT), \ + self.m_GetAccessFunc,\ + access_mode = access_mode\ + ) return a_Prefix def RegisterHandlers(self): super().RegisterHandlers() table_name = self.m_Table.GetName() - key_name = self.m_Table.GetFieldByDestiny(bd_table.TableFieldDestiny.KEY) - name_field = self.m_Table.GetFieldByDestiny(bd_table.TableFieldDestiny.NAME) - desc_field = self.m_Table.GetFieldByDestiny(bd_table.TableFieldDestiny.DESC) - photo_field = self.m_Table.GetFieldByDestiny(bd_table.TableFieldDestiny.PHOTO) - access_field = self.m_Table.GetFieldByDestiny(bd_table.TableFieldDestiny.ACCESS) - parent_id_field = self.m_Table.GetFieldByDestiny(bd_table.TableFieldDestiny.PARENT_ID) + key_name = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.KEY) + name_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.NAME) + desc_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.DESC) + photo_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.PHOTO) + access_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.ACCESS) + parent_id_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.PARENT_ID) parent_table_name = None parent_key_name = None if self.m_ParentModName: parent_mod = self.GetModule(self.m_ParentModName) parent_table_name = parent_mod.m_Table.GetName() - parent_key_name = parent_mod.m_Table.GetFieldByDestiny(bd_table.TableFieldDestiny.KEY) + parent_key_name = parent_mod.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.KEY) def GetViewItemInlineKeyboardTemplate(a_ItemID): - def GetViewItemInlineKeyboard(a_ItemID): - return self.GetViewItemInlineKeyboardTemplate(a_ItemID) - return GetViewItemInlineKeyboard + return self.GetViewItemInlineKeyboardTemplate(a_ItemID) GetButtonNameAndKeyValueAndAccess = self.m_GetButtonNameAndKeyValueAndAccessFunc GetAccess = self.m_GetAccessFunc @@ -251,19 +261,31 @@ 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) - 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\ - ) + 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 # Удаление @@ -272,14 +294,10 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): a_Prefix = self.RegisterSelect(a_ButtonName, user_access.AccessMode.DELETE) bd_item_delete.DeleteBDItemRegisterHandlers(self.m_Bot, \ a_Prefix, \ - bd_item.GetCheckForPrefixFunc(a_Prefix), \ table_name, \ key_name, \ - parent_id_field, \ self.m_PreDeleteFunc, \ self.m_PostDeleteFunc, \ - GetButtonNameAndKeyValueAndAccess, \ - self.GetMessage(Messages.SELECT), \ GetAccess, \ defaul_keyboard_func\ ) @@ -287,9 +305,12 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): # Добавление a_ButtonName = self.GetButton(ButtonNames.ADD) if a_ButtonName: - a_Prefix = self.RegisterSelect(a_ButtonName, user_access.AccessMode.ADD) + a_Prefix = self.RegisterSelect(a_ButtonName, user_access.AccessMode.ADD, only_parent = True) + check_func = bd_item.GetCheckForTextFunc(a_ButtonName) + if a_Prefix: + check_func = bd_item.GetCheckForPrefixFunc(a_Prefix) bd_item_add.AddBDItem3RegisterHandlers(self.m_Bot, \ - bd_item.GetCheckForPrefixFunc(a_Prefix), \ + check_func, \ self.m_FSMs.m_FSMCreate, \ self.m_FSMs.m_FSMCreate.name,\ self.m_FSMs.m_FSMCreate.desc, \ @@ -309,8 +330,8 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): GetAccess, \ self.m_GetStartKeyboardButtonsFunc\ ) - - # Редактирование + ''' + # Редактирование 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: @@ -351,3 +372,5 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): RegisterEdit(self.GetButton(ButtonNames.EDIT_DESC), self.m_FSMs.m_FSMEditDesc, self.GetMessage(Messages.EDIT_DESC), desc_field, bd_item.FieldType.text) RegisterEdit(self.GetButton(ButtonNames.EDIT_PHOTO), self.m_FSMs.m_FSMEditPhoto, self.GetMessage(Messages.EDIT_PHOTO), photo_field, bd_item.FieldType.photo) RegisterEdit(self.GetButton(ButtonNames.EDIT_ACCESS), self.m_FSMs.m_FSMEditAccess, self.GetMessage(Messages.EDIT_ACCESS), access_field, bd_item.FieldType.text) + ''' + diff --git a/bot_modules/projects.py b/bot_modules/projects.py index 0f884a6..17b5a5a 100644 --- a/bot_modules/projects.py +++ b/bot_modules/projects.py @@ -147,7 +147,7 @@ class ModuleProjects(mod_table_operate.TableOperateModule): def GetModuleButtons(self): return super().GetModuleButtons() + [ - keyboard.ButtonWithAccess(self.GetButton(ButtonNames.LIST), user_access.AccessMode.VIEW, self.GetAccess()), + keyboard.ButtonWithAccess(self.GetButton(mod_table_operate.ButtonNames.LIST), user_access.AccessMode.VIEW, self.GetAccess()), ] diff --git a/bot_sys/bd_table.py b/bot_sys/bd_table.py index f68b393..233a806 100644 --- a/bot_sys/bd_table.py +++ b/bot_sys/bd_table.py @@ -38,7 +38,7 @@ class Table: return self.TableFieldType def GetFieldsCount(self): - return len(self.TableFieldType) + return len(self.m_Fields) def GetFieldByDestiny(self, a_Destiny): for f in self.m_Fields: @@ -46,6 +46,12 @@ class Table: return f return None + def GetFieldNameByDestiny(self, a_Destiny): + f = self.GetFieldByDestiny(a_Destiny) + if f: + return f.m_Name + return None + def GetFieldIDByDestiny(self, a_Destiny): for i in range(len(self.m_Fields)): f = self.m_Fields[i] @@ -78,23 +84,28 @@ def Test(): ]) assert table.GetName() == 'tname' assert table.GetFieldByDestiny(TableFieldDestiny.KEY).m_Name == 'f1' + assert table.GetFieldNameByDestiny(TableFieldDestiny.KEY) == 'f1' assert table.GetFieldByDestiny(TableFieldDestiny.KEY).m_Destiny == TableFieldDestiny.KEY assert table.GetFieldByDestiny(TableFieldDestiny.KEY).m_Type == TableFieldType.INT assert table.GetFieldIDByDestiny(TableFieldDestiny.KEY) == 0 assert table.GetFieldByDestiny(TableFieldDestiny.NAME).m_Name == 'f2' + assert table.GetFieldNameByDestiny(TableFieldDestiny.NAME) == 'f2' assert table.GetFieldByDestiny(TableFieldDestiny.NAME).m_Destiny == TableFieldDestiny.NAME assert table.GetFieldByDestiny(TableFieldDestiny.NAME).m_Type == TableFieldType.STR assert table.GetFieldIDByDestiny(TableFieldDestiny.NAME) == 1 assert table.GetFieldByDestiny(TableFieldDestiny.DESC).m_Name == 'f3' + assert table.GetFieldNameByDestiny(TableFieldDestiny.DESC) == 'f3' 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.PHOTO) == None assert table.GetFieldIDByDestiny(TableFieldDestiny.PHOTO) == None + assert table.GetFieldNameByDestiny(TableFieldDestiny.PHOTO) == None + + assert table.GetFieldsCount() == 3 assert table.GetInitTableRequest() == 'CREATE TABLE IF NOT EXISTS tname(f1 INTEGER PRIMARY KEY, f2 TEXT , f3 TEXT );' item = [10, 'i1', 'i2'] - print( table.ReplaceAllFieldTags('#f1 #f2 #f3', item)) assert table.ReplaceAllFieldTags('#f1 #f2 #f3', item) == '10 i1 i2' diff --git a/bot_sys/bot_bd.py b/bot_sys/bot_bd.py index ea9a266..4a1d73f 100644 --- a/bot_sys/bot_bd.py +++ b/bot_sys/bot_bd.py @@ -19,18 +19,11 @@ def GetBDFileName(): def GetBDDateTimeNow(): return 'datetime(\'now\')' -def BDExecute(a_Commands): - for cmd in a_Commands: - SQLRequestToBD(cmd, commit = True) - -def SelectBDTemplate(a_TableName): +def SelectBDTemplate(a_Bot, a_TableName): def SelectBD(): - return SQLRequestToBD(f'SELECT * FROM {a_TableName}') + return a_Bot.SQLRequest(f'SELECT * FROM {a_TableName}') return SelectBD -def SQLRequestToBD(a_Request : str, commit = False, return_error = False, param = None): - return SQLRequest(GetBDFileName(), a_Request, commit = commit, return_error = return_error, param = param) - def RequestsExecute(a_BDFileName, a_Commands): for cmd in a_Commands: SQLRequest(a_BDFileName, cmd, commit = True) diff --git a/bot_sys/keyboard.py b/bot_sys/keyboard.py index 706ddc6..b0ecbc4 100644 --- a/bot_sys/keyboard.py +++ b/bot_sys/keyboard.py @@ -75,7 +75,7 @@ def MakeAiogramInlineKeyboard(a_ButtonList : [InlineButton]): r = [] for b in row: r += [types.InlineKeyboardButton(text = str(b.label), callback_data = b.callback_data)] - buttons += r + buttons += [r] inline_keyboard = InlineKeyboardMarkup(inline_keyboard=buttons) return inline_keyboard diff --git a/main.py b/main.py index 1b5ec47..a7863dc 100644 --- a/main.py +++ b/main.py @@ -38,7 +38,7 @@ g_ModuleAgregator.AddModule(mod_profile) mod_backup = backup.ModuleBackup(start_mod_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) g_ModuleAgregator.AddModule(mod_backup) -start_mod_name_list = [mod_start_name, mod_tasks_name, mod_needs_name, mod_comments_name] +start_mod_name_list = [mod_start_name]#, mod_tasks_name, mod_needs_name, mod_comments_name] mod_project = projects.ModuleProjects(None, None, start_mod_name_list, start_mod_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) g_ModuleAgregator.AddModule(mod_project) diff --git a/template/bd_item.py b/template/bd_item.py index 695030e..31f3316 100644 --- a/template/bd_item.py +++ b/template/bd_item.py @@ -47,7 +47,7 @@ def GetCancelKeyboardButtonsTemplate(a_AccessFunc, a_AccessMode): cur_buttons = [ keyboard.ButtonWithAccess(canсel_button_name, a_AccessMode, a_AccessFunc()), ] - return keyboard.MakeInlineKeyboardButtons(cur_buttons, a_UserGroups) + return keyboard.MakeButtons(cur_buttons, a_UserGroups) return GetCancelKeyboardButtons def GetSkipAndCancelKeyboardButtonsTemplate(a_AccessFunc, a_AccessMode): @@ -56,7 +56,7 @@ def GetSkipAndCancelKeyboardButtonsTemplate(a_AccessFunc, a_AccessMode): keyboard.ButtonWithAccess(skip_button_name, a_AccessMode, a_AccessFunc()), keyboard.ButtonWithAccess(canсel_button_name, a_AccessMode, a_AccessFunc()), ] - return keyboard.MakeInlineKeyboardButtons(cur_buttons, a_UserGroups) + return keyboard.MakeButtons(cur_buttons, a_UserGroups) return GetSkipAndCancelKeyboardButtons def GetAllItemsTemplate(a_Bot, a_TableName): @@ -91,7 +91,7 @@ def CheckAccessBDItemTemplate(a_Bot, a_TableName, a_KeyName, a_KeyValue, a_WorkF return simple_message.WorkFuncResult(bot_messages.MakeBotMessage(msg)), None result_work_func = await a_WorkFunc(a_CallbackQuery, item[0]) - if result_work_func is None or result_work_func.string_message is None: + if result_work_func is None or result_work_func.m_BotMessage is None: return result_work_func, result_work_func if not result_work_func.item_access is None and not user_access.CheckAccessString(result_work_func.item_access, user_groups, a_AccessMode): diff --git a/template/bd_item_add.py b/template/bd_item_add.py index 394a950..a203da0 100644 --- a/template/bd_item_add.py +++ b/template/bd_item_add.py @@ -14,7 +14,7 @@ cancel_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): user_id = str(a_CallbackQuery.from_user.id) - user_groups = groups.GetUserGroupData(a_Bot, user_id) + user_groups = groups_utils.GetUserGroupData(a_Bot, user_id) parent_id = bd_item.GetKeyDataFromCallbackMessage(a_CallbackQuery, a_Prefix) res_of_work_func = None check = None @@ -50,7 +50,7 @@ def FinishOrNextAddBDItemTemplate(a_Bot, a_FSM, a_AddBDItemFunc, a_ParentTableNa else: state_func = a_FSM.next user_id = str(a_Message.from_user.id) - user_groups = groups.GetUserGroupData(a_Bot, user_id) + user_groups = groups_utils.GetUserGroupData(a_Bot, user_id) error = None res_of_work_func = None check = None diff --git a/template/bd_item_delete.py b/template/bd_item_delete.py index 4228e7e..7c7a355 100644 --- a/template/bd_item_delete.py +++ b/template/bd_item_delete.py @@ -10,7 +10,7 @@ from template import simple_message, bd_item_select, bd_item def DeleteBDItemTemplate(a_Bot, a_TableName, a_KeyName, a_PreDeleteWorkFunc, a_PostDeleteWorkFunc, a_Prefix, a_AccessFunc, a_ButtonFunc, delete = True, access_mode = user_access.AccessMode.DELETE): async def DeleteBDItem(a_CallbackQuery, state = None): user_id = str(a_CallbackQuery.from_user.id) - user_groups = groups.GetUserGroupData(a_Bot, user_id) + user_groups = groups_utils.GetUserGroupData(a_Bot, user_id) item_id = str(a_CallbackQuery.data).replace(a_Prefix, '') check, res_of_pre_del = await bd_item.CheckAccessBDItemTemplate(a_Bot, a_TableName, a_KeyName, item_id, a_PreDeleteWorkFunc, access_mode)(a_CallbackQuery) @@ -29,7 +29,7 @@ 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 DeleteBDItemRegisterHandlers(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): +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 @@ -39,3 +39,6 @@ def DeleteBDItemRegisterHandlers(a_Bot, a_PrevPrefix, a_StartCheckFunc, a_TableN 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_select.py b/template/bd_item_select.py index 0109ee5..2931af2 100644 --- a/template/bd_item_select.py +++ b/template/bd_item_select.py @@ -23,13 +23,14 @@ def GetBDItemsListKeyboardButtonsTemplate(a_Bot, a_TableName : str, a_ParentIDFi access = '' if bname: b = keyboard.InlineButtonWithAccess(bname, a_NextPrefix, key_value, access, access_mode) + print('MakeInlineKeyboardButtons', b, bname, a_NextPrefix, key_value, access, access_mode) items_button_list += [b] return keyboard.MakeInlineKeyboardButtons(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): keyboard_func = GetBDItemsListKeyboardButtonsTemplate(a_Bot, a_TableName, a_ParentIDFieldName, a_PrevPrefix, a_NextPrefix, a_GetButtonNameAndKeyValueAndAccessFunc) - return simple_message.InfoMessageTemplate(a_Bot, a_StartMessage, keyboard_func, None, a_AccessFunc, access_mode) + return simple_message.InfoMessageTemplate(a_Bot, a_StartMessage, None, 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): -- 2.11.0 From dcb94dc949df3b555470fc451e06d27e1d544998 Mon Sep 17 00:00:00 2001 From: Alexei Date: Wed, 17 May 2023 12:24:17 +0300 Subject: [PATCH 16/25] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D0=B5=D0=BA=D1=82?= =?UTF-8?q?=D1=8B=20=D0=BF=D0=BE=D0=BB=D0=BD=D0=BE=D1=81=D1=82=D1=8C=D1=8E?= =?UTF-8?q?=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D1=8E=D1=82.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot_modules/mod_table_operate.py | 18 ++++++++++++------ main.py | 1 - 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/bot_modules/mod_table_operate.py b/bot_modules/mod_table_operate.py index d7b8355..8a932cb 100644 --- a/bot_modules/mod_table_operate.py +++ b/bot_modules/mod_table_operate.py @@ -109,7 +109,7 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): return mod_buttons + keyboard.MakeButtons(cur_buttons, a_UserGroups) def GetEditKeyboardButtons(self, a_Message, a_UserGroups): - mod_buttons = self.GetButtons(self.m_EditModuleNameList) + mod_buttons = keyboard.MakeButtons(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()), @@ -206,7 +206,7 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): a_Prefix = None if self.m_ParentModName: parent_mod = self.GetModule(self.m_ParentModName) - a_Prefix = parent_mod.RegisterSelect(a_ButtonName, access_mode) + 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, \ @@ -306,9 +306,11 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): a_ButtonName = self.GetButton(ButtonNames.ADD) if a_ButtonName: a_Prefix = self.RegisterSelect(a_ButtonName, user_access.AccessMode.ADD, only_parent = True) + check_func = bd_item.GetCheckForTextFunc(a_ButtonName) if a_Prefix: check_func = bd_item.GetCheckForPrefixFunc(a_Prefix) + bd_item_add.AddBDItem3RegisterHandlers(self.m_Bot, \ check_func, \ self.m_FSMs.m_FSMCreate, \ @@ -330,17 +332,22 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): GetAccess, \ self.m_GetStartKeyboardButtonsFunc\ ) - ''' + # Редактирование 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 - a_Prefix = self.RegisterSelect(a_ButtonName, a_AccessMode) + + 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) bd_item_edit.EditBDItemRegisterHandlers(self.m_Bot, \ a_Prefix, \ a_FSM, \ - bd_item.GetCheckForPrefixFunc(a_Prefix), \ + check_func, \ self.GetMessage(Messages.SELECT_TO_EDIT), \ self.ShowMessageTemplate(a_EditMessage), \ self.ShowMessageTemplate(self.GetMessage(Messages.SUCCESS_EDIT)), \ @@ -372,5 +379,4 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): RegisterEdit(self.GetButton(ButtonNames.EDIT_DESC), self.m_FSMs.m_FSMEditDesc, self.GetMessage(Messages.EDIT_DESC), desc_field, bd_item.FieldType.text) RegisterEdit(self.GetButton(ButtonNames.EDIT_PHOTO), self.m_FSMs.m_FSMEditPhoto, self.GetMessage(Messages.EDIT_PHOTO), photo_field, bd_item.FieldType.photo) RegisterEdit(self.GetButton(ButtonNames.EDIT_ACCESS), self.m_FSMs.m_FSMEditAccess, self.GetMessage(Messages.EDIT_ACCESS), access_field, bd_item.FieldType.text) - ''' diff --git a/main.py b/main.py index a7863dc..afd4ba1 100644 --- a/main.py +++ b/main.py @@ -71,7 +71,6 @@ g_BotButtons.UpdateSignal(g_Log.GetTimeNow()) #messages.FlushMessages() for m in modules: - print(m) m.RegisterHandlers() # Юнит тесты модулей и файлов -- 2.11.0 From c4ec7b4b20486aa63b0ca89ecf338ec6087c005e Mon Sep 17 00:00:00 2001 From: Alexei Date: Wed, 17 May 2023 13:16:10 +0300 Subject: [PATCH 17/25] =?UTF-8?q?=D0=97=D0=B0=D0=B4=D0=B0=D1=87=D0=B8=20?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D1=8E=D1=82!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot_modules/mod_table_operate.py | 19 +- bot_modules/tasks.py | 363 +++++++-------------------------------- main.py | 10 +- template/bd_item_select.py | 5 +- template/simple_message.py | 15 +- 5 files changed, 93 insertions(+), 319 deletions(-) diff --git a/bot_modules/mod_table_operate.py b/bot_modules/mod_table_operate.py index 8a932cb..8641898 100644 --- a/bot_modules/mod_table_operate.py +++ b/bot_modules/mod_table_operate.py @@ -131,7 +131,7 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): return None child_mod = self.GetModule(self.m_ChildModName) cur_buttons = [ - keyboard.InlineButton(child_mod.GetButton(ButtonNames.LIST), child_mod.GetSelectPrefix(), a_ItemID, self.GetAccess(), user_access.AccessMode.VIEW), + keyboard.InlineButtonWithAccess(child_mod.GetButton(ButtonNames.LIST), child_mod.GetSelectPrefix(), a_ItemID, self.GetAccess(), user_access.AccessMode.VIEW), ] return keyboard.MakeInlineKeyboardButtons(cur_buttons, a_UserGroups) @@ -141,22 +141,23 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): a_Item[self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.KEY)],\ a_Item[self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.ACCESS)] - def ShowMessageTemplate(self, a_Message, keyboard_template_func = None): + def ShowMessageTemplate(self, a_Message, Inline_keyboard_template_func = None): async def ShowMessage(a_CallbackQuery, a_Item): msg = a_Message.StaticCopy() # TODO: добавить поддержку языка в a_MessageName - keyboard_func = None + Inline_keyboard_func = None item_access = None if a_Item: - if len(a_Item) < self.m_Table.GetFieldsCount(): + if len(a_Item) < self.m_Table.GetFieldsCount() - 1: # Для проектов это нужно. Там на 1 меньше поле. TODO разделить отправку сообщений item_access и Inline_keyboard_func return simple_message.WorkFuncResult(self.GetMessage(Messages.ERROR_FIND)) - msg.UpdateDesc(self.m_Table.ReplaceAllFieldTags(msg.GetDesc(), a_Item)) - msg.UpdatePhotoID(a_Item[self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.PHOTO)]) + elif len(a_Item) == self.m_Table.GetFieldsCount(): + msg.UpdateDesc(self.m_Table.ReplaceAllFieldTags(msg.GetDesc(), a_Item)) + msg.UpdatePhotoID(a_Item[self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.PHOTO)]) item_access = a_Item[self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.ACCESS)] - if keyboard_template_func: - keyboard_func = keyboard_template_func(a_Item[self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.KEY)]) + if Inline_keyboard_template_func: + Inline_keyboard_func = Inline_keyboard_template_func(a_Item[self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.KEY)]) - return simple_message.WorkFuncResult(msg, item_access = item_access, keyboard_func = keyboard_func) + return simple_message.WorkFuncResult(msg, item_access = item_access, Inline_keyboard_func = Inline_keyboard_func) return ShowMessage # TODO: delete? diff --git a/bot_modules/tasks.py b/bot_modules/tasks.py index b3ed5f8..ca69097 100644 --- a/bot_modules/tasks.py +++ b/bot_modules/tasks.py @@ -3,36 +3,27 @@ # Задачи -from bot_sys import bot_bd, bd_table, keyboard, user_access -from bot_modules import start, access, groups, projects, needs, comments -from template import bd_item_view, simple_message, bd_item_delete, bd_item_edit, bd_item, bd_item_add, bd_item_select - -from aiogram import types +from bot_sys import bot_bd, keyboard, user_access, user_messages, bd_table +from bot_modules import mod_table_operate from aiogram.dispatcher import FSMContext from aiogram.dispatcher.filters.state import State, StatesGroup -from aiogram.dispatcher import Dispatcher -import sqlite3 -class FSMCreateTask(StatesGroup): +class FSMCreateTasks(StatesGroup): name = State() desc = State() photo = State() -class FSMEditTaskPhotoItem(StatesGroup): - item_id = State() +class FSMEditTasksPhotoItem(StatesGroup): item_field = State() -class FSMEditTaskNameItem(StatesGroup): - item_id = State() +class FSMEditTasksNameItem(StatesGroup): item_field = State() -class FSMEditTaskDescItem(StatesGroup): - item_id = State() +class FSMEditTasksDescItem(StatesGroup): item_field = State() -class FSMEditTaskAccessItem(StatesGroup): - item_id = State() +class FSMEditTasksAccessItem(StatesGroup): item_field = State() # --------------------------------------------------------- # БД @@ -57,327 +48,101 @@ table = bd_table.Table(table_name, [ bd_table.TableField(parent_id_field, bd_table.TableFieldDestiny.PARENT_ID, bd_table.TableFieldType.INT), ]) -init_bd_cmds = [f'''CREATE TABLE IF NOT EXISTS {table_name}( - {key_name} INTEGER PRIMARY KEY, - {name_field} TEXT, - {desc_field} TEXT, - {photo_field} TEXT, - {access_field} TEXT, - {create_datetime_field} TEXT, - {parent_id_field} INTEGER - )''', -f"INSERT OR IGNORE INTO module_access (modName, modAccess, itemDefaultAccess) VALUES ('{module_name}', '{user_access.user_access_group_new}=va', '{user_access.user_access_group_new}=va');" -] +init_access = f'{user_access.user_access_group_new}=va' -select_tasks_prefix = '' +fsm = mod_table_operate.FSMs(FSMCreateTasks, FSMEditTasksNameItem, FSMEditTasksDescItem, FSMEditTasksPhotoItem, FSMEditTasksAccessItem) # --------------------------------------------------------- -# Сообщения - -tasks_button_name = "✎ Задачи" -base_task_message = ''' -✎ Задачи - -''' - -list_task_button_name = "📃 Список задач" -select_task_message = ''' +# Сообщения и кнопки + +button_names = { + mod_table_operate.ButtonNames.START: "✎ Задачи", + 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.ButtonNames.DEL: "❌ Удалить задачу", +} + +messages = { + mod_table_operate.Messages.START: f''' +{button_names[mod_table_operate.ButtonNames.START]} + +''', + mod_table_operate.Messages.SELECT: ''' Пожалуйста, выберите задачу: -''' - -error_find_proj_message = ''' +''', + mod_table_operate.Messages.ERROR_FIND: ''' ❌ Ошибка, задача не найдена -''' - -task_open_message = f''' +''', + mod_table_operate.Messages.OPEN: f''' Задача: #{name_field} #{desc_field} Время создания: #{create_datetime_field} -''' - -# Создание задачи - -add_task_button_name = "☑ Добавить задачу" -task_create_name_message = ''' +''', + mod_table_operate.Messages.CREATE_NAME: ''' Создание задачи. Шаг №1 Введите название задачи: -''' - -task_create_desc_message = ''' +''', + mod_table_operate.Messages.CREATE_DESC: ''' Создание задачи. Шаг №2 Введите описание задачи: -''' - -task_create_photo_message = ''' +''', + mod_table_operate.Messages.CREATE_PHOTO: ''' Создание задачи. Шаг №3 Загрузите обложку для задачи (Фото): Она будет отображаться в её описании. -''' - -task_success_create_message = '''✅ Задача успешно добавлена!''' - -# Редактирование задачи. - -edit_task_button_name = "🛠 Редактировать задачу" -task_start_edit_message= ''' +''', + mod_table_operate.Messages.SUCCESS_CREATE: '''✅ Задача успешно добавлена!''', + mod_table_operate.Messages.START_EDIT: ''' Пожалуйста, выберите действие: -''' - -task_select_to_edit_message = ''' +''', + mod_table_operate.Messages.SELECT_TO_EDIT: ''' Выберите задачу, которую вы хотите отредактировать. -''' - -edit_task_photo_button_name = "☐ Изменить изображение у задачи" -task_edit_photo_message = ''' +''', + mod_table_operate.Messages.EDIT_PHOTO: ''' Загрузите новую обложку для задачи (Фото): Она будет отображаться в её описании. -''' - -edit_task_name_button_name = "≂ Изменить название у задачи" -task_edit_name_message = f''' +''', + mod_table_operate.Messages.EDIT_NAME: f''' Текущее название задачи: #{name_field} Введите новое название задачи: -''' - -edit_task_desc_button_name = "𝌴 Изменить описание у задачи" -task_edit_desc_message = f''' +''', + mod_table_operate.Messages.EDIT_DESC: f''' Текущее описание задачи: #{desc_field} Введите новое описание задачи: -''' - -edit_task_access_button_name = "✋ Изменить доступ к задаче" -task_edit_access_message = f''' +''', + mod_table_operate.Messages.EDIT_ACCESS: f''' Текущий доступ к задаче: #{access_field} {user_access.user_access_readme} Введите новую строку доступа: -''' - -task_success_edit_message = '''✅ Задача успешно отредактирована!''' - -# Удаление задачи - -del_task_button_name = "❌ Удалить задачу" -task_select_to_delete_message = ''' +''', + mod_table_operate.Messages.SUCCESS_EDIT: '''✅ Задача успешно отредактирован!''', + mod_table_operate.Messages.SELECT_TO_DELETE: ''' Выберите задачу, которую вы хотите удалить. -Все потребности в этой задачае так же будут удалены! -''' - -task_success_delete_message = '''✅ Задача успешно удалена!''' - -# --------------------------------------------------------- -# Работа с кнопками - -def GetEditTaskKeyboardButtons(a_Message, a_UserGroups): - cur_buttons = GetModuleButtons() + [ - keyboard.ButtonWithAccess(edit_task_photo_button_name, user_access.AccessMode.EDIT, GetAccess()), - keyboard.ButtonWithAccess(edit_task_name_button_name, user_access.AccessMode.EDIT, GetAccess()), - keyboard.ButtonWithAccess(edit_task_desc_button_name, user_access.AccessMode.EDIT, GetAccess()), - keyboard.ButtonWithAccess(edit_task_access_button_name, user_access.AccessMode.ACCEES_EDIT, GetAccess()), - ] - mods = [start] - return keyboard.MakeKeyboard(keyboard.GetButtons(mods) + cur_buttons, a_UserGroups) - -def GetStartTaskKeyboardButtons(a_Message, a_UserGroups): - cur_buttons = [ - keyboard.ButtonWithAccess(list_task_button_name, user_access.AccessMode.VIEW, GetAccess()), - keyboard.ButtonWithAccess(add_task_button_name, user_access.AccessMode.ADD, GetAccess()), - keyboard.ButtonWithAccess(del_task_button_name, user_access.AccessMode.DELETE, GetAccess()), - keyboard.ButtonWithAccess(edit_task_button_name, user_access.AccessMode.EDIT, GetAccess()) - ] - mods = [start, projects, needs, comments] - return keyboard.MakeKeyboard(keyboard.GetButtons(mods) + cur_buttons, a_UserGroups) - -def GetViewItemInlineKeyboardTemplate(a_ItemID): - def GetViewItemInlineKeyboard(a_Message, a_UserGroups): - cur_buttons = [ - keyboard.InlineButton(needs.list_need_button_name, needs.select_needs_prefix, a_ItemID, GetAccess(), user_access.AccessMode.VIEW), - ] - return keyboard.MakeInlineKeyboard(cur_buttons, a_UserGroups) - return GetViewItemInlineKeyboard - -# --------------------------------------------------------- -# Обработка сообщений - -# стартовое сообщение -async def TasksOpen(a_Message : types.message, state = None): - return simple_message.WorkFuncResult(base_task_message) - -def GetButtonNameAndKeyValueAndAccess(a_Item): - # taskName taskID taskAccess - return a_Item[1], a_Item[0], a_Item[4] - -def ShowMessageTemplate(a_StringMessage, keyboard_template_func = None): - async def ShowMessage(a_CallbackQuery : types.CallbackQuery, a_Item): - if (len(a_Item) < 6): - return simple_message.WorkFuncResult(error_find_proj_message) - - msg = a_StringMessage.\ - replace(f'#{name_field}', a_Item[1]).\ - replace(f'#{desc_field}', a_Item[2]).\ - replace(f'#{create_datetime_field}', a_Item[5]).\ - replace(f'#{access_field}', a_Item[4]) - keyboard_func = None - if keyboard_template_func: - keyboard_func = keyboard_template_func(a_Item[0]) - return simple_message.WorkFuncResult(msg, photo_id = a_Item[3], item_access = a_Item[4], keyboard_func = keyboard_func) - return ShowMessage - -def SimpleMessageTemplateLegacy(a_StringMessage): - async def ShowMessage(a_CallbackQuery : types.CallbackQuery, a_Item): - return simple_message.WorkFuncResult(a_StringMessage) - return ShowMessage - -# Удаление задачи - -async def TaskPreDelete(a_CallbackQuery : types.CallbackQuery, a_Item): - if (len(a_Item) < 6): - return simple_message.WorkFuncResult(error_find_proj_message) - access = a_Item[4] - return simple_message.WorkFuncResult('', None, item_access = access) - -async def TaskPostDelete(a_CallbackQuery : types.CallbackQuery, a_ItemID): - log.Success(f'Задача №{a_ItemID} была удалена пользователем {a_CallbackQuery.from_user.id}.') - #TODO: удалить вложенные - return simple_message.WorkFuncResult(task_success_delete_message) - -# --------------------------------------------------------- -# Работа с базой данных задач - -def AddBDItemFunc(a_ItemData, a_UserID): - res, error = bot_bd.SQLRequestToBD(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], access.GetItemDefaultAccessForModule(module_name) + f";{a_UserID}=+", a_ItemData[parent_id_field])) - - if error: - log.Error(f'Пользоватлель {a_UserID}. Ошибка добавления записи в таблицу {table_name} ({a_ItemData[photo_field]}, {a_ItemData[name_field]}, {a_ItemData[desc_field]}, {access.GetItemDefaultAccessForModule(module_name)}).') - else: - log.Success(f'Пользоватлель {a_UserID}. Добавлена запись в таблицу {table_name} ({a_ItemData[photo_field]}, {a_ItemData[name_field]}, {a_ItemData[desc_field]}, {access.GetItemDefaultAccessForModule(module_name)}).') - - return res, error - -# --------------------------------------------------------- -# API - -# Инициализация БД -def GetInitBDCommands(): - return init_bd_cmds - -def GetAccess(): - return access.GetAccessForModule(module_name) - -# Доступные кнопки -def GetModuleButtons(): - return [keyboard.ButtonWithAccess(tasks_button_name, user_access.AccessMode.VIEW, GetAccess())] - -# Обработка кнопок -def RegisterHandlers(dp : Dispatcher): - defaul_keyboard_func = GetStartTaskKeyboardButtons - def RegisterSelectParent(a_ButtonName, access_mode): - a_PrefixBase = a_ButtonName - return bd_item_select.FirstSelectBDItemRegisterHandlers(dp, \ - a_PrefixBase, \ - a_ButtonName, \ - projects.table_name, \ - projects.key_name, \ - projects.GetButtonNameAndKeyValueAndAccess, \ - projects.select_project_message, \ - projects.GetAccess, access_mode = access_mode\ - ) - - # Стартовое сообщение - dp.register_message_handler(simple_message.SimpleMessageTemplateLegacy(TasksOpen, defaul_keyboard_func, GetAccess), text = tasks_button_name) - - # Список задач - a_Prefix = RegisterSelectParent(list_task_button_name, user_access.AccessMode.VIEW) - bd_item_view.LastSelectAndShowBDItemRegisterHandlers(dp, \ - a_Prefix, parent_id_field, \ - table_name, key_name, \ - ShowMessageTemplate(task_open_message, GetViewItemInlineKeyboardTemplate), \ - GetButtonNameAndKeyValueAndAccess, \ - select_task_message, \ - GetAccess, \ - defaul_keyboard_func, \ - access_mode = user_access.AccessMode.VIEW\ - ) - global select_tasks_prefix - select_tasks_prefix = a_Prefix - - # Удаление задачи - a_Prefix = RegisterSelectParent(del_task_button_name, user_access.AccessMode.DELETE) - bd_item_delete.DeleteBDItemRegisterHandlers(dp, \ - a_Prefix, \ - bd_item.GetCheckForPrefixFunc(a_Prefix), \ - table_name, \ - key_name, \ - parent_id_field, \ - TaskPreDelete, \ - TaskPostDelete, \ - GetButtonNameAndKeyValueAndAccess, \ - select_task_message, \ - GetAccess, \ - defaul_keyboard_func\ - ) - - # Добавление задачи - a_Prefix = RegisterSelectParent(add_task_button_name, user_access.AccessMode.ADD) - bd_item_add.AddBDItem3RegisterHandlers(dp, \ - bd_item.GetCheckForPrefixFunc(a_Prefix), \ - FSMCreateTask, \ - FSMCreateTask.name,\ - FSMCreateTask.desc, \ - FSMCreateTask.photo,\ - AddBDItemFunc, \ - SimpleMessageTemplateLegacy(task_create_name_message), \ - SimpleMessageTemplateLegacy(task_create_desc_message), \ - SimpleMessageTemplateLegacy(task_create_photo_message), \ - SimpleMessageTemplateLegacy(task_success_create_message), \ - a_Prefix,\ - projects.table_name, \ - projects.key_name, \ - name_field, \ - desc_field, \ - photo_field, \ - GetButtonNameAndKeyValueAndAccess, \ - GetAccess, \ - GetStartTaskKeyboardButtons\ - ) - - def RegisterEdit(a_ButtonName, a_FSM, a_EditMessage, a_FieldName, a_FieldType, a_AccessMode = user_access.AccessMode.EDIT): - a_Prefix = RegisterSelectParent(a_ButtonName, a_AccessMode) - bd_item_edit.EditBDItemRegisterHandlers(dp, \ - a_Prefix, \ - a_FSM, \ - bd_item.GetCheckForPrefixFunc(a_Prefix), \ - task_select_to_edit_message, \ - ShowMessageTemplate(a_EditMessage), \ - ShowMessageTemplate(task_success_edit_message), \ - table_name, \ - key_name, \ - parent_id_field, \ - a_FieldName, \ - GetButtonNameAndKeyValueAndAccess, \ - GetAccess, \ - edit_keyboard_func, \ - access_mode = a_AccessMode, \ - field_type = a_FieldType\ - ) +Все потребности в этой задаче так же будут удалены! +''', + mod_table_operate.Messages.SUCCESS_DELETE: '''✅ Задача успешно удалёна!''', +} - # Редактирование задачи - edit_keyboard_func = GetEditTaskKeyboardButtons - dp.register_message_handler(simple_message.InfoMessageTemplateLegacy(task_start_edit_message, edit_keyboard_func, GetAccess, access_mode = user_access.AccessMode.EDIT), text = edit_task_button_name) +class ModuleTasks(mod_table_operate.TableOperateModule): + 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, fsm, a_ParentModName, a_ChildModName, init_access, a_ChildModuleNameList, a_EditModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log) - RegisterEdit(edit_task_photo_button_name, FSMEditTaskPhotoItem, task_edit_photo_message, photo_field, bd_item.FieldType.photo) - RegisterEdit(edit_task_name_button_name, FSMEditTaskNameItem, task_edit_name_message, name_field, bd_item.FieldType.text) - RegisterEdit(edit_task_desc_button_name, FSMEditTaskDescItem, task_edit_desc_message, desc_field, bd_item.FieldType.text) - RegisterEdit(edit_task_access_button_name, FSMEditTaskAccessItem, task_edit_access_message, access_field, bd_item.FieldType.text) + def GetName(self): + return module_name diff --git a/main.py b/main.py index afd4ba1..a585a19 100644 --- a/main.py +++ b/main.py @@ -6,7 +6,7 @@ log_start_message = 'Бот успешно запущен!' import os from bot_sys import config, log, bot_bd, user_access, aiogram_bot, bot_messages, bd_table -from bot_modules import mod_agregator, start, profile, backup, groups, access, projects #, projects, , access, , tasks, needs, comments, messages, , languages +from bot_modules import mod_agregator, start, profile, backup, groups, access, projects, tasks #, projects, , access, , , needs, comments, messages, , languages g_Log = log g_Bot = aiogram_bot.AiogramBot(config.GetTelegramBotApiToken(), bot_bd.GetBDFileName(), config.GetRootIDs(), g_Log) @@ -38,10 +38,14 @@ g_ModuleAgregator.AddModule(mod_profile) mod_backup = backup.ModuleBackup(start_mod_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) g_ModuleAgregator.AddModule(mod_backup) -start_mod_name_list = [mod_start_name]#, mod_tasks_name, mod_needs_name, mod_comments_name] -mod_project = projects.ModuleProjects(None, None, start_mod_name_list, start_mod_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) +start_mod_name_list = [mod_start_name, mod_tasks_name]#, , mod_needs_name, mod_comments_name] +mod_project = projects.ModuleProjects(None, mod_tasks_name, start_mod_name_list, start_mod_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) g_ModuleAgregator.AddModule(mod_project) +start_mod_name_list = [mod_start_name, mod_projects_name]#, mod_needs_name, mod_comments_name] +mod_tasks = tasks.ModuleTasks(mod_projects_name, None, start_mod_name_list, start_mod_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) +g_ModuleAgregator.AddModule(mod_tasks) + start_mod_name_list = [#, '', , '', , 'languages'] mod_profile.GetName(), mod_backup.GetName(), diff --git a/template/bd_item_select.py b/template/bd_item_select.py index 2931af2..8514c9e 100644 --- a/template/bd_item_select.py +++ b/template/bd_item_select.py @@ -23,14 +23,13 @@ def GetBDItemsListKeyboardButtonsTemplate(a_Bot, a_TableName : str, a_ParentIDFi access = '' if bname: b = keyboard.InlineButtonWithAccess(bname, a_NextPrefix, key_value, access, access_mode) - print('MakeInlineKeyboardButtons', b, bname, a_NextPrefix, key_value, access, access_mode) items_button_list += [b] return keyboard.MakeInlineKeyboardButtons(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): - keyboard_func = GetBDItemsListKeyboardButtonsTemplate(a_Bot, a_TableName, a_ParentIDFieldName, a_PrevPrefix, a_NextPrefix, a_GetButtonNameAndKeyValueAndAccessFunc) - return simple_message.InfoMessageTemplate(a_Bot, a_StartMessage, None, keyboard_func, a_AccessFunc, access_mode) + inline_keyboard_func = GetBDItemsListKeyboardButtonsTemplate(a_Bot, a_TableName, a_ParentIDFieldName, 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): diff --git a/template/simple_message.py b/template/simple_message.py index 957cf6b..7da195b 100644 --- a/template/simple_message.py +++ b/template/simple_message.py @@ -29,10 +29,11 @@ async def AccessDeniedMessage(a_Bot, a_GetButtonsFunc, a_UserID, a_Message, user return await SendMessage(a_Bot, bot_messages.MakeBotMessage(access_utils.access_denied_message), a_GetButtonsFunc, None, a_UserID, a_Message, user_groups) class WorkFuncResult(): - def __init__(self, a_BotMessage, keyboard_func = None, item_access = None): + def __init__(self, a_BotMessage, keyboard_func = None, Inline_keyboard_func = None, item_access = None): self.m_BotMessage = a_BotMessage self.item_access = item_access self.keyboard_func = keyboard_func + self.Inline_keyboard_func = Inline_keyboard_func def InfoMessageTemplate(a_Bot, a_HelpMessage, a_GetButtonsFunc, a_GetInlineButtonsFunc, a_AccessFunc, access_mode = user_access.AccessMode.VIEW): async def GetMessage(a_Message : types.message, state = None): @@ -52,7 +53,11 @@ def SimpleMessageTemplate(a_Bot, a_WorkFunc, a_GetButtonsFunc, a_GetInlineButton if res is None: return - keyboard_func = a_GetInlineButtonsFunc + Inline_keyboard_func = a_GetInlineButtonsFunc + if res.Inline_keyboard_func: + Inline_keyboard_func = res.Inline_keyboard_func + + keyboard_func = a_GetButtonsFunc if res.keyboard_func: keyboard_func = res.keyboard_func @@ -61,7 +66,7 @@ def SimpleMessageTemplate(a_Bot, a_WorkFunc, a_GetButtonsFunc, a_GetInlineButton return if not res.item_access is None and not user_access.CheckAccess(a_Bot.GetRootIDs(), res.item_access, user_groups, access_mode): - return await AccessDeniedMessage(a_Bot, a_GetButtonsFunc, user_id, a_Message, user_groups) + return await AccessDeniedMessage(a_Bot, keyboard_func, user_id, a_Message, user_groups) msg = msg.GetMessageForLang(lang).StaticCopy() @@ -69,7 +74,7 @@ def SimpleMessageTemplate(a_Bot, a_WorkFunc, a_GetButtonsFunc, a_GetInlineButton user_id, msg.GetDesc(), msg.GetPhotoID(), - ProxyGetButtonsTemplate(a_GetButtonsFunc)(a_Message, user_groups), - ProxyGetButtonsTemplate(keyboard_func)(a_Message, user_groups) + ProxyGetButtonsTemplate(keyboard_func)(a_Message, user_groups), + ProxyGetButtonsTemplate(Inline_keyboard_func)(a_Message, user_groups) ) return SimpleMessage -- 2.11.0 From a859e36ca3da8d45c157aee739106f38c33e25cb Mon Sep 17 00:00:00 2001 From: Alexei Date: Wed, 17 May 2023 13:30:18 +0300 Subject: [PATCH 18/25] =?UTF-8?q?=D0=BF=D0=BE=D1=82=D1=80=D0=B5=D0=B1?= =?UTF-8?q?=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=B0=D1=8E=D1=82.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot_modules/needs.py | 386 ++++++++++----------------------------------------- main.py | 12 +- 2 files changed, 82 insertions(+), 316 deletions(-) diff --git a/bot_modules/needs.py b/bot_modules/needs.py index b69ad28..42f67e5 100644 --- a/bot_modules/needs.py +++ b/bot_modules/needs.py @@ -3,36 +3,27 @@ # Потребности -from bot_sys import bot_bd, log, keyboard, user_access -from bot_modules import start, access, groups, projects, tasks, comments -from template import bd_item_view, simple_message, bd_item_delete, bd_item_edit, bd_item, bd_item_add, bd_item_select - -from aiogram import types +from bot_sys import bot_bd, keyboard, user_access, user_messages, bd_table +from bot_modules import mod_table_operate from aiogram.dispatcher import FSMContext from aiogram.dispatcher.filters.state import State, StatesGroup -from aiogram.dispatcher import Dispatcher -import sqlite3 -class FSMCreateNeed(StatesGroup): +class FSMCreateNeeds(StatesGroup): name = State() desc = State() photo = State() -class FSMEditNeedPhotoItem(StatesGroup): - item_id = State() +class FSMEditNeedsPhotoItem(StatesGroup): item_field = State() -class FSMEditNeedNameItem(StatesGroup): - item_id = State() +class FSMEditNeedsNameItem(StatesGroup): item_field = State() -class FSMEditNeedDescItem(StatesGroup): - item_id = State() +class FSMEditNeedsDescItem(StatesGroup): item_field = State() -class FSMEditNeedAccessItem(StatesGroup): - item_id = State() +class FSMEditNeedsAccessItem(StatesGroup): item_field = State() # --------------------------------------------------------- # БД @@ -47,340 +38,111 @@ access_field = 'needAccess' create_datetime_field = 'needCreateDateTime' parent_id_field = 'taskID' -init_bd_cmds = [f'''CREATE TABLE IF NOT EXISTS {table_name}( - {key_name} INTEGER PRIMARY KEY, - {name_field} TEXT, - {desc_field} TEXT, - {photo_field} TEXT, - {access_field} TEXT, - {create_datetime_field} TEXT, - {parent_id_field} INTEGER - )''', -f"INSERT OR IGNORE INTO module_access (modName, modAccess, itemDefaultAccess) VALUES ('{module_name}', '{user_access.user_access_group_new}=va', '{user_access.user_access_group_new}=va');" -] - -select_needs_prefix = '' - -# --------------------------------------------------------- -# Сообщения +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(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), + ]) -needs_button_name = "👉 Потребности" -base_need_message = f''' -{needs_button_name} +init_access = f'{user_access.user_access_group_new}=va' -''' +fsm = mod_table_operate.FSMs(FSMCreateNeeds, FSMEditNeedsNameItem, FSMEditNeedsDescItem, FSMEditNeedsPhotoItem, FSMEditNeedsAccessItem) -list_need_button_name = "📃 Список потребностей" -select_need_message = ''' +# --------------------------------------------------------- +# Сообщения и кнопки + +button_names = { + mod_table_operate.ButtonNames.START: "👉 Потребности", + 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.ButtonNames.DEL: "❌ Удалить потребность", +} + +messages = { + mod_table_operate.Messages.START: f''' +{button_names[mod_table_operate.ButtonNames.START]} + +''', + mod_table_operate.Messages.SELECT: ''' Пожалуйста, выберите потребность: -''' - -error_find_proj_message = ''' +''', + mod_table_operate.Messages.ERROR_FIND: ''' ❌ Ошибка, потребность не найдена -''' - -need_open_message = f''' +''', + mod_table_operate.Messages.OPEN: f''' Потребность: #{name_field} #{desc_field} Время создания: #{create_datetime_field} -''' - -# Создание потребностей - -add_need_button_name = "☑ Добавить потребность" -need_create_name_message = ''' +''', + mod_table_operate.Messages.CREATE_NAME: ''' Создание потребности. Шаг №1 Введите название потребности: -''' - -need_create_desc_message = ''' +''', + mod_table_operate.Messages.CREATE_DESC: ''' Создание потребности. Шаг №2 Введите описание потребности: -''' - -need_create_photo_message = ''' +''', + mod_table_operate.Messages.CREATE_PHOTO: ''' Создание потребности. Шаг №3 Загрузите обложку для потребности (Фото): Она будет отображаться в её описании. -''' - -need_success_create_message = '''✅ Потребность успешно добавлена!''' - -# Редактирование потребностей. - -edit_need_button_name = "🛠 Редактировать потребность" -need_start_edit_message= ''' +''', + mod_table_operate.Messages.SUCCESS_CREATE: '''✅ Потребность успешно добавлена!''', + mod_table_operate.Messages.START_EDIT: ''' Пожалуйста, выберите действие: -''' - -need_select_to_edit_message = ''' +''', + mod_table_operate.Messages.SELECT_TO_EDIT: ''' Выберите потребность, которую вы хотите отредактировать. -''' - -edit_need_photo_button_name = "☐ Изменить изображение у потребности" -need_edit_photo_message = ''' +''', + mod_table_operate.Messages.EDIT_PHOTO: ''' Загрузите новую обложку для потребности (Фото): Она будет отображаться в её описании. -''' - -edit_need_name_button_name = "≂ Изменить название у потребности" -need_edit_name_message = f''' +''', + mod_table_operate.Messages.EDIT_NAME: f''' Текущее название потребности: #{name_field} Введите новое название потребности: -''' - -edit_need_desc_button_name = "𝌴 Изменить описание у потребности" -need_edit_desc_message = f''' +''', + mod_table_operate.Messages.EDIT_DESC: f''' Текущее описание потребности: #{desc_field} Введите новое описание потребности: -''' - -edit_need_access_button_name = "✋ Изменить доступ к потребности" -need_edit_access_message = f''' +''', + mod_table_operate.Messages.EDIT_ACCESS: f''' Текущий доступ к потребности: #{access_field} {user_access.user_access_readme} Введите новую строку доступа: -''' - -need_success_edit_message = '''✅ Потребность успешно отредактирована!''' - -# Удаление потребностей - -del_need_button_name = "❌ Удалить потребность" -need_select_to_delete_message = ''' +''', + mod_table_operate.Messages.SUCCESS_EDIT: '''✅ Потребность успешно отредактирован!''', + mod_table_operate.Messages.SELECT_TO_DELETE: ''' Выберите потребность, которую вы хотите удалить. -Все сообщения в этой потребности так же будут удалены! -''' - -need_success_delete_message = '''✅ Потребность успешно удалена!''' - -# --------------------------------------------------------- -# Работа с кнопками - -def GetEditNeedKeyboardButtons(a_Message, a_UserGroups): - cur_buttons = GetModuleButtons() + [ - keyboard.ButtonWithAccess(edit_need_photo_button_name, user_access.AccessMode.EDIT, GetAccess()), - keyboard.ButtonWithAccess(edit_need_name_button_name, user_access.AccessMode.EDIT, GetAccess()), - keyboard.ButtonWithAccess(edit_need_desc_button_name, user_access.AccessMode.EDIT, GetAccess()), - keyboard.ButtonWithAccess(edit_need_access_button_name, user_access.AccessMode.ACCEES_EDIT, GetAccess()), - ] - mods = [start] - return keyboard.MakeKeyboard(keyboard.GetButtons(mods) + cur_buttons, a_UserGroups) - -def GetStartNeedKeyboardButtons(a_Message, a_UserGroups): - cur_buttons = [ - keyboard.ButtonWithAccess(list_need_button_name, user_access.AccessMode.VIEW, GetAccess()), - keyboard.ButtonWithAccess(add_need_button_name, user_access.AccessMode.ADD, GetAccess()), - keyboard.ButtonWithAccess(del_need_button_name, user_access.AccessMode.DELETE, GetAccess()), - keyboard.ButtonWithAccess(edit_need_button_name, user_access.AccessMode.EDIT, GetAccess()) - ] - mods = [start, projects, tasks, comments] - return keyboard.MakeKeyboard(keyboard.GetButtons(mods) + cur_buttons, a_UserGroups) - -def GetViewItemInlineKeyboardTemplate(a_ItemID): - def GetViewItemInlineKeyboard(a_Message, a_UserGroups): - cur_buttons = [ - keyboard.InlineButtonWithAccess(comments.list_comment_button_name, comments.select_comments_prefix, a_ItemID, GetAccess(), user_access.AccessMode.VIEW), - ] - return keyboard.MakeInlineKeyboard(cur_buttons, a_UserGroups) - return GetViewItemInlineKeyboard -# --------------------------------------------------------- -# Обработка сообщений - -# стартовое сообщение -async def NeedsOpen(a_Message : types.message, state = None): - return simple_message.WorkFuncResult(base_need_message) - -def GetButtonNameAndKeyValueAndAccess(a_Item): - # needName needID needAccess - return a_Item[1], a_Item[0], a_Item[4] - -def ShowMessageTemplate(a_StringMessage, keyboard_template_func = None): - async def ShowMessage(a_CallbackQuery : types.CallbackQuery, a_Item): - if (len(a_Item) < 6): - return simple_message.WorkFuncResult(error_find_proj_message) - - msg = a_StringMessage.\ - replace(f'#{name_field}', a_Item[1]).\ - replace(f'#{desc_field}', a_Item[2]).\ - replace(f'#{create_datetime_field}', a_Item[5]).\ - replace(f'#{access_field}', a_Item[4]) - keyboard_func = None - if keyboard_template_func: - keyboard_func = keyboard_template_func(a_Item[0]) - return simple_message.WorkFuncResult(msg, photo_id = a_Item[3], item_access = a_Item[4], keyboard_func = keyboard_func) - return ShowMessage - -def SimpleMessageTemplateLegacy(a_StringMessage): - async def ShowMessage(a_CallbackQuery : types.CallbackQuery, a_Item): - return simple_message.WorkFuncResult(a_StringMessage) - return ShowMessage - -# Удаление потребностей - -async def NeedPreDelete(a_CallbackQuery : types.CallbackQuery, a_Item): - if (len(a_Item) < 6): - return simple_message.WorkFuncResult(error_find_proj_message) - access = a_Item[4] - return simple_message.WorkFuncResult('', None, item_access = access) - -async def NeedPostDelete(a_CallbackQuery : types.CallbackQuery, a_ItemID): - log.Success(f'Потребность №{a_ItemID} была удалена пользователем {a_CallbackQuery.from_user.id}.') - #TODO: удалить вложенные - return simple_message.WorkFuncResult(need_success_delete_message) - -# --------------------------------------------------------- -# Работа с базой данных потребностей - -def AddBDItemFunc(a_ItemData, a_UserID): - print(a_ItemData) - res, error = bot_bd.SQLRequestToBD(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], access.GetItemDefaultAccessForModule(module_name) + f";{a_UserID}=+", a_ItemData[parent_id_field])) - - if error: - log.Error(f'Пользоватлель {a_UserID}. Ошибка добавления записи в таблицу {table_name} ({a_ItemData[photo_field]}, {a_ItemData[name_field]}, {a_ItemData[desc_field]}, {access.GetItemDefaultAccessForModule(module_name)}).') - else: - log.Success(f'Пользоватлель {a_UserID}. Добавлена запись в таблицу {table_name} ({a_ItemData[photo_field]}, {a_ItemData[name_field]}, {a_ItemData[desc_field]}, {access.GetItemDefaultAccessForModule(module_name)}).') - - return res, error - -# --------------------------------------------------------- -# API - -# Инициализация БД -def GetInitBDCommands(): - return init_bd_cmds - -def GetAccess(): - return access.GetAccessForModule(module_name) - -# Доступные кнопки -def GetModuleButtons(): - return [keyboard.ButtonWithAccess(needs_button_name, user_access.AccessMode.VIEW, GetAccess())] - -# Обработка кнопок -def RegisterHandlers(dp : Dispatcher): - defaul_keyboard_func = GetStartNeedKeyboardButtons - def RegisterSelectParent(a_ButtonName, access_mode): - a_PrefixBase = a_ButtonName - a_Prefix = bd_item_select.FirstSelectBDItemRegisterHandlers(dp, \ - a_PrefixBase, \ - a_ButtonName, \ - projects.table_name, \ - projects.key_name, \ - projects.GetButtonNameAndKeyValueAndAccess, \ - projects.select_project_message, \ - projects.GetAccess, \ - access_mode = access_mode\ - ) - a_Prefix = bd_item_select.NextSelectBDItemRegisterHandlers(dp, \ - a_Prefix, \ - tasks.parent_id_field, \ - tasks.table_name, \ - tasks.key_name, \ - tasks.GetButtonNameAndKeyValueAndAccess, \ - tasks.select_task_message, \ - tasks.GetAccess, \ - access_mode = access_mode\ - ) - return a_Prefix - - - # Стартовое сообщение - dp.register_message_handler(simple_message.SimpleMessageTemplateLegacy(NeedsOpen, defaul_keyboard_func, GetAccess), text = needs_button_name) - - # Список потребностей - a_Prefix = RegisterSelectParent(list_need_button_name, user_access.AccessMode.VIEW) - bd_item_view.LastSelectAndShowBDItemRegisterHandlers(dp, \ - a_Prefix, parent_id_field, \ - table_name, key_name, \ - ShowMessageTemplate(need_open_message, GetViewItemInlineKeyboardTemplate), \ - GetButtonNameAndKeyValueAndAccess, \ - select_need_message, \ - GetAccess, \ - defaul_keyboard_func, \ - access_mode = user_access.AccessMode.VIEW\ - ) - global select_needs_prefix - select_needs_prefix = a_Prefix - - # Удаление потребностей - a_Prefix = RegisterSelectParent(del_need_button_name, user_access.AccessMode.DELETE) - bd_item_delete.DeleteBDItemRegisterHandlers(dp, \ - a_Prefix, \ - bd_item.GetCheckForPrefixFunc(a_Prefix), \ - table_name, \ - key_name, \ - parent_id_field, \ - NeedPreDelete, \ - NeedPostDelete, \ - GetButtonNameAndKeyValueAndAccess, \ - select_need_message, \ - GetAccess, \ - defaul_keyboard_func\ - ) - - # Добавление потребностей - a_Prefix = RegisterSelectParent(add_need_button_name, user_access.AccessMode.ADD) - bd_item_add.AddBDItem3RegisterHandlers(dp, \ - bd_item.GetCheckForPrefixFunc(a_Prefix), \ - FSMCreateNeed, \ - FSMCreateNeed.name,\ - FSMCreateNeed.desc, \ - FSMCreateNeed.photo,\ - AddBDItemFunc, \ - SimpleMessageTemplateLegacy(need_create_name_message), \ - SimpleMessageTemplateLegacy(need_create_desc_message), \ - SimpleMessageTemplateLegacy(need_create_photo_message), \ - SimpleMessageTemplateLegacy(need_success_create_message), \ - a_Prefix,\ - tasks.table_name, \ - tasks.key_name, \ - name_field, \ - desc_field, \ - photo_field, \ - GetButtonNameAndKeyValueAndAccess, \ - GetAccess, \ - GetStartNeedKeyboardButtons\ - ) - - def RegisterEdit(a_ButtonName, a_FSM, a_EditMessage, a_FieldName, a_FieldType, a_AccessMode = user_access.AccessMode.EDIT): - a_Prefix = RegisterSelectParent(a_ButtonName, a_AccessMode) - bd_item_edit.EditBDItemRegisterHandlers(dp, \ - a_Prefix, \ - a_FSM, \ - bd_item.GetCheckForPrefixFunc(a_Prefix), \ - need_select_to_edit_message, \ - ShowMessageTemplate(a_EditMessage), \ - ShowMessageTemplate(need_success_edit_message), \ - table_name, \ - key_name, \ - parent_id_field, \ - a_FieldName, \ - GetButtonNameAndKeyValueAndAccess, \ - GetAccess, \ - edit_keyboard_func, \ - access_mode = a_AccessMode, \ - field_type = a_FieldType\ - ) +Все комментарии в этой потребности так же будут удалены! +''', + mod_table_operate.Messages.SUCCESS_DELETE: '''✅ Потребность успешно удалёна!''', +} - # Редактирование потребностей - edit_keyboard_func = GetEditNeedKeyboardButtons - dp.register_message_handler(simple_message.InfoMessageTemplateLegacy(need_start_edit_message, edit_keyboard_func, GetAccess, access_mode = user_access.AccessMode.EDIT), text = edit_need_button_name) +class ModuleNeeds(mod_table_operate.TableOperateModule): + 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, fsm, a_ParentModName, a_ChildModName, init_access, a_ChildModuleNameList, a_EditModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log) - RegisterEdit(edit_need_photo_button_name, FSMEditNeedPhotoItem, need_edit_photo_message, photo_field, bd_item.FieldType.photo) - RegisterEdit(edit_need_name_button_name, FSMEditNeedNameItem, need_edit_name_message, name_field, bd_item.FieldType.text) - RegisterEdit(edit_need_desc_button_name, FSMEditNeedDescItem, need_edit_desc_message, desc_field, bd_item.FieldType.text) - RegisterEdit(edit_need_access_button_name, FSMEditNeedAccessItem, need_edit_access_message, access_field, bd_item.FieldType.text) + def GetName(self): + return module_name diff --git a/main.py b/main.py index a585a19..485eeb2 100644 --- a/main.py +++ b/main.py @@ -6,7 +6,7 @@ log_start_message = 'Бот успешно запущен!' import os from bot_sys import config, log, bot_bd, user_access, aiogram_bot, bot_messages, bd_table -from bot_modules import mod_agregator, start, profile, backup, groups, access, projects, tasks #, projects, , access, , , needs, comments, messages, , languages +from bot_modules import mod_agregator, start, profile, backup, groups, access, projects, tasks, needs #, projects, , access, , , , comments, messages, , languages g_Log = log g_Bot = aiogram_bot.AiogramBot(config.GetTelegramBotApiToken(), bot_bd.GetBDFileName(), config.GetRootIDs(), g_Log) @@ -38,14 +38,18 @@ g_ModuleAgregator.AddModule(mod_profile) mod_backup = backup.ModuleBackup(start_mod_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) g_ModuleAgregator.AddModule(mod_backup) -start_mod_name_list = [mod_start_name, mod_tasks_name]#, , mod_needs_name, mod_comments_name] +start_mod_name_list = [mod_start_name, mod_tasks_name, mod_needs_name]#, , , mod_comments_name] mod_project = projects.ModuleProjects(None, mod_tasks_name, start_mod_name_list, start_mod_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) g_ModuleAgregator.AddModule(mod_project) -start_mod_name_list = [mod_start_name, mod_projects_name]#, mod_needs_name, mod_comments_name] -mod_tasks = tasks.ModuleTasks(mod_projects_name, None, start_mod_name_list, start_mod_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) +start_mod_name_list = [mod_start_name, mod_projects_name, mod_needs_name]#, , mod_comments_name] +mod_tasks = tasks.ModuleTasks(mod_projects_name, mod_needs_name, start_mod_name_list, start_mod_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) g_ModuleAgregator.AddModule(mod_tasks) +start_mod_name_list = [mod_start_name, mod_projects_name, mod_tasks_name]#, , mod_comments_name] +mod_needs= needs.ModuleNeeds(mod_tasks_name, None, start_mod_name_list, start_mod_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) +g_ModuleAgregator.AddModule(mod_needs) + start_mod_name_list = [#, '', , '', , 'languages'] mod_profile.GetName(), mod_backup.GetName(), -- 2.11.0 From 4cdffe68b93872f2abdedd8039506b3a2fa0d58b Mon Sep 17 00:00:00 2001 From: Alexei Date: Wed, 17 May 2023 14:04:09 +0300 Subject: [PATCH 19/25] =?UTF-8?q?=D0=9A=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=B0=D1=80=D0=B8=D0=B8=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=B0=D1=8E=D1=82.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot_modules/comments.py | 388 +++++++++++++----------------------------------- bot_modules/projects.py | 4 +- main.py | 14 +- template/bd_item_add.py | 1 + 4 files changed, 114 insertions(+), 293 deletions(-) diff --git a/bot_modules/comments.py b/bot_modules/comments.py index 8b884cf..941705b 100644 --- a/bot_modules/comments.py +++ b/bot_modules/comments.py @@ -3,26 +3,27 @@ # Комментарии -from bot_sys import bot_bd, log, keyboard, user_access -from bot_modules import start, access, groups, projects, tasks, needs -from template import bd_item_view, simple_message, bd_item_delete, bd_item_edit, bd_item, bd_item_add, bd_item_select - -from aiogram import types +from bot_sys import bot_bd, keyboard, user_access, user_messages, bd_table +from bot_modules import mod_table_operate from aiogram.dispatcher import FSMContext from aiogram.dispatcher.filters.state import State, StatesGroup -from aiogram.dispatcher import Dispatcher -import sqlite3 class FSMCreateComment(StatesGroup): - bd_item = State() + name = State() + desc = State() + photo = State() + +class FSMEditCommentPhotoItem(StatesGroup): + item_field = State() + +class FSMEditCommentNameItem(StatesGroup): + item_field = State() class FSMEditCommentDescItem(StatesGroup): - item_id = State() item_field = State() class FSMEditCommentAccessItem(StatesGroup): - item_id = State() item_field = State() # --------------------------------------------------------- # БД @@ -30,302 +31,117 @@ module_name = 'comments' table_name = module_name key_name = 'commentID' +name_field = 'commentName' desc_field = 'commentDesc' +photo_field = 'commentPhoto' access_field = 'commentAccess' create_datetime_field = 'commentCreateDateTime' parent_id_field = 'needID' -init_bd_cmds = [f'''CREATE TABLE IF NOT EXISTS {table_name}( - {key_name} INTEGER PRIMARY KEY, - {desc_field} TEXT, - {access_field} TEXT, - {create_datetime_field} TEXT, - {parent_id_field} INTEGER - )''', -f"INSERT OR IGNORE INTO module_access (modName, modAccess, itemDefaultAccess) VALUES ('{module_name}', '{user_access.user_access_group_new}=va', '{user_access.user_access_group_new}=va');" -] - -select_comments_prefix = '' - -# --------------------------------------------------------- -# Сообщения +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(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), + ]) -comments_button_name = "⚏ Комментарии" -base_comment_message = f''' -{comments_button_name} +init_access = f'{user_access.user_access_group_new}=va' -''' +fsm = mod_table_operate.FSMs(FSMCreateComment, FSMEditCommentNameItem, FSMEditCommentDescItem, FSMEditCommentPhotoItem, FSMEditCommentAccessItem) -list_comment_button_name = "📃 Список комментариев" -select_comment_message = ''' +# --------------------------------------------------------- +# Сообщения и кнопки + +button_names = { + mod_table_operate.ButtonNames.START: "⚏ Комментарии", + 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.ButtonNames.DEL: "❌ Удалить комментарий", +} + +messages = { + mod_table_operate.Messages.START: f''' +{button_names[mod_table_operate.ButtonNames.START]} + +''', + mod_table_operate.Messages.SELECT: ''' Пожалуйста, выберите комментарий: -''' - -error_find_proj_message = ''' +''', + mod_table_operate.Messages.ERROR_FIND: ''' ❌ Ошибка, комментарий не найден -''' - -comment_open_message = f''' -Комментарий +''', + mod_table_operate.Messages.OPEN: f''' +Комментарий: #{name_field} #{desc_field} Время создания: #{create_datetime_field} -''' - -# Создание комментариев - -add_comment_button_name = "☑ Добавить комментарий" -comment_create_desc_message = ''' -Введите свой комментарий: -''' - -comment_success_create_message = '''✅ Комментарий успешно добавлен!''' - -# Редактирование комментариев. - -edit_comment_button_name = "🛠 Редактировать комментарий" -comment_start_edit_message= ''' +''', + mod_table_operate.Messages.CREATE_NAME: ''' +Создание комментария. Шаг №1 + +Введите название комментария: +''', + mod_table_operate.Messages.CREATE_DESC: ''' +Создание комментария. Шаг №2 + +Введите описание комментария: +''', + mod_table_operate.Messages.CREATE_PHOTO: ''' +Создание комментария. Шаг №3 + +Загрузите обложку для комментария (Фото): +Она будет отображаться в его описании. +''', + mod_table_operate.Messages.SUCCESS_CREATE: '''✅ Комментарий успешно добавлен!''', + mod_table_operate.Messages.START_EDIT: ''' Пожалуйста, выберите действие: -''' - -comment_select_to_edit_message = ''' +''', + mod_table_operate.Messages.SELECT_TO_EDIT: ''' Выберите комментарий, который вы хотите отредактировать. -''' - -edit_comment_desc_button_name = "𝌴 Изменить комментарий" -comment_edit_desc_message = f''' -Текущий комментарий: +''', + mod_table_operate.Messages.EDIT_PHOTO: ''' +Загрузите новую обложку для комментария (Фото): +Она будет отображаться в его описании. +''', + mod_table_operate.Messages.EDIT_NAME: f''' +Текущее название комментария: +#{name_field} + +Введите новое название комментария: +''', + mod_table_operate.Messages.EDIT_DESC: f''' +Текущее описание комментария: #{desc_field} -Введите отредактированный комментарий: -''' - -edit_comment_access_button_name = "✋ Изменить доступ к комментарию" -comment_edit_access_message = f''' -Текущий доступ к комментарию: +Введите новое описание комментария: +''', + mod_table_operate.Messages.EDIT_ACCESS: f''' +Текущий доступ к комментарийу: #{access_field} {user_access.user_access_readme} Введите новую строку доступа: -''' - -comment_success_edit_message = '''✅ Комментарий успешно отредактирован!''' - -# Удаление комментариев - -del_comment_button_name = "❌ Удалить комментарий" -comment_select_to_delete_message = ''' -Выберите комментарий, которую вы хотите удалить. -''' - -comment_success_delete_message = '''✅ Комментарий успешно удалён!''' - -# --------------------------------------------------------- -# Работа с кнопками - -def GetEditCommentKeyboardButtons(a_Message, a_UserGroups): - cur_buttons = GetModuleButtons() + [ - keyboard.ButtonWithAccess(edit_comment_desc_button_name, user_access.AccessMode.EDIT, GetAccess()), - keyboard.ButtonWithAccess(edit_comment_access_button_name, user_access.AccessMode.ACCEES_EDIT, GetAccess()), - ] - mods = [start] - return keyboard.MakeKeyboard(keyboard.GetButtons(mods) + cur_buttons, a_UserGroups) - -def GetStartCommentKeyboardButtons(a_Message, a_UserGroups): - cur_buttons = [ - keyboard.ButtonWithAccess(list_comment_button_name, user_access.AccessMode.VIEW, GetAccess()), - keyboard.ButtonWithAccess(add_comment_button_name, user_access.AccessMode.ADD, GetAccess()), - keyboard.ButtonWithAccess(del_comment_button_name, user_access.AccessMode.DELETE, GetAccess()), - keyboard.ButtonWithAccess(edit_comment_button_name, user_access.AccessMode.EDIT, GetAccess()) - ] - mods = [start, projects, tasks, needs] - return keyboard.MakeKeyboard(keyboard.GetButtons(mods) + cur_buttons, a_UserGroups) - -# --------------------------------------------------------- -# Обработка сообщений - -# стартовое сообщение -async def CommentsOpen(a_Message : types.message, state = None): - return simple_message.WorkFuncResult(base_comment_message) - -def GetButtonNameAndKeyValueAndAccess(a_Item): - # commentDesc commentID commentAccess - return a_Item[1], a_Item[0], a_Item[2] - -def ShowMessageTemplate(a_StringMessage): - async def ShowMessage(a_CallbackQuery : types.CallbackQuery, a_Item): - if (len(a_Item) < 4): - return simple_message.WorkFuncResult(error_find_proj_message) - - msg = a_StringMessage.\ - replace(f'#{desc_field}', a_Item[1]).\ - replace(f'#{create_datetime_field}', a_Item[3]).\ - replace(f'#{access_field}', a_Item[2]) - return simple_message.WorkFuncResult(msg, item_access = a_Item[2]) - return ShowMessage - -def SimpleMessageTemplateLegacy(a_StringMessage): - async def ShowMessage(a_CallbackQuery : types.CallbackQuery, a_Item): - return simple_message.WorkFuncResult(a_StringMessage) - return ShowMessage - -# Удаление комментариев - -async def CommentPreDelete(a_CallbackQuery : types.CallbackQuery, a_Item): - if (len(a_Item) < 4): - return simple_message.WorkFuncResult(error_find_proj_message) - access = a_Item[2] - return simple_message.WorkFuncResult('', None, item_access = access) - -async def CommentPostDelete(a_CallbackQuery : types.CallbackQuery, a_ItemID): - log.Success(f'Комментарий №{a_ItemID} был удалён пользователем {a_CallbackQuery.from_user.id}.') - #TODO: удалить вложенные - return simple_message.WorkFuncResult(comment_success_delete_message) - -# --------------------------------------------------------- -# Работа с базой данных комментариев - -def AddBDItemFunc(a_ItemData, a_UserID): - print(a_ItemData) - res, error = bot_bd.SQLRequestToBD(f'INSERT INTO {table_name}({desc_field}, {access_field}, {parent_id_field}, {create_datetime_field}) VALUES(?, ?, ?, {bot_bd.GetBDDateTimeNow()})', - commit = True, return_error = True, param = (a_ItemData[desc_field], access.GetItemDefaultAccessForModule(module_name) + f";{a_UserID}=+", a_ItemData[parent_id_field])) - - if error: - log.Error(f'Пользоватлель {a_UserID}. Ошибка добавления записи в таблицу {table_name} ({a_ItemData[desc_field]}, {access.GetItemDefaultAccessForModule(module_name)}).') - else: - log.Success(f'Пользоватлель {a_UserID}. Добавлена запись в таблицу {table_name} ({a_ItemData[desc_field]}, {access.GetItemDefaultAccessForModule(module_name)}).') - - return res, error - -# --------------------------------------------------------- -# API - -# Инициализация БД -def GetInitBDCommands(): - return init_bd_cmds - -def GetAccess(): - return access.GetAccessForModule(module_name) - -# Доступные кнопки -def GetModuleButtons(): - return [keyboard.ButtonWithAccess(comments_button_name, user_access.AccessMode.VIEW, GetAccess())] - -# Обработка кнопок -def RegisterHandlers(dp : Dispatcher): - defaul_keyboard_func = GetStartCommentKeyboardButtons - def RegisterSelectParent(a_ButtonName, access_mode): - a_PrefixBase = a_ButtonName - a_Prefix = bd_item_select.FirstSelectBDItemRegisterHandlers(dp, \ - a_PrefixBase, \ - a_ButtonName, \ - projects.table_name, \ - projects.key_name, \ - projects.GetButtonNameAndKeyValueAndAccess, \ - projects.select_project_message, \ - projects.GetAccess, \ - access_mode = access_mode\ - ) - a_Prefix = bd_item_select.NextSelectBDItemRegisterHandlers(dp, \ - a_Prefix, \ - tasks.parent_id_field, \ - tasks.table_name, \ - tasks.key_name, \ - tasks.GetButtonNameAndKeyValueAndAccess, \ - tasks.select_task_message, \ - tasks.GetAccess, \ - access_mode = access_mode\ - ) - a_Prefix = bd_item_select.NextSelectBDItemRegisterHandlers(dp, \ - a_Prefix, \ - needs.parent_id_field, \ - needs.table_name, \ - needs.key_name, \ - needs.GetButtonNameAndKeyValueAndAccess, \ - needs.select_need_message, \ - needs.GetAccess, \ - access_mode = access_mode\ - ) - return a_Prefix - - - # Стартовое сообщение - dp.register_message_handler(simple_message.SimpleMessageTemplateLegacy(CommentsOpen, defaul_keyboard_func, GetAccess), text = comments_button_name) - - # Список комментариев - a_Prefix = RegisterSelectParent(list_comment_button_name, user_access.AccessMode.VIEW) - bd_item_view.LastSelectAndShowBDItemRegisterHandlers(dp, \ - a_Prefix, parent_id_field, \ - table_name, key_name, \ - ShowMessageTemplate(comment_open_message), \ - GetButtonNameAndKeyValueAndAccess, \ - select_comment_message, \ - GetAccess, \ - defaul_keyboard_func, \ - access_mode = user_access.AccessMode.VIEW\ - ) - global select_comments_prefix - select_comments_prefix = a_Prefix - - # Удаление комментариев - a_Prefix = RegisterSelectParent(del_comment_button_name, user_access.AccessMode.DELETE) - bd_item_delete.DeleteBDItemRegisterHandlers(dp, \ - a_Prefix, \ - bd_item.GetCheckForPrefixFunc(a_Prefix), \ - table_name, \ - key_name, \ - parent_id_field, \ - CommentPreDelete, \ - CommentPostDelete, \ - GetButtonNameAndKeyValueAndAccess, \ - select_comment_message, \ - GetAccess, \ - defaul_keyboard_func\ - ) - - # Добавление комментариев - a_Prefix = RegisterSelectParent(add_comment_button_name, user_access.AccessMode.ADD) - bd_item_add.AddBDItem1RegisterHandlers(dp, \ - bd_item.GetCheckForPrefixFunc(a_Prefix), \ - FSMCreateComment, \ - AddBDItemFunc, \ - SimpleMessageTemplateLegacy(comment_create_desc_message), \ - SimpleMessageTemplateLegacy(comment_success_create_message), \ - a_Prefix,\ - needs.table_name, \ - needs.key_name, \ - desc_field, \ - GetButtonNameAndKeyValueAndAccess, \ - GetAccess, \ - GetStartCommentKeyboardButtons,\ - bd_item.FieldType.text - ) - - def RegisterEdit(a_ButtonName, a_FSM, a_EditMessage, a_FieldName, a_FieldType, a_AccessMode = user_access.AccessMode.EDIT): - a_Prefix = RegisterSelectParent(a_ButtonName, a_AccessMode) - bd_item_edit.EditBDItemRegisterHandlers(dp, \ - a_Prefix, \ - a_FSM, \ - bd_item.GetCheckForPrefixFunc(a_Prefix), \ - comment_select_to_edit_message, \ - ShowMessageTemplate(a_EditMessage), \ - ShowMessageTemplate(comment_success_edit_message), \ - table_name, \ - key_name, \ - parent_id_field, \ - a_FieldName, \ - GetButtonNameAndKeyValueAndAccess, \ - GetAccess, \ - edit_keyboard_func, \ - access_mode = a_AccessMode, \ - field_type = a_FieldType\ - ) - - # Редактирование комментариев - edit_keyboard_func = GetEditCommentKeyboardButtons - dp.register_message_handler(simple_message.InfoMessageTemplateLegacy(comment_start_edit_message, edit_keyboard_func, GetAccess, access_mode = user_access.AccessMode.EDIT), text = edit_comment_button_name) - - RegisterEdit(edit_comment_desc_button_name, FSMEditCommentDescItem, comment_edit_desc_message, desc_field, bd_item.FieldType.text) - RegisterEdit(edit_comment_access_button_name, FSMEditCommentAccessItem, comment_edit_access_message, access_field, bd_item.FieldType.text) +''', + mod_table_operate.Messages.SUCCESS_EDIT: '''✅ Комментарий успешно отредактирован!''', + mod_table_operate.Messages.SELECT_TO_DELETE: ''' +Выберите комментарий, который вы хотите удалить. +''', + mod_table_operate.Messages.SUCCESS_DELETE: '''✅ Комментарий успешно удалён!''', +} + +class ModuleComments(mod_table_operate.TableOperateModule): + 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, fsm, 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 17b5a5a..e7f721a 100644 --- a/bot_modules/projects.py +++ b/bot_modules/projects.py @@ -66,8 +66,8 @@ button_names = { } messages = { - mod_table_operate.Messages.START: ''' -🟥 Проекты + mod_table_operate.Messages.START: f''' +{button_names[mod_table_operate.ButtonNames.START]} ''', mod_table_operate.Messages.SELECT: ''' diff --git a/main.py b/main.py index 485eeb2..47f24a8 100644 --- a/main.py +++ b/main.py @@ -6,7 +6,7 @@ log_start_message = 'Бот успешно запущен!' import os from bot_sys import config, log, bot_bd, user_access, aiogram_bot, bot_messages, bd_table -from bot_modules import mod_agregator, start, profile, backup, groups, access, projects, tasks, needs #, projects, , access, , , , comments, messages, , languages +from bot_modules import mod_agregator, start, profile, backup, groups, access, projects, tasks, needs, comments #, projects, , access, , , , , messages, , languages g_Log = log g_Bot = aiogram_bot.AiogramBot(config.GetTelegramBotApiToken(), bot_bd.GetBDFileName(), config.GetRootIDs(), g_Log) @@ -38,18 +38,22 @@ g_ModuleAgregator.AddModule(mod_profile) mod_backup = backup.ModuleBackup(start_mod_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) g_ModuleAgregator.AddModule(mod_backup) -start_mod_name_list = [mod_start_name, mod_tasks_name, mod_needs_name]#, , , mod_comments_name] +start_mod_name_list = [mod_start_name, mod_tasks_name, mod_needs_name, mod_comments_name] mod_project = projects.ModuleProjects(None, mod_tasks_name, start_mod_name_list, start_mod_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) g_ModuleAgregator.AddModule(mod_project) -start_mod_name_list = [mod_start_name, mod_projects_name, mod_needs_name]#, , mod_comments_name] +start_mod_name_list = [mod_start_name]#, mod_projects_name, mod_needs_name, mod_comments_name] mod_tasks = tasks.ModuleTasks(mod_projects_name, mod_needs_name, start_mod_name_list, start_mod_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) g_ModuleAgregator.AddModule(mod_tasks) -start_mod_name_list = [mod_start_name, mod_projects_name, mod_tasks_name]#, , mod_comments_name] -mod_needs= needs.ModuleNeeds(mod_tasks_name, None, start_mod_name_list, start_mod_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) +start_mod_name_list = [mod_start_name]#, mod_projects_name, mod_tasks_name, mod_comments_name] +mod_needs= needs.ModuleNeeds(mod_tasks_name, mod_comments_name, start_mod_name_list, start_mod_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) g_ModuleAgregator.AddModule(mod_needs) +start_mod_name_list = [mod_start_name]#, mod_projects_name, mod_tasks_name, mod_needs_name] +mod_comments= comments.ModuleComments(mod_needs_name, None, start_mod_name_list, start_mod_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) +g_ModuleAgregator.AddModule(mod_comments) + start_mod_name_list = [#, '', , '', , 'languages'] mod_profile.GetName(), mod_backup.GetName(), diff --git a/template/bd_item_add.py b/template/bd_item_add.py index a203da0..7fa2d68 100644 --- a/template/bd_item_add.py +++ b/template/bd_item_add.py @@ -100,6 +100,7 @@ def AddBDItem3RegisterHandlers(a_Bot, a_StartCheckFunc, a_FSM, a_FSMName, a_FSMD reg_func = a_Bot.RegisterCallbackHandler 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) -- 2.11.0 From 6b130ef0e4491c71cb41b0bb335f311403029899 Mon Sep 17 00:00:00 2001 From: Alexei Date: Wed, 17 May 2023 15:54:28 +0300 Subject: [PATCH 20/25] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=20=D0=B4=D0=BE=D1=81=D1=82=D1=83=D0=BF?= =?UTF-8?q?=20=D0=BA=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8F=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot_modules/access.py | 42 ++++++++++++++++++++--------- bot_modules/backup.py | 10 ++++++- bot_modules/comments.py | 16 +++++++---- bot_modules/groups.py | 21 +++++++++------ bot_modules/mod_simple_message.py | 32 +++++++++++++++++----- bot_modules/mod_table_operate.py | 56 ++++++++++++++++----------------------- bot_modules/needs.py | 26 +++++++++++------- bot_modules/profile.py | 16 ++++++----- bot_modules/projects.py | 16 +++++++---- bot_modules/start.py | 14 ++++++---- bot_modules/tasks.py | 26 +++++++++++------- bot_sys/bd_table.py | 1 + 12 files changed, 175 insertions(+), 101 deletions(-) diff --git a/bot_modules/access.py b/bot_modules/access.py index a0c331d..9d2416e 100644 --- a/bot_modules/access.py +++ b/bot_modules/access.py @@ -3,8 +3,8 @@ # Права пользователей -from bot_sys import keyboard, user_access, bot_bd -from bot_modules import mod_simple_message, access_utils +from bot_sys import keyboard, user_access, bot_bd, bd_table +from bot_modules import mod_simple_message, access_utils, mod_table_operate from template import simple_message, sql_request, bd_item from aiogram.dispatcher import FSMContext @@ -29,8 +29,11 @@ mod_name_field = access_utils.mod_name_field moduleaccess_field = access_utils.moduleaccess_field mod_default_access_field = access_utils.mod_default_access_field -#TODO: Автоматическое создание init_bd_cmds, необходимо table_name, mod_name_field ... объединить в объект - +table = bd_table.Table(table_name, [ + bd_table.TableField(mod_name_field, bd_table.TableFieldDestiny.KEY, bd_table.TableFieldType.STR), + bd_table.TableField(moduleaccess_field, bd_table.TableFieldDestiny.ACCESS, bd_table.TableFieldType.STR), + bd_table.TableField(mod_default_access_field, bd_table.TableFieldDestiny.DEFAULT_ACCESS, bd_table.TableFieldType.STR), + ]) # --------------------------------------------------------- # Сообщения @@ -86,14 +89,31 @@ moduleaccess_edit_default_access_message = f''' Введите новую строку доступа: ''' - -moduleaccess_success_edit_message = '''✅ Проект успешно отредактирован!''' +moduleaccess_success_edit_message = '''✅ Доступ к модулю успешно отредактирован!''' + +button_names = { + mod_simple_message.ButtonNames.START: start_button_name, + mod_table_operate.ButtonNames.EDIT_ACCESS: "◇ Изменить доступ к модулю", + mod_table_operate.ButtonNames.EDIT_DEFAULT_ACCESS: "◈ Изменить доступ по умолчанию к модулю ", + } + +messages = { + mod_simple_message.Messages.START: start_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.Messages.SUCCESS_EDIT: moduleaccess_success_edit_message, +} + +fsm = { + mod_table_operate.FSMs.EDIT_ACCESS: FSMEditAccessItem, + mod_table_operate.FSMs.EDIT_DEFAULT_ACCESS: FSMEditDefaultAccessItem, + } init_access = f'{user_access.user_access_group_new}=-' -class ModuleAccess(mod_simple_message.SimpleMessageModule): +class ModuleAccess(mod_table_operate.TableOperateModule): def __init__(self, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log): - super().__init__(start_message, start_button_name, init_access, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log) + super().__init__(table, messages, button_names, fsm, None, None, init_access, a_ChildModuleNameList, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log) self.m_SqlRequestButtonName = self.CreateButton('sql request', sql_request_button_name) self.m_RequestStartMessage = self.CreateMessage('equest start', request_start_message) @@ -107,7 +127,7 @@ class ModuleAccess(mod_simple_message.SimpleMessageModule): None, self.m_GetAccessFunc ) - + ''' def GetInitBDCommands(self): return [ f"""CREATE TABLE IF NOT EXISTS {table_name}( @@ -117,7 +137,7 @@ class ModuleAccess(mod_simple_message.SimpleMessageModule): UNIQUE({mod_name_field}) );""", ] + super().GetInitBDCommands() - + ''' def GetName(self): return module_name @@ -146,8 +166,6 @@ class ModuleAccess(mod_simple_message.SimpleMessageModule): ) - - # --------------------------------------------------------- # Работа с кнопками ''' diff --git a/bot_modules/backup.py b/bot_modules/backup.py index 75fb9b9..291ca5b 100644 --- a/bot_modules/backup.py +++ b/bot_modules/backup.py @@ -36,11 +36,19 @@ error_backup_message = ''' backup_bd_button_name = "📀 Резервные копия базы" backup_log_button_name = "📃 Логи" +button_names = { + mod_simple_message.ButtonNames.START: start_button_name, +} + +messages = { + mod_simple_message.Messages.START: start_message, +} + init_access = f'{user_access.user_access_group_new}=-' class ModuleBackup(mod_simple_message.SimpleMessageModule): def __init__(self, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log): - super().__init__(start_message, start_button_name, init_access, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log) + super().__init__(messages, button_names, init_access, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log) self.m_BackupBDButtonName = self.CreateButton('backup bd', backup_bd_button_name) self.m_BackupBDMessage = self.CreateMessage('backup bd', backup_bd_message) diff --git a/bot_modules/comments.py b/bot_modules/comments.py index 941705b..e09a78b 100644 --- a/bot_modules/comments.py +++ b/bot_modules/comments.py @@ -4,7 +4,7 @@ # Комментарии from bot_sys import bot_bd, keyboard, user_access, user_messages, bd_table -from bot_modules import mod_table_operate +from bot_modules import mod_table_operate, mod_simple_message from aiogram.dispatcher import FSMContext from aiogram.dispatcher.filters.state import State, StatesGroup @@ -50,13 +50,19 @@ table = bd_table.Table(table_name, [ init_access = f'{user_access.user_access_group_new}=va' -fsm = mod_table_operate.FSMs(FSMCreateComment, FSMEditCommentNameItem, FSMEditCommentDescItem, FSMEditCommentPhotoItem, FSMEditCommentAccessItem) +fsm = { + mod_table_operate.FSMs.CREATE: FSMCreateComment, + mod_table_operate.FSMs.EDIT_NAME: FSMEditCommentNameItem, + mod_table_operate.FSMs.EDIT_DESC: FSMEditCommentDescItem, + mod_table_operate.FSMs.EDIT_PHOTO: FSMEditCommentPhotoItem, + mod_table_operate.FSMs.EDIT_ACCESS: FSMEditCommentAccessItem, + } # --------------------------------------------------------- # Сообщения и кнопки button_names = { - mod_table_operate.ButtonNames.START: "⚏ Комментарии", + mod_simple_message.ButtonNames.START: "⚏ Комментарии", mod_table_operate.ButtonNames.LIST: "📃 Список комментариев", mod_table_operate.ButtonNames.ADD: "☑ Добавить комментарий", mod_table_operate.ButtonNames.EDIT: "🛠 Редактировать комментарий", @@ -68,8 +74,8 @@ button_names = { } messages = { - mod_table_operate.Messages.START: f''' -{button_names[mod_table_operate.ButtonNames.START]} + mod_simple_message.Messages.START: f''' +{button_names[mod_simple_message.ButtonNames.START]} ''', mod_table_operate.Messages.SELECT: ''' diff --git a/bot_modules/groups.py b/bot_modules/groups.py index 01b702c..7d02fa6 100644 --- a/bot_modules/groups.py +++ b/bot_modules/groups.py @@ -29,12 +29,6 @@ create_datetime_field = 'createDateTime' # --------------------------------------------------------- # Сообщения -start_message = ''' -Группы пользователей находятся в стадии разработки - -Пока можете воспользоваться хардкорным способом через запросы к БД -''' - request_start_message = ''' **Задайте запрос к БД** @@ -53,15 +47,26 @@ help_message = ''' `user_in_groups(user_id, group_id)` - содержит соответсвия ID пользователей и групп ''' -start_button_name = "‍️️▦ Группы пользователей" sql_request_button_name = "⛃ Запрос к БД для редактирования групп" help_button_name = "📄 Информация по группам" +button_names = { + mod_simple_message.ButtonNames.START: "‍️️▦ Группы пользователей", +} + +messages = { + mod_simple_message.Messages.START: ''' +Группы пользователей находятся в стадии разработки + +Пока можете воспользоваться хардкорным способом через запросы к БД +''', +} + init_access = f'{user_access.user_access_group_new}=-' class ModuleGroups(mod_simple_message.SimpleMessageModule): def __init__(self, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log): - super().__init__(start_message, start_button_name, init_access, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log) + super().__init__(messages, button_names, init_access, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log) self.m_SqlRequestButtonName = self.CreateButton('sql request', sql_request_button_name) self.m_RequestStartMessage = self.CreateMessage('equest start', request_start_message) diff --git a/bot_modules/mod_simple_message.py b/bot_modules/mod_simple_message.py index 6c56b3f..fffa8c8 100644 --- a/bot_modules/mod_simple_message.py +++ b/bot_modules/mod_simple_message.py @@ -7,8 +7,17 @@ from bot_sys import keyboard, user_access from bot_modules import access_utils, mod_interface from template import simple_message, bd_item +from enum import Enum +from enum import auto + +class ButtonNames(Enum): + START = auto() + +class Messages(Enum): + START = auto() + class SimpleMessageModule(mod_interface.IModule): - def __init__(self, a_StartMessage, a_StartButtonName, a_InitAccess, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log): + def __init__(self, a_Messages, a_Buttons, a_InitAccess, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log): self.m_ChildModuleNameList = a_ChildModuleNameList self.m_InitAccess = a_InitAccess self.m_Bot = a_Bot @@ -17,8 +26,13 @@ class SimpleMessageModule(mod_interface.IModule): self.m_BotButtons = a_BotButtons self.m_Log = a_Log - self.m_StartButtonName = self.CreateButton('start', a_StartButtonName) - self.m_StartMessage = self.CreateMessage('start', a_StartMessage) + self.m_Buttons = {} + for name, button_name in a_Buttons.items(): + self.m_Buttons[name] = self.CreateButton(name, button_name) + + self.m_Messages = {} + for name, message in a_Messages.items(): + self.m_Messages[name] = self.CreateMessage(name, message) async def StartMessageHandler(a_Message, state = None): return await self.StartMessageHandler(a_Message, state) @@ -42,7 +56,13 @@ class SimpleMessageModule(mod_interface.IModule): # Основной обработчик главного сообщения async def StartMessageHandler(self, a_Message, state = None): - return simple_message.WorkFuncResult(self.m_StartMessage) + return simple_message.WorkFuncResult(self.GetMessage(Messages.START)) + + def GetButton(self, a_ButtonName): + return self.m_Buttons.get(a_ButtonName, None) + + def GetMessage(self, a_MessageNames): + return self.m_Messages.get(a_MessageNames, None) def CreateMessage(self, a_MessageName, a_MessageDesc): msg = self.m_BotMessages.CreateMessage(f'{self.GetName()} {a_MessageName}', a_MessageDesc, self.m_Log.GetTimeNow()) @@ -78,12 +98,12 @@ class SimpleMessageModule(mod_interface.IModule): def GetModuleButtons(self): return [ - keyboard.ButtonWithAccess(self.m_StartButtonName, user_access.AccessMode.VIEW, self.GetAccess()), + keyboard.ButtonWithAccess(self.GetButton(ButtonNames.START), user_access.AccessMode.VIEW, self.GetAccess()), ] def RegisterHandlers(self): self.m_Bot.RegisterMessageHandler( self.m_StartMessageHandler, - bd_item.GetCheckForTextFunc(self.m_StartButtonName) + bd_item.GetCheckForTextFunc(self.GetButton(ButtonNames.START)) ) diff --git a/bot_modules/mod_table_operate.py b/bot_modules/mod_table_operate.py index 8641898..1817686 100644 --- a/bot_modules/mod_table_operate.py +++ b/bot_modules/mod_table_operate.py @@ -11,7 +11,6 @@ from enum import Enum from enum import auto class ButtonNames(Enum): - START = auto() LIST = auto() ADD = auto() EDIT = auto() @@ -19,10 +18,10 @@ class ButtonNames(Enum): EDIT_NAME = auto() EDIT_DESC = auto() EDIT_ACCESS = auto() + EDIT_DEFAULT_ACCESS = auto() DEL = auto() class Messages(Enum): - START = auto() SELECT = auto() ERROR_FIND = auto() OPEN = auto() @@ -36,21 +35,22 @@ class Messages(Enum): 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: - def __init__(self, a_FSMCreate, a_FSMEditName, a_FSMEditDesc, a_FSMEditPhoto, a_FSMEditAccess): - self.m_FSMCreate = a_FSMCreate - self.m_FSMEditName = a_FSMEditName - self.m_FSMEditDesc = a_FSMEditDesc - self.m_FSMEditPhoto = a_FSMEditPhoto - self.m_FSMEditAccess = a_FSMEditAccess +class FSMs(Enum): + CREATE = auto() + EDIT_PHOTO = auto() + EDIT_NAME = auto() + EDIT_DESC = auto() + EDIT_ACCESS = auto() + EDIT_DEFAULT_ACCESS = auto() class TableOperateModule(mod_simple_message.SimpleMessageModule): def __init__(self, a_Table, a_Messages, a_Buttons, a_FSMs, a_ParentModName, a_ChildModName, a_InitAccess, a_ChildModuleNameList, a_EditModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log): - super().__init__(a_Messages[Messages.START], a_Buttons[ButtonNames.START], a_InitAccess, a_ChildModuleNameList, 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) self.m_Table = a_Table self.m_FSMs = a_FSMs self.m_EditModuleNameList = a_EditModuleNameList @@ -58,14 +58,6 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): self.m_ParentModName = a_ParentModName self.m_SelectPrefix = '' - self.m_Buttons = {} - for name, button_name in a_Buttons.items(): - self.m_Buttons[name] = self.CreateButton(name, button_name) - - self.m_Messages = {} - for name, message in a_Messages.items(): - self.m_Messages[name] = self.CreateMessage(name, message) - def GetEditKeyboardButtons(a_Message, a_UserGroups): return self.GetEditKeyboardButtons(a_Message, a_UserGroups) self.m_GetEditKeyboardButtonsFunc = GetEditKeyboardButtons @@ -86,12 +78,8 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): return self.AddBDItemFunc(a_ItemData, a_UserID) self.m_AddBDItemFunc = AddBDItemFunc - - def GetButton(self, a_ButtonName): - return self.m_Buttons.get(a_ButtonName, None) - - def GetMessage(self, a_MessageNames): - return self.m_Messages.get(a_MessageNames, None) + def GetFSM(self, a_FSMName): + return self.m_FSMs.get(a_FSMName, None) def GetInitBDCommands(self): return super(). GetInitBDCommands() + [ @@ -242,6 +230,7 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): desc_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.DESC) photo_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.PHOTO) access_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.ACCESS) + def_access_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.DEFAULT_ACCESS) parent_id_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.PARENT_ID) parent_table_name = None @@ -287,7 +276,7 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): GetAccess, \ defaul_keyboard_func\ ) - self.m_SelectPrefix = a_Prefix + self.m_SelectPrefix = a_Prefix # Удаление a_ButtonName = self.GetButton(ButtonNames.DEL) @@ -314,10 +303,10 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): bd_item_add.AddBDItem3RegisterHandlers(self.m_Bot, \ check_func, \ - self.m_FSMs.m_FSMCreate, \ - self.m_FSMs.m_FSMCreate.name,\ - self.m_FSMs.m_FSMCreate.desc, \ - self.m_FSMs.m_FSMCreate.photo,\ + self.GetFSM(FSMs.CREATE), \ + self.GetFSM(FSMs.CREATE).name,\ + 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)), \ @@ -376,8 +365,9 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): bd_item.GetCheckForTextFunc(a_ButtonName)\ ) - RegisterEdit(self.GetButton(ButtonNames.EDIT_NAME), self.m_FSMs.m_FSMEditName, self.GetMessage(Messages.EDIT_NAME), name_field, bd_item.FieldType.text) - RegisterEdit(self.GetButton(ButtonNames.EDIT_DESC), self.m_FSMs.m_FSMEditDesc, self.GetMessage(Messages.EDIT_DESC), desc_field, bd_item.FieldType.text) - RegisterEdit(self.GetButton(ButtonNames.EDIT_PHOTO), self.m_FSMs.m_FSMEditPhoto, self.GetMessage(Messages.EDIT_PHOTO), photo_field, bd_item.FieldType.photo) - RegisterEdit(self.GetButton(ButtonNames.EDIT_ACCESS), self.m_FSMs.m_FSMEditAccess, self.GetMessage(Messages.EDIT_ACCESS), access_field, bd_item.FieldType.text) + 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) diff --git a/bot_modules/needs.py b/bot_modules/needs.py index 42f67e5..b58ca8d 100644 --- a/bot_modules/needs.py +++ b/bot_modules/needs.py @@ -4,26 +4,26 @@ # Потребности from bot_sys import bot_bd, keyboard, user_access, user_messages, bd_table -from bot_modules import mod_table_operate +from bot_modules import mod_table_operate, mod_simple_message from aiogram.dispatcher import FSMContext from aiogram.dispatcher.filters.state import State, StatesGroup -class FSMCreateNeeds(StatesGroup): +class FSMCreateNeed(StatesGroup): name = State() desc = State() photo = State() -class FSMEditNeedsPhotoItem(StatesGroup): +class FSMEditNeedPhotoItem(StatesGroup): item_field = State() -class FSMEditNeedsNameItem(StatesGroup): +class FSMEditNeedNameItem(StatesGroup): item_field = State() -class FSMEditNeedsDescItem(StatesGroup): +class FSMEditNeedDescItem(StatesGroup): item_field = State() -class FSMEditNeedsAccessItem(StatesGroup): +class FSMEditNeedAccessItem(StatesGroup): item_field = State() # --------------------------------------------------------- # БД @@ -50,13 +50,19 @@ table = bd_table.Table(table_name, [ init_access = f'{user_access.user_access_group_new}=va' -fsm = mod_table_operate.FSMs(FSMCreateNeeds, FSMEditNeedsNameItem, FSMEditNeedsDescItem, FSMEditNeedsPhotoItem, FSMEditNeedsAccessItem) +fsm = { + mod_table_operate.FSMs.CREATE: FSMCreateNeed, + mod_table_operate.FSMs.EDIT_NAME: FSMEditNeedNameItem, + mod_table_operate.FSMs.EDIT_DESC: FSMEditNeedDescItem, + mod_table_operate.FSMs.EDIT_PHOTO: FSMEditNeedPhotoItem, + mod_table_operate.FSMs.EDIT_ACCESS: FSMEditNeedAccessItem, + } # --------------------------------------------------------- # Сообщения и кнопки button_names = { - mod_table_operate.ButtonNames.START: "👉 Потребности", + mod_simple_message.ButtonNames.START: "👉 Потребности", mod_table_operate.ButtonNames.LIST: "📃 Список потребностей", mod_table_operate.ButtonNames.ADD: "☑ Добавить потребность", mod_table_operate.ButtonNames.EDIT: "🛠 Редактировать потребность", @@ -68,8 +74,8 @@ button_names = { } messages = { - mod_table_operate.Messages.START: f''' -{button_names[mod_table_operate.ButtonNames.START]} + mod_simple_message.Messages.START: f''' +{button_names[mod_simple_message.ButtonNames.START]} ''', mod_table_operate.Messages.SELECT: ''' diff --git a/bot_modules/profile.py b/bot_modules/profile.py index 183656e..b7e887a 100644 --- a/bot_modules/profile.py +++ b/bot_modules/profile.py @@ -32,7 +32,12 @@ table = bd_table.Table(table_name, [ bd_table.TableField(create_datetime_field, bd_table.TableFieldDestiny.CREATE_DATE, bd_table.TableFieldType.STR), ]) -start_message = f''' +button_names = { + mod_simple_message.ButtonNames.START: "📰 Профиль", +} + +messages = { + mod_simple_message.Messages.START: f''' 📰 Профиль: ID: #{key_name} @@ -41,15 +46,14 @@ start_message = f''' Имя2: #{name2_field} Код языка: #{language_code_field} Дата добавления: #{create_datetime_field} -''' - -start_button_name = "📰 Профиль" +''', +} init_access = f'{user_access.user_access_group_new}=+' class ModuleProfile(mod_simple_message.SimpleMessageModule): def __init__(self, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log): - super().__init__(start_message, start_button_name, init_access, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log) + super().__init__(messages, button_names, init_access, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log) def GetInitBDCommands(self): return super(). GetInitBDCommands() + [ @@ -64,7 +68,7 @@ class ModuleProfile(mod_simple_message.SimpleMessageModule): user_info = GetUserInfo(self.m_Bot, a_Message.from_user.id) lang = str(a_Message.from_user.language_code) if not user_info is None: - msg = self.m_StartMessage + msg = self.GetButton(mod_simple_message.ButtonNames.START) msg = msg.GetMessageForLang(lang).StaticCopy() msg.UpdateDesc(table.ReplaceAllFieldTags(msg.GetDesc(), user_info)) return simple_message.WorkFuncResult(msg, item_access = str(user_info[table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.ACCESS)])) diff --git a/bot_modules/projects.py b/bot_modules/projects.py index e7f721a..08d181d 100644 --- a/bot_modules/projects.py +++ b/bot_modules/projects.py @@ -4,7 +4,7 @@ # Проекты from bot_sys import bot_bd, keyboard, user_access, user_messages, bd_table -from bot_modules import mod_table_operate +from bot_modules import mod_table_operate, mod_simple_message from aiogram.dispatcher import FSMContext from aiogram.dispatcher.filters.state import State, StatesGroup @@ -48,13 +48,19 @@ table = bd_table.Table(table_name, [ init_access = f'{user_access.user_access_group_new}=va' -fsm = mod_table_operate.FSMs(FSMCreateProject, FSMEditProjectNameItem, FSMEditProjectDescItem, FSMEditProjectPhotoItem, FSMEditProjectAccessItem) +fsm = { + mod_table_operate.FSMs.CREATE: FSMCreateProject, + mod_table_operate.FSMs.EDIT_NAME: FSMEditProjectNameItem, + mod_table_operate.FSMs.EDIT_DESC: FSMEditProjectDescItem, + mod_table_operate.FSMs.EDIT_PHOTO: FSMEditProjectPhotoItem, + mod_table_operate.FSMs.EDIT_ACCESS: FSMEditProjectAccessItem, + } # --------------------------------------------------------- # Сообщения и кнопки button_names = { - mod_table_operate.ButtonNames.START: "🟥 Проекты", + mod_simple_message.ButtonNames.START: "🟥 Проекты", mod_table_operate.ButtonNames.LIST: "📃 Список проектов", mod_table_operate.ButtonNames.ADD: "✅ Добавить проект", mod_table_operate.ButtonNames.EDIT: "🛠 Редактировать проект", @@ -66,8 +72,8 @@ button_names = { } messages = { - mod_table_operate.Messages.START: f''' -{button_names[mod_table_operate.ButtonNames.START]} + mod_simple_message.Messages.START: f''' +{button_names[mod_simple_message.ButtonNames.START]} ''', mod_table_operate.Messages.SELECT: ''' diff --git a/bot_modules/start.py b/bot_modules/start.py index 5c3f945..ec203e5 100644 --- a/bot_modules/start.py +++ b/bot_modules/start.py @@ -7,18 +7,22 @@ from bot_sys import user_access from bot_modules import mod_simple_message, profile from template import bd_item -start_message = ''' -Добро пожаловать! +button_names = { + mod_simple_message.ButtonNames.START: "☰ Главное меню", +} -Выберите возможные действия на кнопках ниже ⌨''' +messages = { + mod_simple_message.Messages.START: f''' +Добро пожаловать! -start_button_name = "☰ Главное меню" +Выберите возможные действия на кнопках ниже ⌨''', +} init_access = f'{user_access.user_access_group_all}=+' class ModuleStart(mod_simple_message.SimpleMessageModule): def __init__(self, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log): - super().__init__(start_message, start_button_name, init_access, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log) + super().__init__(messages, button_names, init_access, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log) def GetName(self): return 'start' diff --git a/bot_modules/tasks.py b/bot_modules/tasks.py index ca69097..5632a18 100644 --- a/bot_modules/tasks.py +++ b/bot_modules/tasks.py @@ -4,26 +4,26 @@ # Задачи from bot_sys import bot_bd, keyboard, user_access, user_messages, bd_table -from bot_modules import mod_table_operate +from bot_modules import mod_table_operate, mod_simple_message from aiogram.dispatcher import FSMContext from aiogram.dispatcher.filters.state import State, StatesGroup -class FSMCreateTasks(StatesGroup): +class FSMCreateTask(StatesGroup): name = State() desc = State() photo = State() -class FSMEditTasksPhotoItem(StatesGroup): +class FSMEditTaskPhotoItem(StatesGroup): item_field = State() -class FSMEditTasksNameItem(StatesGroup): +class FSMEditTaskNameItem(StatesGroup): item_field = State() -class FSMEditTasksDescItem(StatesGroup): +class FSMEditTaskDescItem(StatesGroup): item_field = State() -class FSMEditTasksAccessItem(StatesGroup): +class FSMEditTaskAccessItem(StatesGroup): item_field = State() # --------------------------------------------------------- # БД @@ -50,13 +50,19 @@ table = bd_table.Table(table_name, [ init_access = f'{user_access.user_access_group_new}=va' -fsm = mod_table_operate.FSMs(FSMCreateTasks, FSMEditTasksNameItem, FSMEditTasksDescItem, FSMEditTasksPhotoItem, FSMEditTasksAccessItem) +fsm = { + mod_table_operate.FSMs.CREATE: FSMCreateTask, + mod_table_operate.FSMs.EDIT_NAME: FSMEditTaskNameItem, + mod_table_operate.FSMs.EDIT_DESC: FSMEditTaskDescItem, + mod_table_operate.FSMs.EDIT_PHOTO: FSMEditTaskPhotoItem, + mod_table_operate.FSMs.EDIT_ACCESS: FSMEditTaskAccessItem, + } # --------------------------------------------------------- # Сообщения и кнопки button_names = { - mod_table_operate.ButtonNames.START: "✎ Задачи", + mod_simple_message.ButtonNames.START: "✎ Задачи", mod_table_operate.ButtonNames.LIST: "📃 Список задач", mod_table_operate.ButtonNames.ADD: "☑ Добавить задачу", mod_table_operate.ButtonNames.EDIT: "🛠 Редактировать задачу", @@ -68,8 +74,8 @@ button_names = { } messages = { - mod_table_operate.Messages.START: f''' -{button_names[mod_table_operate.ButtonNames.START]} + mod_simple_message.Messages.START: f''' +{button_names[mod_simple_message.ButtonNames.START]} ''', mod_table_operate.Messages.SELECT: ''' diff --git a/bot_sys/bd_table.py b/bot_sys/bd_table.py index 233a806..e2dc628 100644 --- a/bot_sys/bd_table.py +++ b/bot_sys/bd_table.py @@ -16,6 +16,7 @@ class TableFieldDestiny(Enum): DESC = auto() PHOTO = auto() ACCESS = auto() + DEFAULT_ACCESS = auto() CREATE_DATE = auto() PARENT_ID = auto() OTHER = auto() -- 2.11.0 From a2ffb319c7b605b59709ba7e5301c114f71fd28f Mon Sep 17 00:00:00 2001 From: Alexei Date: Sat, 20 May 2023 13:40:32 +0300 Subject: [PATCH 21/25] =?UTF-8?q?=D0=94=D0=BE=D1=81=D1=82=D1=83=D0=BF=20?= =?UTF-8?q?=D0=BA=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8E=20=D1=82=D0=B5?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D1=8C=20=D1=80=D0=B5=D0=B4=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=B8=D1=80=D1=83=D0=B5=D1=82=D1=81=D1=8F=20=D0=B8=D0=B7=20?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot_modules/access.py | 31 +++++++++++++++---------------- bot_modules/mod_simple_message.py | 3 +++ bot_modules/mod_table_operate.py | 11 +++++++---- bot_sys/keyboard.py | 7 +++++-- 4 files changed, 30 insertions(+), 22 deletions(-) diff --git a/bot_modules/access.py b/bot_modules/access.py index 9d2416e..97455c5 100644 --- a/bot_modules/access.py +++ b/bot_modules/access.py @@ -13,11 +13,9 @@ from aiogram.dispatcher.filters.state import State, StatesGroup class FSMRequestToBDAccess(StatesGroup): sqlRequest = State() - class FSMEditAccessItem(StatesGroup): item_field = State() - class FSMEditDefaultAccessItem(StatesGroup): item_field = State() # --------------------------------------------------------- @@ -80,7 +78,7 @@ moduleaccess_edit_access_message = f''' Введите новую строку доступа: ''' -edit_moduleaccess_default_access_button_name = "◈ Изменить доступ по умолчанию к модулю " +edit_moduleaccess_default_access_button_name = "◈ Изменить доступ по умолчанию" moduleaccess_edit_default_access_message = f''' Текущий доступ по умолчанию к модулю #{mod_name_field}: #{mod_default_access_field} @@ -93,12 +91,17 @@ moduleaccess_success_edit_message = '''✅ Доступ к модулю успе button_names = { mod_simple_message.ButtonNames.START: start_button_name, - mod_table_operate.ButtonNames.EDIT_ACCESS: "◇ Изменить доступ к модулю", - mod_table_operate.ButtonNames.EDIT_DEFAULT_ACCESS: "◈ Изменить доступ по умолчанию к модулю ", + 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, } messages = { mod_simple_message.Messages.START: start_message, + mod_table_operate.Messages.START_EDIT: ''' +Пожалуйста, выберите действие: +''', + 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.Messages.SUCCESS_EDIT: moduleaccess_success_edit_message, @@ -127,17 +130,13 @@ class ModuleAccess(mod_table_operate.TableOperateModule): None, self.m_GetAccessFunc ) - ''' - def GetInitBDCommands(self): - return [ - f"""CREATE TABLE IF NOT EXISTS {table_name}( - {mod_name_field} TEXT, - {moduleaccess_field} TEXT, - {mod_default_access_field} TEXT, - UNIQUE({mod_name_field}) - );""", - ] + super().GetInitBDCommands() - ''' + + def GetButtonNameAndKeyValueAndAccess(self, a_Item): + return \ + a_Item[self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.KEY)],\ + a_Item[self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.KEY)],\ + a_Item[self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.ACCESS)] + def GetName(self): return module_name diff --git a/bot_modules/mod_simple_message.py b/bot_modules/mod_simple_message.py index fffa8c8..8ef5a65 100644 --- a/bot_modules/mod_simple_message.py +++ b/bot_modules/mod_simple_message.py @@ -69,6 +69,9 @@ class SimpleMessageModule(mod_interface.IModule): return msg def CreateButton(self, a_ButtonName, a_ButtonDesc): + assert len(a_ButtonDesc) < 41 # Телеграм не поддерживает больше + assert a_ButtonDesc[0] != ' ' # Телеграм не поддерживает пробелы в начале + assert a_ButtonDesc[-1:] != ' ' # Телеграм не поддерживает пробелы в конце btn = self.m_BotButtons.CreateMessage(f'{self.GetName()} {a_ButtonName}', 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 1817686..3291662 100644 --- a/bot_modules/mod_table_operate.py +++ b/bot_modules/mod_table_operate.py @@ -92,7 +92,7 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): keyboard.ButtonWithAccess(self.GetButton(ButtonNames.LIST), user_access.AccessMode.VIEW, self.GetAccess()), keyboard.ButtonWithAccess(self.GetButton(ButtonNames.ADD), user_access.AccessMode.ADD, self.GetAccess()), keyboard.ButtonWithAccess(self.GetButton(ButtonNames.DEL), user_access.AccessMode.DELETE, self.GetAccess()), - keyboard.ButtonWithAccess(self.GetButton(ButtonNames.EDIT), user_access.AccessMode.EDIT, self.GetAccess()) + keyboard.ButtonWithAccess(self.GetButton(ButtonNames.EDIT), user_access.AccessMode.EDIT, self.GetAccess()), ] return mod_buttons + keyboard.MakeButtons(cur_buttons, a_UserGroups) @@ -102,7 +102,8 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): 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.EDIT, 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()), ] return mod_buttons + keyboard.MakeButtons(cur_buttons, a_UserGroups) @@ -140,7 +141,9 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): return simple_message.WorkFuncResult(self.GetMessage(Messages.ERROR_FIND)) elif len(a_Item) == self.m_Table.GetFieldsCount(): msg.UpdateDesc(self.m_Table.ReplaceAllFieldTags(msg.GetDesc(), a_Item)) - msg.UpdatePhotoID(a_Item[self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.PHOTO)]) + photo_field = self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.PHOTO) + if photo_field: + msg.UpdatePhotoID(a_Item[photo_field]) 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)]) @@ -330,10 +333,10 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): return 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, \ diff --git a/bot_sys/keyboard.py b/bot_sys/keyboard.py index b0ecbc4..9dde72a 100644 --- a/bot_sys/keyboard.py +++ b/bot_sys/keyboard.py @@ -41,8 +41,9 @@ def MakeButtons(a_ButtonList : [ButtonWithAccess], a_UserGroups): for b in a_ButtonList: if not b.label: continue + label = str(b.label) if user_access.CheckAccessString(b.access_string, a_UserGroups, b.access_mode): - buttons += [types.KeyboardButton(str(b.label))] + buttons += [types.KeyboardButton(label)] step = GetButtonInRowCount(len(buttons)) return Chunks(buttons, step) @@ -83,7 +84,9 @@ def MakeInlineKeyboardButtons(a_ButtonList : [InlineButtonWithAccess], a_UserGro buttons = [] for b in a_ButtonList: if user_access.CheckAccessString(b.access_string, a_UserGroups, b.access_mode): - buttons += [InlineButton(b.label, f'{b.callback_prefix}{b.callback_data}')] + data = f'{b.callback_prefix}{b.callback_data}' + assert len(data) < 41 # Телеграм больше не поддерживает + buttons += [InlineButton(b.label, data)] step = GetButtonInRowCount(len(buttons)) return Chunks(buttons, step) -- 2.11.0 From e17b12903ad4390d8add2850ad6b3062a7962ef4 Mon Sep 17 00:00:00 2001 From: Alexei Date: Sat, 20 May 2023 17:13:22 +0300 Subject: [PATCH 22/25] =?UTF-8?q?=D0=9C=D0=BE=D0=B4=D1=83=D0=BB=D1=8C=20?= =?UTF-8?q?=D1=8F=D0=B7=D1=8B=D0=BA=D0=BE=D0=B2=20=D0=B8=20=D1=81=D0=BE?= =?UTF-8?q?=D0=B1=D1=89=D0=B5=D0=BD=D0=B8=D0=B9.=20=D0=9F=D0=BE=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=BD=D0=B5=20=D0=B4=D0=BE=20=D0=BA=D0=BE=D0=BD=D1=86?= =?UTF-8?q?=D0=B0=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D1=8E=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot_modules/access.py | 104 ---------------- bot_modules/languages.py | 254 ++++++++++++++++++++------------------- bot_modules/messages.py | 217 +++++++++++++++++++-------------- bot_modules/mod_table_operate.py | 8 ++ bot_sys/aiogram_bot.py | 40 ++++-- bot_sys/bd_table.py | 35 ++++-- bot_sys/bot_messages.py | 6 +- bot_sys/keyboard.py | 17 +-- main.py | 25 +++- template/bd_item_edit.py | 10 +- 10 files changed, 347 insertions(+), 369 deletions(-) diff --git a/bot_modules/access.py b/bot_modules/access.py index 97455c5..d1efee8 100644 --- a/bot_modules/access.py +++ b/bot_modules/access.py @@ -164,107 +164,3 @@ class ModuleAccess(mod_table_operate.TableOperateModule): bd_item.GetCheckForTextFunc(self.m_HelpButtonName) ) - -# --------------------------------------------------------- -# Работа с кнопками -''' -def GetEditAccessKeyboardButtons(a_Message, a_UserGroups): - cur_buttons = [ - keyboard.ButtonWithAccess(sql_request_button_name, user_access.AccessMode.ACCEES_EDIT, GetAccess()), - keyboard.ButtonWithAccess(edit_moduleaccess_access_button_name, user_access.AccessMode.ACCEES_EDIT, GetAccess()), - keyboard.ButtonWithAccess(edit_moduleaccess_default_access_button_name, user_access.AccessMode.ACCEES_EDIT, GetAccess()), - keyboard.ButtonWithAccess(help_button_name, user_access.AccessMode.VIEW, GetAccess()) - ] - mods = [start] - return keyboard.MakeKeyboard(keyboard.GetButtons(mods) + cur_buttons, a_UserGroups) - -# --------------------------------------------------------- -# Обработка сообщений - -def GetButtonNameAndKeyValueAndAccess(a_Item): - # ButtonName KeyValue Access - return a_Item[0], a_Item[0], a_Item[1] - -def ShowMessageTemplate(a_StringMessage): - async def ShowMessage(a_CallbackQuery : types.CallbackQuery, a_Item): - if (len(a_Item) < 3): - return simple_message.WorkFuncResult(error_find_proj_message) - - msg = a_StringMessage.\ - replace(f'#{mod_name_field}', a_Item[0]).\ - replace(f'#{moduleaccess_field}', a_Item[1]).\ - replace(f'#{mod_default_access_field}', a_Item[2]) - return simple_message.WorkFuncResult(msg, item_access = a_Item[1]) - return ShowMessage - -def SimpleMessageTemplateLegacy(a_StringMessage): - async def ShowMessage(a_CallbackQuery : types.CallbackQuery): - return simple_message.WorkFuncResult(a_StringMessage) - return ShowMessage - -# --------------------------------------------------------- -# Работа с базой данных - -def GetModuleAccessList(): - return bot_bd.SelectBDTemplate(table_name)() - -# --------------------------------------------------------- -# API - -def GetAccessForModule(a_ModuleName): - alist = GetModuleAccessList() - for i in alist: - if i[0] == a_ModuleName: - return i[1] - return '' - -def GetItemDefaultAccessForModule(a_ModuleName): - alist = GetModuleAccessList() - for i in alist: - if i[0] == a_ModuleName: - return i[2] - return '' - -# Инициализация БД -def GetInitBDCommands(): - return init_bd_cmds - -def GetAccess(): - return GetAccessForModule(module_name) - -# Доступные кнопки -def GetModuleButtons(): - return [keyboard.ButtonWithAccess(access_button_name, user_access.AccessMode.VIEW, GetAccess())] - -# Обработка кнопок -def RegisterHandlers(dp : Dispatcher): - defaul_keyboard_func = GetEditAccessKeyboardButtons - dp.register_message_handler(simple_message.InfoMessageTemplateLegacy(access_start_message, defaul_keyboard_func, GetAccess), text = access_button_name) - dp.register_message_handler(simple_message.InfoMessageTemplateLegacy(help_message, defaul_keyboard_func, GetAccess), text = help_button_name) - - sql_request.RequestToBDRegisterHandlers(dp, sql_request_button_name, request_start_message, FSMRequestToBDAccess, defaul_keyboard_func, user_access.AccessMode.ACCEES_EDIT, GetAccess) - - edit_keyboard_func = defaul_keyboard_func - def RegisterEdit(a_ButtonName, a_FSM, a_EditMessage, a_FieldName, a_FieldType, a_AccessMode = user_access.AccessMode.ACCEES_EDIT): - bd_item_edit.EditBDItemRegisterHandlers(dp, \ - None, \ - a_FSM, \ - bd_item.GetCheckForTextFunc(a_ButtonName), \ - moduleaccess_select_to_edit_message, \ - ShowMessageTemplate(a_EditMessage), \ - ShowMessageTemplate(moduleaccess_success_edit_message), \ - table_name, \ - mod_name_field, \ - None, \ - a_FieldName, \ - GetButtonNameAndKeyValueAndAccess, \ - GetAccess, \ - edit_keyboard_func, \ - access_mode = a_AccessMode, \ - field_type = a_FieldType\ - ) - RegisterEdit(edit_moduleaccess_access_button_name, FSMEditAccessItem, moduleaccess_edit_access_message, moduleaccess_field, bd_item.FieldType.text, user_access.AccessMode.ACCEES_EDIT) - RegisterEdit(edit_moduleaccess_default_access_button_name, FSMEditDefaultAccessItem, moduleaccess_edit_default_access_message, mod_default_access_field, bd_item.FieldType.text, user_access.AccessMode.EDIT) - -''' - diff --git a/bot_modules/languages.py b/bot_modules/languages.py index a7062a3..1bec524 100644 --- a/bot_modules/languages.py +++ b/bot_modules/languages.py @@ -3,16 +3,12 @@ # Языки -from bot_sys import bot_bd, log, keyboard, user_access, user_messages -from bot_modules import start, access, groups, messages -from template import bd_item_view, simple_message, bd_item_delete, bd_item_edit, bd_item, bd_item_add - -from aiogram import types +from bot_sys import bot_bd, keyboard, user_access, user_messages, bd_table +from bot_modules import mod_table_operate, mod_simple_message, access_utils +from template import bd_item from aiogram.dispatcher import FSMContext from aiogram.dispatcher.filters.state import State, StatesGroup -from aiogram.dispatcher import Dispatcher -import sqlite3 class FSMCreateLanguage(StatesGroup): name = State() @@ -25,7 +21,7 @@ class FSMEditLanguagePhotoItem(StatesGroup): class FSMEditLanguageNameItem(StatesGroup): item_field = State() -class FSMEditLanguageDeskItem(StatesGroup): +class FSMEditLanguageDescItem(StatesGroup): item_field = State() class FSMEditLanguageAccessItem(StatesGroup): @@ -42,156 +38,161 @@ photo_field = 'languagePhoto' access_field = 'languageAccess' create_datetime_field = 'languageCreateDateTime' -init_bd_cmds = [f'''CREATE TABLE IF NOT EXISTS {table_name}( - {key_name} INTEGER PRIMARY KEY, - {name_field} TEXT, - {desc_field} TEXT, - {photo_field} TEXT, - {access_field} TEXT, - {create_datetime_field} TEXT, - UNIQUE({key_name}), - UNIQUE({name_field}) - )''', -f"INSERT OR IGNORE INTO module_access (modName, modAccess, itemDefaultAccess) VALUES ('{module_name}', '{user_access.user_access_group_all}=-', '{user_access.user_access_group_all}=-');" -] - -# --------------------------------------------------------- -# Сообщения +table_name_field = bd_table.TableField(name_field, bd_table.TableFieldDestiny.NAME, bd_table.TableFieldType.STR) + +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(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_name_field], + ] +) -languages_button_name = "⚑ Языки" -base_language_message = f''' -{languages_button_name} +init_access = f'{user_access.user_access_group_all}=-' -''' +fsm = { + mod_table_operate.FSMs.CREATE: FSMCreateLanguage, + mod_table_operate.FSMs.EDIT_NAME: FSMEditLanguageNameItem, + mod_table_operate.FSMs.EDIT_DESC: FSMEditLanguageDescItem, + mod_table_operate.FSMs.EDIT_PHOTO: FSMEditLanguagePhotoItem, + mod_table_operate.FSMs.EDIT_ACCESS: FSMEditLanguageAccessItem, + } -list_language_button_name = "📃 Список языков" -select_language_message = ''' +# --------------------------------------------------------- +# Сообщения и кнопки + +button_names = { + mod_simple_message.ButtonNames.START: "⚑ Языки", + mod_table_operate.ButtonNames.LIST: "📃 Список языков", + mod_table_operate.ButtonNames.ADD: "✅ Добавить язык", + mod_table_operate.ButtonNames.EDIT: "🛠 Редактировать язык", + mod_table_operate.ButtonNames.EDIT_PHOTO: "☐ Изменить изображение в языке", + mod_table_operate.ButtonNames.EDIT_NAME: "≂ Изменить название в языке", + mod_table_operate.ButtonNames.EDIT_DESC: "𝌴 Изменить описание в языке", + mod_table_operate.ButtonNames.EDIT_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: ''' Пожалуйста, выберите язык: -''' - -error_find_proj_message = ''' +''', + mod_table_operate.Messages.ERROR_FIND: ''' ❌ Ошибка, язык не найден -''' - -language_open_message = f''' +''', + mod_table_operate.Messages.OPEN: f''' Язык: #{name_field} #{desc_field} Время создания: #{create_datetime_field} -''' - -# Создание языка - -add_language_button_name = "✅ Добавить язык" -language_create_name_message = ''' +''', + mod_table_operate.Messages.CREATE_NAME: ''' Создание языка. Шаг №1 Введите название языка: -''' - -language_create_desc_message = ''' +''', + mod_table_operate.Messages.CREATE_DESC: ''' Создание языка. Шаг №2 Введите описание языка: -''' - -language_create_photo_message = ''' +''', + mod_table_operate.Messages.CREATE_PHOTO: ''' Создание языка. Шаг №3 Загрузите обложку для языка (Фото): Она будет отображаться в его описании. -''' - -language_success_create_message = '''✅ Язык успешно добавлен!''' - -# Редактирование языка. - -edit_language_button_name = "🛠 Редактировать язык" -language_start_edit_message= ''' +''', + mod_table_operate.Messages.SUCCESS_CREATE: '''✅ Язык успешно добавлен!''', + mod_table_operate.Messages.START_EDIT: ''' Пожалуйста, выберите действие: -''' - -language_select_to_edit_message = ''' +''', + mod_table_operate.Messages.SELECT_TO_EDIT: ''' Выберите язык, который вы хотите отредактировать. -''' - -edit_language_photo_button_name = "☐ Изменить изображение в языке" -language_edit_photo_message = ''' +''', + mod_table_operate.Messages.EDIT_PHOTO: ''' Загрузите новую обложку для языка (Фото): Она будет отображаться в его описании. -''' - -edit_language_name_button_name = "≂ Изменить название в языке" -language_edit_name_message = f''' +''', + mod_table_operate.Messages.EDIT_NAME: f''' Текущее название языка: #{name_field} Введите новое название языка: -''' - -edit_language_desc_button_name = "𝌴 Изменить описание в языке" -language_edit_desc_message = f''' +''', + mod_table_operate.Messages.EDIT_DESC: f''' Текущее описание языка: #{desc_field} Введите новое описание языка: -''' - -edit_language_access_button_name = "✋ Изменить доступ к языку" -language_edit_access_message = f''' +''', + mod_table_operate.Messages.EDIT_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: '''✅ Язык успешно удалён!''', +} + +class ModuleLanguages(mod_table_operate.TableOperateModule): + 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, fsm, a_ParentModName, a_ChildModName, init_access, a_ChildModuleNameList, a_EditModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log) + self.m_LanguageIDs = {} + + def GetName(self): + return module_name + + def GetLangID(self, a_Lang): + return self.m_LanguageIDs.get(a_Lang, None) + + def GetLangName(self, a_LangID): + for lang_name, lang_id in self.m_LanguageIDs: + if a_LangID == lang_id: + return lang_name + return user_messages.default_language + + def FlushLanguages(self): + msg = self.m_BotMessages.GetMessages() + for lang, msg_dict in msg.items(): + self.AddOrIgnoreLang(lang) + langs = bd_item.GetAllItemsTemplate(self.m_Bot, table_name)() + if langs: + for l in langs: + self.m_LanguageIDs[l[1]] = str(l[0]) + print('FlushLanguages', self.m_LanguageIDs) + + def AddOrIgnoreLang(self, a_Lang : str): + 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) + desc_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.DESC) + access_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.ACCESS) + create_datetime_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.CREATE_DATE) + + res, error = self.m_Bot.SQLRequest(f'INSERT OR IGNORE INTO {table_name}({photo_field}, {name_field}, {desc_field}, {access_field}, {create_datetime_field}) VALUES(?, ?, ?, ?, {bot_bd.GetBDDateTimeNow()})', + commit = True, return_error = True, param = (0, a_Lang, '', access_utils.GetItemDefaultAccessForModule(self.m_Bot, module_name))) + + def OnChange(self): + self.FlushLanguages() -language_success_edit_message = '''✅ Язык успешно отредактирован!''' - -# Удаление языка - -del_language_button_name = "❌ Удалить язык" -language_select_to_delete_message = ''' -Выберите язык, которое вы хотите удалить. ''' - -language_success_delete_message = '''✅ Язык успешно удален!''' - -# --------------------------------------------------------- -# Работа с кнопками - -def GetEditLanguageKeyboardButtons(a_Language, a_UserGroups): - cur_buttons = GetModuleButtons() + [ - keyboard.ButtonWithAccess(edit_language_photo_button_name, user_access.AccessMode.EDIT, GetAccess()), - keyboard.ButtonWithAccess(edit_language_name_button_name, user_access.AccessMode.EDIT, GetAccess()), - keyboard.ButtonWithAccess(edit_language_desc_button_name, user_access.AccessMode.EDIT, GetAccess()), - keyboard.ButtonWithAccess(edit_language_access_button_name, user_access.AccessMode.ACCEES_EDIT, GetAccess()), - ] - mods = [start] - return keyboard.MakeKeyboard(keyboard.GetButtons(mods) + cur_buttons, a_UserGroups) - -def GetStartLanguageKeyboardButtons(a_Language, a_UserGroups): - cur_buttons = [ - keyboard.ButtonWithAccess(list_language_button_name, user_access.AccessMode.VIEW, GetAccess()), - keyboard.ButtonWithAccess(add_language_button_name, user_access.AccessMode.ADD, GetAccess()), - keyboard.ButtonWithAccess(del_language_button_name, user_access.AccessMode.DELETE, GetAccess()), - keyboard.ButtonWithAccess(edit_language_button_name, user_access.AccessMode.EDIT, GetAccess()) - ] - mods = [start, messages] - return keyboard.MakeKeyboard(keyboard.GetButtons(mods) + cur_buttons, a_UserGroups) - -def GetViewItemInlineKeyboardTemplate(a_ItemID): - def GetViewItemInlineKeyboard(a_Message, a_UserGroups): - cur_buttons = [ - keyboard.InlineButtonWithAccess(messages.list_message_button_name, messages.select_messages_prefix, a_ItemID, GetAccess(), user_access.AccessMode.VIEW), - ] - return keyboard.MakeInlineKeyboard(cur_buttons, a_UserGroups) - return GetViewItemInlineKeyboard -# --------------------------------------------------------- -# Обработка языков - # стартовое язык async def LanguagesOpen(a_Language : types.message, state = None): return simple_message.WorkFuncResult(base_language_message) @@ -257,28 +258,28 @@ def AddOrIgnoreLang(a_Lang : str): res, error = bot_bd.SQLRequestToBD(f'INSERT OR IGNORE INTO {table_name}({photo_field}, {name_field}, {desc_field}, {access_field}, {create_datetime_field}) VALUES(?, ?, ?, ?, {bot_bd.GetBDDateTimeNow()})', commit = True, return_error = True, param = (0, a_Lang, '', access.GetItemDefaultAccessForModule(module_name))) -g_languages = {} +m_LanguageIDs = {} def GetLangID(a_Lang): - global g_languages - return g_languages.get(a_Lang, None) + global m_LanguageIDs + return m_LanguageIDs.get(a_Lang, None) def GetLangName(a_LangID): - global g_languages - for lang_name, lang_id in g_languages: + global m_LanguageIDs + for lang_name, lang_id in m_LanguageIDs: if a_LangID == lang_id: return lang_name return user_messages.default_language def FlushLanguages(): - global g_languages + global m_LanguageIDs msg = user_messages.GetMessages() for lang, msg_dict in msg.items(): AddOrIgnoreLang(lang) langs = bd_item.GetAllItemsTemplate(table_name)() if langs: for l in langs: - g_languages[l[1]] = str(l[0]) - print('FlushLanguages', g_languages) + m_LanguageIDs[l[1]] = str(l[0]) + print('FlushLanguages', m_LanguageIDs) # Инициализация БД def GetInitBDCommands(): @@ -375,3 +376,4 @@ def RegisterHandlers(dp : Dispatcher): RegisterEdit(edit_language_name_button_name, FSMEditLanguageNameItem, language_edit_name_message, name_field, bd_item.FieldType.text) RegisterEdit(edit_language_desc_button_name, FSMEditLanguageDeskItem, language_edit_desc_message, desc_field, bd_item.FieldType.text) RegisterEdit(edit_language_access_button_name, FSMEditLanguageAccessItem, language_edit_access_message, access_field, bd_item.FieldType.text) +''' diff --git a/bot_modules/messages.py b/bot_modules/messages.py index 715f94d..97e4869 100644 --- a/bot_modules/messages.py +++ b/bot_modules/messages.py @@ -3,16 +3,12 @@ # Сообщения -from bot_sys import bot_bd, log, keyboard, user_access, user_messages -from bot_modules import start, access, groups, languages -from template import bd_item_view, simple_message, bd_item_delete, bd_item_edit, bd_item, bd_item_add, bd_item_select - -from aiogram import types +from bot_sys import bot_bd, keyboard, user_access, user_messages, bd_table, bot_messages +from bot_modules import mod_table_operate, mod_simple_message, access_utils +from template import bd_item from aiogram.dispatcher import FSMContext from aiogram.dispatcher.filters.state import State, StatesGroup -from aiogram.dispatcher import Dispatcher -import sqlite3 class FSMCreateMessage(StatesGroup): name = State() @@ -47,126 +43,164 @@ access_field = 'messageAccess' create_datetime_field = 'messageCreateDateTime' parent_id_field = 'languageID' -init_bd_cmds = [f'''CREATE TABLE IF NOT EXISTS {table_name}( - {key_name} INTEGER PRIMARY KEY, - {name_field} TEXT, - {desc_field} TEXT, - {photo_field} TEXT, - {access_field} TEXT, - {create_datetime_field} TEXT, - {parent_id_field} INTEGER, - UNIQUE({key_name}), - UNIQUE({name_field}, {parent_id_field}) - )''', -f"INSERT OR IGNORE INTO module_access (modName, modAccess, itemDefaultAccess) VALUES ('{module_name}', '{user_access.user_access_group_all}=-', '{user_access.user_access_group_all}=-');" -] - -select_messages_prefix = '' - -# --------------------------------------------------------- -# Сообщения +table_name_field = bd_table.TableField(name_field, bd_table.TableFieldDestiny.NAME, bd_table.TableFieldType.STR) +table_parent_id_field = bd_table.TableField(parent_id_field, bd_table.TableFieldDestiny.PARENT_ID, bd_table.TableFieldType.INT) + +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(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, + ], + [ + [table_name_field, table_parent_id_field], + ] +) -messages_button_name = "✉ Сообщения" -base_message_message = ''' -✎ Сообщения +init_access = f'{user_access.user_access_group_all}=-' -''' +fsm = { + mod_table_operate.FSMs.CREATE: FSMCreateMessage, + mod_table_operate.FSMs.EDIT_NAME: FSMEditMessageNameItem, + mod_table_operate.FSMs.EDIT_DESC: FSMEditMessageDescItem, + mod_table_operate.FSMs.EDIT_PHOTO: FSMEditMessagePhotoItem, + mod_table_operate.FSMs.EDIT_ACCESS: FSMEditMessageAccessItem, + } -list_message_button_name = "📃 Список сообщений" -select_message_message = ''' +# --------------------------------------------------------- +# Сообщения и кнопки + +button_names = { + mod_simple_message.ButtonNames.START: "✉ Сообщения", + mod_table_operate.ButtonNames.LIST: "📃 Список сообщений", + mod_table_operate.ButtonNames.ADD: "☑ Добавить сообщение", + mod_table_operate.ButtonNames.EDIT: "🛠 Редактировать сообщение", + mod_table_operate.ButtonNames.EDIT_PHOTO: "☐ Изменить изображение у сообщения", + mod_table_operate.ButtonNames.EDIT_NAME: "≂ Изменить название у сообщения", + mod_table_operate.ButtonNames.EDIT_DESC: "𝌴 Изменить описание у сообщения", + mod_table_operate.ButtonNames.EDIT_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: ''' Пожалуйста, выберите сообщение: -''' - -error_find_proj_message = ''' -❌ Ошибка, сообщенийа не найдена -''' - -message_open_message = f''' +''', + mod_table_operate.Messages.ERROR_FIND: ''' +❌ Ошибка, сообщение не найден +''', + mod_table_operate.Messages.OPEN: f''' Сообщение: #{name_field} #{desc_field} Время создания: #{create_datetime_field} -''' - -# Создание сообщения - -add_message_button_name = "☑ Добавить сообщение" -message_create_name_message = ''' +''', + mod_table_operate.Messages.CREATE_NAME: ''' Создание сообщения. Шаг №1 Введите название сообщения: -''' - -message_create_desc_message = ''' +''', + mod_table_operate.Messages.CREATE_DESC: ''' Создание сообщения. Шаг №2 Введите описание сообщения: -''' - -message_create_photo_message = ''' +''', + mod_table_operate.Messages.CREATE_PHOTO: ''' Создание сообщения. Шаг №3 Загрузите обложку для сообщения (Фото): -Она будет отображаться в её описании. -''' - -message_success_create_message = '''✅ Сообщение успешно добавлено!''' - -# Редактирование сообщения. - -edit_message_button_name = "🛠 Редактировать сообщение" -message_start_edit_message= ''' +Она будет отображаться в его описании. +''', + mod_table_operate.Messages.SUCCESS_CREATE: '''✅ Сообщение успешно добавлено!''', + mod_table_operate.Messages.START_EDIT: ''' Пожалуйста, выберите действие: -''' - -message_select_to_edit_message = ''' -Выберите сообщение, которую вы хотите отредактировать. -''' - -edit_message_photo_button_name = "☐ Изменить изображение у сообщения" -message_edit_photo_message = ''' +''', + mod_table_operate.Messages.SELECT_TO_EDIT: ''' +Выберите сообщение, который вы хотите отредактировать. +''', + mod_table_operate.Messages.EDIT_PHOTO: ''' Загрузите новую обложку для сообщения (Фото): -Она будет отображаться в её описании. -''' - -edit_message_name_button_name = "≂ Изменить название у сообщения" -message_edit_name_message = f''' +Она будет отображаться в его описании. +''', + mod_table_operate.Messages.EDIT_NAME: f''' Текущее название сообщения: #{name_field} Введите новое название сообщения: -''' - -edit_message_desc_button_name = "𝌴 Изменить описание у сообщения" -message_edit_desc_message = f''' +''', + mod_table_operate.Messages.EDIT_DESC: f''' Текущее описание сообщения: #{desc_field} Введите новое описание сообщения: -''' - -edit_message_access_button_name = "✋ Изменить доступ к сообщению" -message_edit_access_message = f''' -Текущий доступ к сообщению: +''', + mod_table_operate.Messages.EDIT_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: '''✅ Сообщение успешно удалено!''', +} + +class ModuleMessages(mod_table_operate.TableOperateModule): + 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, fsm, a_ParentModName, a_ChildModName, init_access, a_ChildModuleNameList, a_EditModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log) + self.m_LanguageIDs = {} + + def GetName(self): + return module_name + + def AddOrIgnoreMessage(self, a_Message): + 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) + desc_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.DESC) + access_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.ACCESS) + create_datetime_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.CREATE_DATE) + parent_id_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.PARENT_ID) + + lang_id = self.GetModule(self.m_ParentModName).GetLangID(a_Message.m_Language) + return self.m_Bot.SQLRequest(f'INSERT OR IGNORE 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_Message.m_PhotoID, a_Message.m_MessageName, a_Message.m_MessageDesc, access_utils.GetItemDefaultAccessForModule(self.m_Bot, module_name), lang_id)) + + def FlushMessages(self): + msg = self.m_BotMessages.GetMessages() + for lang, msg_dict in msg.items(): + for msg_name, message in msg_dict.items(): + self.AddOrIgnoreMessage(message) + + msgs_bd = bd_item.GetAllItemsTemplate(self.m_Bot, table_name)() + if msgs_bd: + for m in msgs_bd: + name = m[1] + desc = m[2] + photo_id = m[3] + lang_id = m[6] + lang_name = self.GetModule(self.m_ParentModName).GetLangName(lang_id) + self.m_BotMessages.CreateMessage(name, desc, self.m_Log.GetTimeNow(), a_MessagePhotoID = photo_id, a_MessageLang = lang_name) + + self.m_BotMessages.UpdateSignal(self.m_Log.GetTimeNow()) + + def OnChange(self): + self.FlushMessages() -message_success_edit_message = '''✅ Сообщение успешно отредактировано!''' -# Удаление сообщения - -del_message_button_name = "❌ Удалить сообщение" -message_select_to_delete_message = ''' -Выберите сообщение, которую вы хотите удалить. ''' - -message_success_delete_message = '''✅ Сообщение успешно удалено!''' - # --------------------------------------------------------- # Работа с кнопками @@ -399,3 +433,4 @@ def RegisterHandlers(dp : Dispatcher): RegisterEdit(edit_message_name_button_name, FSMEditMessageNameItem, message_edit_name_message, name_field, bd_item.FieldType.text) RegisterEdit(edit_message_desc_button_name, FSMEditMessageDescItem, message_edit_desc_message, desc_field, bd_item.FieldType.text) RegisterEdit(edit_message_access_button_name, FSMEditMessageAccessItem, message_edit_access_message, access_field, bd_item.FieldType.text) +''' diff --git a/bot_modules/mod_table_operate.py b/bot_modules/mod_table_operate.py index 3291662..5095f44 100644 --- a/bot_modules/mod_table_operate.py +++ b/bot_modules/mod_table_operate.py @@ -166,6 +166,7 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): async def PostDelete(self, a_CallbackQuery, a_ItemID): self.m_Log.Success(f'Задача №{a_ItemID} была удалена пользователем {a_CallbackQuery.from_user.id}.') #TODO: удалить вложенные + self.OnChange() return simple_message.WorkFuncResult(self.GetMessage(Messages.SUCCESS_DELETE)) def AddBDItemFunc(self, a_ItemData, a_UserID): @@ -187,6 +188,7 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): 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}=+")) + 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}).') else: @@ -332,6 +334,9 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): 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: @@ -351,6 +356,7 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): GetButtonNameAndKeyValueAndAccess, \ GetAccess, \ edit_keyboard_func, \ + OnChange,\ access_mode = a_AccessMode, \ field_type = a_FieldType\ ) @@ -374,3 +380,5 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): 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) + def OnChange(self): + pass diff --git a/bot_sys/aiogram_bot.py b/bot_sys/aiogram_bot.py index c13656c..8d05fce 100644 --- a/bot_sys/aiogram_bot.py +++ b/bot_sys/aiogram_bot.py @@ -9,6 +9,24 @@ from aiogram.dispatcher import Dispatcher from aiogram.contrib.fsm_storage.memory import MemoryStorage from aiogram.utils import executor +def MakeAiogramInlineKeyboards(a_ButtonList : [InlineButton]): + buttons = [] + for row in a_ButtonList: + r = [] + for b in row: + r += [types.InlineKeyboardButton(text = str(b.label), callback_data = b.callback_data)] + buttons += [r] + + button_list_chunks = keyboard.Chunks(buttons, 20) + result = [] + for c in button_list_chunks: + result += [InlineKeyboardMarkup(inline_keyboard=c)] + + return result + +def MakeAiogramKeyboard(a_ButtonList : [[str]]): + return types.ReplyKeyboardMarkup(keyboard=a_ButtonList, resize_keyboard = True) + class AiogramBot(interfaces.IBot): def __init__(self, a_TelegramBotApiToken, a_BDFileName, a_RootIDs, a_Log): self.m_TelegramBotApiToken = a_TelegramBotApiToken @@ -31,27 +49,29 @@ class AiogramBot(interfaces.IBot): async def SendMessage(self, a_UserID, a_Message, a_PhotoIDs, a_KeyboardButtons, a_InlineKeyboardButtons, parse_mode = None): if not parse_mode: parse_mode = types.ParseMode.HTML - inline_keyboard = None + inline_keyboards = None if a_InlineKeyboardButtons: - inline_keyboard = keyboard.MakeAiogramInlineKeyboard(a_InlineKeyboardButtons) - base_keyboard = None + inline_keyboards = keyboard.MakeAiogramInlineKeyboards(a_InlineKeyboardButtons) + base_keyboards = None if a_KeyboardButtons: - base_keyboard = keyboard.MakeAiogramKeyboard(a_KeyboardButtons) - if inline_keyboard: - base_keyboard = inline_keyboard + base_keyboards = [keyboard.MakeAiogramKeyboard(a_KeyboardButtons)] + if inline_keyboards: + base_keyboards = inline_keyboards if a_PhotoIDs and a_PhotoIDs != 0 and a_PhotoIDs != '0': - await self.m_TBot.send_photo( + for k in base_keyboards: + await self.m_TBot.send_photo( a_UserID, a_PhotoIDs, a_Message, - reply_markup = base_keyboard + reply_markup = k ) else: #print('SendMessage', a_UserID, a_Message, a_PhotoIDs, a_InlineKeyboardButtons, a_KeyboardButtons, base_keyboard) - await self.m_TBot.send_message( + for k in base_keyboards: + await self.m_TBot.send_message( a_UserID, a_Message, - reply_markup = base_keyboard, + reply_markup = k, parse_mode = parse_mode ) diff --git a/bot_sys/bd_table.py b/bot_sys/bd_table.py index e2dc628..aaacb4f 100644 --- a/bot_sys/bd_table.py +++ b/bot_sys/bd_table.py @@ -28,9 +28,10 @@ class TableField: self.m_Type = a_Type class Table: - def __init__(self, a_TableName, a_Fields : [TableField]): + def __init__(self, a_TableName, a_Fields : [TableField], a_UniqueFields = None): self.m_TableName = a_TableName self.m_Fields = a_Fields + self.m_UniqueFields = a_UniqueFields def GetName(self): return self.m_TableName @@ -62,13 +63,19 @@ class Table: def GetInitTableRequest(self): request = f'CREATE TABLE IF NOT EXISTS {self.GetName()}(' - fields = [] + items = [] for f in self.m_Fields: - key_str = '' + item = f.m_Name + ' ' + str(f.m_Type.value) if f.m_Destiny == TableFieldDestiny.KEY: - key_str = 'PRIMARY KEY' - fields += [' '.join([f.m_Name, str(f.m_Type.value), key_str])] - return request + ', '.join(fields) + ');' + item += ' PRIMARY KEY' + items += [item] + if self.m_UniqueFields: + for u in self.m_UniqueFields: + fields = [] + for f in u: + fields += [f.m_Name] + items += ['UNIQUE(' + ', '.join(fields) +')'] + return request + ', '.join(items) + ');' def ReplaceAllFieldTags(self, a_String, a_BDItem): result = a_String @@ -78,11 +85,16 @@ class Table: return result def Test(): + f1 = TableField('f1', TableFieldDestiny.KEY, TableFieldType.INT) + f2 = TableField('f2', TableFieldDestiny.NAME, TableFieldType.STR) + f3 = TableField('f3', TableFieldDestiny.DESC, TableFieldType.STR) table = Table('tname', [ - TableField('f1', TableFieldDestiny.KEY, TableFieldType.INT), - TableField('f2', TableFieldDestiny.NAME, TableFieldType.STR), - TableField('f3', TableFieldDestiny.DESC, TableFieldType.STR), - ]) + f1, + f2, + f3 + ], + [[f1], [f2, f3]] + ) assert table.GetName() == 'tname' assert table.GetFieldByDestiny(TableFieldDestiny.KEY).m_Name == 'f1' assert table.GetFieldNameByDestiny(TableFieldDestiny.KEY) == 'f1' @@ -106,7 +118,8 @@ def Test(): assert table.GetFieldsCount() == 3 - assert table.GetInitTableRequest() == 'CREATE TABLE IF NOT EXISTS tname(f1 INTEGER PRIMARY KEY, f2 TEXT , f3 TEXT );' + 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));' item = [10, 'i1', 'i2'] assert table.ReplaceAllFieldTags('#f1 #f2 #f3', item) == '10 i1 i2' diff --git a/bot_sys/bot_messages.py b/bot_sys/bot_messages.py index fca952f..d616a00 100644 --- a/bot_sys/bot_messages.py +++ b/bot_sys/bot_messages.py @@ -71,8 +71,10 @@ class BotMessages: def UpdateSignal(self, a_DateTime): self.m_LastUpdate = a_DateTime - def CreateMessage(self, a_MessageName, a_MessageDesc, a_DateTime): - cur_msg = BotMessage(self, a_MessageName, a_MessageDesc, self.a_DefaultLanguage, 0, a_DateTime) + def CreateMessage(self, a_MessageName, a_MessageDesc, a_DateTime, a_MessagePhotoID = 0, a_MessageLang = None): + if not a_MessageLang: + a_MessageLang = self.a_DefaultLanguage + cur_msg = BotMessage(self, a_MessageName, a_MessageDesc, a_MessageLang, a_MessagePhotoID, a_DateTime) msg = self.GetMessages() if not msg.get(self.a_DefaultLanguage, None): msg[self.a_DefaultLanguage] = {} diff --git a/bot_sys/keyboard.py b/bot_sys/keyboard.py index 9dde72a..263e82e 100644 --- a/bot_sys/keyboard.py +++ b/bot_sys/keyboard.py @@ -30,10 +30,7 @@ def Chunks(a_List, a_ChunkSize): return chunk_list def GetButtonInRowCount(a_AllKeyCount): - return min(max(int(math.sqrt(a_AllKeyCount) // 1), 1), 4) - -def MakeAiogramKeyboard(a_ButtonList : [[str]]): - return types.ReplyKeyboardMarkup(keyboard=a_ButtonList, resize_keyboard = True) + return min(max(int(math.sqrt(a_AllKeyCount) // 1), 1), 3) # TODO перенести KeyboardButton в MakeAiogramKeyboard def MakeButtons(a_ButtonList : [ButtonWithAccess], a_UserGroups): @@ -70,16 +67,6 @@ class InlineButtonWithAccess: self.access_string = a_AccessString self.access_mode = a_AccessMode -def MakeAiogramInlineKeyboard(a_ButtonList : [InlineButton]): - buttons = [] - for row in a_ButtonList: - r = [] - for b in row: - r += [types.InlineKeyboardButton(text = str(b.label), callback_data = b.callback_data)] - buttons += [r] - inline_keyboard = InlineKeyboardMarkup(inline_keyboard=buttons) - return inline_keyboard - def MakeInlineKeyboardButtons(a_ButtonList : [InlineButtonWithAccess], a_UserGroups): buttons = [] for b in a_ButtonList: @@ -90,5 +77,5 @@ def MakeInlineKeyboardButtons(a_ButtonList : [InlineButtonWithAccess], a_UserGro step = GetButtonInRowCount(len(buttons)) return Chunks(buttons, step) -def MakeInlineKeyboard(a_ButtonList : [InlineButtonWithAccess], a_UserGroups): +def MakeInlineKeyboard(a_ButtonList : [InlineButtonWithAccess], a_UserGroups): return MakeAiogramInlineKeyboard(MakeInlineKeyboardButtons(a_ButtonList, a_UserGroups)) diff --git a/main.py b/main.py index 47f24a8..aec52ab 100644 --- a/main.py +++ b/main.py @@ -6,7 +6,7 @@ log_start_message = 'Бот успешно запущен!' import os from bot_sys import config, log, bot_bd, user_access, aiogram_bot, bot_messages, bd_table -from bot_modules import mod_agregator, start, profile, backup, groups, access, projects, tasks, needs, comments #, projects, , access, , , , , messages, , languages +from bot_modules import mod_agregator, start, profile, backup, groups, access, projects, tasks, needs, comments, languages, messages g_Log = log g_Bot = aiogram_bot.AiogramBot(config.GetTelegramBotApiToken(), bot_bd.GetBDFileName(), config.GetRootIDs(), g_Log) @@ -23,6 +23,9 @@ mod_tasks_name = 'tasks' mod_needs_name = 'needs' mod_comments_name = 'comments' mod_projects_name = 'projects' +mod_languages_name = 'languages' +mod_messages_name = 'messages' +mod_buttons_name = 'buttons' start_mod_list = [mod_start_name] @@ -54,24 +57,34 @@ start_mod_name_list = [mod_start_name]#, mod_projects_name, mod_tasks_name, mod_ mod_comments= comments.ModuleComments(mod_needs_name, None, start_mod_name_list, start_mod_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) g_ModuleAgregator.AddModule(mod_comments) -start_mod_name_list = [#, '', , '', , 'languages'] +start_mod_name_list = [mod_start_name, mod_messages_name]#, mod_messages_name, mod_buttons_name +mod_languages = languages.ModuleLanguages(None, mod_messages_name, start_mod_name_list, start_mod_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) +g_ModuleAgregator.AddModule(mod_languages) + +start_mod_name_list = [mod_start_name]#, mod_messages_name, mod_buttons_name +mod_messages = messages.ModuleMessages(mod_languages_name, None, start_mod_name_list, start_mod_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) +g_ModuleAgregator.AddModule(mod_messages) + +start_mod_name_list = [ mod_profile.GetName(), mod_backup.GetName(), mod_groups.GetName(), mod_access.GetName(), mod_project.GetName(), + mod_languages.GetName(), ] mod_start = start.ModuleStart(start_mod_name_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) g_ModuleAgregator.AddModule(mod_start) -# Первичная инициализация модулей. Все модули должны быть прописаны в списке modules -modules = g_ModuleAgregator.GetModList() # [start] #tasks, access, profile, projects, groups, backup, needs, comments, messages, languages] +# Первичная инициализация модулей. +modules = g_ModuleAgregator.GetModList() init_bd_cmds = [] for m in modules: c = m.GetInitBDCommands() if not c is None: init_bd_cmds += c + # Первичная инициализация базы данных for c in init_bd_cmds: g_Bot.SQLRequest(c, commit = True) @@ -79,8 +92,8 @@ for c in init_bd_cmds: g_BotMessages.UpdateSignal(g_Log.GetTimeNow()) g_BotButtons.UpdateSignal(g_Log.GetTimeNow()) -#languages.FlushLanguages() -#messages.FlushMessages() +mod_languages.FlushLanguages() +mod_messages.FlushMessages() for m in modules: m.RegisterHandlers() diff --git a/template/bd_item_edit.py b/template/bd_item_edit.py index aa3fec4..5c21dc9 100644 --- a/template/bd_item_edit.py +++ b/template/bd_item_edit.py @@ -18,7 +18,7 @@ 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, access_mode = user_access.AccessMode.EDIT, field_type = bd_item.FieldType.text): +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): item_id = a_ItemData[a_KeyName] field_value = a_ItemData[a_FieldName] @@ -27,11 +27,13 @@ def FinishEditBDItemTemplate(a_Bot, a_FSM, a_TableName, a_KeyName, a_FieldName, a_Bot.GetLog().Error(f'Пользователю {a_UserID} не удалось изменить поле в таблице {a_TableName} ключу {a_KeyName}={item_id}. Новое значение поля {a_FieldName}={field_value}. Ошибка: {error}') else: a_Bot.GetLog().Success(f'Пользователь {a_UserID} изменил поле в таблице {a_TableName} ключу {a_KeyName}={item_id}. Новое значение поля {a_FieldName}={field_value}.') + + a_OnChangeFunc() 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, access_mode = user_access.AccessMode.EDIT, field_type = bd_item.FieldType.text): +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 @@ -42,6 +44,6 @@ def EditBDItemRegisterHandlers(a_Bot, a_PrevPrefix, a_FSM, a_StartCheckFunc, a_S 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)) 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, 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_AccessFunc, a_ButtonFunc, 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, 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_AccessFunc, a_ButtonFunc, a_OnChangeFunc, access_mode, field_type = field_type), state = a_FSM.item_field) -- 2.11.0 From a02164eca31e0544c1f49f0b90d82d38b855e515 Mon Sep 17 00:00:00 2001 From: Alexei Date: Sat, 20 May 2023 18:00:10 +0300 Subject: [PATCH 23/25] =?UTF-8?q?=D0=A1=D0=BE=D0=BE=D0=B1=D1=89=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=B8=20=D1=8F=D0=B7=D1=8B=D0=BA=D0=B8=20?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D1=8E=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot_modules/messages.py | 1 + bot_modules/mod_table_operate.py | 2 ++ bot_modules/profile.py | 2 +- bot_sys/aiogram_bot.py | 18 ------------------ bot_sys/bot_messages.py | 7 +++---- bot_sys/keyboard.py | 30 ++++++++++++++++++++++++++---- 6 files changed, 33 insertions(+), 27 deletions(-) diff --git a/bot_modules/messages.py b/bot_modules/messages.py index 97e4869..9f593f6 100644 --- a/bot_modules/messages.py +++ b/bot_modules/messages.py @@ -184,6 +184,7 @@ class ModuleMessages(mod_table_operate.TableOperateModule): for msg_name, message in msg_dict.items(): self.AddOrIgnoreMessage(message) + table_name = self.m_Table.GetName() msgs_bd = bd_item.GetAllItemsTemplate(self.m_Bot, table_name)() if msgs_bd: for m in msgs_bd: diff --git a/bot_modules/mod_table_operate.py b/bot_modules/mod_table_operate.py index 5095f44..742c93c 100644 --- a/bot_modules/mod_table_operate.py +++ b/bot_modules/mod_table_operate.py @@ -140,6 +140,8 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): if len(a_Item) < self.m_Table.GetFieldsCount() - 1: # Для проектов это нужно. Там на 1 меньше поле. TODO разделить отправку сообщений item_access и Inline_keyboard_func return simple_message.WorkFuncResult(self.GetMessage(Messages.ERROR_FIND)) 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: diff --git a/bot_modules/profile.py b/bot_modules/profile.py index b7e887a..4062b38 100644 --- a/bot_modules/profile.py +++ b/bot_modules/profile.py @@ -68,7 +68,7 @@ class ModuleProfile(mod_simple_message.SimpleMessageModule): user_info = GetUserInfo(self.m_Bot, a_Message.from_user.id) lang = str(a_Message.from_user.language_code) if not user_info is None: - msg = self.GetButton(mod_simple_message.ButtonNames.START) + msg = self.GetMessage(mod_simple_message.Messages.START) msg = msg.GetMessageForLang(lang).StaticCopy() msg.UpdateDesc(table.ReplaceAllFieldTags(msg.GetDesc(), user_info)) return simple_message.WorkFuncResult(msg, item_access = str(user_info[table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.ACCESS)])) diff --git a/bot_sys/aiogram_bot.py b/bot_sys/aiogram_bot.py index 8d05fce..07985c5 100644 --- a/bot_sys/aiogram_bot.py +++ b/bot_sys/aiogram_bot.py @@ -9,24 +9,6 @@ from aiogram.dispatcher import Dispatcher from aiogram.contrib.fsm_storage.memory import MemoryStorage from aiogram.utils import executor -def MakeAiogramInlineKeyboards(a_ButtonList : [InlineButton]): - buttons = [] - for row in a_ButtonList: - r = [] - for b in row: - r += [types.InlineKeyboardButton(text = str(b.label), callback_data = b.callback_data)] - buttons += [r] - - button_list_chunks = keyboard.Chunks(buttons, 20) - result = [] - for c in button_list_chunks: - result += [InlineKeyboardMarkup(inline_keyboard=c)] - - return result - -def MakeAiogramKeyboard(a_ButtonList : [[str]]): - return types.ReplyKeyboardMarkup(keyboard=a_ButtonList, resize_keyboard = True) - class AiogramBot(interfaces.IBot): def __init__(self, a_TelegramBotApiToken, a_BDFileName, a_RootIDs, a_Log): self.m_TelegramBotApiToken = a_TelegramBotApiToken diff --git a/bot_sys/bot_messages.py b/bot_sys/bot_messages.py index d616a00..dca7307 100644 --- a/bot_sys/bot_messages.py +++ b/bot_sys/bot_messages.py @@ -76,9 +76,8 @@ class BotMessages: a_MessageLang = self.a_DefaultLanguage cur_msg = BotMessage(self, a_MessageName, a_MessageDesc, a_MessageLang, a_MessagePhotoID, a_DateTime) msg = self.GetMessages() - if not msg.get(self.a_DefaultLanguage, None): - msg[self.a_DefaultLanguage] = {} - if not msg[self.a_DefaultLanguage].get(a_MessageName, None): - msg[self.a_DefaultLanguage][a_MessageName] = cur_msg + if not msg.get(a_MessageLang, None): + msg[a_MessageLang] = {} + msg[a_MessageLang][a_MessageName] = cur_msg return cur_msg diff --git a/bot_sys/keyboard.py b/bot_sys/keyboard.py index 263e82e..2ba2190 100644 --- a/bot_sys/keyboard.py +++ b/bot_sys/keyboard.py @@ -4,8 +4,9 @@ # Работа с кнопками и клавиатурой from bot_sys import user_access -from aiogram import types, Bot, Dispatcher + from aiogram.types import ReplyKeyboardRemove, ReplyKeyboardMarkup, KeyboardButton, InlineKeyboardMarkup, InlineKeyboardButton +from aiogram import types class ButtonWithAccess: def __init__(self, a_Label, a_AccessMode : user_access.AccessMode, a_AccessString): @@ -47,9 +48,6 @@ def MakeButtons(a_ButtonList : [ButtonWithAccess], a_UserGroups): def MakeKeyboard(a_ButtonList : [ButtonWithAccess], a_UserGroups): return MakeAiogramKeyboard(MakeButtons(a_ButtonList, a_UserGroups)) -def MakeKeyboardRemove(): - return types.ReplyKeyboardRemove() - def MakeKeyboardForMods(a_ModList, a_UserGroups): buttons = GetButtons(a_ModList) return MakeKeyboard(buttons, a_UserGroups) @@ -79,3 +77,27 @@ def MakeInlineKeyboardButtons(a_ButtonList : [InlineButtonWithAccess], a_UserGro def MakeInlineKeyboard(a_ButtonList : [InlineButtonWithAccess], a_UserGroups): return MakeAiogramInlineKeyboard(MakeInlineKeyboardButtons(a_ButtonList, a_UserGroups)) + +# ------------------------------- + + +def MakeKeyboardRemove(): + return types.ReplyKeyboardRemove() + +def MakeAiogramInlineKeyboards(a_ButtonList : [InlineButton]): + buttons = [] + for row in a_ButtonList: + r = [] + for b in row: + r += [types.InlineKeyboardButton(text = str(b.label), callback_data = b.callback_data)] + buttons += [r] + + button_list_chunks = Chunks(buttons, 20) + result = [] + for c in button_list_chunks: + result += [InlineKeyboardMarkup(inline_keyboard=c)] + + return result + +def MakeAiogramKeyboard(a_ButtonList : [[str]]): + return types.ReplyKeyboardMarkup(keyboard=a_ButtonList, resize_keyboard = True) -- 2.11.0 From c6ceb4433a42898111fa008b009c3849836f4ca2 Mon Sep 17 00:00:00 2001 From: Alexei Date: Sat, 20 May 2023 19:47:10 +0300 Subject: [PATCH 24/25] =?UTF-8?q?=D0=9D=D0=B0=D0=B7=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BE=D0=BA=20=D1=82?= =?UTF-8?q?=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20=D0=BC=D0=BE=D0=B6=D0=BD=D0=BE?= =?UTF-8?q?=20=D1=80=D0=B5=D0=B4=D0=B0=D0=BA=D1=82=D0=B8=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D1=82=D1=8C=20=D0=B8=D0=B7=20=D1=81=D0=B0=D0=BC=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=20=D0=B1=D0=BE=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot_modules/buttons.py | 200 +++++++++++++++++++++++++++++++++++++++ bot_modules/languages.py | 185 ------------------------------------ bot_modules/messages.py | 237 ----------------------------------------------- bot_modules/start.py | 4 +- main.py | 27 +++--- 5 files changed, 219 insertions(+), 434 deletions(-) create mode 100644 bot_modules/buttons.py diff --git a/bot_modules/buttons.py b/bot_modules/buttons.py new file mode 100644 index 0000000..2cc3ef7 --- /dev/null +++ b/bot_modules/buttons.py @@ -0,0 +1,200 @@ +# -*- coding: utf8 -*- +# Общественное достояние, 2023, Алексей Безбородов (Alexei Bezborodov) + +# Сообщения + +from bot_sys import bot_bd, keyboard, user_access, user_messages, bd_table, bot_messages +from bot_modules import mod_table_operate, mod_simple_message, access_utils +from template import bd_item + +from aiogram.dispatcher import FSMContext +from aiogram.dispatcher.filters.state import State, StatesGroup + +class FSMCreateButton(StatesGroup): + name = State() + desc = State() + photo = State() + +class FSMEditButtonPhotoItem(StatesGroup): + item_id = State() + item_field = State() + +class FSMEditButtonNameItem(StatesGroup): + item_id = State() + item_field = State() + +class FSMEditButtonDescItem(StatesGroup): + item_id = State() + item_field = State() + +class FSMEditButtonAccessItem(StatesGroup): + item_id = State() + item_field = State() +# --------------------------------------------------------- +# БД +module_name = 'buttons' + +table_name = module_name +key_name = 'buttonID' +name_field = 'buttonName' +desc_field = 'buttonDesc' +photo_field = 'buttonPhoto' +access_field = 'buttonAccess' +create_datetime_field = 'buttonCreateDateTime' +parent_id_field = 'languageID' + +table_name_field = bd_table.TableField(name_field, bd_table.TableFieldDestiny.NAME, bd_table.TableFieldType.STR) +table_parent_id_field = bd_table.TableField(parent_id_field, bd_table.TableFieldDestiny.PARENT_ID, bd_table.TableFieldType.INT) + +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(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, + ], + [ + [table_name_field, table_parent_id_field], + ] +) + +init_access = f'{user_access.user_access_group_all}=-' + +fsm = { + mod_table_operate.FSMs.CREATE: FSMCreateButton, + mod_table_operate.FSMs.EDIT_NAME: FSMEditButtonNameItem, + mod_table_operate.FSMs.EDIT_DESC: FSMEditButtonDescItem, + mod_table_operate.FSMs.EDIT_PHOTO: FSMEditButtonPhotoItem, + mod_table_operate.FSMs.EDIT_ACCESS: FSMEditButtonAccessItem, + } + +# --------------------------------------------------------- +# Сообщения и кнопки + +button_names = { + mod_simple_message.ButtonNames.START: "❍ Названия кнопок", + mod_table_operate.ButtonNames.LIST: "📃 Список названий кнопок", + mod_table_operate.ButtonNames.ADD: "☑ Добавить название кнопки", + mod_table_operate.ButtonNames.EDIT: "🛠 Редактировать названия кнопок", + mod_table_operate.ButtonNames.EDIT_PHOTO: "☐ Изменить изображение у названия кнопок", + mod_table_operate.ButtonNames.EDIT_NAME: "≂ Изменить название у названия кнопок", + mod_table_operate.ButtonNames.EDIT_DESC: "𝌴 Изменить описание у названия кнопок", + mod_table_operate.ButtonNames.EDIT_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} + +Время создания: #{create_datetime_field} +''', + mod_table_operate.Messages.CREATE_NAME: ''' +Создание названия кнопки Шаг №1 + +Введите название название кнопки: +''', + mod_table_operate.Messages.CREATE_DESC: ''' +Создание названия кнопки. Шаг №2 + +Введите описание название кнопки: +''', + mod_table_operate.Messages.CREATE_PHOTO: ''' +Создание названия кнопки +Загрузите обложку для названия кнопок (Фото): +На данный момент не поддерживается! +Нажмите пропустить +''', + mod_table_operate.Messages.SUCCESS_CREATE: '''✅ Название кнопки успешно добавлено!''', + mod_table_operate.Messages.START_EDIT: ''' +Пожалуйста, выберите действие: +''', + mod_table_operate.Messages.SELECT_TO_EDIT: ''' +Выберите название кнопки, который вы хотите отредактировать. +''', + mod_table_operate.Messages.EDIT_PHOTO: ''' +Загрузите новую обложку для названия кнопок (Фото): +Она будет отображаться в его описании. +''', + mod_table_operate.Messages.EDIT_NAME: f''' +Текущее название названия кнопок: +#{name_field} + +Введите новое название названия кнопки: +''', + mod_table_operate.Messages.EDIT_DESC: f''' +Текущее описание названия кнопок: +#{desc_field} + +Введите новое описание названия кнопки: +''', + mod_table_operate.Messages.EDIT_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: '''✅ Название кнопки успешно удалено!''', +} + +class ModuleButtons(mod_table_operate.TableOperateModule): + 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, fsm, 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 + + def AddOrIgnoreMessage(self, a_Message): + 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) + desc_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.DESC) + access_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.ACCESS) + create_datetime_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.CREATE_DATE) + parent_id_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.PARENT_ID) + + lang_id = self.GetModule(self.m_ParentModName).GetLangID(a_Message.m_Language) + return self.m_Bot.SQLRequest(f'INSERT OR IGNORE 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_Message.m_PhotoID, a_Message.m_MessageName, a_Message.m_MessageDesc, access_utils.GetItemDefaultAccessForModule(self.m_Bot, module_name), lang_id)) + + def FlushMessages(self): + msg = self.m_BotButtons.GetMessages() + for lang, msg_dict in msg.items(): + for msg_name, message in msg_dict.items(): + self.AddOrIgnoreMessage(message) + + table_name = self.m_Table.GetName() + msgs_bd = bd_item.GetAllItemsTemplate(self.m_Bot, table_name)() + if msgs_bd: + for m in msgs_bd: + name = m[1] + desc = m[2] + photo_id = m[3] + lang_id = m[6] + lang_name = self.GetModule(self.m_ParentModName).GetLangName(lang_id) + self.m_BotButtons.CreateMessage(name, desc, self.m_Log.GetTimeNow(), a_MessagePhotoID = photo_id, a_MessageLang = lang_name) + + self.m_BotButtons.UpdateSignal(self.m_Log.GetTimeNow()) + + def OnChange(self): + self.FlushMessages() diff --git a/bot_modules/languages.py b/bot_modules/languages.py index 1bec524..cfb0534 100644 --- a/bot_modules/languages.py +++ b/bot_modules/languages.py @@ -192,188 +192,3 @@ class ModuleLanguages(mod_table_operate.TableOperateModule): def OnChange(self): self.FlushLanguages() -''' -# стартовое язык -async def LanguagesOpen(a_Language : types.message, state = None): - return simple_message.WorkFuncResult(base_language_message) - -def GetButtonNameAndKeyValueAndAccess(a_Item): - # languageName languageID languageAccess - return a_Item[1], a_Item[0], a_Item[4] - -def ShowMessageTemplate(a_StringLanguage, keyboard_template_func = None): - async def ShowLanguage(a_CallbackQuery : types.CallbackQuery, a_Item): - if (len(a_Item) < 6): - return simple_message.WorkFuncResult(error_find_proj_message) - - msg = a_StringLanguage.\ - replace(f'#{name_field}', a_Item[1]).\ - replace(f'#{desc_field}', a_Item[2]).\ - replace(f'#{create_datetime_field}', a_Item[5]).\ - replace(f'#{access_field}', a_Item[4]) - keyboard_func = None - if keyboard_template_func: - keyboard_func = keyboard_template_func(a_Item[0]) - return simple_message.WorkFuncResult(msg, photo_id = a_Item[3], item_access = a_Item[4], keyboard_func = keyboard_func) - return ShowLanguage - -def SimpleMessageTemplateLegacy(a_StringLanguage): - async def ShowLanguage(a_CallbackQuery : types.CallbackQuery, a_Item): - return simple_message.WorkFuncResult(a_StringLanguage) - return ShowLanguage - -# Удаление языка - -async def LanguagePreDelete(a_CallbackQuery : types.CallbackQuery, a_Item): - if (len(a_Item) < 6): - return simple_message.WorkFuncResult(error_find_proj_message) - access = a_Item[4] - return simple_message.WorkFuncResult('', None, item_access = access) - -async def LanguagePostDelete(a_CallbackQuery : types.CallbackQuery, a_ItemID): - log.Success(f'Язык №{a_ItemID} был удалён пользователем {a_CallbackQuery.from_user.id}.') - #TODO: удалить вложенные - FlushLanguages() - return simple_message.WorkFuncResult(language_success_delete_message) - -# --------------------------------------------------------- -# Работа с базой данных языков - -def AddBDItemFunc(a_ItemData, a_UserID): - res, error = bot_bd.SQLRequestToBD(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], access.GetItemDefaultAccessForModule(module_name) + f";{a_UserID}=+")) - - if error: - log.Error(f'Пользоватлель {a_UserID}. Ошибка добавления записи в таблицу {table_name} ({a_ItemData[photo_field]}, {a_ItemData[name_field]}, {a_ItemData[desc_field]}, {access.GetItemDefaultAccessForModule(module_name)}).') - else: - log.Success(f'Пользоватлель {a_UserID}. Добавлена запись в таблицу {table_name} ({a_ItemData[photo_field]}, {a_ItemData[name_field]}, {a_ItemData[desc_field]}, {access.GetItemDefaultAccessForModule(module_name)}).') - - FlushLanguages() - return res, error - -# --------------------------------------------------------- -# API - -def AddOrIgnoreLang(a_Lang : str): - res, error = bot_bd.SQLRequestToBD(f'INSERT OR IGNORE INTO {table_name}({photo_field}, {name_field}, {desc_field}, {access_field}, {create_datetime_field}) VALUES(?, ?, ?, ?, {bot_bd.GetBDDateTimeNow()})', - commit = True, return_error = True, param = (0, a_Lang, '', access.GetItemDefaultAccessForModule(module_name))) - -m_LanguageIDs = {} -def GetLangID(a_Lang): - global m_LanguageIDs - return m_LanguageIDs.get(a_Lang, None) - -def GetLangName(a_LangID): - global m_LanguageIDs - for lang_name, lang_id in m_LanguageIDs: - if a_LangID == lang_id: - return lang_name - return user_messages.default_language - -def FlushLanguages(): - global m_LanguageIDs - msg = user_messages.GetMessages() - for lang, msg_dict in msg.items(): - AddOrIgnoreLang(lang) - langs = bd_item.GetAllItemsTemplate(table_name)() - if langs: - for l in langs: - m_LanguageIDs[l[1]] = str(l[0]) - print('FlushLanguages', m_LanguageIDs) - -# Инициализация БД -def GetInitBDCommands(): - return init_bd_cmds - -def GetAccess(): - return access.GetAccessForModule(module_name) - -# Доступные кнопки -def GetModuleButtons(): - return [ - keyboard.ButtonWithAccess(languages_button_name, user_access.AccessMode.VIEW, GetAccess()), - ] - -# Обработка кнопок -def RegisterHandlers(dp : Dispatcher): - defaul_keyboard_func = GetStartLanguageKeyboardButtons - - # Список языков - dp.register_message_handler(simple_message.SimpleMessageTemplateLegacy(LanguagesOpen, defaul_keyboard_func, GetAccess), text = languages_button_name) - bd_item_view.FirstSelectAndShowBDItemRegisterHandlers(dp, \ - list_language_button_name, \ - table_name, \ - key_name, \ - ShowMessageTemplate(language_open_message, GetViewItemInlineKeyboardTemplate), \ - GetButtonNameAndKeyValueAndAccess, \ - select_language_message, \ - GetAccess, \ - defaul_keyboard_func\ - ) - - # Удаление языка - bd_item_delete.DeleteBDItemRegisterHandlers(dp, \ - None, \ - bd_item.GetCheckForTextFunc(del_language_button_name), \ - table_name, \ - key_name, \ - None, \ - LanguagePreDelete, \ - LanguagePostDelete, \ - GetButtonNameAndKeyValueAndAccess, \ - select_language_message, \ - GetAccess, \ - defaul_keyboard_func\ - ) - - # Добавление языка - bd_item_add.AddBDItem3RegisterHandlers(dp, \ - bd_item.GetCheckForTextFunc(add_language_button_name), \ - FSMCreateLanguage,\ - FSMCreateLanguage.name,\ - FSMCreateLanguage.desc, \ - FSMCreateLanguage.photo,\ - AddBDItemFunc, \ - SimpleMessageTemplateLegacy(language_create_name_message), \ - SimpleMessageTemplateLegacy(language_create_desc_message), \ - SimpleMessageTemplateLegacy(language_create_photo_message), \ - SimpleMessageTemplateLegacy(language_success_create_message), \ - None,\ - None, \ - None, \ - name_field, \ - desc_field, \ - photo_field, \ - GetButtonNameAndKeyValueAndAccess, \ - GetAccess, \ - GetStartLanguageKeyboardButtons\ - ) - - # Редактирование языка - edit_keyboard_func = GetEditLanguageKeyboardButtons - - def RegisterEdit(a_ButtonName, a_FSM, a_EditLanguage, a_FieldName, a_FieldType, a_AccessMode = user_access.AccessMode.EDIT): - bd_item_edit.EditBDItemRegisterHandlers(dp, \ - None, \ - a_FSM, \ - bd_item.GetCheckForTextFunc(a_ButtonName), \ - language_select_to_edit_message, \ - ShowMessageTemplate(a_EditLanguage), \ - ShowMessageTemplate(language_success_edit_message), \ - table_name, \ - key_name, \ - None, \ - a_FieldName, \ - GetButtonNameAndKeyValueAndAccess, \ - GetAccess, \ - edit_keyboard_func, \ - access_mode = a_AccessMode, \ - field_type = a_FieldType\ - ) - - dp.register_message_handler(simple_message.InfoMessageTemplateLegacy(language_start_edit_message, edit_keyboard_func, GetAccess, access_mode = user_access.AccessMode.EDIT), text = edit_language_button_name) - RegisterEdit(edit_language_photo_button_name, FSMEditLanguagePhotoItem, language_edit_photo_message, photo_field, bd_item.FieldType.photo) - RegisterEdit(edit_language_name_button_name, FSMEditLanguageNameItem, language_edit_name_message, name_field, bd_item.FieldType.text) - RegisterEdit(edit_language_desc_button_name, FSMEditLanguageDeskItem, language_edit_desc_message, desc_field, bd_item.FieldType.text) - RegisterEdit(edit_language_access_button_name, FSMEditLanguageAccessItem, language_edit_access_message, access_field, bd_item.FieldType.text) -''' diff --git a/bot_modules/messages.py b/bot_modules/messages.py index 9f593f6..a78141d 100644 --- a/bot_modules/messages.py +++ b/bot_modules/messages.py @@ -160,7 +160,6 @@ messages = { class ModuleMessages(mod_table_operate.TableOperateModule): 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, fsm, a_ParentModName, a_ChildModName, init_access, a_ChildModuleNameList, a_EditModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log) - self.m_LanguageIDs = {} def GetName(self): return module_name @@ -199,239 +198,3 @@ class ModuleMessages(mod_table_operate.TableOperateModule): def OnChange(self): self.FlushMessages() - - -''' -# --------------------------------------------------------- -# Работа с кнопками - -def GetEditMessageKeyboardButtons(a_Message, a_UserGroups): - cur_buttons = GetModuleButtons() + [ - keyboard.ButtonWithAccess(edit_message_photo_button_name, user_access.AccessMode.EDIT, GetAccess()), - keyboard.ButtonWithAccess(edit_message_name_button_name, user_access.AccessMode.EDIT, GetAccess()), - keyboard.ButtonWithAccess(edit_message_desc_button_name, user_access.AccessMode.EDIT, GetAccess()), - keyboard.ButtonWithAccess(edit_message_access_button_name, user_access.AccessMode.ACCEES_EDIT, GetAccess()), - ] - mods = [start] - return keyboard.MakeKeyboard(keyboard.GetButtons(mods) + cur_buttons, a_UserGroups) - -def GetStartMessageKeyboardButtons(a_Message, a_UserGroups): - cur_buttons = [ - keyboard.ButtonWithAccess(list_message_button_name, user_access.AccessMode.VIEW, GetAccess()), - keyboard.ButtonWithAccess(add_message_button_name, user_access.AccessMode.ADD, GetAccess()), - keyboard.ButtonWithAccess(del_message_button_name, user_access.AccessMode.DELETE, GetAccess()), - keyboard.ButtonWithAccess(edit_message_button_name, user_access.AccessMode.EDIT, GetAccess()) - ] - mods = [start, languages] - return keyboard.MakeKeyboard(keyboard.GetButtons(mods) + cur_buttons, a_UserGroups) - -def GetViewItemInlineKeyboardTemplate(a_ItemID): - def GetViewItemInlineKeyboard(a_Message, a_UserGroups): - cur_buttons = [ - #keyboard.InlineButtonWithAccess(needs.list_need_button_name, needs.select_needs_prefix, a_ItemID, GetAccess(), user_access.AccessMode.VIEW), - ] - return keyboard.MakeInlineKeyboard(cur_buttons, a_UserGroups) - return GetViewItemInlineKeyboard - -# --------------------------------------------------------- -# Обработка сообщений - -# стартовое сообщение -async def MessagesOpen(a_Message : types.message, state = None): - return simple_message.WorkFuncResult(base_message_message) - -def GetButtonNameAndKeyValueAndAccess(a_Item): - # messageName messageID messageAccess - return a_Item[1], a_Item[0], a_Item[4] - -def ShowMessageTemplate(a_StringMessage, keyboard_template_func = None): - async def ShowMessage(a_CallbackQuery : types.CallbackQuery, a_Item): - if (len(a_Item) < 6): - return simple_message.WorkFuncResult(error_find_proj_message) - - if message_success_edit_message == a_StringMessage: - FlushMessages() - # TODO FlushMessages происходит рано. Нужно после изменений - msg = a_StringMessage.\ - replace(f'#{name_field}', a_Item[1]).\ - replace(f'#{desc_field}', a_Item[2]).\ - replace(f'#{create_datetime_field}', a_Item[5]).\ - replace(f'#{access_field}', a_Item[4]) - keyboard_func = None - if keyboard_template_func: - keyboard_func = keyboard_template_func(a_Item[0]) - return simple_message.WorkFuncResult(msg, photo_id = a_Item[3], item_access = a_Item[4], keyboard_func = keyboard_func) - return ShowMessage - -def SimpleMessageTemplateLegacy(a_StringMessage): - async def ShowMessage(a_CallbackQuery : types.CallbackQuery, a_Item): - return simple_message.WorkFuncResult(a_StringMessage) - return ShowMessage - -# Удаление сообщения - -async def MessagePreDelete(a_CallbackQuery : types.CallbackQuery, a_Item): - if (len(a_Item) < 6): - return simple_message.WorkFuncResult(error_find_proj_message) - access = a_Item[4] - return simple_message.WorkFuncResult('', None, item_access = access) - -async def MessagePostDelete(a_CallbackQuery : types.CallbackQuery, a_ItemID): - log.Success(f'Сообщение №{a_ItemID} была удалена пользователем {a_CallbackQuery.from_user.id}.') - #TODO: удалить вложенные - FlushMessages() - return simple_message.WorkFuncResult(message_success_delete_message) - -# --------------------------------------------------------- -# Работа с базой данных сообщений - -def AddBDItemFunc(a_ItemData, a_UserID): - res, error = bot_bd.SQLRequestToBD(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], access.GetItemDefaultAccessForModule(module_name) + f";{a_UserID}=+", a_ItemData[parent_id_field])) - - if error: - log.Error(f'Пользоватлель {a_UserID}. Ошибка добавления записи в таблицу {table_name} ({a_ItemData[photo_field]}, {a_ItemData[name_field]}, {a_ItemData[desc_field]}, {access.GetItemDefaultAccessForModule(module_name)}).') - else: - log.Success(f'Пользоватлель {a_UserID}. Добавлена запись в таблицу {table_name} ({a_ItemData[photo_field]}, {a_ItemData[name_field]}, {a_ItemData[desc_field]}, {access.GetItemDefaultAccessForModule(module_name)}).') - - FlushMessages() - return res, error - -# --------------------------------------------------------- -# API - -def AddOrIgnoreMessage(a_Message : user_messages.Message): - return bot_bd.SQLRequestToBD(f'INSERT OR IGNORE 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_Message.m_PhotoID, a_Message.m_MessageName, a_Message.m_MessageDesc, access.GetItemDefaultAccessForModule(module_name), languages.GetLangID(a_Message.m_Language))) - -def FlushMessages(): - msg = user_messages.GetMessages() - for lang, msg_dict in msg.items(): - for msg_name, message in msg_dict.items(): - AddOrIgnoreMessage(message) - - msgs_bd = bd_item.GetAllItemsTemplate(table_name)() - if msgs_bd: - for m in msgs_bd: - name = m[1] - lang_id = m[6] - lang_name = languages.GetLangName(lang_id) - new_msg = user_messages.Message(name, m[2], lang_name, m[3], log.GetTimeNow()) - if not msg.get(lang_name, None): - msg[lang_name] = {} - msg[lang_name][name] = new_msg - user_messages.UpdateSignal(log.GetTimeNow()) - -# Инициализация БД -def GetInitBDCommands(): - return init_bd_cmds - -def GetAccess(): - return access.GetAccessForModule(module_name) - -# Доступные кнопки -def GetModuleButtons(): - return [keyboard.ButtonWithAccess(messages_button_name, user_access.AccessMode.VIEW, GetAccess())] - -# Обработка кнопок -def RegisterHandlers(dp : Dispatcher): - defaul_keyboard_func = GetStartMessageKeyboardButtons - def RegisterSelectParent(a_ButtonName, access_mode): - a_PrefixBase = a_ButtonName - return bd_item_select.FirstSelectBDItemRegisterHandlers(dp, \ - a_PrefixBase, \ - a_ButtonName, \ - languages.table_name, \ - languages.key_name, \ - languages.GetButtonNameAndKeyValueAndAccess, \ - languages.select_language_message, \ - languages.GetAccess, access_mode = access_mode\ - ) - - # Стартовое сообщение - dp.register_message_handler(simple_message.SimpleMessageTemplateLegacy(MessagesOpen, defaul_keyboard_func, GetAccess), text = messages_button_name) - - # Список сообщений - a_Prefix = RegisterSelectParent(list_message_button_name, user_access.AccessMode.VIEW) - bd_item_view.LastSelectAndShowBDItemRegisterHandlers(dp, \ - a_Prefix, parent_id_field, \ - table_name, key_name, \ - ShowMessageTemplate(message_open_message), \ - GetButtonNameAndKeyValueAndAccess, \ - select_message_message, \ - GetAccess, \ - defaul_keyboard_func, \ - access_mode = user_access.AccessMode.VIEW\ - ) - global select_messages_prefix - select_messages_prefix = a_Prefix - - # Удаление сообщения - a_Prefix = RegisterSelectParent(del_message_button_name, user_access.AccessMode.DELETE) - bd_item_delete.DeleteBDItemRegisterHandlers(dp, \ - a_Prefix, \ - bd_item.GetCheckForPrefixFunc(a_Prefix), \ - table_name, \ - key_name, \ - parent_id_field, \ - MessagePreDelete, \ - MessagePostDelete, \ - GetButtonNameAndKeyValueAndAccess, \ - select_message_message, \ - GetAccess, \ - defaul_keyboard_func\ - ) - - # Добавление сообщения - a_Prefix = RegisterSelectParent(add_message_button_name, user_access.AccessMode.ADD) - bd_item_add.AddBDItem3RegisterHandlers(dp, \ - bd_item.GetCheckForPrefixFunc(a_Prefix), \ - FSMCreateMessage, \ - FSMCreateMessage.name,\ - FSMCreateMessage.desc, \ - FSMCreateMessage.photo,\ - AddBDItemFunc, \ - SimpleMessageTemplateLegacy(message_create_name_message), \ - SimpleMessageTemplateLegacy(message_create_desc_message), \ - SimpleMessageTemplateLegacy(message_create_photo_message), \ - SimpleMessageTemplateLegacy(message_success_create_message), \ - a_Prefix,\ - languages.table_name, \ - languages.key_name, \ - name_field, \ - desc_field, \ - photo_field, \ - GetButtonNameAndKeyValueAndAccess, \ - GetAccess, \ - GetStartMessageKeyboardButtons\ - ) - - def RegisterEdit(a_ButtonName, a_FSM, a_EditMessage, a_FieldName, a_FieldType, a_AccessMode = user_access.AccessMode.EDIT): - a_Prefix = RegisterSelectParent(a_ButtonName, a_AccessMode) - bd_item_edit.EditBDItemRegisterHandlers(dp, \ - a_Prefix, \ - a_FSM, \ - bd_item.GetCheckForPrefixFunc(a_Prefix), \ - message_select_to_edit_message, \ - ShowMessageTemplate(a_EditMessage), \ - ShowMessageTemplate(message_success_edit_message), \ - table_name, \ - key_name, \ - parent_id_field, \ - a_FieldName, \ - GetButtonNameAndKeyValueAndAccess, \ - GetAccess, \ - edit_keyboard_func, \ - access_mode = a_AccessMode, \ - field_type = a_FieldType\ - ) - - # Редактирование сообщения - edit_keyboard_func = GetEditMessageKeyboardButtons - dp.register_message_handler(simple_message.InfoMessageTemplateLegacy(message_start_edit_message, edit_keyboard_func, GetAccess, access_mode = user_access.AccessMode.EDIT), text = edit_message_button_name) - - RegisterEdit(edit_message_photo_button_name, FSMEditMessagePhotoItem, message_edit_photo_message, photo_field, bd_item.FieldType.photo) - RegisterEdit(edit_message_name_button_name, FSMEditMessageNameItem, message_edit_name_message, name_field, bd_item.FieldType.text) - RegisterEdit(edit_message_desc_button_name, FSMEditMessageDescItem, message_edit_desc_message, desc_field, bd_item.FieldType.text) - RegisterEdit(edit_message_access_button_name, FSMEditMessageAccessItem, message_edit_access_message, access_field, bd_item.FieldType.text) -''' diff --git a/bot_modules/start.py b/bot_modules/start.py index ec203e5..d4012c3 100644 --- a/bot_modules/start.py +++ b/bot_modules/start.py @@ -7,6 +7,8 @@ from bot_sys import user_access from bot_modules import mod_simple_message, profile from template import bd_item +module_name = 'start' + button_names = { mod_simple_message.ButtonNames.START: "☰ Главное меню", } @@ -25,7 +27,7 @@ class ModuleStart(mod_simple_message.SimpleMessageModule): super().__init__(messages, button_names, init_access, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log) def GetName(self): - return 'start' + return module_name # Основной обработчик главного сообщения async def StartMessageHandler(self, a_Message, state = None): diff --git a/main.py b/main.py index aec52ab..d12de06 100644 --- a/main.py +++ b/main.py @@ -6,7 +6,7 @@ log_start_message = 'Бот успешно запущен!' import os from bot_sys import config, log, bot_bd, user_access, aiogram_bot, bot_messages, bd_table -from bot_modules import mod_agregator, start, profile, backup, groups, access, projects, tasks, needs, comments, languages, messages +from bot_modules import mod_agregator, start, profile, backup, groups, access, projects, tasks, needs, comments, languages, messages, buttons g_Log = log g_Bot = aiogram_bot.AiogramBot(config.GetTelegramBotApiToken(), bot_bd.GetBDFileName(), config.GetRootIDs(), g_Log) @@ -18,14 +18,14 @@ g_BotButtons = bot_messages.BotMessages(default_language) g_ModuleAgregator = mod_agregator.ModuleAgregator() -mod_start_name = 'start' -mod_tasks_name = 'tasks' -mod_needs_name = 'needs' -mod_comments_name = 'comments' -mod_projects_name = 'projects' -mod_languages_name = 'languages' -mod_messages_name = 'messages' -mod_buttons_name = 'buttons' +mod_start_name = start.module_name +mod_tasks_name = tasks.module_name +mod_needs_name = needs.module_name +mod_comments_name = comments.module_name +mod_projects_name = projects.module_name +mod_languages_name = languages.module_name +mod_messages_name = messages.module_name +mod_buttons_name = buttons.module_name start_mod_list = [mod_start_name] @@ -57,14 +57,18 @@ start_mod_name_list = [mod_start_name]#, mod_projects_name, mod_tasks_name, mod_ mod_comments= comments.ModuleComments(mod_needs_name, None, start_mod_name_list, start_mod_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) g_ModuleAgregator.AddModule(mod_comments) -start_mod_name_list = [mod_start_name, mod_messages_name]#, mod_messages_name, mod_buttons_name +start_mod_name_list = [mod_start_name, mod_messages_name, mod_buttons_name] mod_languages = languages.ModuleLanguages(None, mod_messages_name, start_mod_name_list, start_mod_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) g_ModuleAgregator.AddModule(mod_languages) -start_mod_name_list = [mod_start_name]#, mod_messages_name, mod_buttons_name +start_mod_name_list = [mod_start_name] mod_messages = messages.ModuleMessages(mod_languages_name, None, start_mod_name_list, start_mod_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) g_ModuleAgregator.AddModule(mod_messages) +start_mod_name_list = [mod_start_name] +mod_buttons = buttons.ModuleButtons(mod_languages_name, None, start_mod_name_list, start_mod_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log) +g_ModuleAgregator.AddModule(mod_buttons) + start_mod_name_list = [ mod_profile.GetName(), mod_backup.GetName(), @@ -94,6 +98,7 @@ g_BotButtons.UpdateSignal(g_Log.GetTimeNow()) mod_languages.FlushLanguages() mod_messages.FlushMessages() +mod_buttons.FlushMessages() for m in modules: m.RegisterHandlers() -- 2.11.0 From 70cb71e0ead1e8c197b30f0351043ca079f9b519 Mon Sep 17 00:00:00 2001 From: Alexei Date: Sat, 20 May 2023 20:32:25 +0300 Subject: [PATCH 25/25] =?UTF-8?q?=D0=A7=D0=B8=D1=81=D1=82=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BE=D1=82=20=D1=81=D1=82=D0=B0=D1=80=D0=BE=D0=B3=D0=BE=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot_modules/access.py | 2 +- bot_modules/access_utils.py | 2 +- bot_modules/backup.py | 4 +- bot_modules/buttons.py | 2 +- bot_modules/comments.py | 2 +- bot_modules/languages.py | 4 +- bot_modules/messages.py | 2 +- bot_modules/mod_simple_message.py | 2 +- bot_modules/mod_table_operate.py | 8 ++-- bot_modules/needs.py | 2 +- bot_modules/projects.py | 2 +- bot_modules/tasks.py | 2 +- bot_sys/aiogram_bot.py | 24 +++++++++--- bot_sys/bot_bd.py | 25 +++--------- bot_sys/bot_messages.py | 4 +- bot_sys/keyboard.py | 11 ++---- bot_sys/log.py | 82 ++++++++++++++++++++------------------- bot_sys/user_access.py | 4 -- bot_sys/user_messages.py | 56 -------------------------- main.py | 10 +++-- template/bd_item.py | 10 ++--- template/bd_item_add.py | 6 +-- template/bd_item_edit.py | 2 +- template/bd_item_select.py | 2 +- template/file_message.py | 2 +- template/sql_request.py | 12 +++--- 26 files changed, 114 insertions(+), 170 deletions(-) delete mode 100644 bot_sys/user_messages.py diff --git a/bot_modules/access.py b/bot_modules/access.py index d1efee8..b5b2529 100644 --- a/bot_modules/access.py +++ b/bot_modules/access.py @@ -146,7 +146,7 @@ class ModuleAccess(mod_table_operate.TableOperateModule): keyboard.ButtonWithAccess(self.m_SqlRequestButtonName, user_access.AccessMode.EDIT, self.GetAccess()), keyboard.ButtonWithAccess(self.m_HelpButtonName , user_access.AccessMode.VIEW, self.GetAccess()) ] - return mod_buttons + keyboard.MakeButtons(cur_buttons, a_UserGroups) + return mod_buttons + keyboard.MakeButtons(self.m_Bot, cur_buttons, a_UserGroups) def RegisterHandlers(self): super().RegisterHandlers() diff --git a/bot_modules/access_utils.py b/bot_modules/access_utils.py index 81da334..18c6e99 100644 --- a/bot_modules/access_utils.py +++ b/bot_modules/access_utils.py @@ -20,7 +20,7 @@ def GetAccessForModuleRequest(module_name, access, default_access): return f"INSERT OR IGNORE INTO {table_name} ({mod_name_field}, {moduleaccess_field}, {mod_default_access_field}) VALUES ('{module_name}', '{access}', '{default_access}');" def GetModulesAccessList(a_Bot): - return bot_bd.RequestSelectTemplate(a_Bot.m_BDFileName, table_name)() + return bot_bd.RequestSelectTemplate(a_Bot, table_name)() def GetAccessForModule(a_Bot, a_ModuleName): alist = GetModulesAccessList(a_Bot) diff --git a/bot_modules/backup.py b/bot_modules/backup.py index 291ca5b..bd4ca67 100644 --- a/bot_modules/backup.py +++ b/bot_modules/backup.py @@ -69,7 +69,7 @@ class ModuleBackup(mod_simple_message.SimpleMessageModule): ) self.m_BackupLogMessageHandler = file_message.BackupFileTemplate( self.m_Bot, - self.m_Bot.GetLog().g_log_file_name, + self.m_Bot.GetLog().GetFileName(), self.m_BackupLogMessage, self.m_GetAccessFunc, self.m_GetStartKeyboardButtonsFunc, @@ -87,7 +87,7 @@ class ModuleBackup(mod_simple_message.SimpleMessageModule): keyboard.ButtonWithAccess(self.m_BackupBDButtonName, user_access.AccessMode.EDIT, self.GetAccess()), keyboard.ButtonWithAccess(self.m_BackupLogButtonName , user_access.AccessMode.EDIT, self.GetAccess()) ] - return mod_buttons + keyboard.MakeButtons(cur_buttons, a_UserGroups) + return mod_buttons + keyboard.MakeButtons(self.m_Bot, cur_buttons, a_UserGroups) def RegisterHandlers(self): super().RegisterHandlers() diff --git a/bot_modules/buttons.py b/bot_modules/buttons.py index 2cc3ef7..e2cef12 100644 --- a/bot_modules/buttons.py +++ b/bot_modules/buttons.py @@ -3,7 +3,7 @@ # Сообщения -from bot_sys import bot_bd, keyboard, user_access, user_messages, bd_table, bot_messages +from bot_sys import bot_bd, keyboard, user_access, bd_table, bot_messages from bot_modules import mod_table_operate, mod_simple_message, access_utils from template import bd_item diff --git a/bot_modules/comments.py b/bot_modules/comments.py index e09a78b..8217dc8 100644 --- a/bot_modules/comments.py +++ b/bot_modules/comments.py @@ -3,7 +3,7 @@ # Комментарии -from bot_sys import bot_bd, keyboard, user_access, user_messages, bd_table +from bot_sys import bot_bd, keyboard, user_access, bd_table from bot_modules import mod_table_operate, mod_simple_message from aiogram.dispatcher import FSMContext diff --git a/bot_modules/languages.py b/bot_modules/languages.py index cfb0534..259bb59 100644 --- a/bot_modules/languages.py +++ b/bot_modules/languages.py @@ -3,7 +3,7 @@ # Языки -from bot_sys import bot_bd, keyboard, user_access, user_messages, bd_table +from bot_sys import bot_bd, keyboard, user_access, bd_table from bot_modules import mod_table_operate, mod_simple_message, access_utils from template import bd_item @@ -166,7 +166,7 @@ class ModuleLanguages(mod_table_operate.TableOperateModule): for lang_name, lang_id in self.m_LanguageIDs: if a_LangID == lang_id: return lang_name - return user_messages.default_language + return self.m_BotMessages.m_DefaultLanguage def FlushLanguages(self): msg = self.m_BotMessages.GetMessages() diff --git a/bot_modules/messages.py b/bot_modules/messages.py index a78141d..2585c8b 100644 --- a/bot_modules/messages.py +++ b/bot_modules/messages.py @@ -3,7 +3,7 @@ # Сообщения -from bot_sys import bot_bd, keyboard, user_access, user_messages, bd_table, bot_messages +from bot_sys import bot_bd, keyboard, user_access, bd_table, bot_messages from bot_modules import mod_table_operate, mod_simple_message, access_utils from template import bd_item diff --git a/bot_modules/mod_simple_message.py b/bot_modules/mod_simple_message.py index 8ef5a65..19d5ff4 100644 --- a/bot_modules/mod_simple_message.py +++ b/bot_modules/mod_simple_message.py @@ -89,7 +89,7 @@ class SimpleMessageModule(mod_interface.IModule): def GetStartKeyboardButtons(self, a_Message, a_UserGroups): buttons = self.GetButtons(self.m_ChildModuleNameList) - return keyboard.MakeButtons(buttons, a_UserGroups) + return keyboard.MakeButtons(self.m_Bot, buttons, a_UserGroups) def GetInitBDCommands(self): return [ diff --git a/bot_modules/mod_table_operate.py b/bot_modules/mod_table_operate.py index 742c93c..0c62eaa 100644 --- a/bot_modules/mod_table_operate.py +++ b/bot_modules/mod_table_operate.py @@ -94,10 +94,10 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): keyboard.ButtonWithAccess(self.GetButton(ButtonNames.DEL), user_access.AccessMode.DELETE, self.GetAccess()), keyboard.ButtonWithAccess(self.GetButton(ButtonNames.EDIT), user_access.AccessMode.EDIT, self.GetAccess()), ] - return mod_buttons + keyboard.MakeButtons(cur_buttons, a_UserGroups) + return mod_buttons + keyboard.MakeButtons(self.m_Bot, cur_buttons, a_UserGroups) def GetEditKeyboardButtons(self, a_Message, a_UserGroups): - mod_buttons = keyboard.MakeButtons(self.GetButtons(self.m_EditModuleNameList), 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()), @@ -105,7 +105,7 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): 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()), ] - return mod_buttons + keyboard.MakeButtons(cur_buttons, a_UserGroups) + return mod_buttons + keyboard.MakeButtons(self.m_Bot, cur_buttons, a_UserGroups) def GetViewItemInlineKeyboardTemplate(self, a_ItemID): def GetViewItemInlineKeyboard(a_Message, a_UserGroups): @@ -122,7 +122,7 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): cur_buttons = [ keyboard.InlineButtonWithAccess(child_mod.GetButton(ButtonNames.LIST), child_mod.GetSelectPrefix(), a_ItemID, self.GetAccess(), user_access.AccessMode.VIEW), ] - return keyboard.MakeInlineKeyboardButtons(cur_buttons, a_UserGroups) + return keyboard.MakeInlineKeyboardButtons(self.m_Bot, cur_buttons, a_UserGroups) def GetButtonNameAndKeyValueAndAccess(self, a_Item): return \ diff --git a/bot_modules/needs.py b/bot_modules/needs.py index b58ca8d..15625a3 100644 --- a/bot_modules/needs.py +++ b/bot_modules/needs.py @@ -3,7 +3,7 @@ # Потребности -from bot_sys import bot_bd, keyboard, user_access, user_messages, bd_table +from bot_sys import bot_bd, keyboard, user_access, bd_table from bot_modules import mod_table_operate, mod_simple_message from aiogram.dispatcher import FSMContext diff --git a/bot_modules/projects.py b/bot_modules/projects.py index 08d181d..6b82cfa 100644 --- a/bot_modules/projects.py +++ b/bot_modules/projects.py @@ -3,7 +3,7 @@ # Проекты -from bot_sys import bot_bd, keyboard, user_access, user_messages, bd_table +from bot_sys import bot_bd, keyboard, user_access, bd_table from bot_modules import mod_table_operate, mod_simple_message from aiogram.dispatcher import FSMContext diff --git a/bot_modules/tasks.py b/bot_modules/tasks.py index 5632a18..b591ce3 100644 --- a/bot_modules/tasks.py +++ b/bot_modules/tasks.py @@ -3,7 +3,7 @@ # Задачи -from bot_sys import bot_bd, keyboard, user_access, user_messages, bd_table +from bot_sys import bot_bd, keyboard, user_access, bd_table from bot_modules import mod_table_operate, mod_simple_message from aiogram.dispatcher import FSMContext diff --git a/bot_sys/aiogram_bot.py b/bot_sys/aiogram_bot.py index 07985c5..6b4ccca 100644 --- a/bot_sys/aiogram_bot.py +++ b/bot_sys/aiogram_bot.py @@ -26,7 +26,7 @@ class AiogramBot(interfaces.IBot): return self.m_Log def SQLRequest(self, a_Request : str, commit = False, return_error = False, param = None): - return bot_bd.SQLRequest(self.m_BDFileName, a_Request, commit = commit, return_error = return_error, param = param) + return bot_bd.SQLRequest(self.m_Log, self.m_BDFileName, a_Request, commit = commit, return_error = return_error, param = param) async def SendMessage(self, a_UserID, a_Message, a_PhotoIDs, a_KeyboardButtons, a_InlineKeyboardButtons, parse_mode = None): if not parse_mode: @@ -40,22 +40,36 @@ class AiogramBot(interfaces.IBot): if inline_keyboards: base_keyboards = inline_keyboards if a_PhotoIDs and a_PhotoIDs != 0 and a_PhotoIDs != '0': - for k in base_keyboards: - await self.m_TBot.send_photo( + if base_keyboards: + for k in base_keyboards: + await self.m_TBot.send_photo( a_UserID, a_PhotoIDs, a_Message, reply_markup = k ) + else: + await self.m_TBot.send_photo( + a_UserID, + a_PhotoIDs, + a_Message + ) else: #print('SendMessage', a_UserID, a_Message, a_PhotoIDs, a_InlineKeyboardButtons, a_KeyboardButtons, base_keyboard) - for k in base_keyboards: - await self.m_TBot.send_message( + if base_keyboards: + for k in base_keyboards: + await self.m_TBot.send_message( a_UserID, a_Message, reply_markup = k, parse_mode = parse_mode ) + else: + await self.m_TBot.send_message( + a_UserID, + a_Message, + parse_mode = parse_mode + ) async def SendDocument(self, a_UserID, a_Document, a_Caption, a_KeyboardButtons, a_InlineKeyboardButtons): inline_keyboard = None diff --git a/bot_sys/bot_bd.py b/bot_sys/bot_bd.py index 4a1d73f..ec81174 100644 --- a/bot_sys/bot_bd.py +++ b/bot_sys/bot_bd.py @@ -6,16 +6,6 @@ from bot_sys import log # Работа с базой данных -# Имя файла БД -g_bd_file_name = 'bot.db' -def GetBDFileName(): - return g_bd_file_name - -# --------------------------------------------------------- -# Функции работы с базой - -# --------------------------------------------------------- - def GetBDDateTimeNow(): return 'datetime(\'now\')' @@ -24,16 +14,12 @@ def SelectBDTemplate(a_Bot, a_TableName): return a_Bot.SQLRequest(f'SELECT * FROM {a_TableName}') return SelectBD -def RequestsExecute(a_BDFileName, a_Commands): - for cmd in a_Commands: - SQLRequest(a_BDFileName, cmd, commit = True) - -def RequestSelectTemplate(a_BDFileName, a_TableName): +def RequestSelectTemplate(a_Bot, a_TableName): def SelectBD(): - return SQLRequest(a_BDFileName, f'SELECT * FROM {a_TableName}') + return a_Bot.SQLRequest(f'SELECT * FROM {a_TableName}') return SelectBD -def SQLRequest(a_BDFileName, a_Request : str, commit = False, return_error = False, param = None): +def SQLRequest(a_Log, a_BDFileName, a_Request : str, commit = False, return_error = False, param = None): db = sqlite3.connect(a_BDFileName) cursor = db.cursor() result = [] @@ -47,11 +33,12 @@ def SQLRequest(a_BDFileName, a_Request : str, commit = False, return_error = Fal if commit: db.commit() except sqlite3.Error as e: - log.Error(f'Ошибка при обработке запроса [{a_Request}]:{str(e)}') + a_Log.Error(f'Ошибка при обработке запроса [{a_Request}]:{str(e)}') error = "Ошибка sqlite3:" + str(e) cursor.close() db.close() - if not error and commit: log.Success(f'Выполнен запрос [{a_Request}]') + if not error and commit: + a_Log.Success(f'Выполнен запрос [{a_Request}]') if return_error: return result, error return result diff --git a/bot_sys/bot_messages.py b/bot_sys/bot_messages.py index dca7307..c032df4 100644 --- a/bot_sys/bot_messages.py +++ b/bot_sys/bot_messages.py @@ -61,7 +61,7 @@ def MakeBotMessage(a_MessageDesc): class BotMessages: def __init__(self, a_DefaultLanguage): - self.a_DefaultLanguage = a_DefaultLanguage + self.m_DefaultLanguage = a_DefaultLanguage self.m_Messages = {} self.m_LastUpdate = None @@ -73,7 +73,7 @@ class BotMessages: def CreateMessage(self, a_MessageName, a_MessageDesc, a_DateTime, a_MessagePhotoID = 0, a_MessageLang = None): if not a_MessageLang: - a_MessageLang = self.a_DefaultLanguage + a_MessageLang = self.m_DefaultLanguage cur_msg = BotMessage(self, a_MessageName, a_MessageDesc, a_MessageLang, a_MessagePhotoID, a_DateTime) msg = self.GetMessages() if not msg.get(a_MessageLang, None): diff --git a/bot_sys/keyboard.py b/bot_sys/keyboard.py index 2ba2190..c598ca5 100644 --- a/bot_sys/keyboard.py +++ b/bot_sys/keyboard.py @@ -34,13 +34,13 @@ def GetButtonInRowCount(a_AllKeyCount): return min(max(int(math.sqrt(a_AllKeyCount) // 1), 1), 3) # TODO перенести KeyboardButton в MakeAiogramKeyboard -def MakeButtons(a_ButtonList : [ButtonWithAccess], a_UserGroups): +def MakeButtons(a_Bot, a_ButtonList : [ButtonWithAccess], a_UserGroups): buttons = [] for b in a_ButtonList: if not b.label: continue label = str(b.label) - if user_access.CheckAccessString(b.access_string, a_UserGroups, b.access_mode): + if user_access.CheckAccess(a_Bot.GetRootIDs(), b.access_string, a_UserGroups, b.access_mode): buttons += [types.KeyboardButton(label)] step = GetButtonInRowCount(len(buttons)) return Chunks(buttons, step) @@ -65,19 +65,16 @@ class InlineButtonWithAccess: self.access_string = a_AccessString self.access_mode = a_AccessMode -def MakeInlineKeyboardButtons(a_ButtonList : [InlineButtonWithAccess], a_UserGroups): +def MakeInlineKeyboardButtons(a_Bot, a_ButtonList : [InlineButtonWithAccess], a_UserGroups): buttons = [] for b in a_ButtonList: - if user_access.CheckAccessString(b.access_string, a_UserGroups, b.access_mode): + if user_access.CheckAccess(a_Bot.GetRootIDs(), b.access_string, a_UserGroups, b.access_mode): data = f'{b.callback_prefix}{b.callback_data}' assert len(data) < 41 # Телеграм больше не поддерживает buttons += [InlineButton(b.label, data)] step = GetButtonInRowCount(len(buttons)) return Chunks(buttons, step) -def MakeInlineKeyboard(a_ButtonList : [InlineButtonWithAccess], a_UserGroups): - return MakeAiogramInlineKeyboard(MakeInlineKeyboardButtons(a_ButtonList, a_UserGroups)) - # ------------------------------- diff --git a/bot_sys/log.py b/bot_sys/log.py index cfb28e3..fd8adb6 100644 --- a/bot_sys/log.py +++ b/bot_sys/log.py @@ -10,48 +10,52 @@ # Error - Ошибка. # Success - Успех. -# Файл лога -g_log_file_name = 'log.txt' - from bot_sys import config import colorama import datetime colorama.init() -def GetTimeNow(): - return datetime.datetime.now() - -def GetTime(): - now = GetTimeNow() - time = now.strftime(f"[%d.%m.%Y, %H:%M]") - return time - -def Info(a_LogMessage): - time = GetTime() - WriteToFile(f'{time} | {a_LogMessage}') - print(f"{time} {colorama.Back.BLUE}{colorama.Style.BRIGHT} ИНФО {colorama.Style.RESET_ALL} | {a_LogMessage}") - -def Warn(a_LogMessage): - time = GetTime() - WriteToFile(f'{time} | {a_LogMessage}') - print(f"{time} {colorama.Back.YELLOW}{colorama.Style.BRIGHT} ВНИМАНИЕ {colorama.Style.RESET_ALL} | {a_LogMessage}") - -def Error(a_LogMessage): - time = GetTime() - WriteToFile(f'{time} | {a_LogMessage}') - print(f"{time} {colorama.Back.RED}{colorama.Style.BRIGHT} ОШИБКА {colorama.Style.RESET_ALL} | {a_LogMessage}") - -def Success(a_LogMessage): - time = GetTime() - WriteToFile(f'{time} | {a_LogMessage}') - print(f"{time} {colorama.Back.GREEN}{colorama.Style.BRIGHT} УСПЕХ {colorama.Style.RESET_ALL} | {a_LogMessage}") - -def WriteToFile(a_LogMessage): - if config.g_log_to_file != True: - return - - f = open(g_log_file_name, 'a+') - f.write(a_LogMessage) - f.write('\n') - f.close() +class Log: + def __init__(self, a_FileName): + self.m_FileName = a_FileName + + def GetFileName(self): + return self.m_FileName + + def GetTimeNow(self): + return datetime.datetime.now() + + def GetTime(self): + now = self.GetTimeNow() + time = now.strftime(f"[%d.%m.%Y, %H:%M]") + return time + + def Info(self, a_LogMessage): + time = self.GetTime() + self.WriteToFile(f'{time} | {a_LogMessage}') + print(f"{time} {colorama.Back.BLUE}{colorama.Style.BRIGHT} ИНФО {colorama.Style.RESET_ALL} | {a_LogMessage}") + + def Warn(self, a_LogMessage): + time = self.GetTime() + self.WriteToFile(f'{time} | {a_LogMessage}') + print(f"{time} {colorama.Back.YELLOW}{colorama.Style.BRIGHT} ВНИМАНИЕ {colorama.Style.RESET_ALL} | {a_LogMessage}") + + def Error(self, a_LogMessage): + time = self.GetTime() + self.WriteToFile(f'{time} | {a_LogMessage}') + print(f"{time} {colorama.Back.RED}{colorama.Style.BRIGHT} ОШИБКА {colorama.Style.RESET_ALL} | {a_LogMessage}") + + def Success(self, a_LogMessage): + time = self.GetTime() + self.WriteToFile(f'{time} | {a_LogMessage}') + print(f"{time} {colorama.Back.GREEN}{colorama.Style.BRIGHT} УСПЕХ {colorama.Style.RESET_ALL} | {a_LogMessage}") + + def WriteToFile(self, a_LogMessage): + if not self.m_FileName: + return + + f = open(self.m_FileName, 'a+') + f.write(a_LogMessage) + f.write('\n') + f.close() diff --git a/bot_sys/user_access.py b/bot_sys/user_access.py index c4fbd67..abe3127 100644 --- a/bot_sys/user_access.py +++ b/bot_sys/user_access.py @@ -54,10 +54,6 @@ def CheckAccessItem(a_AccessItem : str, a_AccessMode : AccessMode): return False # Возвращает возможность доступа пользователю a_UserGroups в элемент с правами a_AccessValue по режиму доступа a_AccessMode -def CheckAccessString(a_AccessValue : str, a_UserGroups : UserGroups, a_AccessMode : AccessMode): - return CheckAccess(config.GetRootIDs(), a_AccessValue, a_UserGroups, a_AccessMode) - -# Возвращает возможность доступа пользователю a_UserGroups в элемент с правами a_AccessValue по режиму доступа a_AccessMode def CheckAccess(a_RootIDs, a_AccessValue : str, a_UserGroups : UserGroups, a_AccessMode : AccessMode): if a_UserGroups.user_id in a_RootIDs: return True diff --git a/bot_sys/user_messages.py b/bot_sys/user_messages.py deleted file mode 100644 index 61e39b2..0000000 --- a/bot_sys/user_messages.py +++ /dev/null @@ -1,56 +0,0 @@ -#-*-coding utf-8-*- -# Общественное достояние, 2023, Алексей Безбородов (Alexei Bezborodov) - -import sqlite3 -from bot_sys import log - -# Работа ссообщениями - -default_language = 'ru' - -g_messages = None -def GetMessages(): - global g_messages - if not g_messages: - g_messages = {} - return g_messages - -g_last_update = None -def UpdateSignal(a_DateTime): - global g_last_update - g_last_update = a_DateTime -# --------------------------------------------------------- -# Функции работы с собщениями - -# --------------------------------------------------------- -class Message: - def __init__(self, a_MessageName : str, a_MessageDesc : str, a_Language : str, a_PhotoID : str, a_DateTime): - self.m_MessageName = a_MessageName - self.m_MessageDesc = a_MessageDesc - self.m_Language = a_Language - self.m_PhotoID = a_PhotoID - self.m_DateTime = a_DateTime - - def __str__(self): - global g_last_update - last_update = g_last_update - if self.m_DateTime < last_update: - msg = GetMessages() - if not msg.get(self.m_Language, None): - msg[self.m_Language] = {} - new_msg = msg[self.m_Language].get(self.m_MessageName, self) - self.m_MessageName = new_msg.m_MessageName - self.m_MessageDesc = new_msg.m_MessageDesc - self.m_PhotoID = new_msg.m_PhotoID - self.m_DateTime = last_update - return f'{self.m_MessageDesc}' - -def MSG(a_MessageName, a_MessageDesc, a_UpdateMSG, a_DateTime): - cur_msg = Message(a_MessageName, a_MessageDesc, default_language, 0, a_DateTime) - msg = GetMessages() - if not msg.get(default_language, None): - msg[default_language] = {} - if not msg[default_language].get(a_MessageName, None): - msg[default_language][a_MessageName] = cur_msg - a_UpdateMSG(cur_msg) - diff --git a/main.py b/main.py index d12de06..f48c1ad 100644 --- a/main.py +++ b/main.py @@ -5,11 +5,15 @@ log_start_message = 'Бот успешно запущен!' import os -from bot_sys import config, log, bot_bd, user_access, aiogram_bot, bot_messages, bd_table +from bot_sys import config, log, aiogram_bot, bot_messages, bd_table, user_access from bot_modules import mod_agregator, start, profile, backup, groups, access, projects, tasks, needs, comments, languages, messages, buttons -g_Log = log -g_Bot = aiogram_bot.AiogramBot(config.GetTelegramBotApiToken(), bot_bd.GetBDFileName(), config.GetRootIDs(), g_Log) +bd_file_name = 'bot.db' + +log_file_name = 'log.txt' + +g_Log = log.Log(log_file_name) +g_Bot = aiogram_bot.AiogramBot(config.GetTelegramBotApiToken(), bd_file_name, config.GetRootIDs(), g_Log) default_language = 'ru' diff --git a/template/bd_item.py b/template/bd_item.py index 31f3316..b0cadc6 100644 --- a/template/bd_item.py +++ b/template/bd_item.py @@ -42,21 +42,21 @@ def GetKeyDataFromCallbackMessage(a_Message, a_Prefix): key_item_id = str(a_Message.data).replace(a_Prefix, '') return key_item_id -def GetCancelKeyboardButtonsTemplate(a_AccessFunc, a_AccessMode): +def GetCancelKeyboardButtonsTemplate(a_Bot, a_AccessFunc, a_AccessMode): def GetCancelKeyboardButtons(a_Message, a_UserGroups): cur_buttons = [ keyboard.ButtonWithAccess(canсel_button_name, a_AccessMode, a_AccessFunc()), ] - return keyboard.MakeButtons(cur_buttons, a_UserGroups) + return keyboard.MakeButtons(a_Bot, cur_buttons, a_UserGroups) return GetCancelKeyboardButtons -def GetSkipAndCancelKeyboardButtonsTemplate(a_AccessFunc, a_AccessMode): +def GetSkipAndCancelKeyboardButtonsTemplate(a_Bot, a_AccessFunc, a_AccessMode): def GetSkipAndCancelKeyboardButtons(a_Message, a_UserGroups): cur_buttons = [ keyboard.ButtonWithAccess(skip_button_name, a_AccessMode, a_AccessFunc()), keyboard.ButtonWithAccess(canсel_button_name, a_AccessMode, a_AccessFunc()), ] - return keyboard.MakeButtons(cur_buttons, a_UserGroups) + return keyboard.MakeButtons(a_Bot, cur_buttons, a_UserGroups) return GetSkipAndCancelKeyboardButtons def GetAllItemsTemplate(a_Bot, a_TableName): @@ -94,7 +94,7 @@ def CheckAccessBDItemTemplate(a_Bot, a_TableName, a_KeyName, a_KeyValue, a_WorkF if result_work_func is None or result_work_func.m_BotMessage is None: return result_work_func, result_work_func - if not result_work_func.item_access is None and not user_access.CheckAccessString(result_work_func.item_access, user_groups, a_AccessMode): + if not result_work_func.item_access is None and not user_access.CheckAccess(a_Bot.GetRootIDs(), result_work_func.item_access, user_groups, a_AccessMode): return simple_message.WorkFuncResult(bot_messages.MakeBotMessage(access_utils.access_denied_message)), None return None, result_work_func diff --git a/template/bd_item_add.py b/template/bd_item_add.py index 7fa2d68..2bcb39d 100644 --- a/template/bd_item_add.py +++ b/template/bd_item_add.py @@ -93,8 +93,8 @@ def FinishOrNextAddBDItemTemplate(a_Bot, a_FSM, a_AddBDItemFunc, a_ParentTableNa return simple_message.SimpleMessageTemplate(a_Bot, FinishAddBDItem, a_ButtonFunc, None, a_AccessFunc, access_mode) def AddBDItem3RegisterHandlers(a_Bot, a_StartCheckFunc, a_FSM, a_FSMName, a_FSMDesc, a_FSMPhoto, a_AddBDItemFunc, a_AddNameMessageFunc, a_AddDescMessageFunc, a_AddPhotoMessageFunc, a_FinishMessageFunc, a_ParentPrefix, a_ParentTableName : str, a_ParentKeyFieldName, a_NameField, a_DescField, a_PhotoField, a_GetButtonNameAndKeyValueAndAccessFunc, a_AccessFunc, a_ButtonFunc, access_mode = user_access.AccessMode.ADD): - keyboard_cancel = bd_item.GetCancelKeyboardButtonsTemplate(a_AccessFunc, access_mode) - keyboard_skip_and_cancel = bd_item.GetSkipAndCancelKeyboardButtonsTemplate(a_AccessFunc, access_mode) + keyboard_cancel = bd_item.GetCancelKeyboardButtonsTemplate(a_Bot, a_AccessFunc, access_mode) + keyboard_skip_and_cancel = bd_item.GetSkipAndCancelKeyboardButtonsTemplate(a_Bot, a_AccessFunc, access_mode) reg_func = a_Bot.RegisterMessageHandler if a_ParentTableName: reg_func = a_Bot.RegisterCallbackHandler @@ -106,7 +106,7 @@ def AddBDItem3RegisterHandlers(a_Bot, a_StartCheckFunc, a_FSM, a_FSMName, a_FSMD 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) 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_AccessFunc, access_mode) + keyboard_cancel = bd_item.GetCancelKeyboardButtonsTemplate(a_Bot, a_AccessFunc, access_mode) reg_func = a_Bot.RegisterMessageHandler if a_ParentTableName: reg_func = a_Bot.RegisterCallbackHandler diff --git a/template/bd_item_edit.py b/template/bd_item_edit.py index 5c21dc9..a665349 100644 --- a/template/bd_item_edit.py +++ b/template/bd_item_edit.py @@ -38,7 +38,7 @@ def EditBDItemRegisterHandlers(a_Bot, a_PrevPrefix, a_FSM, a_StartCheckFunc, a_S if a_ParentIDFieldName: reg_func = a_Bot.RegisterCallbackHandler - keyboard_cancel = bd_item.GetCancelKeyboardButtonsTemplate(a_AccessFunc, access_mode) + 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) diff --git a/template/bd_item_select.py b/template/bd_item_select.py index 8514c9e..2e199bd 100644 --- a/template/bd_item_select.py +++ b/template/bd_item_select.py @@ -24,7 +24,7 @@ def GetBDItemsListKeyboardButtonsTemplate(a_Bot, a_TableName : str, a_ParentIDFi if bname: b = keyboard.InlineButtonWithAccess(bname, a_NextPrefix, key_value, access, access_mode) items_button_list += [b] - return keyboard.MakeInlineKeyboardButtons(items_button_list, a_UserGroups) + 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): diff --git a/template/file_message.py b/template/file_message.py index 2869bda..fe7e6a7 100644 --- a/template/file_message.py +++ b/template/file_message.py @@ -11,7 +11,7 @@ def BackupFileTemplate(a_Bot, a_Path, a_CaptionMessage, a_AccessFunc, a_GetButto async def BackupFile(a_Message): user_id = str(a_Message.from_user.id) user_groups= groups_utils.GetUserGroupData(a_Bot, user_id) - if not user_access.CheckAccessString(a_AccessFunc(), user_groups, access_mode): + if not user_access.CheckAccess(a_Bot.GetRootIDs(), a_AccessFunc(), user_groups, access_mode): return await simple_message.AccessDeniedMessage(a_Bot, a_GetButtonsFunc, user_id, a_Message, user_groups) document = await GetFile(a_Bot, a_Path) diff --git a/template/sql_request.py b/template/sql_request.py index f50696b..262d781 100644 --- a/template/sql_request.py +++ b/template/sql_request.py @@ -13,34 +13,32 @@ cancel_message = ''' 🚫 Запрос к БД отменён ''' -def GetCancelKeyboardButtonsTemplate(a_AccessFunc, a_AccessMode): +def GetCancelKeyboardButtonsTemplate(a_Bot, a_AccessFunc, a_AccessMode): def GetCancelKeyboardButtons(a_Message, a_UserGroups): print ('canсel_button_name', canсel_button_name) cur_buttons = [ keyboard.ButtonWithAccess(canсel_button_name, a_AccessMode, a_AccessFunc()) ] - return keyboard.MakeButtons(cur_buttons, a_UserGroups) + return keyboard.MakeButtons(a_Bot, cur_buttons, a_UserGroups) return GetCancelKeyboardButtons -# TODO CheckAccessString -> CheckAccess - def RequestToBDTemplate(a_Bot, a_StartMessage, a_GetButtonsFunc, a_AccessFunc, a_FSM, a_AccessMode): async def RequestToBDStart(a_Message): user_id = str(a_Message.from_user.id) user_groups = groups_utils.GetUserGroupData(a_Bot, user_id) - if not user_access.CheckAccessString(a_AccessFunc(), user_groups, a_AccessMode): + if not user_access.CheckAccess(a_Bot.GetRootIDs(), a_AccessFunc(), user_groups, a_AccessMode): return await simple_message.AccessDeniedMessage(a_Bot, a_GetButtonsFunc, user_id, a_Message, user_groups) await a_FSM.sqlRequest.set() print ('a_FSM.sqlRequest.set()', a_StartMessage) - await simple_message.SendMessage(a_Bot, a_StartMessage, GetCancelKeyboardButtonsTemplate(a_AccessFunc, a_AccessMode), None, user_id, a_Message, user_groups, parse_mode='Markdown') + await simple_message.SendMessage(a_Bot, a_StartMessage, GetCancelKeyboardButtonsTemplate(a_Bot, a_AccessFunc, a_AccessMode), None, user_id, a_Message, user_groups, parse_mode='Markdown') return RequestToBDStart def RequestToBDFinishTemplate(a_Bot, a_GetButtonsFunc, a_AccessFunc, a_AccessMode): async def RequestToBDFinish(a_Message, state): user_id = str(a_Message.from_user.id) user_groups = groups_utils.GetUserGroupData(a_Bot, user_id) - if not user_access.CheckAccessString(a_AccessFunc(), user_groups, a_AccessMode): + if not user_access.CheckAccess(a_Bot.GetRootIDs(), a_AccessFunc(), user_groups, a_AccessMode): return await simple_message.AccessDeniedMessage(a_Bot, a_GetButtonsFunc, user_id, a_Message, user_groups) result = '' -- 2.11.0