diff --git a/bot_modules/profile.py b/bot_modules/profile.py
index 0eb269c..d631bc5 100644
--- a/bot_modules/profile.py
+++ b/bot_modules/profile.py
@@ -49,7 +49,7 @@ async def ProfileOpen(a_Message):
msg = profile_message
if not user_info is None:
msg = msg.replace('@user_id', str(user_info[0])).replace('@user_name', str(user_info[1]))
- return msg
+ return msg, None
# ---------------------------------------------------------
# Работа с базой данных пользователей
diff --git a/bot_modules/projects.py b/bot_modules/projects.py
index 5835d2d..28baab2 100644
--- a/bot_modules/projects.py
+++ b/bot_modules/projects.py
@@ -5,6 +5,8 @@
from bot_sys import bot_bd, log, config, keyboard, user_access
from bot_modules import start, access, groups
+from template import bd_item_view, simple_message
+
from aiogram import Bot, types
from aiogram.dispatcher import FSMContext
@@ -27,14 +29,17 @@ class FSMEditProject(StatesGroup):
# ---------------------------------------------------------
# БД
-table_name = 'projects'
module_name = 'projects'
+table_name = 'projects'
+key_name = 'projectID'
+
init_bd_cmds = [f'''CREATE TABLE IF NOT EXISTS {table_name}(
projectPhoto TEXT,
projectName TEXT,
projectDesc TEXT,
- projectID INTEGER PRIMARY KEY
+ projectAccess TEXT,
+ {key_name} INTEGER PRIMARY KEY
)''',
f"INSERT OR IGNORE INTO module_access (modName, modAccess) VALUES ('{module_name}', 'other=va');"
]
@@ -44,7 +49,7 @@ f"INSERT OR IGNORE INTO module_access (modName, modAccess) VALUES ('{module_name
# Сообщения
base_project_message = '''
-🛒 Проекты
+🟥 Проекты
'''
select_project_message = '''
@@ -52,7 +57,7 @@ select_project_message = '''
'''
error_find_proj_message = '''
-❌ Ошибка, проект с ID @project_id не найден
+❌ Ошибка, проект не найден
'''
project_open_message = '''
@@ -179,13 +184,30 @@ def GetProjectsListKeyboardButtons(a_UserGroups, a_Prefix):
# ---------------------------------------------------------
# Обработка сообщений
-# Отображение всех проектов
+def GetButtonNameAndKeyValueAndAccess(a_Item):
+ # projectName projectID projectAccess
+ return a_Item[1], a_Item[4], a_Item[3]
+
+async def ShowProject(a_CallbackQuery : types.CallbackQuery, a_Item):
+ if (len(a_Item) < 3):
+ return error_find_proj_message, None
+
+ photo_id = a_Item[0]
+ name = a_Item[1]
+ desc = a_Item[2]
+ msg = project_open_message.replace('@proj_name', name).replace('@proj_desk', desc)
+ return msg, photo_id
+
+select_handler = 0
+# стартовое сообщение
async def ProjectsOpen(a_Message : types.message):
user_id = str(a_Message.from_user.id)
user_groups = groups.GetUserGroupData(user_id)
- await bot.send_message(a_Message.from_user.id, base_project_message, reply_markup = GetEditProjectKeyboardButtons(user_groups))
- await bot.send_message(a_Message.from_user.id, select_project_message, reply_markup = GetProjectsListKeyboardButtons(user_groups, select_project_callback_prefix))
+ await a_Message.answer(base_project_message, reply_markup = GetEditProjectKeyboardButtons(user_groups))
+ await select_handler(a_Message)
+ return None
+# Создание нового проекта
def GetProjectData(a_ProjectID):
project = GetProject(a_ProjectID)
if len(project) < 1:
@@ -196,23 +218,6 @@ def GetProjectData(a_ProjectID):
p = project[0]
return '', p[0], p[1], p[2]
-async def ShowProject(a_CallbackQuery : types.CallbackQuery):
- project_id = str(a_CallbackQuery.data).replace(select_project_callback_prefix, '')
- user_id = str(a_CallbackQuery.from_user.id)
- user_groups = groups.GetUserGroupData(user_id)
- msg, photo_id, name, desc = GetProjectData(project_id)
- if msg != '':
- await bot.send_message(a_CallbackQuery.from_user.id, msg, reply_markup = GetEditProjectKeyboardButtons(user_groups))
- return
-
- msg = project_open_message.replace('@proj_name', name).replace('@proj_desk', desc)
- if photo_id == '0':
- await bot.send_message(a_CallbackQuery.from_user.id, msg, reply_markup = GetEditProjectKeyboardButtons(user_groups))
- else:
- await bot.send_photo(a_CallbackQuery.from_user.id, photo_id, msg, reply_markup = GetEditProjectKeyboardButtons(user_groups))
-
-# Создание нового проекта
-
async def ProjectCreateCancel(a_Message : types.message, state : FSMContext):
user_id = str(a_Message.from_user.id)
user_groups = groups.GetUserGroupData(user_id)
@@ -406,10 +411,11 @@ def GetModuleButtons():
# Обработка кнопок
def RegisterHandlers(dp : Dispatcher):
-# Список проектов
- dp.register_message_handler(ProjectsOpen, text = projects_button_name)
- dp.register_message_handler(ProjectsOpen, text = list_project_button_name)
- dp.register_callback_query_handler(ShowProject, lambda x: x.data.startswith(select_project_callback_prefix))
+ dp.register_message_handler(simple_message.SimpleMessageTemplate(ProjectsOpen, GetEditProjectKeyboardButtons, GetAccess), text = projects_button_name)
+
+ global select_handler
+ select_handler = bd_item_view.SelectAndShowBDItemRegisterHandlers(dp, list_project_button_name, table_name, key_name, ShowProject, GetButtonNameAndKeyValueAndAccess, select_project_message, GetAccess, GetEditProjectKeyboardButtons)
+
# Добавление проекта
dp.register_message_handler(ProjectCreate, text = add_project_button_name)
dp.register_message_handler(ProjectPhotoSkip, text = projects_skip_button_name, state = FSMCreateProject.prjPhoto)
diff --git a/bot_modules/start.py b/bot_modules/start.py
index e688d52..6c91efc 100644
--- a/bot_modules/start.py
+++ b/bot_modules/start.py
@@ -43,7 +43,7 @@ async def StartMenu(a_Message):
user_name = str(a_Message.from_user.username)
profile.AddUser(user_id, user_name)
log.Info(f'Пользователь {user_id} {user_name} авторизовался в боте')
- return start_message
+ return start_message, None
# ---------------------------------------------------------
# API
diff --git a/template/bd_item_view.py b/template/bd_item_view.py
new file mode 100644
index 0000000..350c7e8
--- /dev/null
+++ b/template/bd_item_view.py
@@ -0,0 +1,64 @@
+# -*- coding: utf8 -*-
+# Общественное достояние 2023, Алексей Безбородов (Alexei Bezborodov)
+
+# Простые информационные сообщения
+
+from bot_sys import user_access, bot_bd, keyboard
+from bot_modules import access, groups
+from template import simple_message
+
+from aiogram import types
+
+def GetAllItemsTemplate(a_TableName):
+ def GetAllItems():
+ return bot_bd.SelectBDTemplate(a_TableName)()
+ return GetAllItems
+
+def GetBDItemTemplate(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 GetBDItem
+
+def GetBDItemsListKeyboardButtonsTemplate(a_TableName : str, a_Prefix : str, a_GetButtonNameAndKeyValueAndAccessFunc, access_mode = user_access.AccessMode.VIEW):
+ def GetBDItemsListKeyboardButtons(a_UserGroups):
+ items = GetAllItemsTemplate(a_TableName)()
+ items_button_list = []
+ for t in items:
+ bname, key_value, access = a_GetButtonNameAndKeyValueAndAccessFunc(t)
+ if not bname is None and user_access.CheckAccessString(access, a_UserGroups, access_mode):
+ items_button_list += [keyboard.Button(bname, key_value)]
+ return keyboard.MakeInlineKeyboard(items_button_list, a_Prefix)
+ return GetBDItemsListKeyboardButtons
+'''
+class TableListParam():
+ def __init__(self, a_TableName : str, a_KeyName : str, a_GetButtonNameAndKeyValueAndAccessFunc):
+ self.table_name = a_TableName
+ self.key_name = a_KeyName
+ self.get_bname_and_key_value_func = a_GetButtonNameAndKeyValueAndAccessFunc
+'''
+def SelectDBItemTemplate(a_TableName : str, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, a_Prefix, access_mode = user_access.AccessMode.VIEW):
+ keyborad_func = GetBDItemsListKeyboardButtonsTemplate(a_TableName, a_Prefix, a_GetButtonNameAndKeyValueAndAccessFunc)
+ return simple_message.InfoMessageTemplate(a_StartMessage, keyborad_func, a_AccessFunc, access_mode)
+
+def ShowBDItemTemplate(a_TableName, a_KeyName, a_WorkFunc, a_Prefix, a_AccessFunc, a_ButtonFunc, access_mode = user_access.AccessMode.VIEW):
+ async def ShowBDItem(a_CallbackQuery : types.CallbackQuery):
+ user_id = str(a_CallbackQuery.from_user.id)
+ user_groups = groups.GetUserGroupData(user_id)
+ item_id = str(a_CallbackQuery.data).replace(a_Prefix, '')
+ item = GetBDItemTemplate(a_TableName, a_KeyName)(item_id)
+ if len(item) < 1:
+ msg = f'Элемент {item_id} не найден в таблице {a_TableName}'
+ log.Error(msg)
+ await bot.send_message(a_CallbackQuery.from_user.id, msg, reply_markup = a_ButtonFunc(user_groups))
+ return None, None
+
+ return await a_WorkFunc(a_CallbackQuery, item[0])
+ return simple_message.SimpleMessageTemplate(ShowBDItem, a_ButtonFunc, a_AccessFunc, access_mode)
+
+def SelectAndShowBDItemRegisterHandlers(dp, a_RequestButtonName, a_TableName : str, a_KeyName, a_ShowItemWorkFunc, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, a_ButtonFunc, access_mode = user_access.AccessMode.VIEW):
+ a_Prefix = f'select_{a_TableName}_{a_KeyName}:'
+ sel_handler = SelectDBItemTemplate(a_TableName, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, a_Prefix, access_mode)
+ dp.register_message_handler(sel_handler, text = a_RequestButtonName)
+ dp.register_callback_query_handler(ShowBDItemTemplate(a_TableName, a_KeyName, a_ShowItemWorkFunc, a_Prefix, a_AccessFunc, a_ButtonFunc, access_mode), lambda x: x.data.startswith(a_Prefix))
+
+ return sel_handler
diff --git a/template/simple_message.py b/template/simple_message.py
index 38945f9..ba901b8 100644
--- a/template/simple_message.py
+++ b/template/simple_message.py
@@ -3,13 +3,16 @@
# Простые информационные сообщения
-from bot_sys import user_access
+from bot_sys import user_access, config
from bot_modules import access, groups
from aiogram import types
+from aiogram import Bot
+bot = Bot(token=config.GetTelegramBotApiToken(), parse_mode = types.ParseMode.HTML)
+
def InfoMessageTemplate(a_HelpMessage, a_GetButtonsFunc, a_AccessFunc, access_mode = user_access.AccessMode.VIEW):
async def GetMessage(a_Message : types.message):
- return a_HelpMessage
+ return a_HelpMessage, None
return SimpleMessageTemplate(GetMessage, a_GetButtonsFunc, a_AccessFunc, access_mode)
@@ -18,9 +21,14 @@ def SimpleMessageTemplate(a_WorkFunc, a_GetButtonsFunc, a_AccessFunc, access_mod
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 a_Message.answer(access.access_denied_message, reply_markup = a_GetButtonsFunc(user_groups))
+ return await bot.send_message(a_Message.from_user.id, access.access_denied_message, reply_markup = a_GetButtonsFunc(user_groups))
- msg = await a_WorkFunc(a_Message)
- if not msg is None:
- await a_Message.answer(msg, reply_markup = a_GetButtonsFunc(user_groups))
+ msg, photo_id = await a_WorkFunc(a_Message)
+ if msg is None:
+ return
+
+ 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 = a_GetButtonsFunc(user_groups))
+
+ await bot.send_photo(user_id, photo_id, msg, reply_markup = a_GetButtonsFunc(user_groups))
return SimpleMessage