Skip to content

Commit

Permalink
Merge pull request #22 from Rxyalxrd/master
Browse files Browse the repository at this point in the history
Update keyboard
  • Loading branch information
GreenVibesOnly authored Oct 16, 2024
2 parents 5452550 + a11e841 commit 6b7db1e
Show file tree
Hide file tree
Showing 23 changed files with 434 additions and 128 deletions.
10 changes: 2 additions & 8 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,18 +1,12 @@
<<<<<<< HEAD
BOT_TOKEN=<'BOT TOKEN'>
TELEGRAM_CHAT_IDS=<'TELEGRAM CHAT IDS'>

=======
TELEGRAM_TOKEN=<'TELEGRAM TOKEN'>
TELEGRAM_CHAT_IDS=<'TELEGRAM CHAT IDS'>

DATABASE_URL=<'DATABASE URL'>
>>>>>>> upstream/dev
POSTGRES_USER=<'DB OWNER'>
POSTGRES_PASSWORD=<'PASSWORD'>
POSTGRES_DB=<'DB NAME'>
DB_HOST=db
DB_PORT=5432
DB_HOST=<'DB HOST'>
DB_PORT=<'DB PORT'>

EMAIL=<'MANAGER EMAIL'>
EMAIL_PASSWORD=<'PASSWORD'>
197 changes: 189 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,193 @@
### Установка:
- клонируем директорию с гитхаба
- устанавливаем poetry из любой директории: pip install poetry --user
- переходим в папку проекта и устанавливаем зависимости: poetry install
- создаём файл .env и добавляем строку BOT_TOKEN='<токен бота>'
# Чат-бот для предоставления информации, помощи в обслуживании клиентов, проведения маркетинговых кампаний.

**SCID** — это цифровое агентство полного цикла, основанное в 2008 году. Оно занимается созданием IT-решений, которые помогают компаниям оптимизировать бизнес-процессы и улучшить эффективность. Среди ключевых услуг агентства — разработка сайтов, мобильных приложений, CRM-систем и систем бизнес-аналитики (BI).

### Директории:
**Основные направления деятельности SCID включают:**

1. Разработку программного обеспечения, включая системы для управления бизнесом;
2. Создание сайтов и мобильных приложений для различных отраслей, включая медицину, образование и ритейл;
3. Интеграцию с корпоративными системами и разработку сложных CRM-систем;
4. Внедрение бизнес-аналитики (BI) для компаний с помощью современных цифровых инструментов.
5. SCID также работает с крупнейшими представителями бизнеса и государственных структур, успешно реализовав более 250 проектов для разных отраслей, что делает их экспертом в создании индивидуальных IT-решений для компаний всех размеров.

### Ссылка на бота:
https://t.me/csid_inform_bot
Благодаря многолетнему опыту и глубокому пониманию специфики цифровых технологий, агентство создает проекты, ориентированные на решение конкретных задач клиентов, будь то оптимизация логистики, внедрение систем управления ресурсами или улучшение пользовательского опыта.

Для более детальной информации можно посетить официальный сайт компании: [SCID](https://scid.ru/).

---

## Стек технологий

В данном проекте используется современный стек технологий, который обеспечивает эффективную разработку, масштабируемость и удобство в использовании. Ниже представлены основные библиотеки и инструменты, использованные в проекте:

- **Python**: Основной язык программирования проекта, известный своей простотой и читаемостью, что способствует быстрой разработке.

- **Aiogram**: Асинхронная библиотека для создания Telegram-ботов, обеспечивающая простоту интеграции и работы с `API Telegram`.

- **Pydantic**: Библиотека для валидации данных и работы с настройками на основе аннотаций типов Python, что улучшает надежность кода.

- **Python-dotenv**: Позволяет загружать переменные окружения из файла `.env`, упрощая управление конфигурацией приложения.

- **Alembic**: Инструмент для управления миграциями базы данных, совместимый с `SQLAlchemy`, что облегчает версионирование схемы базы данных.

- **SQLAlchemy**: `ORM (Object Relational Mapping)` библиотека для работы с реляционными базами данных, предоставляющая высокоуровневый интерфейс для взаимодействия с базами данных.

- **Pydantic-settings**: Расширение `Pydantic` для управления настройками приложений с поддержкой файлов конфигурации и переменных окружения.

- **Asyncpg**: Асинхронный драйвер для `PostgreSQL`, который обеспечивает высокую производительность и эффективное взаимодействие с базой данных.

- **Aiosmtplib**: Асинхронная библиотека для отправки электронной почты через `SMTP`, позволяющая интегрировать почтовые функции в приложение.

- **Make**: Инструмент для автоматизации задач, упрощающий процессы установки зависимостей и запуска различных команд.

- **Black**: Форматировщик кода, который помогает поддерживать код в чистом и читаемом состоянии, следуя единым стандартам оформления.

Этот стек технологий был выбран для обеспечения надежности, производительности и удобства разработки, что позволяет сосредоточиться на реализации бизнес-логики приложения.

---

## .env

В проекте используются переменные окружения для конфигурации подключения к различным сервисам, таким как Telegram, база данных, и почтовый сервер. Вам необходимо создать файл `.env` на основе примера `.env.example` и заполнить его актуальными данными.

### Шаги для настройки

1. **Скопируйте файл `.env.example` в `.env`:**

```bash
cp .env.example .env
```

### Заполните файл `.env` своими данными

2. **Откройте файл `.env` в любом текстовом редакторе и замените значения в угловых скобках на актуальные данные.**

### Описание переменных окружения

- **`TELEGRAM_TOKEN`**: Токен вашего Telegram-бота. Получите его у [BotFather](https://t.me/BotFather).

- **`TELEGRAM_CHAT_IDS`**: Список ID чатов Telegram, которые получат статус администратора. Эти ID можно получить после настройки бота.

- **`DATABASE_URL`**: Полный URL для подключения к базе данных PostgreSQL. Пример:
```bash
postgresql://<DB_OWNER>:<PASSWORD>@<DB_HOST>:<DB_PORT>/<DB_NAME>

POSTGRES_USER: Имя пользователя, который является владельцем базы данных.

- **`POSTGRES_PASSWORD`**: Пароль для подключения к базе данных.

- **`POSTGRES_DB`**: Название базы данных, к которой происходит подключение.

- **`DB_HOST`**: Хост базы данных (например, localhost или IP-адрес сервера).

- **`DB_PORT`**: Порт для подключения к базе данных (обычно 5432 для PostgreSQL).

- **`EMAIL`**: Адрес электронной почты, который будет использоваться для отправки сообщений менеджеру.

- **`EMAIL_PASSWORD`**: Пароль для доступа к электронной почте, с которой будут отправляться сообщения.

3. **Пример заполненного файла `.env`:**
```bash
TELEGRAM_TOKEN=123456789:ABCdefGhijklMNOpqrstuvwxyz
TELEGRAM_CHAT_IDS=123456789,987654321
DATABASE_URL=postgresql://dbuser:password@localhost:5432/mydatabase
POSTGRES_USER=dbuser
POSTGRES_PASSWORD=password
POSTGRES_DB=mydatabase
DB_HOST=localhost
DB_PORT=5432
[email protected]
EMAIL_PASSWORD=your-email-password
```
---

## Как использовать Makefile

[Makefile](https://victorz.ru/202402043262) предоставляет команды для упрощения управления зависимостями, миграциями базы данных и запуском приложения. Вот описание каждой команды:

### 1. Установка зависимостей
Команда устанавливает зависимости, указанные в `pyproject.toml`, с помощью `Poetry`.

**Использование:**
```bash
make install
```

### 2. Установка нового пакета
Команда добавляет новый пакет в проект с помощью `Poetry`. Нужно передать переменную `PACKAGE`, указывающую имя пакета.

**Использование:**
```bash
make install-package PACKAGE=<имя_пакета>
```

### 3. Обновление зависимостей
Команда обновляет все зависимости до последних версий с помощью `Poetry`.

**Использование:**
```bash
make update
```

### 4. Запуск приложения
Команда запускает основное приложение, используя переменные `PYTHON` (интерпретатор) и `APP` (главный файл приложения).

**Использование:**
```bash
make run
```

### 5. Очистка .pyc файлов
Команда удаляет все файлы .pyc, которые создаются при компиляции Python. Это помогает очистить проект от временных файлов.

**Использование:**
```bash
make clean
```

### 6. Форматирование кода
Команда форматирует весь код проекта по стандарту black.

**Использование:**
```bash
make format
```

### 7. Применение миграций
Команда применяет все доступные миграции к базе данных с помощью Alembic.

**Использование:**
```bash
make migrate
```

### 8. Откат миграций
Команда откатывает последнюю примененную миграцию базы данных с помощью Alembic.

**Использование:**
```bash
make downgrade
```

### 9. Создание миграции
Команда создает новую миграцию на основе изменений в моделях базы данных. Необходимо указать описание изменений в переменной msg.

**Использование:**
```bash
make makemigration msg="описание изменений"
```

### 10. Docker Compose команда
Команда выполняет следующие действия для работы с Docker Compose:

- Проставляет текущее состояние миграций: alembic stamp head.
- Генерирует новую миграцию: alembic revision --autogenerate.
- Применяет миграции: alembic upgrade head.
- Запускает основное приложение.

**Использование:**
```bash
make docker_compose_command
```
7 changes: 4 additions & 3 deletions app/bot/callbacks.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
faq_or_problems_with_products_inline_keyboard,
category_type_inline_keyboard,
inline_products_and_services,
company_information_keyboard,
get_company_information_keyboard,
company_portfolio_choice,
support_keyboard,
back_to_main_menu,
Expand Down Expand Up @@ -209,15 +209,16 @@ async def view_portfolio(callback: CallbackQuery) -> None:
log_error_text="Ошибка при запросе информации о компании."
)
@router.callback_query(F.data == "company_info")
async def company_info(callback: CallbackQuery) -> None:
async def company_info(callback: CallbackQuery, session: AsyncSession) -> None:
"""Информация о компании."""

await callback.answer()

user_id = get_user_id(callback)

await callback.message.edit_text(
bc.MESSAGE_FOR_COMPANY_INFO, reply_markup=company_information_keyboard
bc.MESSAGE_FOR_COMPANY_INFO,
reply_markup=await get_company_information_keyboard(session)
)

logger.info(f"Пользователь {user_id} " f"запросил информацию о компании. ")
Expand Down
63 changes: 39 additions & 24 deletions app/bot/keyborads.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from aiogram.utils.keyboard import InlineKeyboardBuilder
from sqlalchemy.ext.asyncio import AsyncSession

from crud.about_crud import company_info_crud
from crud.questions import get_question_by_title
from crud.projects import get_all_prtfolio_projects, get_categories_by_name
from models.models import CheckCompanyPortfolio, ProductCategory
Expand All @@ -24,17 +25,17 @@
],
[
InlineKeyboardButton(
text="Получить информацию о компании.", callback_data="company_info"
text="Информация о компании.", callback_data="company_info"
)
],
[
InlineKeyboardButton(
text="Узнать о продуктах и услугах.", callback_data="products_services"
text="Продуктах и услугах.", callback_data="products_services"
)
],
[
InlineKeyboardButton(
text="Получить техническую поддержку.", callback_data="tech_support"
text="Техническая поддержка.", callback_data="tech_support"
)
],
[
Expand All @@ -45,22 +46,28 @@
]
)

company_information_keyboard = InlineKeyboardMarkup(
inline_keyboard=[
[
InlineKeyboardButton(
text="Презентация компании.",
url="https://www.visme.co/ru/powerpoint-online/",
)
],
[
InlineKeyboardButton(
text="Карточка компании.", url="https://github.com/Rxyalxrd"
)
],
[back_to_main_menu],
]
)

async def get_company_information_keyboard(session: AsyncSession):

builder = InlineKeyboardBuilder()

presentation = await company_info_crud.get_by_about_name(
"Презентация компании", session
)
card = await company_info_crud.get_by_about_name(
"Карточка компании", session
)

if presentation:
builder.add(
InlineKeyboardButton(text=presentation.name, url=presentation.url)
)
if card:
builder.add(InlineKeyboardButton(text=card.name, url=card.url))

builder.add(back_to_main_menu)

return builder.adjust(1).as_markup()


async def inline_products_and_services(session: AsyncSession):
Expand All @@ -72,7 +79,10 @@ async def inline_products_and_services(session: AsyncSession):

for obj in objects_in_db:
keyboard.add(
InlineKeyboardButton(text=obj.title, callback_data=f"category_{obj.id}")
InlineKeyboardButton(
text=obj.name,
callback_data=f"category_{obj.id}"
)
)

keyboard.add(back_to_main_menu)
Expand Down Expand Up @@ -100,7 +110,8 @@ async def list_of_projects_keyboard(session: AsyncSession):
keyboard = InlineKeyboardBuilder()

for project in projects:
keyboard.add(InlineKeyboardButton(text=project.project_name, url=project.url))
keyboard.add(InlineKeyboardButton(
text=project.name, url=project.url))

keyboard.add(back_to_main_menu)

Expand All @@ -112,12 +123,14 @@ async def list_of_projects_keyboard(session: AsyncSession):
[InlineKeyboardButton(text="F.A.Q", callback_data="get_faq")],
[
InlineKeyboardButton(
text="Проблемы с продуктами", callback_data="get_problems_with_products"
text="Проблемы с продуктами",
callback_data="get_problems_with_products"
)
],
[
InlineKeyboardButton(
text="Запрос на обратный звонок", callback_data="callback_request"
text="Запрос на обратный звонок",
callback_data="callback_request"
)
],
[back_to_main_menu],
Expand Down Expand Up @@ -156,7 +169,9 @@ async def category_type_inline_keyboard(

for category_type in category_types:
keyboard.add(
InlineKeyboardButton(text=category_type.name, url=category_type.url)
InlineKeyboardButton(
text=category_type.name, url=category_type.url
)
)

keyboard.add(back_to_previous_menu)
Expand Down
Loading

0 comments on commit 6b7db1e

Please sign in to comment.