Введение 0:00 Приветствие от канала «Пайтон Хап Студио». Восьмое видео по разработке Telegram-ботов на Python и Ogramma 3.0. Темы видео: многоуровневое онлайн-меню, каталог товаров, постраничное перелистывание и корзины пользователей.
Меню для пользователя 0:37 Админка почти готова, будут показаны изменения. Пользователь заходит на бота, нажимает «запустите старт», появляется меню. Взаимодействие с пиццерией происходит через меню с онлайн-кнопками и текстом.
Категории и товары 1:22 Кнопка «о нас» отображает справочную информацию о магазине. Кнопка «товары» позволяет выбрать категории «еда» и «напитки». Доступ к корзине из второго уровня меню.
Корзина 2:18 В корзине отображаются изображение продукта, стоимость, количество и общая стоимость. Дополнительные кнопки для управления товарами: увеличение количества, удаление. Возможность вернуться на главную страницу или заказать сформированный заказ.
Изменения в коде 3:18 Добавлены категории «еда» и «напитки». Убраны команды для пользователя в «хендлерс юзер приват». Закомментированы ненужные команды в «бот комонс лист» и файле «э пай».
Подготовка к работе 4:11 Переход на репозиторий видеокурса. Скачивание шаблона для работы. Открытие проекта в редакторе и обзор изменений.
Удаление команд и настройка базы данных 5:50 Удаление команд пользователя из «хендлерс юзер приват». Разкомментирование строк для удаления старых команд при первом запуске скрипта. Создание новой схемы базы данных при первом запуске.
Дополнительные таблицы 6:44 В пакете «дата бейс» добавлены дополнительные таблицы. Настройка базы данных не показана, так как это было в прошлых видео.
Создание таблиц 7:15 Таблица «Продукт» наследуется от «Бейс», содержит стандартные поля: дата создания и обновления записей. Таблица «Баннер» также наследуется от «Бейс», хранит ID, имя баннера и описание. В таблице «Баннер» хранятся изображения и описания для информационных страниц.
Добавление категорий и продуктов 8:07 Добавлены категории «Еда» и «Напитки». В таблице «Продукты» добавлены поля «Категория ID» и «Категория Map». Установлена связь между таблицами через внешний ключ.
Настройка внешнего ключа 9:03 Внешний ключ указывает на таблицу «Категории». Параметр «Каскад» позволяет автоматически удалять продукты при удалении категории. Возможность настройки дефолтных значений или запрета удаления категории при наличии продуктов.
Исправление типа поля 9:57 Поле «Прайс» изменено с «Float» на «Numeric» для корректной работы с Equlite. Ограничение на количество знаков после запятой в поле «Прайс».
Таблица «Юзер» и «Корзина» 10:53 Таблица «Юзер» содержит ID, имя, фамилию и номер телефона. Таблица «Корзина» содержит ID, ID пользователя, ID товара и количество. Каскад для удаления корзин при удалении пользователя.
Запросы и админка 12:39 Создан самописный агрегатор для постраничного перелистывания товаров. Добавлены запросы для работы с баннерами и категориями. Админка позволяет добавлять, удалять и изменять продукты и категории.
Текстовые файлы и импорт 15:07 В папке «Common» добавлены текстовые файлы с категориями и описаниями для информационных страниц. Импорт категорий и описаний в базу данных при старте бота.
Запуск бота и заполнение базы данных 18:39 Запуск бота, создание таблиц и запись категорий и описаний. Загрузка товаров через админскую команду. Заполнение базы данных товарами и категориями.
Добавление и изменение товаров админом 20:36 В FSM добавлен новый пункт «категория». После ввода описания товара админ переходит в состояние «продукт категории». Формируется словарь с категориями и отправляется в функцию callback.
Обработка кликов и проверка категорий 21:35 При нажатии на категорию «еда» запрашивается цена товара. Проверяется, есть ли введённая категория в списке, и добавляется update date. Исправлен баг с добавлением пунктов меню только при наличии товара для изменения.
Загрузка изображений товаров 22:31 Вводятся цена и изображение товара. Товар добавляется или изменяется. Загружаются изображения для категории «напитки».
Оптимизация FSM и проверка ввода 23:11 Убрана лишняя орфографическая проверка. Проверка длины названия товара: менее 4 или более 150 символов. При выходе за рамки диапазона выводится сообщение для корректного ввода.
Работа с баннерами 24:13 МикроFSM для загрузки и изменения баннеров. Отправка фото баннера и указание страницы в описании. Проверка правильности ввода страницы и обновление баннера в базе данных.
Обновление баннеров в базе данных 27:03 Запуск функции на старте бота для заполнения таблицы баннеров. Обновление изображений баннеров для разных страниц.
Работа с ассортиментом 28:00 Выбор категории для вывода ассортимента. Формирование кнопок для удаления или изменения товаров. Вывод списка продуктов с учётом выбранных категорий.
Меню для пользователей 29:55 Сообщения с онлайн-кнопками для изменения текста. Редактирование текста и кнопок при нажатии на кнопку. Возможность редактирования отдельных элементов сообщения: текст, кнопки, изображения.
Особенности редактирования сообщений 31:58 Одновременное редактирование текста и кнопок. Редактирование отдельных элементов: текст, описание, изображение. Важность наличия изображений на страницах для красивого отображения.
Преимущества редактирования сообщений 33:28 Меньше хендлеров и более лояльный интерфейс. Ограничение на удаление сообщений в Telegram — 48 часов. Старые сообщения не удаляются, что может привести к захламлению чата.
Разработка схемы меню 34:25 Меню будет иметь четыре уровня с разными наборами кнопок. Каждая кнопка отправляет информацию через callback-данные. Пример callback-данных: уровень меню и имя страницы.
Реализация кнопок и уровней 35:23 Кнопки «О нас», «Оплата» и «Доставка» имеют уровень 0 и страницу «Шиппи». Кнопка «Корзина» ведёт на уровень 3. Товары отправляют уровень 1, а кнопка «Назад» — уровень 0.
Дополнительные callback-данные 36:23 Для постраничной навигации требуется дополнительная callback-дата. Информация о странице и товарах передаётся через callback-данные.
Использование фабрики callback-данных 37:21 Стандартные строки callback-данных неудобны в работе. Фабрика callback-данных в Telegram упрощает работу с данными.
Подготовка структуры бота 38:21 Удаление ненужных частей файла user_private. Формирование первого сообщения при команде «старт». Создание файла menu_process для обработки меню.
Реализация функции get_menu_content 40:50 Функция получает аргументы: сессия, уровень и меню нейм. Проверка уровня меню и возврат изображения, описания и кнопок. Импорт необходимых функций для работы с изображениями и клавиатурами.
Получение изображения и формирование клавиатуры 41:57 Получение изображения из базы данных по имени страницы. Формирование онлайновой клавиатуры и возврат её функции. Объяснение использования медиа и кэпшн в методе transfer_photo.
Создание инлайновой кнопки 44:09 В файле «ин-лайн» создаём функцию для обработки уровня меню. Передаём уровень меню и размерность кнопок. Формируем онлайн-клавиатуру с кнопками «товары», «каталог», «корзина» и другими.
Формирование callback-данных 45:04 Используем словарь для формирования callback-данных кнопок. Создаём класс «меню-callback», наследуя от «callback-data». Аннотируем поля класса: уровень и меню-нейм.
Обработка кнопок 47:00 Перебираем словарь для формирования кнопок. Для кнопки «товары» формируем callback-данные с уровнем +1. Для кнопки «корзина» формируем callback-данные с уровнем 3. Для остальных кнопок передаём базовый уровень.
Проверка работы кнопок 49:06 Запускаем бота и проверяем отображение кнопок. Убеждаемся, что кнопки отображаются правильно, но не работают.
Обработка callback-событий 50:02 Импортируем класс «меню-callback» в хендлер. Фильтруем callback-события с префиксом «меню». Получаем данные из callback-данных и формируем медиа-сообщение.
Редактирование медиа-сообщения 52:47 Редактируем отправленное сообщение, передавая медиа-экземпляр. Возвращаем соответствующее изображение по имени страницы.
Тестирование обработки уровней 53:44 Тестируем обработку нулевого уровня. Проверяем отображение новых изображений и подписей. Переходим к обработке уровня один для перехода к товарам.
Настройка кнопок в меню 54:18 При нажатии на кнопку «Товары» должно отображаться меню с кнопками «Назад», «Корзина» и категориями товаров. В callback-строке кнопок добавляется информация о категории товара из базы данных. Категория товара хранится в таблице под ключом «категории».
Добавление параметра категории 55:15 В классе добавляется параметр категории с аннотацией типа. Параметр может быть необязательным, его значение по умолчанию — None.
Функция для возврата кнопок 56:03 Создаётся функция get_user_catalog_buttons для возврата кнопок первого уровня. Функция получает текущий уровень меню и список категорий из базы данных. Формируются кнопки «Назад», «Корзина» и категории товаров.
Работа с категориями 57:02 Для каждой категории создаётся кнопка с callback-строкой, включающей уровень меню, название категории и идентификатор категории. Функция menu_process запускает соответствующую функцию в зависимости от уровня меню.
Формирование баннера и категорий 57:59 Формируется баннер с описанием категорий на основе данных из базы данных. Категории товаров выбираются из файла data_rm_categories. Полученные категории передаются в клавиатуру.
Проверка работы меню 59:33 Проверяется работа меню, кнопок «Назад», «Корзина» и категорий. Добавляется callback-строка категории для кнопок «Еда», «Напитки».
Добавление параметров для кнопок 1:00:19 В функцию get_menu_content добавляются параметры категории и product_id. Product_id используется для добавления товара в корзину.
Формирование кнопок для товаров 1:01:39 Определяются поля page и product_id для кнопок. Создаётся функция get_product_buttons для возврата кнопок товаров.
Формирование кнопок «Назад» и «Вперёд» 1:03:26 Формируются кнопки «Назад» и «Вперёд» для перелистывания товаров. Кнопка «Купить» добавляет товар в корзину без изменения отображения меню.
Добавление кнопок «Предыдущий» и «Следующий» товар 1:04:44 Кнопки «Предыдущий» и «Следующий» товар добавляются в словарь. Применяются методы append и remove для формирования списка кнопок.
Функция product 1:05:37 Функция product формирует изображение и кнопки. Для работы функции требуются две функции: основная и для pagination. В функцию передаются аргументы: сессия, уровень, категории и пейдж.
Передача аргументов и выбор товаров 1:06:31 Пейдж передаётся как callback, callback_data, page. При нажатии на кнопку категории товара уровень меняется на уровень два. Товары выбираются из базы данных с помощью функции rmt_products.
Выбор товаров срезами 1:07:24 Можно усложнить код, выбирая товары срезами с помощью параметров лимит и офсет. Для небольшого количества товаров 50 лучше выбирать все товары сразу.
Класс paginator 1:08:21 Класс paginator принимает массив, список или кортеж данных. Функция get_page выбирает товары по странице. Определены методы для проверки наличия следующей и предыдущей страницы.
Формирование изображения товара 1:09:21 Формируется изображение товара, включая фото, название, описание и стоимость.
Создание кнопок навигации 1:10:15 Создаются кнопки «назад» и «вперёд» с помощью функции pages. Возвращается словарь с кнопками.
Проверка работы бота 1:11:13 Запуск бота для проверки работы кнопок. Проверка отображения товаров и кнопок навигации.
Добавление товара в корзину 1:13:22 При нажатии на кнопку «купить» товар добавляется в корзину. Добавляется пользователь в базу данных перед добавлением товара в корзину.
Работа с корзинами 1:16:15 Создаётся корзина для пользователя, если её нет. Изменяется количество товара в корзине, если она уже есть.
Тестирование добавления товара в корзину 1:17:50 Тестирование работы кнопки «купить». Подтверждение добавления товара в корзину и отображения оповещения.
Дополнительное оповещение 1:18:33 Возможность добавления параметра show_alert для более явного оповещения пользователя.
Реализация отображения корзины товаров пользователя 1:18:53 Добавление дополнительных параметров для фильтрации корзин по пользователю. Передача информации об user ID из хендлера в функцию get_menu_content. Использование параметра user ID в функции с типом данных int или bool.
Формирование кнопок для корзины 1:20:48 Подготовка функции для формирования кнопок корзины. Передача параметров: level, page, product_id, buttons. Проверка наличия товаров в корзине перед формированием клавиатуры.
Реализация кнопок для пустой корзины 1:21:37 Формирование кнопки «Главная» при пустой корзине. Отображение баннера пустой корзины.
Реализация кнопок для заполненной корзины 1:22:01 Добавление кнопок «Удалить», «Минус один», «Плюс один». Формирование кнопок пагинации «Назад» и «Следующий». Добавление кнопки «Заказать».
Логика взаимодействия с корзиной 1:23:00 Реализация функции для взаимодействия с корзиной пользователя. Передача сессии, уровня, меню нейма, user ID и product_id. Обработка действий пользователя: удаление товара, изменение количества товара.
Удаление товара из корзины 1:24:54 Вызов функции rm_delete_from_cart с передачей сессии, user ID и product_id. Проверка и изменение страницы при удалении товара.
Изменение количества товара в корзине 1:25:33 Запрос к системе для уменьшения количества товаров в корзине. Удаление корзины при уменьшении количества до одного товара. Увеличение количества товаров при нажатии на кнопку «Плюс один».
Выбор всех корзин пользователя 1:28:17 Выбор всех корзин по пользователю с передачей сессии и user ID. Применение метода ob_binds для загрузки связанных записей. Формирование списка корзин.
Формирование баннера и клавиатуры 1:29:51 Формирование баннера пустой корзины при её отсутствии. Формирование клавиатуры с одной кнопкой «Главная» при пустой корзине. Формирование кнопок пагинации при наличии корзин.
Тестирование функции 1:30:48 Добавление запуска функции для тестирования. Возможность просмотра кода на GitHub.
Удаление товаров из базы 1:31:45 Настройка выбора товара для удаления из базы. Использование product_id из callback_data. Проверка работы системы через бота.
Отображение товаров в корзине 1:32:44 Отображение стоимости и количества товаров в корзине. Формирование общей стоимости товаров через перемножение количества товаров на их стоимость. Применение функции round для округления стоимости.
Работа с paginator 1:33:35 Отображение одного элемента корзины с помощью paginator. Использование цикла for для перемножения количества товаров на их стоимость. Распаковка и просчёт данных для отображения.
Тестирование удаления товаров 1:34:30 Удаление одного товара из корзины. Проверка работы системы после удаления. Удаление всех товаров из корзины.
Финальные штрихи 1:35:29 Удаление лишних функций иPAGINATOR. РазмещениеPAGINATOR в папке «утилиты». Исправление импортаPAGINATOR в меню процессе.
Завершение видео 1:36:42 Форматирование документа для улучшения читаемости импортов. Прощание и упоминание канала «Пайтон Хаб Студио».