Problem with replace var in docx document with value from bot

31 views Asked by At
import telebot
from telebot import types
from docxtpl import DocxTemplate
from docx import Document
import tempfile
import os
from datetime import datetime

Token = '6916931629:AAG0EB9xsAgJ5RLS_S3BErGwIhGQnr3pWJQ'
bot = telebot.TeleBot(Token)

previous_messages = {}
messages = []
user_data = {}
question_stack = {}  # Стек вопросов и ответов
# Вопросы для каждой переменной
questions = {
    'Name_student': 'ФИО с инициалами',
    'student_gender': 'Вы студент или студентка?',
    'student_group': 'Ваша группа:',
    'student_gender_type': 'отсутствовал' if 'студент' in 'Вы студент или студентка?' else 'отсутствовала',
    'date_lesson': 'Дата занятия',
    'prichina': 'Причина отсутствия(желательно)',
    'Date_create': datetime.now().strftime('%d %B %Y')
}

def fill_document(template_path, data):
    doc = Document(template_path)

    for key, value in data.items():
        # Replace placeholders in the document with data
        for paragraph in doc.paragraphs:
            if f'{{{key}}}' in paragraph.text:
                paragraph.text = paragraph.text.replace(f'{{{key}}}', str(value))
                print(paragraph.text)
        for table in doc.tables:
            for row in table.rows:
                for cell in row.cells:
                    if f'{{{key}}}' in cell.text:
                        cell.text = cell.text.replace(f'{{{key}}}', str(value))

    return doc

def send_document(chat_id, doc):
    with tempfile.NamedTemporaryFile(delete=False, suffix=".docx") as temp_file:
        temp_file_name = temp_file.name
        doc.save(temp_file_name)
        temp_file.close()
        with open(temp_file_name, 'rb') as file:
            # Assume 'bot' is defined elsewhere in your code
            bot.send_document(chat_id, file)
        os.unlink(temp_file_name)  # Delete the temporary file after sending

def ask_next_question(message, user_id):
    variables = list(questions.keys())

    if user_id not in user_data:
        user_data[user_id] = {}

    current_index = len(user_data[user_id])
    variables_excluded = [var for var in variables if var not in ['student_gender_type', 'Date_create']]

    if current_index < len(variables_excluded):
        next_variable = variables_excluded[current_index]
        question_text = questions[next_variable]
        bot.send_message(message.chat.id, question_text)

        # Save the question and answer in the stack
        question_stack[user_id] = {'variable': next_variable, 'question_text': question_text}
        previous_messages[message.chat.id] = [message.message_id]
        bot.register_next_step_handler(message, process_answer)
    else:
        generate_and_send_document(message, user_id)

def process_answer(message):
    user_id = message.from_user.id
    variable = question_stack[user_id]['variable']
    answer = message.text

    # If the variable is 'Date_create', format the date with digits only
    if variable == 'Date_create':
        answer = datetime.now().strftime('%d%m%Y')

    user_data[user_id][variable] = answer

    # Remove the question from the stack
    question_stack.pop(user_id, None)

    ask_next_question(message, user_id)

def generate_and_send_document(message, user_id):
    template_path = 'PHOTOS/College/Обьяснительная.docx'

    if user_id in user_data:
        document_data = user_data[user_id]
        filled_document = fill_document(template_path, document_data)
        send_document(message.chat.id, filled_document)
        del user_data[user_id]
def send_start_message(message):
    markup = types.InlineKeyboardMarkup(row_width=2)
    item1 = types.InlineKeyboardButton("Гос.услуги", callback_data='goverments')
    item2 = types.InlineKeyboardButton("Колледж", callback_data='college')
    item3 = types.InlineKeyboardButton("Судебное", callback_data='courts')
    item4 = types.InlineKeyboardButton("Нотариус", callback_data='notarius')
    markup.add(item1, item2, item3, item4)
    sent_message = bot.send_message(message.chat.id, "Выберите образец который хотите получить", reply_markup=markup)
    # Сохраняем только текущее сообщение пользователя в списке
    previous_messages[message.chat.id] = [sent_message.message_id]


@bot.message_handler(commands=['start'])
def start_message(message):
    # Отправляем информацию о студенте
    student_info = "Данный бот является курсовым проектом студента группы
    bot.send_message(message.chat.id, student_info)

    # Отправляем ссылки на инстаграм и вк
    instagram_link = "https://www.instagram.com/"
    vk_link = "https://vk.com"
    social_media_info = f"Инстаграм: {instagram_link}\nВКонтакте: {vk_link}"
    bot.send_message(message.chat.id, social_media_info)

    # Просим пользователя написать слово "Документы" для начала работы
    bot.send_message(message.chat.id, "Для начала работы бота напишите слово 'Документы'")


@bot.message_handler(func=lambda message: message.text.lower() == 'документы' or message.text.lower() == '/start')
def handle_start_message(message):
    send_start_message(message)


@bot.callback_query_handler(func=lambda call: True)
def handle_callback_query(call):
    user_id = call.from_user.id
    if call.message.chat.id in previous_messages:
        for msg_id in previous_messages[call.message.chat.id]:
            bot.delete_message(call.message.chat.id, msg_id)
        previous_messages[call.message.chat.id] = []  # Очищаем список
    if call.data == 'college_button1':
        bot.send_message(call.message.chat.id, "Начнем опрос. Ответьте на следующие вопросы:")
        user_data[user_id] = {}
        ask_next_question(call.message, user_id)
    elif call.data == 'college_back_button':
        send_start_message(call.message)

    # ... (остальной ваш код)
    if call.data == 'goverments':
        markup1 = types.InlineKeyboardMarkup(row_width=2)
        item1_1 = types.InlineKeyboardButton("Гос.услуги 1", callback_data='goverments_buttion1')
        item1_2 = types.InlineKeyboardButton("Гос.услуги 2", callback_data='goverments_buttion2')
        item1_3 = types.InlineKeyboardButton("Гос.услуги 3", callback_data='goverments_buttion3')
        item1_4 = types.InlineKeyboardButton("Назад", callback_data='goverments_back_button')
        markup1.add(item1_1, item1_2, item1_3, item1_4)
        sent_message = bot.send_message(chat_id=call.message.chat.id, text="Выберите документ", reply_markup=markup1)
        # Сохраняем только текущее сообщение пользователя в списке
        previous_messages[call.message.chat.id] = [sent_message.message_id]
    elif call.data == 'goverments_back_button':
        send_start_message(call.message)
    if call.data == 'college':
        markup1 = types.InlineKeyboardMarkup(row_width=2)
        item2_1 = types.InlineKeyboardButton("Обьяснительная", callback_data='college_button1')
        item2_2 = types.InlineKeyboardButton("Заявления", callback_data='college_button2')
        item2_3 = types.InlineKeyboardButton("Просьба", callback_data='college_button3')
        item2_4 = types.InlineKeyboardButton("Назад", callback_data='college_back_button')
        markup1.add(item2_1, item2_2, item2_3, item2_4)
        sent_message = bot.send_message(chat_id=call.message.chat.id, text="Выберите документ", reply_markup=markup1)
        previous_messages[call.message.chat.id] = [sent_message.message_id]
    elif call.data == 'college_back_button':
        send_start_message(call.message)
    if call.data == 'courts':
        markup1 = types.InlineKeyboardMarkup(row_width=2)
        item3_1 = types.InlineKeyboardButton("Признание гражданина недееспособным", callback_data='courts_button1')
        item3_2 = types.InlineKeyboardButton("О возмещение ущерба дтп", callback_data='courts_button2')
        item3_3 = types.InlineKeyboardButton("Об установление факта смерти", callback_data='courts_button3')
        item3_4 = types.InlineKeyboardButton("Назад", callback_data='courts_back_button')
        markup1.add(item3_1, item3_2, item3_3, item3_4)
        sent_message = bot.send_message(chat_id=call.message.chat.id, text="Выберите документ", reply_markup=markup1)
        # Сохраняем только текущее сообщение пользователя в списке
        previous_messages[call.message.chat.id] = [sent_message.message_id]
    elif call.data == 'courts_back_button ':
        send_start_message(call.message)
    if call.data == 'notarius':
        markup1 = types.InlineKeyboardMarkup(row_width=2)
        item4_1 = types.InlineKeyboardButton("Нотариальные документы 1", callback_data='notarius_button1')
        item4_2 = types.InlineKeyboardButton("Нотариальные документы 2", callback_data='notarius_button2')
        item4_3 = types.InlineKeyboardButton("Нотариальные документы 3", callback_data='notarius_button3')
        item4_4 = types.InlineKeyboardButton("Назад", callback_data='notarius_back_button')
        markup1.add(item4_1, item4_2, item4_3, item4_4)
        sent_message = bot.send_message(chat_id=call.message.chat.id, text="Выберите документ", reply_markup=markup1)
        # Сохраняем только текущее сообщение пользователя в списке
        previous_messages[call.message.chat.id] = [sent_message.message_id]


# Эта строка запускает бота и начинает прослушивание сообщений
bot.polling(none_stop=True, timeout=123)

Document:

Я { student_gender } группы { student_group }  { Name_student } , { student_gender_type } на занятие { date_lesson } , { prichina }.
                                                                    {Date_create}
                    __________________

How can I fix them? Values doesn't insert in document. Now the ask a variables for insert, saving them values, but doesn't insert them in document sample. The created document remains the same as the template without changes.

0

There are 0 answers