diff --git a/README.md b/README.md index 92c168c..2ee3bf4 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,16 @@ # RandomCoffeeBotTelegram Random Coffee bot for the Telegram +#### Проект телеграм-бота, который предоставляет возможность пообщаться с IT-специалистами - выпускниками разных IT направлений практикума. + # Содержание -1. [БРИФ](#brief) +1. [БРИФ](docs/materials/briff.md) - 1.1 [Инструкции и ритуалы на проекте]() + 1.1 [Инструкции и ритуалы на проекте](docs/materials/instructions.md) - 1.2 [ER - диаграмма сущностей](#er) + 1.2 [ER - диаграмма сущностей](docs/RandomCoffeeER.jpg) 2. [Структура проекта](#structure) 3. [Подготовка к запуску](#start) @@ -31,12 +33,6 @@ Random Coffee bot for the Telegram

-# 1. БРИФ - -## 1.2. ER - диаграмма сущностей: -ER диаграммы расположены в директории /docs в двух удобных форматах [.drowio, .jpg] -![ER Диаграмма](/docs/RandomCoffeeER.jpg) - # 2. Структура проекта | Имя | Описание | @@ -311,4 +307,4 @@ make filldb #### Рекомендации к написанию кода [Codestyle](https://github.com/Studio-Yandex-Practicum/RandomCoffeeBotTelegram/tree/develop/docs/codestyle.md) -#### Диаграмма логики работы бота [Diagram](https://github.com/Studio-Yandex-Practicum/RandomCoffeeBotTelegram/tree/develop/docs/Diagramm_of_bot_logic.drawio) \ No newline at end of file +#### Диаграмма логики работы бота [Diagram](https://github.com/Studio-Yandex-Practicum/RandomCoffeeBotTelegram/tree/develop/docs/Diagramm_of_bot_logic.drawio) diff --git a/docs/materials/briff.md b/docs/materials/briff.md new file mode 100644 index 0000000..d212d34 --- /dev/null +++ b/docs/materials/briff.md @@ -0,0 +1,25 @@ +# Бриф + +**Цель проекта:** Обеспечить процесс формирования пар для Random Coffee между студентами курса IT-рекрутер и выпускниками IT-специальностей Практикума в Telegram + +**Задачи:** + +Создать Телеграм-бота. + + +## Описание телеграм-бота: + +### [Схема состояний](https://github.com/Studio-Yandex-Practicum/RandomCoffeeBotTelegram/blob/develop/docs/Diagramm%20of%20bot%20logic.jpg) - визуальное изображение стейтов + +Ожидаемая функциональность: + +* создание профиля (учетной записи) каждого участника и хранение его в базе данных +* создание пары между выпускником и рекрутером (нужно, чтобы бот не создавал * пары типа рекрутер-рекрутер или выпускник-выпускник) +* рассылка контактов собеседников после создания пары +* запрос обратной связи у участников (отправляет ссылку на форму) +* повторный вопрос о создании пары после первого участия +* режим администратора должен включать: сброс пар, запрос статистики по парам, удаление профилей (возможно, другие функции по администрированию бота и участников) + + +### Начало работы: +Пользователь заходит в телеграмм и вводит в поисковую строку **@название бота ,** кликает по найденному боту, видит краткое описание, нажимает кнопку menu, после чего появляется окно с 3 кнопками: Поддержка, Старт, Помощь. При нажатии на кнопку старт бот предлагает поучаствовать в неформальном разговоре с выпускником Практикума. diff --git a/docs/materials/instructions.md b/docs/materials/instructions.md new file mode 100644 index 0000000..090f361 --- /dev/null +++ b/docs/materials/instructions.md @@ -0,0 +1,61 @@ +# Инструкции + +### Общие правила коммуникации на проекте + +1. Рабочее время: распределение времени с пн-вс для студентов, пн-пт для PM и TL, но для решения важных вопросов можно связаться и в выходные: + + PM - с 12:00 до 22.00 по мск; + TL Константин Райхерт - с 16.00 до 23.00 по мск; + + - Работаем недельными спринтами (далее по скорости разработки). + - Стендапы понедельник, среда, пятница + - Еженедельные встречи с тимлидами один на один. + - В середине спринта (вт-чт) груминг задач для формирования бэклога на следующий спринт. + +2. Каналы коммуникации: + - пачка **Random_coffee_recruiter_bot_general** - анонсы и stand up + +3. Notion - место для базы + +### Ритуалы + +1. **Письменный стендап** + +Когда: понедельник, среда, пятница до 19:00 +Где: в тредах к сообщению в пачке +Цель: собрать актуальную информацию о положении дел в команде, выявить направления, требующие проработки тимлидами/техлидами/кураторами +Как: написать сообщение по установленному формату в треде в пачке. (ПМ создает тред с утра) + +2. **Встреча one-to-one** + +Когда: по необходимости +Где: по видео, один на один с тимлидом +Цель: решить вопросы вызывающие стопор, обменяться опытом. +Как: участник команды договаривается о созвоне лично с тимлидом. + +3. **Ретро** + +Когда: по итогам спринта +Где: по видео +Цель: улучшение командных процессов за счет обсуждения предыдущих событий и процессов в команде, которые наблюдались в течение спринта +Как: вместе анализируем спринт и отвечаем на вопросы: + +- Плюсы. Что шло хорошо в прошлой итерации? +- Минусы. Какие проблемы были в прошлой итерации? +- Идеи. Какие идеи появились по ходу ретроспективы? +- План. Какие улучшения мы запланируем на следующую итерацию? +(если необходимо, закрепить ответственного за конкретные события) + +4. **Организация встреч в Zoom** + + - Описание встречи + - Цели + - Фиксированный тайминг + - Запись при необходимости + +5. **Стендап (в письменном формате)** +- Что делал вчера: +- Что буду делать сегодня: +- Какие есть вопросы/проблемы (тегай того, с кем конкретно хочешь переговорить): + *Если вопросов/проблем нет, так и пишешь, что их нет* +- Предложения/пожелания: diff --git a/src/bot/bot_interface.py b/src/bot/bot_interface.py index bca55e6..154dae1 100644 --- a/src/bot/bot_interface.py +++ b/src/bot/bot_interface.py @@ -5,7 +5,7 @@ from django.conf import settings from telegram.ext import Application, ApplicationBuilder, PicklePersistence -from bot.handlers import HANDLERS, help_hendler +from bot.handlers.command_handlers import help_handler, start_handler logger = logging.getLogger(__name__) @@ -55,7 +55,7 @@ async def _build_app(self) -> Application: .persistence(PicklePersistence(filepath=settings.PERSISTANCE_PATH)) .build() ) - app.add_handlers([HANDLERS, help_hendler]) + app.add_handlers([start_handler, help_handler]) return app async def _manage_webhook(self) -> None: diff --git a/src/bot/constants/buttons.py b/src/bot/constants/buttons.py new file mode 100644 index 0000000..f3e1d26 --- /dev/null +++ b/src/bot/constants/buttons.py @@ -0,0 +1,4 @@ +GO_BUTTON = "GO" +NEXT_TIME_BUTTON = "В следующий раз" +PARTICIPATE = "Участвовать!" +SUPPORT = "Написать в поддержку" diff --git a/src/bot/constants/messages.py b/src/bot/constants/messages.py index 473d16f..7fbec5b 100644 --- a/src/bot/constants/messages.py +++ b/src/bot/constants/messages.py @@ -6,3 +6,8 @@ "Вас возникли сложности в работе, или пожелания - " "можете написать в поддержку" ) +START_MESSAGE = ( + "Наш бот предлагает тебе поучаствовать в неформальном разговоре с выпускником Практикума. " + 'Для этого необходимо нажать на кнопку "Go". Если вы не готовы на этой неделе участвовать в ' + 'Random Coffee просто нажмите "В следующий раз".' +) diff --git a/src/bot/handlers.py b/src/bot/handlers.py index 30cdbad..6be9fae 100644 --- a/src/bot/handlers.py +++ b/src/bot/handlers.py @@ -3,9 +3,6 @@ from telegram import Update from telegram.ext import CallbackContext, CommandHandler -from bot.constants.messages import HELP_MESSAGE -from bot.keyboards.help_keyboard import help_keyboard - # Инициализация логгера logging.basicConfig( format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", @@ -20,12 +17,4 @@ async def start_bot(update: Update, context: CallbackContext): await update.message.reply_html(rf"Привет, {user.mention_html()}!") -async def help_bot(update: Update, context: CallbackContext): - """Функция-обработчик для команды /help.""" - await update.message.reply_html( - text=(HELP_MESSAGE), reply_markup=help_keyboard - ) - - HANDLERS = CommandHandler("start", start_bot) -help_hendler = CommandHandler("help", help_bot) diff --git a/src/bot/handlers/__init__.py b/src/bot/handlers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/bot/handlers/command_handlers.py b/src/bot/handlers/command_handlers.py new file mode 100644 index 0000000..abaee08 --- /dev/null +++ b/src/bot/handlers/command_handlers.py @@ -0,0 +1,26 @@ +from telegram import Update +from telegram.ext import CallbackContext, CommandHandler + +from bot.constants.messages import HELP_MESSAGE, START_MESSAGE +from bot.keyboards.command_keyboards import ( + help_keyboard_markup, + start_keyboard_markup, +) + + +async def start(update: Update, context: CallbackContext) -> None: + """Функция-обработчик команды start.""" + await update.message.reply_text( + text=START_MESSAGE, reply_markup=start_keyboard_markup + ) + + +async def help(update: Update, context: CallbackContext) -> None: + """Функция-обработчик для команды /help.""" + await update.message.reply_html( + text=(HELP_MESSAGE), reply_markup=help_keyboard_markup + ) + + +start_handler = CommandHandler("start", start) +help_handler = CommandHandler("help", help) diff --git a/src/bot/keyboards/command_keyboards.py b/src/bot/keyboards/command_keyboards.py new file mode 100644 index 0000000..58d1219 --- /dev/null +++ b/src/bot/keyboards/command_keyboards.py @@ -0,0 +1,28 @@ +from telegram import InlineKeyboardButton, InlineKeyboardMarkup + +from bot.constants.buttons import ( + GO_BUTTON, + NEXT_TIME_BUTTON, + PARTICIPATE, + SUPPORT, +) + +start_keyboard_markup = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton(text=GO_BUTTON, callback_data="go"), + InlineKeyboardButton( + text=NEXT_TIME_BUTTON, callback_data="next_time" + ), + ] + ] +) + +help_keyboard_markup = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton(PARTICIPATE, callback_data="go"), + InlineKeyboardButton(SUPPORT, callback_data="support"), + ] + ] +) diff --git a/src/bot/keyboards/help_keyboard.py b/src/bot/keyboards/help_keyboard.py deleted file mode 100644 index 3f28068..0000000 --- a/src/bot/keyboards/help_keyboard.py +++ /dev/null @@ -1,12 +0,0 @@ -from telegram import InlineKeyboardButton, InlineKeyboardMarkup - -PARTICIPATE = "Участвовать!" -SUPPORT = "Написать в поддержку" - -keyboard_buttons = [ - [ - InlineKeyboardButton(PARTICIPATE, callback_data="go_bot"), - InlineKeyboardButton(SUPPORT, callback_data="support_bot"), - ] -] -help_keyboard = InlineKeyboardMarkup(keyboard_buttons) diff --git a/src/core/settings.py b/src/core/settings.py index 42e134e..e1d2a27 100644 --- a/src/core/settings.py +++ b/src/core/settings.py @@ -3,8 +3,6 @@ import environ from dotenv import find_dotenv -DEBUG = True - BASE_DIR = Path(__file__).resolve().parent.parent env = environ.Env() @@ -15,6 +13,8 @@ ALLOWED_HOSTS = env.list('ALLOWED_HOSTS', default=['*']) +AUTH_USER_MODEL = "admin_user.AdminUser" + DEFAULT_APPS = [ "django.contrib.admin", "django.contrib.auth",