diff --git a/bot_modules/all_orders.py b/bot_modules/all_orders.py index f7de343..2c1b30b 100644 --- a/bot_modules/all_orders.py +++ b/bot_modules/all_orders.py @@ -7,7 +7,6 @@ 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' @@ -28,6 +27,7 @@ cur_button_names = { 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): "𝌴 Изменить описание в заказе", @@ -70,7 +70,19 @@ cur_messages = { ''', } +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): @@ -120,3 +132,31 @@ class ModuleAllOrders(orders.ModuleOrders): parent_field_id = self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.PARENT_ID) n, k, a = super().GetButtonNameAndKeyValueAndAccess(a_Item) return n + ":" + str(a_Item[parent_field_id]), k, a + + async def OnChangeField(self, a_Field, a_ItemID, a_ItemData, a_EditUserID): + if a_Field.m_Destiny == bd_table.TableFieldDestiny.STATUS: + key_field = self.m_Table.GetFieldNameByDestiny(bd_table.TableFieldDestiny.KEY) + item = bd_item.GetBDItemsTemplate(self.m_Bot, self.m_Table.GetName(), key_field)(a_ItemID) + if len(item) < 1: + self.m_Log.Error(f'Не удалось оповестить по заказу №{a_ItemID}.') + return + + item = item[0] + parent_field_id = self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.PARENT_ID) + status_field_id = self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.STATUS) + print('OnChangeField', item, parent_field_id, status_field_id) + owner_id = item[parent_field_id] + new_status = item[status_field_id] + msg = self.GetMessage(mod_table_operate.NotificationMessage(new_status)) + if not msg: + self.m_Log.Error(f'Не удалось оповестить по заказу №{a_ItemID}. Пустое сообщение для нового статуса {new_status}') + return + msg = self.UpdateMessage(msg, None, item) + await self.m_Bot.SendMessage( + owner_id, + msg.GetDesc(), + msg.GetPhotoID(), + None, + None + ) + diff --git a/bot_modules/mod_table_operate.py b/bot_modules/mod_table_operate.py index dd109b6..f1a3347 100644 --- a/bot_modules/mod_table_operate.py +++ b/bot_modules/mod_table_operate.py @@ -28,6 +28,9 @@ def CreateMessage(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() @@ -107,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): @@ -133,7 +136,10 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): mod_buttons = keyboard.MakeButtons(self.m_Bot, self.GetButtons(self.m_EditModuleNameList), a_UserGroups) cur_buttons = [] for f in self.m_Table.GetFields(): - cur_buttons += [keyboard.ButtonWithAccess(self.GetButton(EditButton(f.m_Destiny)), user_access.AccessMode.EDIT, self.GetAccess()),] + 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): @@ -165,7 +171,7 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): a_Item[key_name_id],\ a_Item[access_field_id] - def UpdateMessage(self, a_Msg, a_Lang, a_Item): + 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 @@ -178,10 +184,11 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): elif f.m_Type == bd_table.TableFieldType.PHOTO: photos += [str(a_Item[field_id])] field_id += 1 - a_Msg.UpdatePhotoID(','.join(photos)) + if a_EnablePhoto: + a_Msg.UpdatePhotoID(','.join(photos)) return a_Msg - def ShowMessageTemplate(self, a_Message, Inline_keyboard_template_func = None): + 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 @@ -213,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) @@ -297,6 +304,9 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): 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)) @@ -309,7 +319,8 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): if not a_ButtonName or not a_EditMessage: return - def OnChange(): + 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() @@ -381,7 +392,7 @@ class TableOperateModule(mod_simple_message.SimpleMessageModule): a_Prefix,\ table_name,\ key_name,\ - self.ShowMessageTemplate(self.GetMessage(Messages.OPEN), GetViewItemInlineKeyboardTemplate),\ + self.ShowMessageTemplate(self.GetMessage(Messages.OPEN), GetViewItemInlineKeyboardTemplate, a_EnablePhoto = True),\ GetAccess,\ defaul_keyboard_func,\ access_mode = user_access.AccessMode.VIEW\ diff --git a/bot_modules/orders.py b/bot_modules/orders.py index a19209e..e534a34 100644 --- a/bot_modules/orders.py +++ b/bot_modules/orders.py @@ -45,7 +45,7 @@ table = bd_table.Table(table_name, [ bd_table.TableField(parent_id_field, bd_table.TableFieldDestiny.PARENT_ID, bd_table.TableFieldType.INT), ]) -init_access = f'{user_access.user_access_group_new}=va' +init_access = f'{user_access.user_access_group_new}=vea' # --------------------------------------------------------- # Сообщения и кнопки @@ -59,7 +59,7 @@ button_names = { 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_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): "𝌴 Изменить описание в моём заказе", @@ -244,7 +244,7 @@ class ModuleOrders(mod_table_operate.TableOperateModule): a_Prefix,\ table_name,\ key_name,\ - self.ShowMessageTemplate(self.GetMessage(mod_table_operate.Messages.OPEN),GetViewItemInlineKeyboardTemplate),\ + self.ShowMessageTemplate(self.GetMessage(mod_table_operate.Messages.OPEN),GetViewItemInlineKeyboardTemplate, a_EnablePhoto = True),\ GetAccess,\ default_keyboard_func,\ access_mode = user_access.AccessMode.VIEW\ diff --git a/bot_sys/bot_subscribes.py b/bot_sys/bot_subscribes.py new file mode 100644 index 0000000..523fe94 --- /dev/null +++ b/bot_sys/bot_subscribes.py @@ -0,0 +1,43 @@ +#-*-coding utf-8-*- +# Общественное достояние, 2023, Алексей Безбородов (Alexei Bezborodov) + +# Работа с подписками + +from enum import Enum +from enum import auto + +# Тип поля в таблице +class SubscribeType(Enum): + ADD = auto() + ANY_ITEM_DEL = auto() + ANY_ITEM_EDIT = auto() + ITEM_DEL = auto() + ITEM_EDIT = auto() + +class BotSubscribes + def __init__(self): + self.Clear() + + def GetSubscribes(self): + return self.m_Subscribes + + def Clear(self): + self.m_Subscribes = {} + + def CheckSubscribe(self, a_UserID, a_ModuleName, a_Type, a_ItemID = -1): + s = self.GetSubscribes() + su = s.get(a_UserID, None) + if su: + sub_um = su.get(a_ModuleName, None) + if sub_um: + t = su.get(a_ItemID, None) + return t + return None + + def AddSubscribe(self, a_UserID, a_ModuleName, a_Type, a_ItemID = -1): + s = self.GetSubscribes() + if not s.get(a_UserID, None): + s[a_UserID] = {} + if not s[a_UserID].get(a_ModuleName, None): + s[a_UserID][a_ModuleName] = {} + s[a_UserID][a_ModuleName][a_ItemID] = a_Type diff --git a/template/bd_item_add.py b/template/bd_item_add.py index 373bac3..54c6960 100644 --- a/template/bd_item_add.py +++ b/template/bd_item_add.py @@ -90,7 +90,7 @@ def FinishOrNextAddBDItemTemplate(a_Bot, a_FSM, a_AddBDItemFunc, a_ParentTableNa 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)) diff --git a/template/bd_item_edit.py b/template/bd_item_edit.py index 8b85a66..9e877e7 100644 --- a/template/bd_item_edit.py +++ b/template/bd_item_edit.py @@ -19,7 +19,7 @@ def StartEditBDItemTemplate(a_Bot, a_FSM, a_MessageFunc, a_TableName, a_KeyName, 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_PostProcessFunc, a_AccessFunc, a_ButtonFunc, a_OnChangeFunc, access_mode = user_access.AccessMode.EDIT, field_type = bd_item.FieldType.text): - def EditBDItemFunc(a_ItemData, a_UserID): + 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,7 +28,7 @@ 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_PostProcessFunc, a_AccessFunc, a_ButtonFunc, access_mode = access_mode, field_type = field_type)