Доброго времени суток. Пишу tg бота который будет бронировать помещение. Сейчас работаю над тем, чтобы человек не мог бронировать на уже забронированное другим человеком время. Проблема в том, что при сохранении времени начала бронирования start_time, учитывая что у меня явно указан формат времени ЧЧ:ММ он нме дописывает еще и секунды. С временем конца бронирования такой проблемы нет, хотя код идентичен...
Запись времени начала бронирования и окончания содержатся в двух функциях.
Я исключил из данного кода все лишние обработчики, проверки и тд, для уменьшения масштабности кода.
Функция записи начала времени бронирования:
def save_reservation_time(message, reservation_data):
reservation_time = message.text.strip()
hours, minutes = map(int, reservation_time.split(':'))
selected_time = dt.time(hours, minutes)
start_time = dt.time(9, 0)
end_time_range = dt.time(22, 0)
print(f"start_time1: {start_time}")
if selected_time < start_time or selected_time > end_time_range:
bot.send_message(message.chat.id,
'Выбранное время не входит в допустимый диапазон (09:00 - 22:00). Пожалуйста, выберите другое время.')
bot.register_next_step_handler(message, save_reservation_time, reservation_data)
return
reservation_data['start_time'] = selected_time.strftime('%H:%M')
print(f"start_time2: {start_time}")
bot.send_message(message.chat.id, 'Введите время окончания бронирования в формате ЧЧ:ММ: ')
bot.register_next_step_handler(message, save_end_time, reservation_data)
Далее идёт запись времени окончания бронирования
def save_end_time(message, reservation_data):
end_time = message.text.strip()
hours, minutes = map(int, end_time.split(':'))
start_time = dt.time(9, 0)
end_time_range = dt.time(22, 0)
selected_end_time = dt.time(hours, minutes)
if selected_end_time < start_time or selected_end_time > end_time_range:
bot.send_message(message.chat.id,
'Выбранное время не входит в допустимый диапазон (09:00 - 22:00). Пожалуйста, выберите другое время.')
bot.register_next_step_handler(message, save_end_time, reservation_data)
return
start_hours, start_minutes = map(int, reservation_data['start_time'].split(':'))
start_time = dt.time(start_hours, start_minutes)
print(f"start_time3: {start_time}")
reservation_data['end_time'] = selected_end_time.strftime('%H:%M')
reservation_data['reservation_time'] = reservation_data['start_time'] + ' - ' + reservation_data['end_time']
print(f"start_time4: {start_time}")
result = is_time_slot_available(reservation_data['reservation_date'], reservation_data['start_time'],
reservation_data['end_time'])
if result is not None:
bot.send_message(message.chat.id, result, reply_markup=edit_keyboard)
bot.register_next_step_handler(message, handle_edit_time_or_date)
return
print(f"start_time: {start_time}")
print(f"end_time: {end_time}")
print(f"result: {result}")
print(reservation_data)
bot.send_message(message.chat.id, 'Введите ФИО организатора:')
bot.register_next_step_handler(message, save_organizer_name, reservation_data)
При объявлении переменной result идёт функция is_time_slot_available, которая проверяет доступность слота. Её я проверял, в ней в единственной формат хранится правильно.
def is_time_slot_available(reservation_date, start_time, end_time):
global sheet
values = sheet.get_all_values()
for row in values:
if (
row[2] == reservation_date and
row[10] is not None and
row[11] is not None
):
existing_start_time = datetime.strptime(row[10], "%H:%M").time()
existing_end_time = datetime.strptime(row[11], "%H:%M").time()
start_time_dt = datetime.strptime(start_time, "%H:%M").time()
end_time_dt = datetime.strptime(end_time, "%H:%M").time()
print(f"start_time_000: {start_time}")
if (
start_time_dt < existing_end_time and
end_time_dt > existing_start_time
):
available_time_slots = get_available_time_slots(reservation_date)
message = 'Выбранное время уже забронировано. Пожалуйста, выберите другое время.\n\nУже забронированные временные слоты:\n'
message += '\n'.join(available_time_slots)
return message
print(f"start_time_001: {start_time}")
return None
Так же не выводится start_time_000 в цикле, который должен пройтись по всем строкам базы и выяснить забронировано уже время или нет
Приложу выводы с принтов:
start_time1: 09:00:00
start_time2: 09:00:00
start_time3: 10:30:00
start_time4: 10:30:00
start_time_001: 10:30
start_time: 10:30:00
end_time: 12:30
result: None
То есть время изначально в ЧЧ:ММ:СС, хотя в словаре он сохраняется в ЧЧ:ММ
{'id': 1, 'user_id': 1348671573, 'reservation_date': datetime.date(2024, 2, 12), 'reservation_time': '10:30 - 12:30', 'start_time': '10:30', 'end_time': '12:30'}
Подскажите, в чём заключается проблема, заранее спасибо за ваши ответы)