# -*- coding: utf8 -*-
# Общественное достояние, 2023, Алексей Безбородов (Alexei Bezborodov) <AlexeiBv+mirocod_platform_bot@narod.ru>
# Редактирование элемента в БД
from bot_sys import user_access , bot_bd , log
from bot_modules import access , groups
from template import simple_message , bd_item_select , bd_item
from aiogram import types
from aiogram . dispatcher import FSMContext
from aiogram . dispatcher . filters . state import State , StatesGroup
#TODO: Переделать на FinishOrNextAddBDItemTemplate StartAddBDItemTemplate
cancel_message = '''
🚫 Редактирование отменено
'''
error_photo_type_message = '''
🚫 Фотографий не найдено
'''
def StartEditBDItemTemplate ( a_FSM , a_MessageFunc , a_TableName , a_KeyName , a_FieldName , a_Prefix , a_AccessFunc , a_ButtonFunc , access_mode = user_access . AccessMode . EDIT ) :
async def StartEditBDItem ( a_CallbackQuery : types . CallbackQuery , state : FSMContext ) :
user_id = str ( a_CallbackQuery . from_user . id )
user_groups = groups . GetUserGroupData ( user_id )
await a_FSM . item_id . set ( )
item_id = str ( a_CallbackQuery . data ) . replace ( a_Prefix , ' ' )
res_of_work_func = None
async with state . proxy ( ) as item_data :
item_data [ ' item_id ' ] = item_id
check , res_of_work_func = await bd_item . CheckAccessBDItemTemplate ( a_TableName , a_KeyName , item_id , a_MessageFunc , access_mode ) ( a_CallbackQuery )
if not check is None :
await state . finish ( )
return check
await a_FSM . next ( )
return res_of_work_func
return simple_message . SimpleMessageTemplate ( StartEditBDItem , a_ButtonFunc , a_AccessFunc , access_mode )
def FinishEditBDItemTemplate ( a_FSM , a_TableName , a_KeyName , a_FieldName , a_MessageFunc , a_AccessFunc , a_ButtonFunc , access_mode = user_access . AccessMode . EDIT , field_type = bd_item . FieldType . text ) :
async def FinishEditBDItem ( a_Message : types . CallbackQuery , state : FSMContext ) :
user_id = str ( a_Message . from_user . id )
user_groups = groups . GetUserGroupData ( user_id )
error = None
res_of_work_func = None
async with state . proxy ( ) as item_data :
if a_Message . text == bd_item . canсel_button_name :
await state . finish ( )
return simple_message . WorkFuncResult ( cancel_message )
item_id = item_data [ ' item_id ' ]
check , res_of_work_func = await bd_item . CheckAccessBDItemTemplate ( a_TableName , a_KeyName , item_id , a_MessageFunc , access_mode ) ( a_Message )
if not check is None :
await state . finish ( )
return check
field_value = ' '
if field_type == bd_item . FieldType . photo :
if a_Message . photo == None or len ( a_Message . photo ) == 0 :
await state . finish ( )
return simple_message . WorkFuncResult ( error_photo_type_message )
field_value = a_Message . photo [ 0 ] . file_id
else :
field_value = a_Message . text
res , error = bd_item . EditBDItemInTableTemplate ( a_TableName , a_KeyName , a_FieldName ) ( item_id , field_value )
log . Success ( f ' Изменено поле в таблице { a_TableName } ключу { a_KeyName } = { item_id } . Новое значение поля { a_FieldName } = { field_value } . Пользователь { user_id } . ' )
await state . finish ( )
if error :
return simple_message . WorkFuncResult ( error )
return res_of_work_func
return simple_message . SimpleMessageTemplate ( FinishEditBDItem , a_ButtonFunc , a_AccessFunc , access_mode )
def EditBDItemRegisterHandlers ( dp , a_FSM , a_ButtonName , a_StartMessage , a_EditMessageFunc , a_FinishMessageFunc , a_TableName : str , a_KeyName , a_FieldName , a_GetButtonNameAndKeyValueAndAccessFunc , a_AccessFunc , a_ButtonFunc , access_mode = user_access . AccessMode . EDIT , field_type = bd_item . FieldType . text ) :
keyboard_cancel = bd_item . GetCancelKeyboardButtonsTemplate ( a_AccessFunc , access_mode )
a_Prefix = f ' edit_ { a_TableName } _ { a_KeyName } _ { a_FieldName } : '
sel_handler = bd_item_select . SelectDBItemTemplate ( a_TableName , None , a_GetButtonNameAndKeyValueAndAccessFunc , a_StartMessage , a_AccessFunc , None , a_Prefix , access_mode )
dp . register_message_handler ( sel_handler , text = a_ButtonName )
dp . register_callback_query_handler ( StartEditBDItemTemplate ( a_FSM , a_EditMessageFunc , a_TableName , a_KeyName , a_FieldName , a_Prefix , a_AccessFunc , keyboard_cancel , access_mode ) , bd_item . GetCheckForPrefixFunc ( a_Prefix ) )
if field_type == bd_item . FieldType . photo :
dp . register_message_handler ( FinishEditBDItemTemplate ( a_FSM , a_TableName , a_KeyName , a_FieldName , a_FinishMessageFunc , a_AccessFunc , a_ButtonFunc , access_mode , field_type = field_type ) , content_types = [ ' photo ' , ' text ' ] , state = a_FSM . item_field )
else :
dp . register_message_handler ( FinishEditBDItemTemplate ( a_FSM , a_TableName , a_KeyName , a_FieldName , a_FinishMessageFunc , a_AccessFunc , a_ButtonFunc , access_mode , field_type = field_type ) , state = a_FSM . item_field )