0

I have to find user_id and order_id in the message, but I want to make a separate class for this search. I just want to optimise my code.

I have highlighted a part of the code(#-----) that I would like to cram into a separate file, but since I am a beginner I do not understand how it could be implemented. Tell me, please or at least a similar example to figure it out for yourself.

This is my code:

@dp.callback_query_handler(text="accept_ord", state=None)
    async def process_order_callback_4(query: types.CallbackQuery):
    answ_date_2=query.data

#------------
    #find the text from message
    text = str(query.message.text)
    #find id_order from the text of the message
    id = text.split('\n')[0].split("№ ")[1]
    #from str to int
    id_1 = int(re.search('\d+', id).group(0))
    #find id_user from table_2 in db
    cl_id = str(db.get_user_id_admin(id_1))
    #from str to int
    cl_id_1 = int(re.search('\d+', cl_id).group(0))
    #find id_user from table_1 in db
    user_id = str(db.get_user_telegram_id_admin(cl_id_1))
    user_id_clear=int(re.search('\d+', user_id).group(0))
    #------------

    await bot.send_message(user_id_clear,
                           text=f'The status of the order has been change №{id_1} изменен!\n\nPlease check main menu (/start)')
    if answ_date_2 == "accept_ord":
        status = 2
        db.set_new_status(id_1, status)

        await bot.send_message(query.from_user.id, text=f'The order №{id_1} has been assepted.', reply_markup=nav.back_admin_menu_order)

It looks kreepy, but it works, hah.

Ivan W
  • 41
  • 6

1 Answers1

1

Avoid obsessing about classes; a class has a distinct theory that should not be abused. However, as you noted, your code appears to be a bit lengthy, and I would suggest the following:

@dp.callback_query_handler(text="accept_ord", state=None)
async def process_order_callback_4(query: types.CallbackQuery):
    answ_date_2=query.data

    #------------
    id_1, user_id_clear = await __mySearch(query)
    #------------
    
    await bot.send_message(user_id_clear,
                           text=f'The status of the order has been change №{id_1} изменен!\n\nPlease check main menu (/start)')
    if answ_date_2 == "accept_ord":
        status = 2
        db.set_new_status(id_1, status)
    
        await bot.send_message(query.from_user.id, text=f'The order №{id_1} has been assepted.', reply_markup=nav.back_admin_menu_order)


async def __mySearch(query):
    #find the text from message
    text = str(query.message.text)
    #find id_order from the text of the message
    id = text.split('\n')[0].split("№ ")[1]
    #from str to int
    id_1 = int(re.search('\d+', id).group(0))
    #find id_user from table_2 in db
    cl_id = str(db.get_user_id_admin(id_1))
    #from str to int
    cl_id_1 = int(re.search('\d+', cl_id).group(0))
    #find id_user from table_1 in db
    user_id = str(db.get_user_telegram_id_admin(cl_id_1))
    user_id_clear = int(re.search('\d+', user_id).group(0))
    return id_1, user_id_clear

Note: For some tasks, it is acceptable to construct a utils.py that does the task generically with the parameters provided and returns the desired result. It could be extracted into another file and called within yours such as import myFile (refer to this thread for more information)

Simon Provost
  • 356
  • 1
  • 2
  • 15