Browse Source

Сделаны в простейшем виде оповещения для пользователей об изменении статуса заказа.

pull/3/head
Alexei 2 years ago
parent
commit
775c03d574
  1. 42
      bot_modules/all_orders.py
  2. 29
      bot_modules/mod_table_operate.py
  3. 6
      bot_modules/orders.py
  4. 43
      bot_sys/bot_subscribes.py
  5. 2
      template/bd_item_add.py
  6. 4
      template/bd_item_edit.py

42
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
)

29
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\

6
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\

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

2
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))

4
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)

Loading…
Cancel
Save