Заказы #3

Merged
Bezborodov merged 15 commits from orders into master 2 years ago
  1. 8
      bot_modules/access.py
  2. 162
      bot_modules/all_orders.py
  3. 24
      bot_modules/buttons.py
  4. 24
      bot_modules/comments.py
  5. 24
      bot_modules/groups.py
  6. 24
      bot_modules/languages.py
  7. 24
      bot_modules/messages.py
  8. 1
      bot_modules/mod_simple_message.py
  9. 335
      bot_modules/mod_table_operate.py
  10. 24
      bot_modules/needs.py
  11. 258
      bot_modules/orders.py
  12. 30
      bot_modules/projects.py
  13. 24
      bot_modules/tasks.py
  14. 21
      bot_modules/user_in_groups.py
  15. 24
      bot_modules/users.py
  16. 24
      bot_sys/aiogram_bot.py
  17. 47
      bot_sys/bd_table.py
  18. 43
      bot_sys/bot_subscribes.py
  19. 17
      main.py
  20. 10
      template/bd_item.py
  21. 28
      template/bd_item_add.py
  22. 10
      template/bd_item_delete.py
  23. 30
      template/bd_item_edit.py
  24. 89
      template/bd_item_select.py
  25. 10
      template/bd_item_view.py

8
bot_modules/access.py

@ -87,8 +87,8 @@ moduleaccess_success_edit_message = '''✅ Доступ к модулю успе
button_names = {
mod_simple_message.ButtonNames.START: start_button_name,
mod_table_operate.ButtonNames.EDIT: "🛠 Редактировать доступ",
mod_table_operate.ButtonNames.EDIT_ACCESS: edit_moduleaccess_access_button_name,
mod_table_operate.ButtonNames.EDIT_DEFAULT_ACCESS: edit_moduleaccess_default_access_button_name,
mod_table_operate.EditButton(bd_table.TableFieldDestiny.ACCESS): edit_moduleaccess_access_button_name,
mod_table_operate.EditButton(bd_table.TableFieldDestiny.DEFAULT_ACCESS): edit_moduleaccess_default_access_button_name,
}
messages = {
@ -97,8 +97,8 @@ messages = {
Пожалуйста, выберите действие:
''',
mod_table_operate.Messages.SELECT_TO_EDIT: moduleaccess_select_to_edit_message,
mod_table_operate.Messages.EDIT_ACCESS: moduleaccess_edit_access_message,
mod_table_operate.Messages.EDIT_DEFAULT_ACCESS: moduleaccess_edit_default_access_message,
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.ACCESS): moduleaccess_edit_access_message,
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.DEFAULT_ACCESS): moduleaccess_edit_default_access_message,
mod_table_operate.Messages.SUCCESS_EDIT: moduleaccess_success_edit_message,
}

162
bot_modules/all_orders.py

@ -0,0 +1,162 @@
# -*- coding: utf8 -*-
# Общественное достояние, 2023, Алексей Безбородов (Alexei Bezborodov) <AlexeiBv+mirocod_platform_bot@narod.ru>
# Заказы
from bot_sys import bot_bd, keyboard, user_access, bd_table
from bot_modules import mod_table_operate, mod_simple_message, orders
from template import bd_item_select, bd_item_view, bd_item
# ---------------------------------------------------------
# БД
module_name = 'all_orders'
table = orders.table
init_access = f'{user_access.user_access_group_new}=-'
# ---------------------------------------------------------
# Сообщения и кнопки
button_names = {}
button_names.update(orders.button_names)
button_names.pop(mod_table_operate.ButtonNames.ADD)
cur_button_names = {
mod_simple_message.ButtonNames.START: "🛒 Все заказы",
mod_table_operate.ButtonNames.LIST: "📃 Список текущих заказов",
orders.ButtonNames.LIST_ALL: "📃 Список всех заказов",
mod_table_operate.ButtonNames.EDIT: "🛠 Редактировать заказ",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.PHOTO_PAY): "☐ Загрузить чек по оплате заказа",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.PHOTO): "☐ Изменить изображение в заказе",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.NAME): "≂ Изменить название в заказе",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.DESC): "𝌴 Изменить описание в заказе",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.ADDRESS): "𝌴 Изменить адрес в заказе",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.ACCESS): "✋ Изменить доступ к заказу",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.STATUS): "𝌴 Изменить статус в заказе",
mod_table_operate.EnumButton(orders.OrderStatus.NEW): "Заказ ожидает модерации",
mod_table_operate.EnumButton(orders.OrderStatus.PAY): "Заказ ожидает оплаты",
mod_table_operate.EnumButton(orders.OrderStatus.ADDRESS): "Заказ ожидает уточнения адреса",
mod_table_operate.EnumButton(orders.OrderStatus.FINISH): "Заказ выполнен",
mod_table_operate.ButtonNames.DEL: "❌ Удалить заказ",}
button_names.update(cur_button_names)
messages = {}
messages.update(orders.messages)
cur_messages = {
mod_simple_message.Messages.START: f'''
<b>{button_names[mod_simple_message.ButtonNames.START]}</b>
''',
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.STATUS): f'''
Текущий статус заказа:
#{orders.status_field}
Введите новый статус заказа:
''',
mod_table_operate.Messages.OPEN: f'''
<b>Заказ: #{orders.name_field}</b>
<b>Описание и состав заказа:</b> #{orders.desc_field}
<b>Статус:</b> #{orders.status_field}
<b>Пользователь:</b> #{orders.parent_id_field}
<b>Адрес доставки:</b> #{orders.address_field}
<b>Время создания:</b> #{orders.create_datetime_field}
''',
}
messages_notification = {
mod_table_operate.NotificationMessage(orders.OrderStatus.NEW): f'''Статус заказа "#{orders.name_field}" изменён на - ожидает модерации''',
mod_table_operate.NotificationMessage(orders.OrderStatus.PAY): f'''Статус заказа "#{orders.name_field}" изменён на - Заказ ожидает оплаты.
Оплатите заказ и прикрепите чек об оплате к заказу. Для этого проследуйте по пути "Заказы"->"Редактировать мой заказ"->"Загрузить чек по оплате моего заказа"''',
mod_table_operate.NotificationMessage(orders.OrderStatus.ADDRESS): f'''Статус заказа "#{orders.name_field}" изменён на - Заказ ожидает указания адреса доставки.
Для этого проследуйте по пути "Заказы"->"Редактировать мой заказ"->"Изменить адрес в моём заказе"''',
mod_table_operate.NotificationMessage(orders.OrderStatus.FINISH): f'''Статус заказа "#{orders.name_field}" изменён на - Заказ выполнен''',
}
messages.update(orders.messages_order_status)
messages.update(messages_notification)
messages.update(cur_messages)
def GetCurItemsTemplate(a_Bot, a_TableName, a_StatusFieldName):
def GetBDItems(a_Message, a_UserGroups, a_ParentID):
request = f'SELECT * FROM {a_TableName} WHERE {a_StatusFieldName} != ?'
return a_Bot.SQLRequest(request, param = ([str(orders.OrderStatus.FINISH)]))
return GetBDItems
def GetBDItemsForUserTemplate(a_Bot, a_TableName):
def GetBDItems(a_Message, a_UserGroups, a_ParentID):
return bd_item.GetAllItemsTemplate(a_Bot, a_TableName)()
return GetBDItems
class DBItemForUserSelectSource(bd_item_select.DBItemSelectSource):
def __init__(self, a_Bot, a_TableName, a_ParentIDFieldName, a_PrevPrefix, a_ButtonName, a_OnlyCurrent = False):
super().__init__(a_Bot, a_TableName, a_ParentIDFieldName, a_PrevPrefix, a_ButtonName)
self.m_OnlyCurrent = a_OnlyCurrent
def GetItemsFunc(self):
if self.m_OnlyCurrent:
return GetCurItemsTemplate(self.m_Bot, self.m_TableName, orders.status_field)
return GetBDItemsForUserTemplate(self.m_Bot, self.m_TableName)
def IsFirst(self):
return True
class ModuleAllOrders(orders.ModuleOrders):
def __init__(self, a_ParentModName, a_ChildModName, a_ChildModuleNameList, a_EditModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log):
super().__init__(table, messages, button_names, a_ParentModName, a_ChildModName, init_access, a_ChildModuleNameList, a_EditModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log)
def GetInitBDCommands(self):
# уже сделано в ModuleUserOrders
return []
def GetName(self):
return module_name
def SelectSourceTemplate(self, a_PrevPrefix, a_ButtonName):
parent_id_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.PARENT_ID)
return DBItemForUserSelectSource(self.m_Bot, self.m_Table.GetName(), parent_id_field, a_PrevPrefix, a_ButtonName, a_OnlyCurrent = True)
def SelectSourceForAllTemplate(self, a_PrevPrefix, a_ButtonName):
parent_id_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.PARENT_ID)
return DBItemForUserSelectSource(self.m_Bot, self.m_Table.GetName(), parent_id_field, a_PrevPrefix, a_ButtonName)
def GetButtonNameAndKeyValueAndAccess(self, a_Item):
parent_field_id = self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.PARENT_ID)
n, k, a = super().GetButtonNameAndKeyValueAndAccess(a_Item)
return n + ":" + str(a_Item[parent_field_id]), k, a
async def OnChangeField(self, a_Field, a_ItemID, a_ItemData, a_EditUserID):
if a_Field.m_Destiny == bd_table.TableFieldDestiny.STATUS:
key_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.KEY)
item = bd_item.GetBDItemsTemplate(self.m_Bot, self.m_Table.GetName(), key_field)(a_ItemID)
if len(item) < 1:
self.m_Log.Error(f'Не удалось оповестить по заказу №{a_ItemID}.')
return
item = item[0]
parent_field_id = self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.PARENT_ID)
status_field_id = self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.STATUS)
print('OnChangeField', item, parent_field_id, status_field_id)
owner_id = item[parent_field_id]
new_status = item[status_field_id]
msg = self.GetMessage(mod_table_operate.NotificationMessage(new_status))
if not msg:
self.m_Log.Error(f'Не удалось оповестить по заказу №{a_ItemID}. Пустое сообщение для нового статуса {new_status}')
return
msg = self.UpdateMessage(msg, None, item)
await self.m_Bot.SendMessage(
owner_id,
msg.GetDesc(),
msg.GetPhotoID(),
None,
None
)

24
bot_modules/buttons.py

@ -27,7 +27,7 @@ table = bd_table.Table(table_name, [
bd_table.TableField(key_name, bd_table.TableFieldDestiny.KEY, bd_table.TableFieldType.INT),
table_name_field,
bd_table.TableField(desc_field, bd_table.TableFieldDestiny.DESC, bd_table.TableFieldType.STR),
bd_table.TableField(photo_field, bd_table.TableFieldDestiny.PHOTO, bd_table.TableFieldType.STR),
bd_table.TableField(photo_field, bd_table.TableFieldDestiny.PHOTO, bd_table.TableFieldType.PHOTO),
bd_table.TableField(access_field, bd_table.TableFieldDestiny.ACCESS, bd_table.TableFieldType.STR),
bd_table.TableField(create_datetime_field, bd_table.TableFieldDestiny.CREATE_DATE, bd_table.TableFieldType.STR),
table_parent_id_field,
@ -47,10 +47,10 @@ button_names = {
mod_table_operate.ButtonNames.LIST: "📃 Список названий кнопок",
mod_table_operate.ButtonNames.ADD: "☑ Добавить название кнопки",
mod_table_operate.ButtonNames.EDIT: "🛠 Редактировать названия кнопок",
mod_table_operate.ButtonNames.EDIT_PHOTO: "☐ Изменить изображение у названия кнопок",
mod_table_operate.ButtonNames.EDIT_NAME: "≂ Изменить название у названия кнопок",
mod_table_operate.ButtonNames.EDIT_DESC: "𝌴 Изменить описание у названия кнопок",
mod_table_operate.ButtonNames.EDIT_ACCESS: "✋ Изменить доступ к названию кнопки",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.PHOTO): "☐ Изменить изображение у названия кнопок",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.NAME): "≂ Изменить название у названия кнопок",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.DESC): "𝌴 Изменить описание у названия кнопок",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.ACCESS): "✋ Изменить доступ к названию кнопки",
mod_table_operate.ButtonNames.DEL: "❌ Удалить название кнопки",
}
@ -72,17 +72,17 @@ messages = {
Время создания: #{create_datetime_field}
''',
mod_table_operate.Messages.CREATE_NAME: '''
mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.NAME): '''
Создание названия кнопки Шаг 1
Введите название название кнопки:
''',
mod_table_operate.Messages.CREATE_DESC: '''
mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.DESC): '''
Создание названия кнопки. Шаг 2
Введите описание название кнопки:
''',
mod_table_operate.Messages.CREATE_PHOTO: '''
mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.PHOTO): '''
Создание названия кнопки
Загрузите обложку для названия кнопок (Фото):
На данный момент не поддерживается!
@ -95,23 +95,23 @@ messages = {
mod_table_operate.Messages.SELECT_TO_EDIT: '''
Выберите название кнопки, который вы хотите отредактировать.
''',
mod_table_operate.Messages.EDIT_PHOTO: '''
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.PHOTO): '''
Загрузите новую обложку для названия кнопок (Фото):
Она будет отображаться в его описании.
''',
mod_table_operate.Messages.EDIT_NAME: f'''
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.NAME): f'''
Текущее название названия кнопок:
#{name_field}
Введите новое название названия кнопки:
''',
mod_table_operate.Messages.EDIT_DESC: f'''
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.DESC): f'''
Текущее описание названия кнопок:
#{desc_field}
Введите новое описание названия кнопки:
''',
mod_table_operate.Messages.EDIT_ACCESS: f'''
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.ACCESS): f'''
Текущий доступ к названию кнопки:
#{access_field}

24
bot_modules/comments.py

@ -23,7 +23,7 @@ table = bd_table.Table(table_name, [
bd_table.TableField(key_name, bd_table.TableFieldDestiny.KEY, bd_table.TableFieldType.INT),
bd_table.TableField(name_field, bd_table.TableFieldDestiny.NAME, bd_table.TableFieldType.STR),
bd_table.TableField(desc_field, bd_table.TableFieldDestiny.DESC, bd_table.TableFieldType.STR),
bd_table.TableField(photo_field, bd_table.TableFieldDestiny.PHOTO, bd_table.TableFieldType.STR),
bd_table.TableField(photo_field, bd_table.TableFieldDestiny.PHOTO, bd_table.TableFieldType.PHOTO),
bd_table.TableField(access_field, bd_table.TableFieldDestiny.ACCESS, bd_table.TableFieldType.STR),
bd_table.TableField(create_datetime_field, bd_table.TableFieldDestiny.CREATE_DATE, bd_table.TableFieldType.STR),
bd_table.TableField(parent_id_field, bd_table.TableFieldDestiny.PARENT_ID, bd_table.TableFieldType.INT),
@ -39,10 +39,10 @@ button_names = {
mod_table_operate.ButtonNames.LIST: "📃 Список комментариев",
mod_table_operate.ButtonNames.ADD: "☑ Добавить комментарий",
mod_table_operate.ButtonNames.EDIT: "🛠 Редактировать комментарий",
mod_table_operate.ButtonNames.EDIT_PHOTO: "☐ Изменить изображение у комментария",
mod_table_operate.ButtonNames.EDIT_NAME: "≂ Изменить название у комментария",
mod_table_operate.ButtonNames.EDIT_DESC: "𝌴 Изменить описание у комментария",
mod_table_operate.ButtonNames.EDIT_ACCESS: "✋ Изменить доступ к комментарию",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.PHOTO): "☐ Изменить изображение у комментария",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.NAME): "≂ Изменить название у комментария",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.DESC): "𝌴 Изменить описание у комментария",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.ACCESS): "✋ Изменить доступ к комментарию",
mod_table_operate.ButtonNames.DEL: "❌ Удалить комментарий",
}
@ -64,17 +64,17 @@ messages = {
Время создания: #{create_datetime_field}
''',
mod_table_operate.Messages.CREATE_NAME: '''
mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.NAME): '''
Создание комментария. Шаг 1
Введите название комментария:
''',
mod_table_operate.Messages.CREATE_DESC: '''
mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.DESC): '''
Создание комментария. Шаг 2
Введите описание комментария:
''',
mod_table_operate.Messages.CREATE_PHOTO: '''
mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.PHOTO): '''
Создание комментария. Шаг 3
Загрузите обложку для комментария (Фото):
@ -87,23 +87,23 @@ messages = {
mod_table_operate.Messages.SELECT_TO_EDIT: '''
Выберите комментарий, который вы хотите отредактировать.
''',
mod_table_operate.Messages.EDIT_PHOTO: '''
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.PHOTO): '''
Загрузите новую обложку для комментария (Фото):
Она будет отображаться в его описании.
''',
mod_table_operate.Messages.EDIT_NAME: f'''
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.NAME): f'''
Текущее название комментария:
#{name_field}
Введите новое название комментария:
''',
mod_table_operate.Messages.EDIT_DESC: f'''
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.DESC): f'''
Текущее описание комментария:
#{desc_field}
Введите новое описание комментария:
''',
mod_table_operate.Messages.EDIT_ACCESS: f'''
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.ACCESS): f'''
Текущий доступ к комментарийу:
#{access_field}

24
bot_modules/groups.py

@ -25,7 +25,7 @@ table = bd_table.Table(table_name, [
bd_table.TableField(key_name, bd_table.TableFieldDestiny.KEY, bd_table.TableFieldType.INT),
table_name_field,
bd_table.TableField(desc_field, bd_table.TableFieldDestiny.DESC, bd_table.TableFieldType.STR),
bd_table.TableField(photo_field, bd_table.TableFieldDestiny.PHOTO, bd_table.TableFieldType.STR),
bd_table.TableField(photo_field, bd_table.TableFieldDestiny.PHOTO, bd_table.TableFieldType.PHOTO),
bd_table.TableField(access_field, bd_table.TableFieldDestiny.ACCESS, bd_table.TableFieldType.STR),
bd_table.TableField(create_datetime_field, bd_table.TableFieldDestiny.CREATE_DATE, bd_table.TableFieldType.STR),
],
@ -44,10 +44,10 @@ button_names = {
mod_table_operate.ButtonNames.LIST: "📃 Список групп",
mod_table_operate.ButtonNames.ADD: "✅ Добавить группу",
mod_table_operate.ButtonNames.EDIT: "🛠 Редактировать группу",
mod_table_operate.ButtonNames.EDIT_PHOTO: "☐ Изменить изображение в группе",
mod_table_operate.ButtonNames.EDIT_NAME: "≂ Изменить название в группе",
mod_table_operate.ButtonNames.EDIT_DESC: "𝌴 Изменить описание в группе",
mod_table_operate.ButtonNames.EDIT_ACCESS: "✋ Изменить доступ к группе",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.PHOTO): "☐ Изменить изображение в группе",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.NAME): "≂ Изменить название в группе",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.DESC): "𝌴 Изменить описание в группе",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.ACCESS): "✋ Изменить доступ к группе",
mod_table_operate.ButtonNames.DEL: "❌ Удалить группу",
}
@ -69,17 +69,17 @@ messages = {
Время создания: #{create_datetime_field}
''',
mod_table_operate.Messages.CREATE_NAME: '''
mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.NAME): '''
Создание группы. Шаг 1
Введите название группы:
''',
mod_table_operate.Messages.CREATE_DESC: '''
mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.DESC): '''
Создание группы. Шаг 2
Введите описание группы:
''',
mod_table_operate.Messages.CREATE_PHOTO: '''
mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.PHOTO): '''
Создание группы. Шаг 3
Загрузите обложку для группы (Фото):
@ -92,23 +92,23 @@ messages = {
mod_table_operate.Messages.SELECT_TO_EDIT: '''
Выберите группу, которого вы хотите отредактировать.
''',
mod_table_operate.Messages.EDIT_PHOTO: '''
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.PHOTO): '''
Загрузите новую обложку для группы (Фото):
Она будет отображаться в его описании.
''',
mod_table_operate.Messages.EDIT_NAME: f'''
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.NAME): f'''
Текущее название группы:
#{name_field}
Введите новое название группы:
''',
mod_table_operate.Messages.EDIT_DESC: f'''
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.DESC): f'''
Текущее описание группы:
#{desc_field}
Введите новое описание группы:
''',
mod_table_operate.Messages.EDIT_ACCESS: f'''
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.ACCESS): f'''
Текущий доступ к группе:
#{access_field}

24
bot_modules/languages.py

@ -25,7 +25,7 @@ table = bd_table.Table(table_name, [
bd_table.TableField(key_name, bd_table.TableFieldDestiny.KEY, bd_table.TableFieldType.INT),
table_name_field,
bd_table.TableField(desc_field, bd_table.TableFieldDestiny.DESC, bd_table.TableFieldType.STR),
bd_table.TableField(photo_field, bd_table.TableFieldDestiny.PHOTO, bd_table.TableFieldType.STR),
bd_table.TableField(photo_field, bd_table.TableFieldDestiny.PHOTO, bd_table.TableFieldType.PHOTO),
bd_table.TableField(access_field, bd_table.TableFieldDestiny.ACCESS, bd_table.TableFieldType.STR),
bd_table.TableField(create_datetime_field, bd_table.TableFieldDestiny.CREATE_DATE, bd_table.TableFieldType.STR),
],
@ -44,10 +44,10 @@ button_names = {
mod_table_operate.ButtonNames.LIST: "📃 Список языков",
mod_table_operate.ButtonNames.ADD: "✅ Добавить язык",
mod_table_operate.ButtonNames.EDIT: "🛠 Редактировать язык",
mod_table_operate.ButtonNames.EDIT_PHOTO: "☐ Изменить изображение в языке",
mod_table_operate.ButtonNames.EDIT_NAME: "≂ Изменить название в языке",
mod_table_operate.ButtonNames.EDIT_DESC: "𝌴 Изменить описание в языке",
mod_table_operate.ButtonNames.EDIT_ACCESS: "✋ Изменить доступ к языку",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.PHOTO): "☐ Изменить изображение в языке",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.NAME): "≂ Изменить название в языке",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.DESC): "𝌴 Изменить описание в языке",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.ACCESS): "✋ Изменить доступ к языку",
mod_table_operate.ButtonNames.DEL: "❌ Удалить язык",
}
@ -69,17 +69,17 @@ messages = {
Время создания: #{create_datetime_field}
''',
mod_table_operate.Messages.CREATE_NAME: '''
mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.NAME): '''
Создание языка. Шаг 1
Введите название языка:
''',
mod_table_operate.Messages.CREATE_DESC: '''
mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.DESC): '''
Создание языка. Шаг 2
Введите описание языка:
''',
mod_table_operate.Messages.CREATE_PHOTO: '''
mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.PHOTO): '''
Создание языка. Шаг 3
Загрузите обложку для языка (Фото):
@ -92,23 +92,23 @@ messages = {
mod_table_operate.Messages.SELECT_TO_EDIT: '''
Выберите язык, который вы хотите отредактировать.
''',
mod_table_operate.Messages.EDIT_PHOTO: '''
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.PHOTO): '''
Загрузите новую обложку для языка (Фото):
Она будет отображаться в его описании.
''',
mod_table_operate.Messages.EDIT_NAME: f'''
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.NAME): f'''
Текущее название языка:
#{name_field}
Введите новое название языка:
''',
mod_table_operate.Messages.EDIT_DESC: f'''
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.DESC): f'''
Текущее описание языка:
#{desc_field}
Введите новое описание языка:
''',
mod_table_operate.Messages.EDIT_ACCESS: f'''
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.ACCESS): f'''
Текущий доступ к языку:
#{access_field}

24
bot_modules/messages.py

@ -27,7 +27,7 @@ table = bd_table.Table(table_name, [
bd_table.TableField(key_name, bd_table.TableFieldDestiny.KEY, bd_table.TableFieldType.INT),
table_name_field,
bd_table.TableField(desc_field, bd_table.TableFieldDestiny.DESC, bd_table.TableFieldType.STR),
bd_table.TableField(photo_field, bd_table.TableFieldDestiny.PHOTO, bd_table.TableFieldType.STR),
bd_table.TableField(photo_field, bd_table.TableFieldDestiny.PHOTO, bd_table.TableFieldType.PHOTO),
bd_table.TableField(access_field, bd_table.TableFieldDestiny.ACCESS, bd_table.TableFieldType.STR),
bd_table.TableField(create_datetime_field, bd_table.TableFieldDestiny.CREATE_DATE, bd_table.TableFieldType.STR),
table_parent_id_field,
@ -47,10 +47,10 @@ button_names = {
mod_table_operate.ButtonNames.LIST: "📃 Список сообщений",
mod_table_operate.ButtonNames.ADD: "☑ Добавить сообщение",
mod_table_operate.ButtonNames.EDIT: "🛠 Редактировать сообщение",
mod_table_operate.ButtonNames.EDIT_PHOTO: "☐ Изменить изображение у сообщения",
mod_table_operate.ButtonNames.EDIT_NAME: "≂ Изменить название у сообщения",
mod_table_operate.ButtonNames.EDIT_DESC: "𝌴 Изменить описание у сообщения",
mod_table_operate.ButtonNames.EDIT_ACCESS: "✋ Изменить доступ к сообщению",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.PHOTO): "☐ Изменить изображение у сообщения",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.NAME): "≂ Изменить название у сообщения",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.DESC): "𝌴 Изменить описание у сообщения",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.ACCESS): "✋ Изменить доступ к сообщению",
mod_table_operate.ButtonNames.DEL: "❌ Удалить сообщение",
}
@ -72,17 +72,17 @@ messages = {
Время создания: #{create_datetime_field}
''',
mod_table_operate.Messages.CREATE_NAME: '''
mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.NAME): '''
Создание сообщения. Шаг 1
Введите название сообщения:
''',
mod_table_operate.Messages.CREATE_DESC: '''
mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.DESC): '''
Создание сообщения. Шаг 2
Введите описание сообщения:
''',
mod_table_operate.Messages.CREATE_PHOTO: '''
mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.PHOTO): '''
Создание сообщения. Шаг 3
Загрузите обложку для сообщения (Фото):
@ -95,23 +95,23 @@ messages = {
mod_table_operate.Messages.SELECT_TO_EDIT: '''
Выберите сообщение, который вы хотите отредактировать.
''',
mod_table_operate.Messages.EDIT_PHOTO: '''
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.PHOTO): '''
Загрузите новую обложку для сообщения (Фото):
Она будет отображаться в его описании.
''',
mod_table_operate.Messages.EDIT_NAME: f'''
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.NAME): f'''
Текущее название сообщения:
#{name_field}
Введите новое название сообщения:
''',
mod_table_operate.Messages.EDIT_DESC: f'''
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.DESC): f'''
Текущее описание сообщения:
#{desc_field}
Введите новое описание сообщения:
''',
mod_table_operate.Messages.EDIT_ACCESS: f'''
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.ACCESS): f'''
Текущий доступ к сообщениеу:
#{access_field}

1
bot_modules/mod_simple_message.py

@ -72,6 +72,7 @@ class SimpleMessageModule(mod_interface.IModule):
assert len(a_ButtonDesc) < 41 # Телеграм не поддерживает больше
assert a_ButtonDesc[0] != ' ' # Телеграм не поддерживает пробелы в начале
assert a_ButtonDesc[-1:] != ' ' # Телеграм не поддерживает пробелы в конце
# TODO добавить проверку, что все кнопки (a_ButtonDesc) разные
btn = self.m_BotButtons.CreateMessage(f'{self.GetName()} {str(a_ButtonName).replace("ButtonNames.", "")}', a_ButtonDesc, self.m_Log.GetTimeNow())
return btn

335
bot_modules/mod_table_operate.py

@ -13,43 +13,43 @@ from aiogram.dispatcher.filters.state import State, StatesGroup
from enum import Enum
from enum import auto
def EditButton(a_BDTableDestiny):
return 'edit ' + str(a_BDTableDestiny)
def EnumButton(a_EnumItem):
return 'enum ' + str(a_EnumItem)
def EditMessage(a_BDTableDestiny):
return 'edit ' + str(a_BDTableDestiny)
def CreateMessage(a_BDTableDestiny):
return 'create ' + str(a_BDTableDestiny)
def EnumMessageForView(a_EnumItem):
return 'enum ' + str(a_EnumItem)
def NotificationMessage(a_EnumItem):
return 'notification ' + str(a_EnumItem)
class ButtonNames(Enum):
LIST = auto()
ADD = auto()
EDIT = auto()
EDIT_PHOTO = auto()
EDIT_NAME = auto()
EDIT_DESC = auto()
EDIT_ACCESS = auto()
EDIT_DEFAULT_ACCESS = auto()
DEL = auto()
class Messages(Enum):
SELECT = auto()
ERROR_FIND = auto()
OPEN = auto()
CREATE_NAME = auto()
CREATE_DESC = auto()
CREATE_PHOTO = auto()
SUCCESS_CREATE = auto()
START_EDIT = auto()
SELECT_TO_EDIT = auto()
EDIT_PHOTO = auto()
EDIT_NAME = auto()
EDIT_DESC = auto()
EDIT_ACCESS = auto()
EDIT_DEFAULT_ACCESS = auto()
SUCCESS_EDIT = auto()
SELECT_TO_DELETE = auto()
SUCCESS_DELETE = auto()
class FSMs(Enum):
CREATE = auto()
EDIT_PHOTO = auto()
EDIT_NAME = auto()
EDIT_DESC = auto()
EDIT_ACCESS = auto()
EDIT_DEFAULT_ACCESS = auto()
create_fsms_cmd = '''
class FSMCreate{a_ModName}(StatesGroup):
@ -57,28 +57,9 @@ class FSMCreate{a_ModName}(StatesGroup):
desc = State()
photo = State()
class FSMEdit{a_ModName}PhotoItem(StatesGroup):
item_field = State()
class FSMEdit{a_ModName}NameItem(StatesGroup):
item_field = State()
class FSMEdit{a_ModName}DescItem(StatesGroup):
item_field = State()
class FSMEdit{a_ModName}AccessItem(StatesGroup):
item_field = State()
class FSMEdit{a_ModName}DefaultAccessItem(StatesGroup):
item_field = State()
fsm = {
FSMs.CREATE: FSMCreate{a_ModName},
FSMs.EDIT_NAME: FSMEdit{a_ModName}NameItem,
FSMs.EDIT_DESC: FSMEdit{a_ModName}DescItem,
FSMs.EDIT_PHOTO: FSMEdit{a_ModName}PhotoItem,
FSMs.EDIT_ACCESS: FSMEdit{a_ModName}AccessItem,
FSMs.EDIT_DEFAULT_ACCESS: FSMEdit{a_ModName}DefaultAccessItem,
}
'''
@ -89,6 +70,20 @@ def MakeFSMs(a_ModName):
return _locals['fsm']
edit_fsm_cmd = '''
class FSMEdit{a_ModName}_{a_FieldName}_Item(StatesGroup):
item_field = State()
fsm = FSMEdit{a_ModName}_{a_FieldName}_Item
'''
def MakeFSMForEdit(a_ModName, a_FieldName):
cmd = edit_fsm_cmd.replace("{a_ModName}", a_ModName).replace("{a_FieldName}", a_FieldName)
print ('cmd', cmd)
_locals = locals()
exec(cmd, globals(), _locals)
return _locals['fsm']
class TableOperateModule(mod_simple_message.SimpleMessageModule):
def __init__(self, a_Table, a_Messages, a_Buttons, a_ParentModName, a_ChildModName, a_InitAccess, a_ChildModuleNameList, a_EditModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log):
super().__init__(a_Messages, a_Buttons, a_InitAccess, a_ChildModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log)
@ -115,8 +110,8 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule):
return await self.PostDelete(a_CallbackQuery, a_ItemID)
self.m_PostDeleteFunc = PostDelete
def AddBDItemFunc(a_ItemData, a_UserID):
return self.AddBDItemFunc(a_ItemData, a_UserID)
async def AddBDItemFunc(a_ItemData, a_UserID):
return await self.AddBDItemFunc(a_ItemData, a_UserID)
self.m_AddBDItemFunc = AddBDItemFunc
def GetFSM(self, a_FSMName):
@ -139,13 +134,12 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule):
def GetEditKeyboardButtons(self, a_Message, a_UserGroups):
mod_buttons = keyboard.MakeButtons(self.m_Bot, self.GetButtons(self.m_EditModuleNameList), a_UserGroups)
cur_buttons = [
keyboard.ButtonWithAccess(self.GetButton(ButtonNames.EDIT_PHOTO), user_access.AccessMode.VIEW, self.GetAccess()),
keyboard.ButtonWithAccess(self.GetButton(ButtonNames.EDIT_NAME), user_access.AccessMode.ADD, self.GetAccess()),
keyboard.ButtonWithAccess(self.GetButton(ButtonNames.EDIT_DESC), user_access.AccessMode.DELETE, self.GetAccess()),
keyboard.ButtonWithAccess(self.GetButton(ButtonNames.EDIT_ACCESS), user_access.AccessMode.DELETE, self.GetAccess()),
keyboard.ButtonWithAccess(self.GetButton(ButtonNames.EDIT_DEFAULT_ACCESS), user_access.AccessMode.EDIT, self.GetAccess()),
]
cur_buttons = []
for f in self.m_Table.GetFields():
access = user_access.AccessMode.EDIT
if f.m_Destiny == bd_table.TableFieldDestiny.ACCESS or f.m_Destiny == bd_table.TableFieldDestiny.DEFAULT_ACCESS:
access = user_access.AccessMode.ACCEES_EDIT
cur_buttons += [keyboard.ButtonWithAccess(self.GetButton(EditButton(f.m_Destiny)), access, self.GetAccess()),]
return mod_buttons + keyboard.MakeButtons(self.m_Bot, cur_buttons, a_UserGroups)
def GetViewItemInlineKeyboardTemplate(self, a_ItemID):
@ -177,7 +171,24 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule):
a_Item[key_name_id],\
a_Item[access_field_id]
def ShowMessageTemplate(self, a_Message, Inline_keyboard_template_func = None):
def UpdateMessage(self, a_Msg, a_Lang, a_Item, a_EnablePhoto = False):
a_Msg.UpdateDesc(self.m_Table.ReplaceAllFieldTags(a_Msg.GetDesc(), a_Item))
photos = []
field_id = 0
for f in self.m_Table.GetFields():
if f.m_Type == bd_table.TableFieldType.ENUM:
for s in f.m_Enum:
msg = self.GetMessage(EnumMessageForView(s))
if msg:
a_Msg.UpdateDesc(a_Msg.GetDesc().replace(str(s), str(msg.GetMessageForLang(a_Lang).StaticCopy())))
elif f.m_Type == bd_table.TableFieldType.PHOTO:
photos += [str(a_Item[field_id])]
field_id += 1
if a_EnablePhoto:
a_Msg.UpdatePhotoID(','.join(photos))
return a_Msg
def ShowMessageTemplate(self, a_Message, Inline_keyboard_template_func = None, a_EnablePhoto = False):
async def ShowMessage(a_CallbackQuery, a_Item):
msg = a_Message.StaticCopy()
# TODO: добавить поддержку языка в a_MessageName
@ -189,10 +200,7 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule):
elif len(a_Item) == self.m_Table.GetFieldsCount():
lang = str(a_CallbackQuery.from_user.language_code)
msg = msg.GetMessageForLang(lang).StaticCopy()
msg.UpdateDesc(self.m_Table.ReplaceAllFieldTags(msg.GetDesc(), a_Item))
photo_field = self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.PHOTO)
if photo_field:
msg.UpdatePhotoID(a_Item[photo_field])
msg = self.UpdateMessage(msg, lang, a_Item)
item_access = a_Item[self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.ACCESS)]
if Inline_keyboard_template_func:
Inline_keyboard_func = Inline_keyboard_template_func(a_Item[self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.KEY)])
@ -200,12 +208,6 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule):
return simple_message.WorkFuncResult(msg, item_access = item_access, Inline_keyboard_func = Inline_keyboard_func)
return ShowMessage
# TODO: delete?
def SimpleMessageTemplate(self, a_MessageName : Messages):
async def ShowMessage(a_CallbackQuery, a_Item):
return simple_message.WorkFuncResult(self.GetMessage(a_MessageName))
return ShowMessage
async def PreDelete(self, a_CallbackQuery, a_Item):
if len(a_Item) < self.m_Table.GetFieldsCount():
return simple_message.WorkFuncResult(error_find_proj_message)
@ -218,7 +220,7 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule):
self.OnChange()
return simple_message.WorkFuncResult(self.GetMessage(Messages.SUCCESS_DELETE))
def AddBDItemFunc(self, a_ItemData, a_UserID):
async def AddBDItemFunc(self, a_ItemData, a_UserID):
table_name = self.m_Table.GetName()
name_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.NAME)
photo_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.PHOTO)
@ -227,55 +229,127 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule):
create_datetime_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.CREATE_DATE)
parent_id_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.PARENT_ID)
res, error = None, None
def_access = access_utils.GetItemDefaultAccessForModule(self.m_Bot, self.GetName())
#TODO сделать список полей, чтобы запрос генерировался автоматически.
if parent_id_field:
res, error = self.m_Bot.SQLRequest(f'INSERT INTO {table_name}({photo_field}, {name_field}, {desc_field}, {access_field}, {parent_id_field}, {create_datetime_field}) VALUES(?, ?, ?, ?, ?, {bot_bd.GetBDDateTimeNow()})',
commit = True, return_error = True, param = (a_ItemData[photo_field], a_ItemData[name_field], a_ItemData[desc_field], def_access + f";{a_UserID}=+", a_ItemData[parent_id_field]))
else:
res, error = self.m_Bot.SQLRequest(f'INSERT INTO {table_name}({photo_field}, {name_field}, {desc_field}, {access_field}, {create_datetime_field}) VALUES(?, ?, ?, ?, {bot_bd.GetBDDateTimeNow()})',
commit = True, return_error = True, param = (a_ItemData[photo_field], a_ItemData[name_field], a_ItemData[desc_field], def_access + f";{a_UserID}=+"))
fields = []
values = []
param = ()
for f in self.m_Table.GetFields():
d = f.m_Destiny
n = f.m_Name
if d == bd_table.TableFieldDestiny.KEY:
continue
elif d == bd_table.TableFieldDestiny.CREATE_DATE:
fields += [n]
values += [bot_bd.GetBDDateTimeNow()]
elif d == bd_table.TableFieldDestiny.ACCESS:
fields += [n]
values += ['?']
param += (def_access + f";{a_UserID}=+", )
else:
fields += [n]
values += ['?']
param += (a_ItemData[n], )
request = f'INSERT INTO {table_name}({",".join(fields)}) VALUES({",".join(values)})'
print('request', request, param)
res, error = self.m_Bot.SQLRequest(request, commit = True, return_error = True, param = param)
self.OnChange()
if error:
self.m_Log.Error(f'Пользоватлель {a_UserID}. Ошибка добавления записи в таблицу {table_name} ({a_ItemData[photo_field]}, {a_ItemData[name_field]}, {a_ItemData[desc_field]}, {def_access}).')
self.m_Log.Error(f'Пользователь {a_UserID}. Ошибка добавления записи в таблицу {request} {param}.')
else:
self.m_Log.Success(f'Пользоватлель {a_UserID}. Добавлена запись в таблицу {table_name} ({a_ItemData[photo_field]}, {a_ItemData[name_field]}, {a_ItemData[desc_field]}, {def_access}).')
self.m_Log.Success(f'Пользователь {a_UserID}. Добавлена запись в таблицу {request} {param}.')
return res, error
def SelectSourceTemplate(self, a_PrevPrefix, a_ButtonName):
parent_id_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.PARENT_ID)
return bd_item_select.DBItemSelectSource(self.m_Bot, self.m_Table.GetName(), parent_id_field, a_PrevPrefix, a_ButtonName)
def RegisterSelect(self, a_ButtonName, access_mode, only_parent = False):
a_Prefix = None
if self.m_ParentModName:
parent_mod = self.GetModule(self.m_ParentModName)
a_Prefix = parent_mod.RegisterSelect(a_ButtonName, access_mode, only_parent = False)
if not only_parent:
a_Prefix = bd_item_select.NextSelectBDItemRegisterHandlers(self.m_Bot, \
a_Prefix, \
self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.PARENT_ID), \
self.m_Table.GetName(), \
self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.KEY), \
self.m_GetButtonNameAndKeyValueAndAccessFunc, \
self.GetMessage(Messages.SELECT), \
self.m_GetAccessFunc,\
access_mode = access_mode\
)
else:
if not only_parent:
a_PrefixBase = a_ButtonName.GetDesc()
a_Prefix = bd_item_select.FirstSelectBDItemRegisterHandlers(self.m_Bot, \
a_PrefixBase, \
a_ButtonName, \
self.m_Table.GetName(), \
self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.KEY), \
if not only_parent:
a_Prefix = bd_item_select.SelectRegisterHandlers(self.m_Bot, \
self.SelectSourceTemplate(a_Prefix, a_ButtonName), \
self.m_GetButtonNameAndKeyValueAndAccessFunc, \
self.GetMessage(Messages.SELECT), \
self.m_GetAccessFunc,\
access_mode = access_mode\
)
return a_Prefix
def AdditionalKeyboardForEditTemplate(self, a_Field):
if a_Field.m_Type == bd_table.TableFieldType.ENUM:
def KeyboardButtons(a_Message, a_UserGroups):
cur_buttons = []
for s in a_Field.m_Enum:
cur_buttons += [keyboard.ButtonWithAccess(self.GetButton(EnumButton(s)), user_access.AccessMode.EDIT, self.GetAccess()),]
return keyboard.MakeButtons(self.m_Bot, cur_buttons, a_UserGroups)
return KeyboardButtons
return None
def PostProccessingForFieldForEditTemplate(self, a_Field):
if a_Field.m_Type == bd_table.TableFieldType.ENUM:
def PostProccessing(a_Message):
for s in a_Field.m_Enum:
if a_Message == str(self.GetButton(EnumButton(s))):
return str(s)
return a_Message
return PostProccessing
return None
async def OnChangeField(self, a_Field, a_ItemID, a_ItemData, a_EditUserID):
pass
def RegisterEdit(self, a_Field, a_AccessMode = user_access.AccessMode.EDIT):
a_ButtonName = self.GetButton(EditButton(a_Field.m_Destiny))
a_EditMessage = self.GetMessage(EditMessage(a_Field.m_Destiny))
a_FieldName = a_Field.m_Name
a_FieldType = bd_item.FieldType.text
if a_Field.m_Type == bd_table.TableFieldType.PHOTO:
a_FieldType = bd_item.FieldType.photo
if not a_ButtonName or not a_EditMessage:
return
async def OnChange(a_ItemID, a_ItemData, a_EditUserID):
await self.OnChangeField(a_Field, a_ItemID, a_ItemData, a_EditUserID)
return self.OnChange()
table_name = self.m_Table.GetName()
key_name = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.KEY)
edit_keyboard_func = self.m_GetEditKeyboardButtonsFunc
GetButtonNameAndKeyValueAndAccess = self.m_GetButtonNameAndKeyValueAndAccessFunc
GetAccess = self.m_GetAccessFunc
a_Prefix = self.RegisterSelect(a_ButtonName, a_AccessMode, only_parent = True)
bd_item_edit.EditBDItemRegisterHandlers(self.m_Bot, \
self.SelectSourceTemplate(a_Prefix, a_ButtonName), \
MakeFSMForEdit(self.GetName(), a_FieldName), \
self.GetMessage(Messages.SELECT_TO_EDIT), \
self.ShowMessageTemplate(a_EditMessage), \
self.ShowMessageTemplate(self.GetMessage(Messages.SUCCESS_EDIT)), \
table_name, \
key_name, \
a_FieldName, \
self.PostProccessingForFieldForEditTemplate(a_Field),\
GetButtonNameAndKeyValueAndAccess, \
GetAccess, \
self.AdditionalKeyboardForEditTemplate(a_Field),\
edit_keyboard_func, \
OnChange,\
access_mode = a_AccessMode, \
field_type = a_FieldType\
)
def RegisterHandlers(self):
super().RegisterHandlers()
table_name = self.m_Table.GetName()
@ -306,31 +380,23 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule):
a_ButtonName = self.GetButton(ButtonNames.LIST)
if a_ButtonName:
a_Prefix = self.RegisterSelect(a_ButtonName, user_access.AccessMode.VIEW, only_parent = True)
if a_Prefix:
bd_item_view.LastSelectAndShowBDItemRegisterHandlers(self.m_Bot, \
a_Prefix,\
parent_id_field, \
table_name,\
key_name, \
self.ShowMessageTemplate(self.GetMessage(Messages.OPEN), GetViewItemInlineKeyboardTemplate), \
GetButtonNameAndKeyValueAndAccess, \
self.GetMessage(Messages.SELECT), \
GetAccess, \
defaul_keyboard_func, \
access_mode = user_access.AccessMode.VIEW\
)
else:
bd_item_view.FirstSelectAndShowBDItemRegisterHandlers(self.m_Bot, \
a_ButtonName, \
table_name, \
key_name, \
self.ShowMessageTemplate(self.GetMessage(Messages.OPEN), GetViewItemInlineKeyboardTemplate), \
GetButtonNameAndKeyValueAndAccess, \
self.GetMessage(Messages.SELECT), \
GetAccess, \
defaul_keyboard_func\
)
self.m_SelectPrefix = a_Prefix
a_Prefix = bd_item_select.SelectRegisterHandlers(self.m_Bot,\
self.SelectSourceTemplate(a_Prefix, a_ButtonName), \
GetButtonNameAndKeyValueAndAccess,\
self.GetMessage(Messages.SELECT),\
GetAccess,\
access_mode = user_access.AccessMode.VIEW\
)
bd_item_view.ShowBDItemRegisterHandlers(self.m_Bot,\
a_Prefix,\
table_name,\
key_name,\
self.ShowMessageTemplate(self.GetMessage(Messages.OPEN), GetViewItemInlineKeyboardTemplate, a_EnablePhoto = True),\
GetAccess,\
defaul_keyboard_func,\
access_mode = user_access.AccessMode.VIEW\
)
# Удаление
a_ButtonName = self.GetButton(ButtonNames.DEL)
@ -362,9 +428,9 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule):
self.GetFSM(FSMs.CREATE).desc, \
self.GetFSM(FSMs.CREATE).photo,\
self.m_AddBDItemFunc, \
self.ShowMessageTemplate(self.GetMessage(Messages.CREATE_NAME)), \
self.ShowMessageTemplate(self.GetMessage(Messages.CREATE_DESC)), \
self.ShowMessageTemplate(self.GetMessage(Messages.CREATE_PHOTO)), \
self.ShowMessageTemplate(self.GetMessage(CreateMessage(bd_table.TableFieldDestiny.NAME))), \
self.ShowMessageTemplate(self.GetMessage(CreateMessage(bd_table.TableFieldDestiny.DESC))), \
self.ShowMessageTemplate(self.GetMessage(CreateMessage(bd_table.TableFieldDestiny.PHOTO))), \
self.ShowMessageTemplate(self.GetMessage(Messages.SUCCESS_CREATE)), \
a_Prefix,\
parent_table_name, \
@ -379,37 +445,6 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule):
# Редактирование
edit_keyboard_func = self.m_GetEditKeyboardButtonsFunc
def RegisterEdit(a_ButtonName, a_FSM, a_EditMessage, a_FieldName, a_FieldType, a_AccessMode = user_access.AccessMode.EDIT):
if not a_ButtonName:
return
def OnChange():
return self.OnChange()
a_Prefix = self.RegisterSelect(a_ButtonName, a_AccessMode, only_parent = True)
check_func = bd_item.GetCheckForTextFunc(a_ButtonName)
if a_Prefix:
check_func = bd_item.GetCheckForPrefixFunc(a_Prefix)
#print(a_ButtonName, a_Prefix, check_func)
bd_item_edit.EditBDItemRegisterHandlers(self.m_Bot, \
a_Prefix, \
a_FSM, \
check_func, \
self.GetMessage(Messages.SELECT_TO_EDIT), \
self.ShowMessageTemplate(a_EditMessage), \
self.ShowMessageTemplate(self.GetMessage(Messages.SUCCESS_EDIT)), \
table_name, \
key_name, \
parent_id_field, \
a_FieldName, \
GetButtonNameAndKeyValueAndAccess, \
GetAccess, \
edit_keyboard_func, \
OnChange,\
access_mode = a_AccessMode, \
field_type = a_FieldType\
)
a_ButtonName = self.GetButton(ButtonNames.EDIT)
if a_ButtonName:
self.m_Bot.RegisterMessageHandler(\
@ -423,11 +458,11 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule):
bd_item.GetCheckForTextFunc(a_ButtonName)\
)
RegisterEdit(self.GetButton(ButtonNames.EDIT_NAME), self.GetFSM(FSMs.EDIT_NAME), self.GetMessage(Messages.EDIT_NAME), name_field, bd_item.FieldType.text)
RegisterEdit(self.GetButton(ButtonNames.EDIT_DESC), self.GetFSM(FSMs.EDIT_DESC), self.GetMessage(Messages.EDIT_DESC), desc_field, bd_item.FieldType.text)
RegisterEdit(self.GetButton(ButtonNames.EDIT_PHOTO), self.GetFSM(FSMs.EDIT_PHOTO), self.GetMessage(Messages.EDIT_PHOTO), photo_field, bd_item.FieldType.photo)
RegisterEdit(self.GetButton(ButtonNames.EDIT_ACCESS), self.GetFSM(FSMs.EDIT_ACCESS), self.GetMessage(Messages.EDIT_ACCESS), access_field, bd_item.FieldType.text)
RegisterEdit(self.GetButton(ButtonNames.EDIT_DEFAULT_ACCESS), self.GetFSM(FSMs.EDIT_DEFAULT_ACCESS), self.GetMessage(Messages.EDIT_DEFAULT_ACCESS), def_access_field, bd_item.FieldType.text)
address_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.ADDRESS)
status_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.STATUS)
for f in self.m_Table.GetFields():
self.RegisterEdit(f)
def OnChange(self):
pass

24
bot_modules/needs.py

@ -23,7 +23,7 @@ table = bd_table.Table(table_name, [
bd_table.TableField(key_name, bd_table.TableFieldDestiny.KEY, bd_table.TableFieldType.INT),
bd_table.TableField(name_field, bd_table.TableFieldDestiny.NAME, bd_table.TableFieldType.STR),
bd_table.TableField(desc_field, bd_table.TableFieldDestiny.DESC, bd_table.TableFieldType.STR),
bd_table.TableField(photo_field, bd_table.TableFieldDestiny.PHOTO, bd_table.TableFieldType.STR),
bd_table.TableField(photo_field, bd_table.TableFieldDestiny.PHOTO, bd_table.TableFieldType.PHOTO),
bd_table.TableField(access_field, bd_table.TableFieldDestiny.ACCESS, bd_table.TableFieldType.STR),
bd_table.TableField(create_datetime_field, bd_table.TableFieldDestiny.CREATE_DATE, bd_table.TableFieldType.STR),
bd_table.TableField(parent_id_field, bd_table.TableFieldDestiny.PARENT_ID, bd_table.TableFieldType.INT),
@ -39,10 +39,10 @@ button_names = {
mod_table_operate.ButtonNames.LIST: "📃 Список потребностей",
mod_table_operate.ButtonNames.ADD: "☑ Добавить потребность",
mod_table_operate.ButtonNames.EDIT: "🛠 Редактировать потребность",
mod_table_operate.ButtonNames.EDIT_PHOTO: "☐ Изменить изображение у потребности",
mod_table_operate.ButtonNames.EDIT_NAME: "≂ Изменить название у потребности",
mod_table_operate.ButtonNames.EDIT_DESC: "𝌴 Изменить описание у потребности",
mod_table_operate.ButtonNames.EDIT_ACCESS: "✋ Изменить доступ к потребности",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.PHOTO): "☐ Изменить изображение у потребности",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.NAME): "≂ Изменить название у потребности",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.DESC): "𝌴 Изменить описание у потребности",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.ACCESS): "✋ Изменить доступ к потребности",
mod_table_operate.ButtonNames.DEL: "❌ Удалить потребность",
}
@ -64,17 +64,17 @@ messages = {
Время создания: #{create_datetime_field}
''',
mod_table_operate.Messages.CREATE_NAME: '''
mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.NAME): '''
Создание потребности. Шаг 1
Введите название потребности:
''',
mod_table_operate.Messages.CREATE_DESC: '''
mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.DESC): '''
Создание потребности. Шаг 2
Введите описание потребности:
''',
mod_table_operate.Messages.CREATE_PHOTO: '''
mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.PHOTO): '''
Создание потребности. Шаг 3
Загрузите обложку для потребности (Фото):
@ -87,23 +87,23 @@ messages = {
mod_table_operate.Messages.SELECT_TO_EDIT: '''
Выберите потребность, которую вы хотите отредактировать.
''',
mod_table_operate.Messages.EDIT_PHOTO: '''
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.PHOTO): '''
Загрузите новую обложку для потребности (Фото):
Она будет отображаться в её описании.
''',
mod_table_operate.Messages.EDIT_NAME: f'''
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.NAME): f'''
Текущее название потребности:
#{name_field}
Введите новое название потребности:
''',
mod_table_operate.Messages.EDIT_DESC: f'''
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.DESC): f'''
Текущее описание потребности:
#{desc_field}
Введите новое описание потребности:
''',
mod_table_operate.Messages.EDIT_ACCESS: f'''
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.ACCESS): f'''
Текущий доступ к потребности:
#{access_field}

258
bot_modules/orders.py

@ -0,0 +1,258 @@
# -*- coding: utf8 -*-
# Общественное достояние, 2023, Алексей Безбородов (Alexei Bezborodov) <AlexeiBv+mirocod_platform_bot@narod.ru>
# Заказы
from bot_sys import bot_bd, keyboard, user_access, bd_table
from bot_modules import mod_table_operate, mod_simple_message
from template import bd_item_select, bd_item_view, bd_item
from enum import Enum
from enum import auto
class OrderStatus(Enum):
NEW = auto()
PAY = auto()
ADDRESS = auto()
FINISH = auto()
# ---------------------------------------------------------
# БД
module_name = 'orders'
table_name = module_name
key_name = 'orderID'
name_field = 'orderName'
desc_field = 'orderDesc'
photo_field = 'orderPhoto'
photo_pay_field = 'orderPhotoPay'
status_field = 'orderStatus'
address_field = 'orderAddress'
access_field = 'orderAccess'
create_datetime_field = 'orderCreateDateTime'
parent_id_field = 'userID'
table = bd_table.Table(table_name, [
bd_table.TableField(key_name, bd_table.TableFieldDestiny.KEY, bd_table.TableFieldType.INT),
bd_table.TableField(name_field, bd_table.TableFieldDestiny.NAME, bd_table.TableFieldType.STR),
bd_table.TableField(desc_field, bd_table.TableFieldDestiny.DESC, bd_table.TableFieldType.STR),
bd_table.TableField(photo_field, bd_table.TableFieldDestiny.PHOTO, bd_table.TableFieldType.PHOTO),
bd_table.TableField(photo_pay_field, bd_table.TableFieldDestiny.PHOTO_PAY, bd_table.TableFieldType.PHOTO),
bd_table.TableField(status_field, bd_table.TableFieldDestiny.STATUS, bd_table.TableFieldType.ENUM, a_Enum = OrderStatus),
bd_table.TableField(address_field, bd_table.TableFieldDestiny.ADDRESS, bd_table.TableFieldType.STR),
bd_table.TableField(access_field, bd_table.TableFieldDestiny.ACCESS, bd_table.TableFieldType.STR),
bd_table.TableField(create_datetime_field, bd_table.TableFieldDestiny.CREATE_DATE, bd_table.TableFieldType.STR),
bd_table.TableField(parent_id_field, bd_table.TableFieldDestiny.PARENT_ID, bd_table.TableFieldType.INT),
])
init_access = f'{user_access.user_access_group_new}=vea'
# ---------------------------------------------------------
# Сообщения и кнопки
class ButtonNames(Enum):
LIST_ALL = auto()
button_names = {
mod_simple_message.ButtonNames.START: "🛒 Заказы",
mod_table_operate.ButtonNames.LIST: "📃 Список моих текущих заказов",
ButtonNames.LIST_ALL: "📃 Список всех моих заказов",
mod_table_operate.ButtonNames.ADD: "✅ Добавить заказ",
mod_table_operate.ButtonNames.EDIT: "🛠 Редактировать мой заказ",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.PHOTO_PAY): "☐ Загрузить чек по оплате моего заказа",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.PHOTO): "☐ Изменить изображение в моём заказе",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.NAME): "≂ Изменить название в моём заказе",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.DESC): "𝌴 Изменить описание в моём заказе",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.ADDRESS): "𝌴 Изменить адрес в моём заказе",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.ACCESS): "✋ Изменить доступ к моему заказу",
mod_table_operate.ButtonNames.DEL: "❌ Удалить мой заказ",
}
messages = {
mod_simple_message.Messages.START: f'''
<b>{button_names[mod_simple_message.ButtonNames.START]}</b>
''',
mod_table_operate.Messages.SELECT: '''
Пожалуйста, выберите заказ:
''',
mod_table_operate.Messages.ERROR_FIND: '''
Ошибка, заказ не найден
''',
mod_table_operate.Messages.OPEN: f'''
<b>Заказ: #{name_field}</b>
<b>Описание и состав заказа:</b> #{desc_field}
<b>Статус:</b> #{status_field}
<b>Адрес доставки:</b> #{address_field}
<b>Время создания:</b> #{create_datetime_field}
''',
mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.NAME): '''
Создание заказа. Шаг 1
Введите название заказа:
''',
mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.DESC): '''
Создание заказа. Шаг 2
Введите описание заказа:
''',
mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.PHOTO): '''
Создание заказа. Шаг 3
Загрузите обложку для заказа (Фото):
Она будет отображаться в его описании.
''',
mod_table_operate.Messages.SUCCESS_CREATE: '''✅ Заказ успешно добавлен!''',
mod_table_operate.Messages.START_EDIT: '''
Пожалуйста, выберите действие:
''',
mod_table_operate.Messages.SELECT_TO_EDIT: '''
Выберите заказ, который вы хотите отредактировать.
''',
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.PHOTO_PAY): '''
Загрузите чек по оплате заказа (фото):
''',
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.PHOTO): '''
Загрузите новую обложку для заказа (Фото):
Она будет отображаться в его описании.
''',
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.NAME): f'''
Текущее название заказа:
#{name_field}
Введите новое название заказа:
''',
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.DESC): f'''
Текущее описание заказа:
#{desc_field}
Введите новое описание заказа:
''',
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.ADDRESS): f'''
Текущий адрес заказа:
#{desc_field}
Введите новый адрес доставки заказа (укажите, кто, когда и где его сможет забрать):
''',
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.ACCESS): f'''
Текущий доступ к заказу:
#{access_field}
{user_access.user_access_readme}
Введите новую строку доступа:
''',
mod_table_operate.Messages.SUCCESS_EDIT: '''✅ Заказ успешно отредактирован!''',
mod_table_operate.Messages.SELECT_TO_DELETE: '''
Выберите заказ, который вы хотите удалить.
Все задачи и потребности в этом заказе так же будут удалены!
''',
mod_table_operate.Messages.SUCCESS_DELETE: '''✅ Заказ успешно удалён!''',
}
messages_order_status = {
mod_table_operate.EnumMessageForView(OrderStatus.NEW): f'''Заказ создан, ожидает модерации''',
mod_table_operate.EnumMessageForView(OrderStatus.PAY): f'''Заказ ожидает оплаты''',
mod_table_operate.EnumMessageForView(OrderStatus.ADDRESS): f'''Заказ ожидает указания адреса доставки''',
mod_table_operate.EnumMessageForView(OrderStatus.FINISH): f'''Заказ выполнен''',
}
messages.update(messages_order_status)
def GetCurItemsTemplate(a_Bot, a_TableName, a_UserIDFieldName, a_StatusFieldName):
def GetBDItems(a_Message, a_UserGroups, a_ParentID):
user_id = str(a_Message.from_user.id)
request = f'SELECT * FROM {a_TableName} WHERE {a_UserIDFieldName} = ? AND {a_StatusFieldName} != ?'
return a_Bot.SQLRequest(request, param = ([user_id, str(OrderStatus.FINISH)]))
return GetBDItems
def GetBDItemsForUserTemplate(a_Bot, a_TableName, a_UserIDFieldName):
def GetBDItems(a_Message, a_UserGroups, a_ParentID):
user_id = str(a_Message.from_user.id)
return bd_item.GetBDItemsTemplate(a_Bot, a_TableName, a_UserIDFieldName)(user_id)
return GetBDItems
class DBItemForUserSelectSource(bd_item_select.DBItemSelectSource):
def __init__(self, a_Bot, a_TableName, a_ParentIDFieldName, a_PrevPrefix, a_ButtonName, a_OnlyCurrent = False):
super().__init__(a_Bot, a_TableName, a_ParentIDFieldName, a_PrevPrefix, a_ButtonName)
self.m_OnlyCurrent = a_OnlyCurrent
def GetItemsFunc(self):
if self.m_OnlyCurrent:
return GetCurItemsTemplate(self.m_Bot, self.m_TableName, self.m_ParentIDFieldName, status_field)
return GetBDItemsForUserTemplate(self.m_Bot, self.m_TableName, self.m_ParentIDFieldName)
def IsFirst(self):
return True
class ModuleOrders(mod_table_operate.TableOperateModule):
def __init__(self, a_Table, a_Messages, a_Buttons, a_ParentModName, a_ChildModName, a_InitAccess, a_ChildModuleNameList, a_EditModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log):
super().__init__(table, a_Messages, a_Buttons, a_ParentModName, a_ChildModName, a_InitAccess, a_ChildModuleNameList, a_EditModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log)
def SelectSourceTemplate(self, a_PrevPrefix, a_ButtonName):
parent_id_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.PARENT_ID)
return DBItemForUserSelectSource(self.m_Bot, self.m_Table.GetName(), parent_id_field, a_PrevPrefix, a_ButtonName, a_OnlyCurrent = True)
def SelectSourceForAllTemplate(self, a_PrevPrefix, a_ButtonName):
parent_id_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.PARENT_ID)
return DBItemForUserSelectSource(self.m_Bot, self.m_Table.GetName(), parent_id_field, a_PrevPrefix, a_ButtonName)
def AddBDItemFunc(self, a_ItemData, a_UserID):
parent_id_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.PARENT_ID)
a_ItemData[parent_id_field] = a_UserID
a_ItemData[status_field] = str(OrderStatus.NEW)
a_ItemData[address_field] = ''
a_ItemData[photo_pay_field] = '0'
return super().AddBDItemFunc(a_ItemData, a_UserID)
def GetStartKeyboardButtons(self, a_Message, a_UserGroups):
parent_buttons = super().GetStartKeyboardButtons(a_Message, a_UserGroups)
cur_buttons = [
keyboard.ButtonWithAccess(self.GetButton(ButtonNames.LIST_ALL), user_access.AccessMode.VIEW, self.GetAccess()),
]
return parent_buttons + keyboard.MakeButtons(self.m_Bot, cur_buttons, a_UserGroups)
def RegisterHandlers(self):
super().RegisterHandlers()
table_name = self.m_Table.GetName()
key_name = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.KEY)
def GetViewItemInlineKeyboardTemplate(a_ItemID):
return self.GetViewItemInlineKeyboardTemplate(a_ItemID)
GetButtonNameAndKeyValueAndAccess = self.m_GetButtonNameAndKeyValueAndAccessFunc
GetAccess = self.m_GetAccessFunc
default_keyboard_func = self.m_GetStartKeyboardButtonsFunc
# Список всех заказов
a_ButtonName = self.GetButton(ButtonNames.LIST_ALL)
if a_ButtonName:
a_Prefix = self.RegisterSelect(a_ButtonName, user_access.AccessMode.VIEW, only_parent = True)
a_Prefix = bd_item_select.SelectRegisterHandlers(self.m_Bot,\
self.SelectSourceForAllTemplate(a_Prefix, a_ButtonName), \
GetButtonNameAndKeyValueAndAccess,\
self.GetMessage(mod_table_operate.Messages.SELECT),\
GetAccess,\
access_mode = user_access.AccessMode.VIEW\
)
bd_item_view.ShowBDItemRegisterHandlers(self.m_Bot,\
a_Prefix,\
table_name,\
key_name,\
self.ShowMessageTemplate(self.GetMessage(mod_table_operate.Messages.OPEN),GetViewItemInlineKeyboardTemplate, a_EnablePhoto = True),\
GetAccess,\
default_keyboard_func,\
access_mode = user_access.AccessMode.VIEW\
)
class ModuleUserOrders(ModuleOrders):
def __init__(self, a_ParentModName, a_ChildModName, a_ChildModuleNameList, a_EditModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log):
super().__init__(table, messages, button_names, a_ParentModName, a_ChildModName, init_access, a_ChildModuleNameList, a_EditModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_Log)
def GetName(self):
return module_name

30
bot_modules/projects.py

@ -22,7 +22,7 @@ table = bd_table.Table(table_name, [
bd_table.TableField(key_name, bd_table.TableFieldDestiny.KEY, bd_table.TableFieldType.INT),
bd_table.TableField(name_field, bd_table.TableFieldDestiny.NAME, bd_table.TableFieldType.STR),
bd_table.TableField(desc_field, bd_table.TableFieldDestiny.DESC, bd_table.TableFieldType.STR),
bd_table.TableField(photo_field, bd_table.TableFieldDestiny.PHOTO, bd_table.TableFieldType.STR),
bd_table.TableField(photo_field, bd_table.TableFieldDestiny.PHOTO, bd_table.TableFieldType.PHOTO),
bd_table.TableField(access_field, bd_table.TableFieldDestiny.ACCESS, bd_table.TableFieldType.STR),
bd_table.TableField(create_datetime_field, bd_table.TableFieldDestiny.CREATE_DATE, bd_table.TableFieldType.STR),
])
@ -37,10 +37,10 @@ button_names = {
mod_table_operate.ButtonNames.LIST: "📃 Список проектов",
mod_table_operate.ButtonNames.ADD: "✅ Добавить проект",
mod_table_operate.ButtonNames.EDIT: "🛠 Редактировать проект",
mod_table_operate.ButtonNames.EDIT_PHOTO: "☐ Изменить изображение в проекте",
mod_table_operate.ButtonNames.EDIT_NAME: "≂ Изменить название в проекте",
mod_table_operate.ButtonNames.EDIT_DESC: "𝌴 Изменить описание в проекте",
mod_table_operate.ButtonNames.EDIT_ACCESS: "✋ Изменить доступ к проекту",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.PHOTO): "☐ Изменить изображение в проекте",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.NAME): "≂ Изменить название в проекте",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.DESC): "𝌴 Изменить описание в проекте",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.ACCESS): "✋ Изменить доступ к проекту",
mod_table_operate.ButtonNames.DEL: "❌ Удалить проект",
}
@ -62,17 +62,17 @@ messages = {
Время создания: #{create_datetime_field}
''',
mod_table_operate.Messages.CREATE_NAME: '''
mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.NAME): '''
Создание проекта. Шаг 1
Введите название проекта:
''',
mod_table_operate.Messages.CREATE_DESC: '''
mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.DESC): '''
Создание проекта. Шаг 2
Введите описание проекта:
''',
mod_table_operate.Messages.CREATE_PHOTO: '''
mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.PHOTO): '''
Создание проекта. Шаг 3
Загрузите обложку для проекта (Фото):
@ -85,23 +85,23 @@ messages = {
mod_table_operate.Messages.SELECT_TO_EDIT: '''
Выберите проект, который вы хотите отредактировать.
''',
mod_table_operate.Messages.EDIT_PHOTO: '''
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.PHOTO): '''
Загрузите новую обложку для проекта (Фото):
Она будет отображаться в его описании.
''',
mod_table_operate.Messages.EDIT_NAME: f'''
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.NAME): f'''
Текущее название проекта:
#{name_field}
Введите новое название проекта:
''',
mod_table_operate.Messages.EDIT_DESC: f'''
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.DESC): f'''
Текущее описание проекта:
#{desc_field}
Введите новое описание проекта:
''',
mod_table_operate.Messages.EDIT_ACCESS: f'''
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.ACCESS): f'''
Текущий доступ к проекту:
#{access_field}
@ -124,9 +124,3 @@ class ModuleProjects(mod_table_operate.TableOperateModule):
def GetName(self):
return module_name
def GetModuleButtons(self):
return super().GetModuleButtons() + [
keyboard.ButtonWithAccess(self.GetButton(mod_table_operate.ButtonNames.LIST), user_access.AccessMode.VIEW, self.GetAccess()),
]

24
bot_modules/tasks.py

@ -23,7 +23,7 @@ table = bd_table.Table(table_name, [
bd_table.TableField(key_name, bd_table.TableFieldDestiny.KEY, bd_table.TableFieldType.INT),
bd_table.TableField(name_field, bd_table.TableFieldDestiny.NAME, bd_table.TableFieldType.STR),
bd_table.TableField(desc_field, bd_table.TableFieldDestiny.DESC, bd_table.TableFieldType.STR),
bd_table.TableField(photo_field, bd_table.TableFieldDestiny.PHOTO, bd_table.TableFieldType.STR),
bd_table.TableField(photo_field, bd_table.TableFieldDestiny.PHOTO, bd_table.TableFieldType.PHOTO),
bd_table.TableField(access_field, bd_table.TableFieldDestiny.ACCESS, bd_table.TableFieldType.STR),
bd_table.TableField(create_datetime_field, bd_table.TableFieldDestiny.CREATE_DATE, bd_table.TableFieldType.STR),
bd_table.TableField(parent_id_field, bd_table.TableFieldDestiny.PARENT_ID, bd_table.TableFieldType.INT),
@ -39,10 +39,10 @@ button_names = {
mod_table_operate.ButtonNames.LIST: "📃 Список задач",
mod_table_operate.ButtonNames.ADD: "☑ Добавить задачу",
mod_table_operate.ButtonNames.EDIT: "🛠 Редактировать задачу",
mod_table_operate.ButtonNames.EDIT_PHOTO: "☐ Изменить изображение у задачи",
mod_table_operate.ButtonNames.EDIT_NAME: "≂ Изменить название у задачи",
mod_table_operate.ButtonNames.EDIT_DESC: "𝌴 Изменить описание у задачи",
mod_table_operate.ButtonNames.EDIT_ACCESS: "✋ Изменить доступ к задаче",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.PHOTO): "☐ Изменить изображение у задачи",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.NAME): "≂ Изменить название у задачи",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.DESC): "𝌴 Изменить описание у задачи",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.ACCESS): "✋ Изменить доступ к задаче",
mod_table_operate.ButtonNames.DEL: "❌ Удалить задачу",
}
@ -64,17 +64,17 @@ messages = {
Время создания: #{create_datetime_field}
''',
mod_table_operate.Messages.CREATE_NAME: '''
mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.NAME): '''
Создание задачи. Шаг 1
Введите название задачи:
''',
mod_table_operate.Messages.CREATE_DESC: '''
mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.DESC): '''
Создание задачи. Шаг 2
Введите описание задачи:
''',
mod_table_operate.Messages.CREATE_PHOTO: '''
mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.PHOTO): '''
Создание задачи. Шаг 3
Загрузите обложку для задачи (Фото):
@ -87,23 +87,23 @@ messages = {
mod_table_operate.Messages.SELECT_TO_EDIT: '''
Выберите задачу, которую вы хотите отредактировать.
''',
mod_table_operate.Messages.EDIT_PHOTO: '''
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.PHOTO): '''
Загрузите новую обложку для задачи (Фото):
Она будет отображаться в её описании.
''',
mod_table_operate.Messages.EDIT_NAME: f'''
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.NAME): f'''
Текущее название задачи:
#{name_field}
Введите новое название задачи:
''',
mod_table_operate.Messages.EDIT_DESC: f'''
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.DESC): f'''
Текущее описание задачи:
#{desc_field}
Введите новое описание задачи:
''',
mod_table_operate.Messages.EDIT_ACCESS: f'''
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.ACCESS): f'''
Текущий доступ к задаче:
#{access_field}

21
bot_modules/user_in_groups.py

@ -55,7 +55,7 @@ button_names = {
mod_simple_message.ButtonNames.START: "🗫 Пользователи в группах",
mod_table_operate.ButtonNames.LIST: "📃 Список пользователей в группах",
ButtonNames.ADD_USER: "✅ Добавить пользователя в группу",
mod_table_operate.ButtonNames.EDIT_ACCESS: "✋ Доступ к пользователю в группе",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.ACCESS): "✋ Доступ к пользователю в группе",
mod_table_operate.ButtonNames.DEL: "❌ Удалить пользователя из группы",
}
@ -77,7 +77,7 @@ messages = {
Время создания: #{create_datetime_field}
''',
mod_table_operate.Messages.CREATE_NAME: '''
mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.NAME): '''
Создание пользователя в группе.
Укажите ID пользователя:
@ -89,7 +89,7 @@ messages = {
mod_table_operate.Messages.SELECT_TO_EDIT: '''
Выберите пользователя в группе, которого вы хотите отредактировать.
''',
mod_table_operate.Messages.EDIT_ACCESS: f'''
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.ACCESS): f'''
Текущий доступ к пользователю в группе:
#{access_field}
@ -118,19 +118,6 @@ class ModuleUserInGroups(mod_table_operate.TableOperateModule):
]
return t_buttons + keyboard.MakeButtons(self.m_Bot, cur_buttons, a_UserGroups)
def AddBDItemFunc(self, a_ItemData, a_UserID):
def_access = access_utils.GetItemDefaultAccessForModule(self.m_Bot, self.GetName())
res, error = self.m_Bot.SQLRequest(f'INSERT INTO {table_name}({name_field}, {access_field}, {parent_id_field}, {create_datetime_field}) VALUES(?, ?, ?, {bot_bd.GetBDDateTimeNow()})',
commit = True, return_error = True, param = (a_ItemData[name_field], def_access + f";{a_UserID}=+", a_ItemData[parent_id_field]))
self.OnChange()
if error:
self.m_Log.Error(f'Пользоватлель {a_UserID}. Ошибка добавления записи в таблицу {table_name} ({a_ItemData[name_field]}, {def_access}).')
else:
self.m_Log.Success(f'Пользоватлель {a_UserID}. Добавлена запись в таблицу {table_name} ({a_ItemData[name_field]}, {def_access}).')
return res, error
def RegisterHandlers(self):
super().RegisterHandlers()
GetButtonNameAndKeyValueAndAccess = self.m_GetButtonNameAndKeyValueAndAccessFunc
@ -158,7 +145,7 @@ class ModuleUserInGroups(mod_table_operate.TableOperateModule):
check_func,\
FSMAddUserInGroups,\
self.m_AddBDItemFunc,\
self.ShowMessageTemplate(self.GetMessage(mod_table_operate.Messages.CREATE_NAME)),\
self.ShowMessageTemplate(self.GetMessage(mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.NAME))),\
self.ShowMessageTemplate(self.GetMessage(mod_table_operate.Messages.SUCCESS_CREATE)),\
a_Prefix,\
parent_table_name,\

24
bot_modules/users.py

@ -29,7 +29,7 @@ table = bd_table.Table(table_name, [
bd_table.TableField(name2_field, bd_table.TableFieldDestiny.DESC, bd_table.TableFieldType.STR),
bd_table.TableField(is_bot_field, bd_table.TableFieldDestiny.DESC, bd_table.TableFieldType.STR),
bd_table.TableField(language_code_field, bd_table.TableFieldDestiny.DESC, bd_table.TableFieldType.STR),
bd_table.TableField(photo_field, bd_table.TableFieldDestiny.PHOTO, bd_table.TableFieldType.STR),
bd_table.TableField(photo_field, bd_table.TableFieldDestiny.PHOTO, bd_table.TableFieldType.PHOTO),
bd_table.TableField(access_field, bd_table.TableFieldDestiny.ACCESS, bd_table.TableFieldType.STR),
bd_table.TableField(create_datetime_field, bd_table.TableFieldDestiny.CREATE_DATE, bd_table.TableFieldType.STR),
])
@ -44,10 +44,10 @@ button_names = {
mod_table_operate.ButtonNames.LIST: "📃 Список пользователей",
# mod_table_operate.ButtonNames.ADD: "✅ Добавить пользователя",
mod_table_operate.ButtonNames.EDIT: "🛠 Редактировать пользователя",
mod_table_operate.ButtonNames.EDIT_PHOTO: "☐ Изменить изображение в пользователяе",
mod_table_operate.ButtonNames.EDIT_NAME: "≂ Изменить название в пользователяе",
mod_table_operate.ButtonNames.EDIT_DESC: "𝌴 Изменить описание в пользователяе",
mod_table_operate.ButtonNames.EDIT_ACCESS: "✋ Изменить доступ к пользователю",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.PHOTO): "☐ Изменить изображение в пользователяе",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.NAME): "≂ Изменить название в пользователяе",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.DESC): "𝌴 Изменить описание в пользователяе",
mod_table_operate.EditButton(bd_table.TableFieldDestiny.ACCESS): "✋ Изменить доступ к пользователю",
mod_table_operate.ButtonNames.DEL: "❌ Удалить пользователя",
}
@ -72,17 +72,17 @@ messages = {
<b>Код языка:</b> #{language_code_field}
<b>Дата добавления:</b> #{create_datetime_field}
''',
mod_table_operate.Messages.CREATE_NAME: '''
mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.NAME): '''
Создание пользователя. Шаг 1
Введите название пользователя:
''',
mod_table_operate.Messages.CREATE_DESC: '''
mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.DESC): '''
Создание пользователя. Шаг 2
Введите описание пользователя:
''',
mod_table_operate.Messages.CREATE_PHOTO: '''
mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.PHOTO): '''
Создание пользователя. Шаг 3
Загрузите обложку для пользователя (Фото):
@ -95,23 +95,23 @@ messages = {
mod_table_operate.Messages.SELECT_TO_EDIT: '''
Выберите пользователя, которого вы хотите отредактировать.
''',
mod_table_operate.Messages.EDIT_PHOTO: '''
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.PHOTO): '''
Загрузите новую обложку для пользователя (Фото):
Она будет отображаться в его описании.
''',
mod_table_operate.Messages.EDIT_NAME: f'''
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.NAME): f'''
Текущее название пользователя:
#{name_field}
Введите новое название пользователя:
''',
mod_table_operate.Messages.EDIT_DESC: f'''
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.DESC): f'''
Текущее описание пользователя:
#{name1_field}
Введите новое описание пользователя:
''',
mod_table_operate.Messages.EDIT_ACCESS: f'''
mod_table_operate.EditMessage(bd_table.TableFieldDestiny.ACCESS): f'''
Текущий доступ к пользователю:
#{access_field}

24
bot_sys/aiogram_bot.py

@ -9,6 +9,16 @@ from aiogram.dispatcher import Dispatcher
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.utils import executor
def GetPhotoList(a_PhotoIDs):
if not a_PhotoIDs or a_PhotoIDs == 0:
return []
photos = a_PhotoIDs.split(",")
result = []
for p in photos:
if p != '0' and p != '':
result += [p]
return result
class AiogramBot(interfaces.IBot):
def __init__(self, a_TelegramBotApiToken, a_BDFileName, a_RootIDs, a_Log):
self.m_TelegramBotApiToken = a_TelegramBotApiToken
@ -39,19 +49,27 @@ class AiogramBot(interfaces.IBot):
base_keyboards = [keyboard.MakeAiogramKeyboard(a_KeyboardButtons)]
if inline_keyboards:
base_keyboards = inline_keyboards
if a_PhotoIDs and a_PhotoIDs != 0 and a_PhotoIDs != '0':
photos = GetPhotoList(a_PhotoIDs)
if len(photos) > 0:
for p in photos[:-1]:
await self.m_TBot.send_photo(
a_UserID,
p,
''
)
p = photos[-1]
if base_keyboards:
for k in base_keyboards:
await self.m_TBot.send_photo(
a_UserID,
a_PhotoIDs,
p,
a_Message,
reply_markup = k
)
else:
await self.m_TBot.send_photo(
a_UserID,
a_PhotoIDs,
p,
a_Message
)
else:

47
bot_sys/bd_table.py

@ -6,8 +6,19 @@ from enum import auto
# Тип поля в таблице
class TableFieldType(Enum):
INT = 'INTEGER'
STR = 'TEXT'
INT = auto()
STR = auto()
ENUM = auto()
PHOTO = auto()
def InitTableType(a_TableFieldType):
types = {
TableFieldType.INT: 'INTEGER',
TableFieldType.STR: 'TEXT',
TableFieldType.ENUM: 'TEXT',
TableFieldType.PHOTO: 'TEXT',
}
return types.get(a_TableFieldType, None)
# Предназначение поля в таблице
class TableFieldDestiny(Enum):
@ -15,17 +26,21 @@ class TableFieldDestiny(Enum):
NAME = auto()
DESC = auto()
PHOTO = auto()
PHOTO_PAY = auto()
ACCESS = auto()
DEFAULT_ACCESS = auto()
CREATE_DATE = auto()
PARENT_ID = auto()
STATUS = auto()
ADDRESS = auto()
OTHER = auto()
class TableField:
def __init__(self, a_Name, a_Destiny : TableFieldDestiny, a_Type : TableFieldType):
def __init__(self, a_Name, a_Destiny : TableFieldDestiny, a_Type : TableFieldType, a_Enum = None):
self.m_Name = a_Name
self.m_Destiny = a_Destiny
self.m_Type = a_Type
self.m_Enum = a_Enum
class Table:
def __init__(self, a_TableName, a_Fields : [TableField], a_UniqueFields = None):
@ -37,7 +52,7 @@ class Table:
return self.m_TableName
def GetFields(self):
return self.TableFieldType
return self.m_Fields
def GetFieldsCount(self):
return len(self.m_Fields)
@ -65,7 +80,7 @@ class Table:
request = f'CREATE TABLE IF NOT EXISTS {self.GetName()}('
items = []
for f in self.m_Fields:
item = f.m_Name + ' ' + str(f.m_Type.value)
item = f.m_Name + ' ' + str(InitTableType(f.m_Type))
if f.m_Destiny == TableFieldDestiny.KEY:
item += ' PRIMARY KEY'
items += [item]
@ -84,14 +99,20 @@ class Table:
result = result.replace(f'#{f.m_Name}', str(a_BDItem[i]))
return result
class Status(Enum):
NEW = auto()
FINISH = auto()
def Test():
f1 = TableField('f1', TableFieldDestiny.KEY, TableFieldType.INT)
f2 = TableField('f2', TableFieldDestiny.NAME, TableFieldType.STR)
f3 = TableField('f3', TableFieldDestiny.DESC, TableFieldType.STR)
f4 = TableField('f4', TableFieldDestiny.STATUS, TableFieldType.ENUM, a_Enum = Status)
table = Table('tname', [
f1,
f2,
f3
f3,
f4,
],
[[f1], [f2, f3]]
)
@ -111,15 +132,21 @@ def Test():
assert table.GetFieldByDestiny(TableFieldDestiny.DESC).m_Destiny == TableFieldDestiny.DESC
assert table.GetFieldByDestiny(TableFieldDestiny.DESC).m_Type == TableFieldType.STR
assert table.GetFieldIDByDestiny(TableFieldDestiny.DESC) == 2
assert table.GetFieldByDestiny(TableFieldDestiny.STATUS).m_Name == 'f4'
assert table.GetFieldNameByDestiny(TableFieldDestiny.STATUS) == 'f4'
assert table.GetFieldByDestiny(TableFieldDestiny.STATUS).m_Destiny == TableFieldDestiny.STATUS
assert table.GetFieldByDestiny(TableFieldDestiny.STATUS).m_Type == TableFieldType.ENUM
assert table.GetFieldIDByDestiny(TableFieldDestiny.STATUS) == 3
assert table.GetFieldByDestiny(TableFieldDestiny.PHOTO) == None
assert table.GetFieldIDByDestiny(TableFieldDestiny.PHOTO) == None
assert table.GetFieldNameByDestiny(TableFieldDestiny.PHOTO) == None
assert table.GetFieldsCount() == 3
assert table.GetFieldsCount() == 4
assert len(table.GetFields()) == 4
print(table.GetInitTableRequest())
assert table.GetInitTableRequest() == 'CREATE TABLE IF NOT EXISTS tname(f1 INTEGER PRIMARY KEY, f2 TEXT, f3 TEXT, UNIQUE(f1), UNIQUE(f2, f3));'
assert table.GetInitTableRequest() == 'CREATE TABLE IF NOT EXISTS tname(f1 INTEGER PRIMARY KEY, f2 TEXT, f3 TEXT, f4 TEXT, UNIQUE(f1), UNIQUE(f2, f3));'
item = [10, 'i1', 'i2']
assert table.ReplaceAllFieldTags('#f1 #f2 #f3', item) == '10 i1 i2'
item = [10, 'i2', 'i3', 'i4']
assert table.ReplaceAllFieldTags('#f1 #f2 #f3 #f4', item) == '10 i2 i3 i4'

43
bot_sys/bot_subscribes.py

@ -0,0 +1,43 @@
#-*-coding utf-8-*-
# Общественное достояние, 2023, Алексей Безбородов (Alexei Bezborodov) <AlexeiBv+mirocod_platform_bot@narod.ru>
# Работа с подписками
from enum import Enum
from enum import auto
# Тип поля в таблице
class SubscribeType(Enum):
ADD = auto()
ANY_ITEM_DEL = auto()
ANY_ITEM_EDIT = auto()
ITEM_DEL = auto()
ITEM_EDIT = auto()
class BotSubscribes
def __init__(self):
self.Clear()
def GetSubscribes(self):
return self.m_Subscribes
def Clear(self):
self.m_Subscribes = {}
def CheckSubscribe(self, a_UserID, a_ModuleName, a_Type, a_ItemID = -1):
s = self.GetSubscribes()
su = s.get(a_UserID, None)
if su:
sub_um = su.get(a_ModuleName, None)
if sub_um:
t = su.get(a_ItemID, None)
return t
return None
def AddSubscribe(self, a_UserID, a_ModuleName, a_Type, a_ItemID = -1):
s = self.GetSubscribes()
if not s.get(a_UserID, None):
s[a_UserID] = {}
if not s[a_UserID].get(a_ModuleName, None):
s[a_UserID][a_ModuleName] = {}
s[a_UserID][a_ModuleName][a_ItemID] = a_Type

17
main.py

@ -6,6 +6,7 @@ import os
from bot_sys import config, log, aiogram_bot, bot_messages, bd_table, user_access
from bot_modules import mod_agregator, start, profile, backup, users_groups_agregator, access, projects, tasks, needs, comments
from bot_modules import languages, messages, buttons, users, groups, user_in_groups
from bot_modules import orders, all_orders
log_start_message = 'Бот успешно запущен!'
@ -34,6 +35,8 @@ mod_buttons_name = buttons.module_name
mod_users_name = users.module_name
mod_groups_name = groups.module_name
mod_user_in_groups_name = user_in_groups.module_name
mod_orders_name = orders.module_name
mod_all_orders_name = all_orders.module_name
start_mod_list = [mod_start_name]
mod_access = access.ModuleAccess(start_mod_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log)
@ -87,6 +90,14 @@ child_mod_name_list = [mod_start_name]
mod_buttons = buttons.ModuleButtons(mod_languages_name, None, child_mod_name_list, start_mod_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log)
g_ModuleAgregator.AddModule(mod_buttons)
child_mod_name_list = [mod_start_name]
mod_orders = orders.ModuleUserOrders(None, None, child_mod_name_list, start_mod_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log)
g_ModuleAgregator.AddModule(mod_orders)
child_mod_name_list = [mod_start_name]
mod_all_orders = all_orders.ModuleAllOrders(None, None, child_mod_name_list, start_mod_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log)
g_ModuleAgregator.AddModule(mod_all_orders)
child_mod_name_list = [
mod_profile.GetName(),
mod_backup.GetName(),
@ -94,6 +105,8 @@ child_mod_name_list = [
mod_access.GetName(),
mod_project.GetName(),
mod_languages.GetName(),
mod_orders.GetName(),
mod_all_orders.GetName(),
]
mod_start = start.ModuleStart(child_mod_name_list, g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log)
g_ModuleAgregator.AddModule(mod_start)
@ -127,8 +140,8 @@ for m in test_mods:
m.Test()
if __name__ == '__main__':
# os.system('clear')
# os.system('cls')
#os.system('clear')
#os.system('cls')
g_Log.Success(log_start_message)
g_Bot.StartPolling()

10
template/bd_item.py

@ -42,6 +42,16 @@ def GetKeyDataFromCallbackMessage(a_Message, a_Prefix):
key_item_id = str(a_Message.data).replace(a_Prefix, '')
return key_item_id
def MixKeyboardFuncTemplate(a_Func1, a_Func2):
def KeyboardButtons(a_Message, a_UserGroups):
func = [a_Func1, a_Func2]
result = []
for f in func:
if f:
result += f(a_Message, a_UserGroups)
return result
return KeyboardButtons
def GetCancelKeyboardButtonsTemplate(a_Bot, a_AccessFunc, a_AccessMode):
def GetCancelKeyboardButtons(a_Message, a_UserGroups):
cur_buttons = [

28
template/bd_item_add.py

@ -10,6 +10,9 @@ from template import simple_message, bd_item_select, bd_item
cancel_message = '''
🚫 Добавление отменено
'''
error_photo_type_message = '''
🚫 Неверный формат изображений
'''
def StartAddBDItemTemplate(a_Bot, a_FSM, a_FSMStart, a_MessageFunc, a_ParentTableName, a_ParentKeyFieldName, a_Prefix, a_AccessFunc, a_ButtonFunc, a_FinishButtonFunc, access_mode = user_access.AccessMode.ADD):
async def StartAddBDItem(a_CallbackQuery, state):
@ -36,13 +39,13 @@ def StartAddBDItemTemplate(a_Bot, a_FSM, a_FSMStart, a_MessageFunc, a_ParentTabl
return res_of_work_func
return simple_message.SimpleMessageTemplate(a_Bot, StartAddBDItem, a_ButtonFunc, None, a_AccessFunc, access_mode)
def FinishAddBDItemTemplate(a_Bot, a_FSM, a_AddBDItemFunc, a_ParentTableName, a_ParentKeyFieldName, a_FieldName, a_MessageFunc, a_AccessFunc, a_ButtonFunc, access_mode = user_access.AccessMode.ADD, field_type = bd_item.FieldType.text):
return FinishOrNextAddBDItemTemplate(a_Bot, a_FSM, a_AddBDItemFunc, a_ParentTableName, a_ParentKeyFieldName, a_FieldName, a_MessageFunc, a_AccessFunc, a_ButtonFunc, a_ButtonFunc, True, access_mode = access_mode, field_type = field_type)
def FinishAddBDItemTemplate(a_Bot, a_FSM, a_AddBDItemFunc, a_ParentTableName, a_ParentKeyFieldName, a_FieldName, a_MessageFunc, a_PostProcessFunc, a_AccessFunc, a_ButtonFunc, access_mode = user_access.AccessMode.ADD, field_type = bd_item.FieldType.text):
return FinishOrNextAddBDItemTemplate(a_Bot, a_FSM, a_AddBDItemFunc, a_ParentTableName, a_ParentKeyFieldName, a_FieldName, a_MessageFunc, a_PostProcessFunc, a_AccessFunc, a_ButtonFunc, a_ButtonFunc, True, access_mode = access_mode, field_type = field_type)
def NextAddBDItemTemplate(a_Bot, a_FSM, a_AddBDItemFunc, a_ParentTableName, a_ParentKeyFieldName, a_FieldName, a_MessageFunc, a_AccessFunc, a_ButtonFunc, a_FinishButtonFunc, access_mode = user_access.AccessMode.ADD, field_type = bd_item.FieldType.text):
return FinishOrNextAddBDItemTemplate(a_Bot, a_FSM, a_AddBDItemFunc, a_ParentTableName, a_ParentKeyFieldName, a_FieldName, a_MessageFunc, a_AccessFunc, a_ButtonFunc, a_FinishButtonFunc, False, access_mode = access_mode, field_type = field_type)
def NextAddBDItemTemplate(a_Bot, a_FSM, a_AddBDItemFunc, a_ParentTableName, a_ParentKeyFieldName, a_FieldName, a_MessageFunc, a_PostProcessFunc, a_AccessFunc, a_ButtonFunc, a_FinishButtonFunc, access_mode = user_access.AccessMode.ADD, field_type = bd_item.FieldType.text):
return FinishOrNextAddBDItemTemplate(a_Bot, a_FSM, a_AddBDItemFunc, a_ParentTableName, a_ParentKeyFieldName, a_FieldName, a_MessageFunc, a_PostProcessFunc, a_AccessFunc, a_ButtonFunc, a_FinishButtonFunc, False, access_mode = access_mode, field_type = field_type)
def FinishOrNextAddBDItemTemplate(a_Bot, a_FSM, a_AddBDItemFunc, a_ParentTableName, a_ParentKeyFieldName, a_FieldName, a_MessageFunc, a_AccessFunc, a_ButtonFunc, a_FinishButtonFunc, a_Finish, access_mode = user_access.AccessMode.ADD, field_type = bd_item.FieldType.text):
def FinishOrNextAddBDItemTemplate(a_Bot, a_FSM, a_AddBDItemFunc, a_ParentTableName, a_ParentKeyFieldName, a_FieldName, a_MessageFunc, a_PostProcessFunc, a_AccessFunc, a_ButtonFunc, a_FinishButtonFunc, a_Finish, access_mode = user_access.AccessMode.ADD, field_type = bd_item.FieldType.text):
async def FinishAddBDItem(a_Message, state):
state_func = None
if a_Finish:
@ -81,10 +84,13 @@ def FinishOrNextAddBDItemTemplate(a_Bot, a_FSM, a_AddBDItemFunc, a_ParentTableNa
return simple_message.WorkFuncResult(bot_messages.MakeBotMessage(error_photo_type_message), keyboard_func = a_FinishButtonFunc)
field_value = a_Message.photo[0].file_id
else:
field_value = a_Message.text
result = a_Message.text
if a_PostProcessFunc:
result = a_PostProcessFunc(result)
field_value = result
item_data[a_FieldName] = field_value
if a_Finish:
res, error = a_AddBDItemFunc(item_data, user_id)
res, error = await a_AddBDItemFunc(item_data, user_id)
await state_func()
if error:
return simple_message.WorkFuncResult(bot_messages.MakeBotMessage(error))
@ -101,9 +107,9 @@ def AddBDItem3RegisterHandlers(a_Bot, a_StartCheckFunc, a_FSM, a_FSMName, a_FSMD
reg_func(StartAddBDItemTemplate(a_Bot, a_FSM, a_FSMName, a_AddNameMessageFunc, a_ParentTableName, a_ParentKeyFieldName, a_ParentPrefix, a_AccessFunc, keyboard_cancel, a_ButtonFunc, access_mode), a_StartCheckFunc)
# TODO: Сделать возможность не указывать все поля. пусть a_FSMName и a_NameField например могут быть пустыми. Возможно лучше вообще передавать список полей и их fsm
a_Bot.RegisterMessageHandler(NextAddBDItemTemplate(a_Bot, a_FSM, None, a_ParentTableName, a_ParentKeyFieldName, a_NameField, a_AddDescMessageFunc, a_AccessFunc, keyboard_cancel, a_ButtonFunc, access_mode, field_type = bd_item.FieldType.text), state = a_FSMName)
a_Bot.RegisterMessageHandler(NextAddBDItemTemplate(a_Bot, a_FSM, None, a_ParentTableName, a_ParentKeyFieldName, a_DescField, a_AddPhotoMessageFunc, a_AccessFunc, keyboard_skip_and_cancel, a_ButtonFunc, access_mode, field_type = bd_item.FieldType.text), state = a_FSMDesc)
a_Bot.RegisterMessageHandler(FinishAddBDItemTemplate(a_Bot, a_FSM, a_AddBDItemFunc, a_ParentTableName, a_ParentKeyFieldName, a_PhotoField, a_FinishMessageFunc, a_AccessFunc, a_ButtonFunc, access_mode, field_type = bd_item.FieldType.photo), content_types = ['photo', 'text'], state = a_FSMPhoto)
a_Bot.RegisterMessageHandler(NextAddBDItemTemplate(a_Bot, a_FSM, None, a_ParentTableName, a_ParentKeyFieldName, a_NameField, a_AddDescMessageFunc, None, a_AccessFunc, keyboard_cancel, a_ButtonFunc, access_mode, field_type = bd_item.FieldType.text), state = a_FSMName)
a_Bot.RegisterMessageHandler(NextAddBDItemTemplate(a_Bot, a_FSM, None, a_ParentTableName, a_ParentKeyFieldName, a_DescField, a_AddPhotoMessageFunc, None, a_AccessFunc, keyboard_skip_and_cancel, a_ButtonFunc, access_mode, field_type = bd_item.FieldType.text), state = a_FSMDesc)
a_Bot.RegisterMessageHandler(FinishAddBDItemTemplate(a_Bot, a_FSM, a_AddBDItemFunc, a_ParentTableName, a_ParentKeyFieldName, a_PhotoField, a_FinishMessageFunc, None, a_AccessFunc, a_ButtonFunc, access_mode, field_type = bd_item.FieldType.photo), content_types = ['photo', 'text'], state = a_FSMPhoto)
def AddBDItem1RegisterHandlers(a_Bot, a_StartCheckFunc, a_FSM, a_AddBDItemFunc, a_AddMessageFunc, a_FinishMessageFunc, a_ParentPrefix, a_ParentTableName : str, a_ParentKeyFieldName, a_FieldName, a_GetButtonNameAndKeyValueAndAccessFunc, a_AccessFunc, a_ButtonFunc, a_FieldType, access_mode = user_access.AccessMode.ADD):
keyboard_cancel = bd_item.GetCancelKeyboardButtonsTemplate(a_Bot, a_AccessFunc, access_mode)
@ -111,7 +117,7 @@ def AddBDItem1RegisterHandlers(a_Bot, a_StartCheckFunc, a_FSM, a_AddBDItemFunc,
if a_ParentTableName:
reg_func = a_Bot.RegisterCallbackHandler
reg_func(StartAddBDItemTemplate(a_Bot, a_FSM, a_FSM.bd_item, a_AddMessageFunc, a_ParentTableName, a_ParentKeyFieldName, a_ParentPrefix, a_AccessFunc, keyboard_cancel, a_ButtonFunc, access_mode), a_StartCheckFunc)
finish_handler = FinishAddBDItemTemplate(a_Bot, a_FSM, a_AddBDItemFunc, a_ParentTableName, a_ParentKeyFieldName, a_FieldName, a_FinishMessageFunc, a_AccessFunc, a_ButtonFunc, access_mode, field_type = a_FieldType)
finish_handler = FinishAddBDItemTemplate(a_Bot, a_FSM, a_AddBDItemFunc, a_ParentTableName, a_ParentKeyFieldName, a_FieldName, a_FinishMessageFunc, None, a_AccessFunc, a_ButtonFunc, access_mode, field_type = a_FieldType)
if a_FieldType == bd_item.FieldType.photo:
a_Bot.RegisterMessageHandler(finish_handler, content_types = ['photo', 'text'], state = a_FSM.bd_item)
else:

10
template/bd_item_delete.py

@ -29,16 +29,6 @@ def DeleteBDItemTemplate(a_Bot, a_TableName, a_KeyName, a_PreDeleteWorkFunc, a_P
return simple_message.SimpleMessageTemplate(a_Bot, DeleteBDItem, a_ButtonFunc, None, a_AccessFunc, access_mode)
def SelectAndDeleteBDItemRegisterHandlers(a_Bot, a_PrevPrefix, a_StartCheckFunc, a_TableName : str, a_KeyName, a_ParentIDFieldName,a_PreDeleteWorkFunc, a_PostDeleteWorkFunc, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, a_ButtonFunc, access_mode = user_access.AccessMode.DELETE):
reg_func = a_Bot.RegisterMessageHandler
if a_ParentIDFieldName:
reg_func = a_Bot.RegisterCallbackHandler
a_Prefix = bd_item.HashPrefix(f'delete_{a_TableName}_{a_KeyName}:')
sel_handler = bd_item_select.SelectDBItemTemplate(a_Bot, a_TableName, a_ParentIDFieldName, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, a_PrevPrefix, a_Prefix, access_mode)
reg_func(sel_handler, a_StartCheckFunc)
a_Bot.RegisterCallbackHandler(DeleteBDItemTemplate(a_Bot, a_TableName, a_KeyName, a_PreDeleteWorkFunc, a_PostDeleteWorkFunc, a_Prefix, a_AccessFunc, a_ButtonFunc, access_mode), bd_item.GetCheckForPrefixFunc(a_Prefix))
def DeleteBDItemRegisterHandlers(a_Bot, a_PrevPrefix, a_TableName : str, a_KeyName, a_PreDeleteWorkFunc, a_PostDeleteWorkFunc, a_AccessFunc, a_ButtonFunc, access_mode = user_access.AccessMode.DELETE):
a_Bot.RegisterCallbackHandler(DeleteBDItemTemplate(a_Bot, a_TableName, a_KeyName, a_PreDeleteWorkFunc, a_PostDeleteWorkFunc, a_PrevPrefix, a_AccessFunc, a_ButtonFunc, access_mode), bd_item.GetCheckForPrefixFunc(a_PrevPrefix))

30
template/bd_item_edit.py

@ -18,8 +18,8 @@ error_photo_type_message = '''
def StartEditBDItemTemplate(a_Bot, a_FSM, a_MessageFunc, a_TableName, a_KeyName, a_Prefix, a_AccessFunc, a_ButtonFunc, a_FinishButtonFunc, access_mode = user_access.AccessMode.EDIT):
return bd_item_add.StartAddBDItemTemplate(a_Bot, a_FSM, a_FSM.item_field, a_MessageFunc, a_TableName, a_KeyName, a_Prefix, a_AccessFunc, a_ButtonFunc, a_FinishButtonFunc, access_mode = access_mode)
def FinishEditBDItemTemplate(a_Bot, a_FSM, a_TableName, a_KeyName, a_FieldName, a_MessageFunc, a_AccessFunc, a_ButtonFunc, a_OnChangeFunc, access_mode = user_access.AccessMode.EDIT, field_type = bd_item.FieldType.text):
def EditBDItemFunc(a_ItemData, a_UserID):
def FinishEditBDItemTemplate(a_Bot, a_FSM, a_TableName, a_KeyName, a_FieldName, a_MessageFunc, a_PostProcessFunc, a_AccessFunc, a_ButtonFunc, a_OnChangeFunc, access_mode = user_access.AccessMode.EDIT, field_type = bd_item.FieldType.text):
async def EditBDItemFunc(a_ItemData, a_UserID):
item_id = a_ItemData[a_KeyName]
field_value = a_ItemData[a_FieldName]
res, error = bd_item.EditBDItemInTableTemplate(a_Bot, a_TableName, a_KeyName, a_FieldName)(item_id, field_value)
@ -28,22 +28,18 @@ def FinishEditBDItemTemplate(a_Bot, a_FSM, a_TableName, a_KeyName, a_FieldName,
else:
a_Bot.GetLog().Success(f'Пользователь {a_UserID} изменил поле в таблице {a_TableName} ключу {a_KeyName}={item_id}. Новое значение поля {a_FieldName}={field_value}.')
a_OnChangeFunc()
await a_OnChangeFunc(item_id, a_ItemData, a_UserID)
return res, error
return bd_item_add.FinishAddBDItemTemplate(a_Bot, a_FSM, EditBDItemFunc, a_TableName, a_KeyName, a_FieldName, a_MessageFunc, a_AccessFunc, a_ButtonFunc, access_mode = access_mode, field_type = field_type)
def EditBDItemRegisterHandlers(a_Bot, a_PrevPrefix, a_FSM, a_StartCheckFunc, a_StartMessage, a_EditMessageFunc, a_FinishMessageFunc, a_TableName : str, a_KeyName, a_ParentIDFieldName, a_FieldName, a_GetButtonNameAndKeyValueAndAccessFunc, a_AccessFunc, a_ButtonFunc, a_OnChangeFunc, access_mode = user_access.AccessMode.EDIT, field_type = bd_item.FieldType.text):
reg_func = a_Bot.RegisterMessageHandler
if a_ParentIDFieldName:
reg_func = a_Bot.RegisterCallbackHandler
keyboard_cancel = bd_item.GetCancelKeyboardButtonsTemplate(a_Bot, a_AccessFunc, access_mode)
a_Prefix = bd_item.HashPrefix(f'edit_{a_TableName}_{a_KeyName}_{a_FieldName}:')
sel_handler = bd_item_select.SelectDBItemTemplate(a_Bot, a_TableName, a_ParentIDFieldName, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, a_PrevPrefix, a_Prefix, access_mode)
reg_func(sel_handler, a_StartCheckFunc)
a_Bot.RegisterCallbackHandler(StartEditBDItemTemplate(a_Bot, a_FSM, a_EditMessageFunc, a_TableName, a_KeyName, a_Prefix, a_AccessFunc, keyboard_cancel, a_ButtonFunc, access_mode), bd_item.GetCheckForPrefixFunc(a_Prefix))
return bd_item_add.FinishAddBDItemTemplate(a_Bot, a_FSM, EditBDItemFunc, a_TableName, a_KeyName, a_FieldName, a_MessageFunc, a_PostProcessFunc, a_AccessFunc, a_ButtonFunc, access_mode = access_mode, field_type = field_type)
def EditBDItemRegisterHandlers(a_Bot, a_SelectSource, a_FSM, a_StartMessage, a_EditMessageFunc, a_FinishMessageFunc, a_TableName, a_KeyName, a_FieldName, a_PostProcessFunc, a_GetButtonNameAndKeyValueAndAccessFunc, a_AccessFunc, a_AdditionalButtonFunc, a_FinishButtonFunc, a_OnChangeFunc, access_mode = user_access.AccessMode.EDIT, field_type = bd_item.FieldType.text):
keyboard = bd_item.MixKeyboardFuncTemplate(a_AdditionalButtonFunc, bd_item.GetCancelKeyboardButtonsTemplate(a_Bot, a_AccessFunc, access_mode))
a_Prefix = bd_item_select.SelectRegisterHandlers(a_Bot, a_SelectSource, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, access_mode = access_mode)
a_Bot.RegisterCallbackHandler(StartEditBDItemTemplate(a_Bot, a_FSM, a_EditMessageFunc, a_TableName, a_KeyName, a_Prefix, a_AccessFunc, keyboard, a_FinishButtonFunc, access_mode), bd_item.GetCheckForPrefixFunc(a_Prefix))
if field_type == bd_item.FieldType.photo:
a_Bot.RegisterMessageHandler(FinishEditBDItemTemplate(a_Bot, a_FSM, a_TableName, a_KeyName, a_FieldName, a_FinishMessageFunc, a_AccessFunc, a_ButtonFunc, a_OnChangeFunc, access_mode, field_type = field_type), content_types = ['photo', 'text'], state = a_FSM.item_field)
a_Bot.RegisterMessageHandler(FinishEditBDItemTemplate(a_Bot, a_FSM, a_TableName, a_KeyName, a_FieldName, a_FinishMessageFunc, a_PostProcessFunc, a_AccessFunc, a_FinishButtonFunc, a_OnChangeFunc, access_mode, field_type = field_type), content_types = ['photo', 'text'], state = a_FSM.item_field)
else:
a_Bot.RegisterMessageHandler(FinishEditBDItemTemplate(a_Bot, a_FSM, a_TableName, a_KeyName, a_FieldName, a_FinishMessageFunc, a_AccessFunc, a_ButtonFunc, a_OnChangeFunc, access_mode, field_type = field_type), state = a_FSM.item_field)
a_Bot.RegisterMessageHandler(FinishEditBDItemTemplate(a_Bot, a_FSM, a_TableName, a_KeyName, a_FieldName, a_FinishMessageFunc, a_PostProcessFunc, a_AccessFunc, a_FinishButtonFunc, a_OnChangeFunc, access_mode, field_type = field_type), state = a_FSM.item_field)

89
template/bd_item_select.py

@ -7,14 +7,12 @@ from bot_sys import user_access, bot_bd, keyboard
from bot_modules import access_utils, groups_utils
from template import simple_message, bd_item
def GetBDItemsListKeyboardButtonsTemplate(a_Bot, a_TableName : str, a_ParentIDFieldName, a_PrevPrefix, a_NextPrefix : str, a_GetButtonNameAndKeyValueAndAccessFunc, access_mode = user_access.AccessMode.VIEW):
from abc import ABC, abstractmethod
def GetCustomListKeyboardButtonsTemplate(a_Bot, a_GetItemsFunc, a_PrevPrefix, a_NextPrefix : str, a_GetButtonNameAndKeyValueAndAccessFunc, access_mode = user_access.AccessMode.VIEW):
def GetBDItemsListKeyboardButtons(a_Message, a_UserGroups):
parent_id = bd_item.GetKeyDataFromCallbackMessage(a_Message, a_PrevPrefix)
items = []
if a_ParentIDFieldName and parent_id and parent_id != '':
items = bd_item.GetBDItemsTemplate(a_Bot, a_TableName, a_ParentIDFieldName)(parent_id)
else:
items = bd_item.GetAllItemsTemplate(a_Bot, a_TableName)()
items = a_GetItemsFunc(a_Message, a_UserGroups, parent_id)
items_button_list = []
for t in items:
@ -27,23 +25,78 @@ def GetBDItemsListKeyboardButtonsTemplate(a_Bot, a_TableName : str, a_ParentIDFi
return keyboard.MakeInlineKeyboardButtons(a_Bot, items_button_list, a_UserGroups)
return GetBDItemsListKeyboardButtons
def SelectDBItemTemplate(a_Bot, a_TableName : str, a_ParentIDFieldName, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, a_PrevPrefix, a_NextPrefix, access_mode = user_access.AccessMode.VIEW):
inline_keyboard_func = GetBDItemsListKeyboardButtonsTemplate(a_Bot, a_TableName, a_ParentIDFieldName, a_PrevPrefix, a_NextPrefix, a_GetButtonNameAndKeyValueAndAccessFunc)
def GetBDItemsTemplate(a_Bot, a_TableName : str, a_ParentIDFieldName):
def GetBDItems(a_Message, a_UserGroups, a_ParentID):
items = []
if a_ParentIDFieldName and a_ParentID and a_ParentID != '':
items = bd_item.GetBDItemsTemplate(a_Bot, a_TableName, a_ParentIDFieldName)(a_ParentID)
else:
items = bd_item.GetAllItemsTemplate(a_Bot, a_TableName)()
return items
return GetBDItems
def SelectCustomTemplate(a_Bot, a_GetItemsFunc, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, a_PrevPrefix, a_NextPrefix, access_mode = user_access.AccessMode.VIEW):
inline_keyboard_func = GetCustomListKeyboardButtonsTemplate(a_Bot, a_GetItemsFunc, a_PrevPrefix, a_NextPrefix, a_GetButtonNameAndKeyValueAndAccessFunc)
return simple_message.InfoMessageTemplate(a_Bot, a_StartMessage, None, inline_keyboard_func, a_AccessFunc, access_mode)
def FirstSelectBDItemRegisterHandlers(a_Bot, a_PrefixBase, a_ButtonName, a_TableName : str, a_KeyName, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, access_mode = user_access.AccessMode.VIEW):
class ISelectSource(ABC):
@abstractmethod
def IsFirst(self):
pass
@abstractmethod
def GetItemsFunc(self):
pass
@abstractmethod
def GetCheckFunc(self):
pass
@abstractmethod
def GetPrevPrefix(self):
pass
@abstractmethod
def GetPrefixBase(self):
pass
class DBItemSelectSource(ISelectSource):
def __init__(self, a_Bot, a_TableName, a_ParentIDFieldName, a_PrevPrefix, a_ButtonName):
self.m_Bot = a_Bot
self.m_TableName = a_TableName
self.m_ParentIDFieldName = a_ParentIDFieldName
self.m_PrevPrefix = a_PrevPrefix
self.m_ButtonName = a_ButtonName
def IsFirst(self):
return not self.m_ParentIDFieldName
def GetItemsFunc(self):
return GetBDItemsTemplate(self.m_Bot, self.m_TableName, self.m_ParentIDFieldName)
def GetCheckFunc(self):
if self.IsFirst():
return bd_item.GetCheckForTextFunc(self.m_ButtonName)
return bd_item.GetCheckForPrefixFunc(self.m_PrevPrefix)
def GetPrevPrefix(self):
return self.m_PrevPrefix
a_Prefix = bd_item.HashPrefix(f'first_select_{a_TableName}_{a_KeyName}_in_base_{a_PrefixBase}:')
def GetPrefixBase(self):
if self.m_PrevPrefix:
return self.m_PrevPrefix
return self.m_ButtonName
sel_handler = SelectDBItemTemplate(a_Bot, a_TableName, None, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, None, a_Prefix, access_mode = access_mode)
a_Bot.RegisterMessageHandler(sel_handler, bd_item.GetCheckForTextFunc(a_ButtonName))
def SelectRegisterHandlers(a_Bot, a_SelectSource, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, access_mode = user_access.AccessMode.VIEW):
reg_func = a_Bot.RegisterMessageHandler
if not a_SelectSource.IsFirst():
reg_func = a_Bot.RegisterCallbackHandler
return a_Prefix
a_NextPrefix = bd_item.HashPrefix(f'select_{a_SelectSource}_after_prefix_or_in_base_{a_SelectSource.GetPrefixBase()}:')
def NextSelectBDItemRegisterHandlers(a_Bot, a_PrevPrefix, a_ParentIDFieldName, a_TableName : str, a_KeyName, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, access_mode = user_access.AccessMode.VIEW):
a_Prefix = bd_item.HashPrefix(f'next_select_{a_TableName}_{a_KeyName}_{a_ParentIDFieldName}_after_prefix_{a_PrevPrefix}:')
sel_handler = SelectCustomTemplate(a_Bot, a_SelectSource.GetItemsFunc(), a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, a_SelectSource.GetPrevPrefix(), a_NextPrefix, access_mode = access_mode)
reg_func(sel_handler, a_SelectSource.GetCheckFunc())
sel_handler = SelectDBItemTemplate(a_Bot, a_TableName, a_ParentIDFieldName, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, a_PrevPrefix, a_Prefix, access_mode = access_mode)
a_Bot.RegisterCallbackHandler(sel_handler, bd_item.GetCheckForPrefixFunc(a_PrevPrefix))
return a_NextPrefix
return a_Prefix

10
template/bd_item_view.py

@ -5,18 +5,10 @@
from bot_sys import user_access, bot_bd, keyboard
from bot_modules import access_utils, groups_utils
from template import simple_message, bd_item_select, bd_item_delete, bd_item
from template import simple_message, bd_item_delete, bd_item
def ShowBDItemTemplate(a_Bot, a_TableName, a_KeyName, a_WorkFunc, a_Prefix, a_AccessFunc, a_ButtonFunc, access_mode = user_access.AccessMode.VIEW):
return bd_item_delete.DeleteBDItemTemplate(a_Bot, a_TableName, a_KeyName, a_WorkFunc, None, a_Prefix, a_AccessFunc, a_ButtonFunc, access_mode = access_mode, delete = False)
def ShowBDItemRegisterHandlers(a_Bot, a_PrevPrefix, a_TableName : str, a_KeyName, a_ShowItemWorkFunc, a_AccessFunc, a_ButtonFunc, access_mode = user_access.AccessMode.VIEW):
a_Bot.RegisterCallbackHandler(ShowBDItemTemplate(a_Bot, a_TableName, a_KeyName, a_ShowItemWorkFunc, a_PrevPrefix, a_AccessFunc, a_ButtonFunc, access_mode = access_mode), bd_item.GetCheckForPrefixFunc(a_PrevPrefix))
def FirstSelectAndShowBDItemRegisterHandlers(a_Bot, a_ButtonName, a_TableName : str, a_KeyName, a_ShowItemWorkFunc, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, a_ButtonFunc, access_mode = user_access.AccessMode.VIEW):
a_Prefix = bd_item_select.FirstSelectBDItemRegisterHandlers(a_Bot, '', a_ButtonName, a_TableName, a_KeyName, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, access_mode = access_mode)
ShowBDItemRegisterHandlers(a_Bot, a_Prefix, a_TableName, a_KeyName, a_ShowItemWorkFunc, a_AccessFunc, a_ButtonFunc, access_mode = access_mode)
def LastSelectAndShowBDItemRegisterHandlers(a_Bot, a_PrevPrefix, a_ParentIDFieldName, a_TableName : str, a_KeyName, a_ShowItemWorkFunc, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, a_ButtonFunc, access_mode = user_access.AccessMode.VIEW):
a_Prefix = bd_item_select.NextSelectBDItemRegisterHandlers(a_Bot, a_PrevPrefix, a_ParentIDFieldName, a_TableName, a_KeyName, a_GetButtonNameAndKeyValueAndAccessFunc, a_StartMessage, a_AccessFunc, access_mode = access_mode)
ShowBDItemRegisterHandlers(a_Bot, a_Prefix, a_TableName, a_KeyName, a_ShowItemWorkFunc, a_AccessFunc, a_ButtonFunc, access_mode = access_mode)

Loading…
Cancel
Save