Skip to content

Commit

Permalink
Merge remote-tracking branch 'upstream/dev' into ikhit-dev
Browse files Browse the repository at this point in the history
  • Loading branch information
ikhit committed Oct 16, 2024
2 parents 5ee6c49 + 119448d commit d6f3a0e
Show file tree
Hide file tree
Showing 38 changed files with 1,042 additions and 401 deletions.
7 changes: 7 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
<<<<<<< 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'>
Expand Down
28 changes: 24 additions & 4 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ on:
branches:
- master
- dev # закомментить перед выходом в прод
# pull_request:
# branches:
# - dev
# pull_request:
# branches:
# - dev
jobs:
linter:
runs-on: ubuntu-latest
Expand All @@ -23,9 +23,29 @@ jobs:
pip install flake8
- name: Test with flake8
run: python -m flake8 app/
deploy:
build_and_push_to_docker_hub:
name: Push Docker image to DockerHub
runs-on: ubuntu-latest
needs: linter
steps:
- name: Check out the repo
uses: actions/checkout@v3
- name: Set up Docker Build
uses: docker/setup-buildx-action@v2
- name: Login to Docker
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Push to DockerHub
uses: docker/build-push-action@v4
with:
context: .
push: true
tags: greenvibe/scid_bot_3:latest
deploy:
runs-on: ubuntu-latest
needs: build_and_push_to_docker_hub
steps:
- name: Checkout repo
uses: actions/checkout@v3
Expand Down
File renamed without changes.
12 changes: 3 additions & 9 deletions app/admin/handlers/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,9 +80,7 @@ async def portfolio_info(callback: CallbackQuery, session: AsyncSession):


@user_router.callback_query(F.data == MAIN_MENU_OPTIONS.get("company_bio"))
async def main_info(
callback: CallbackQuery, session: AsyncSession, state: FSMContext
):
async def main_info(callback: CallbackQuery, session: AsyncSession, state: FSMContext):
"""Получить список ссылок на информацию о компании."""

await state.clear()
Expand Down Expand Up @@ -155,9 +153,7 @@ async def info_faq(
await state.set_state(QuestionAnswer.question)


@user_router.callback_query(
F.data == PORTFOLIO_MENU_OPTIONS.get("other_projects")
)
@user_router.callback_query(F.data == PORTFOLIO_MENU_OPTIONS.get("other_projects"))
async def portfolio_other_projects(
callback: CallbackQuery, session: AsyncSession, state: FSMContext
):
Expand Down Expand Up @@ -256,9 +252,7 @@ async def get_product_info(


@user_router.callback_query(QuestionAnswer.question, F.data)
async def faq_answer(
callback: CallbackQuery, session: AsyncSession, state: FSMContext
):
async def faq_answer(callback: CallbackQuery, session: AsyncSession, state: FSMContext):
"""Получить ответ на вопрос из раздела Техподдержка."""

question_list = [
Expand Down
4 changes: 1 addition & 3 deletions app/admin/keyboards/keyboards.py
Original file line number Diff line number Diff line change
Expand Up @@ -98,9 +98,7 @@ async def get_delete_message_keyboard() -> InlineKeyboardMarkup:
"""Создать копку для удаления сообщения."""

keyboard = InlineKeyboardBuilder()
keyboard.add(
InlineKeyboardButton(text="Понятно! :)", callback_data="delete")
)
keyboard.add(InlineKeyboardButton(text="Понятно! :)", callback_data="delete"))
return keyboard.adjust(1).as_markup(resize_keyboard=True)


Expand Down
2 changes: 1 addition & 1 deletion app/alembic.ini
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ sqlalchemy.url = driver://user:pass@localhost/dbname
keys = root,sqlalchemy,alembic

[handlers]
keys = console
keys = generic

[formatters]
keys = generic
Expand Down
4 changes: 2 additions & 2 deletions app/alembic/env.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,11 @@

from core.base import Base

load_dotenv('.env')
load_dotenv(".env")

config = context.config

config.set_main_option('sqlalchemy.url', os.environ['DATABASE_URL'])
config.set_main_option("sqlalchemy.url", os.environ["DATABASE_URL"])

if config.config_file_name is not None:
fileConfig(config.config_file_name)
Expand Down
41 changes: 41 additions & 0 deletions app/alembic/versions/fd795bdbba90_update_feedback.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
"""Update Feedback
Revision ID: fd795bdbba90
Revises:
Create Date: 2024-10-11 19:56:11.060934
"""

from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql

# revision identifiers, used by Alembic.
revision: str = "fd795bdbba90"
down_revision: Union[str, None] = None
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.create_table(
"feedback",
sa.Column("user", sa.Integer(), nullable=False),
sa.Column("rating", sa.INTEGER(), nullable=False),
sa.Column("feedback_text", sa.TEXT(), nullable=False),
sa.Column("feedback_date", postgresql.TIMESTAMP(), nullable=False),
sa.Column("unread", sa.BOOLEAN(), nullable=False),
sa.Column("id", sa.Integer(), nullable=False),
sa.ForeignKeyConstraint(["user"], ["user.id"], ondelete="CASCADE"),
sa.PrimaryKeyConstraint("id"),
)
# ### end Alembic commands ###


def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.drop_table("feedback")
# ### end Alembic commands ###
100 changes: 66 additions & 34 deletions app/bot/bot_const.py
Original file line number Diff line number Diff line change
@@ -1,46 +1,45 @@
from aiogram.fsm.state import StatesGroup, State


ADMIN_POSITIVE_ANSWER: str = 'Добро пожаловать в админку!'
ADMIN_POSITIVE_ANSWER: str = "Добро пожаловать в админку!"

ADMIN_NEGATIVE_ANSWER: str = 'У вас нет прав администратора!'
ADMIN_NEGATIVE_ANSWER: str = "У вас нет прав администратора!"

START_MESSAGE: str = (
'Здравстуйте! Я ваш виртуальный помощник. '
'Как я могу помочь вам сегодня? '
"Здравстуйте! Я ваш виртуальный помощник. "
"Как я могу помочь вам сегодня? "
)

MESSAGE_FOR_SHOW_PROJECTS: str = (
'Вот некоторые из наших проектов. '
'Выберите, чтобы узнать больше о каждом из них: '
"Вот некоторые из наших проектов. "
"Выберите, чтобы узнать больше о каждом из них: "
)

MESSAGE_FOR_PREVIOUS_CHOICE: str = (
'Вы вернулись в оснвное меню. '
'Как я могу помочь вам дальше? '
"Вы вернулись в оснвное меню. Как я могу помочь вам дальше? "
)

MESSAGE_FOR_GET_QUESTIONS: str = 'Какой вид технической поддержки вам нужен? '
MESSAGE_FOR_GET_QUESTIONS: str = "Какой вид технической поддержки вам нужен? "

QUESTION_NOT_FOUND: str = 'Вопрос не найден.'
QUESTION_NOT_FOUND: str = "Вопрос не найден."

MESSAGE_FOR_BACK_TO_PRODUCTS: str = 'Вы вернулись к списку продуктов и услуг: '
MESSAGE_FOR_BACK_TO_PRODUCTS: str = "Вы вернулись к списку продуктов и услуг: "

MESSAGE_FOR_VIEW_PORTFOLIO: str = (
'Вот ссылка на наше портфолио [url]. '
'Хотите узнать больше о конкретны проектах или услугах? '
"Вот ссылка на наше портфолио [url]. "
"Хотите узнать больше о конкретны проектах или услугах? "
)

MESSAGE_FOR_COMPANY_INFO: str = (
'Вот несколько вариантов информации о нашей компании.'
'Что именно вас интересует?'
"Вот несколько вариантов информации о нашей компании."
"Что именно вас интересует? "
)

MESSAGE_FOR_GET_SUPPORT: str = 'Какой вид технической поддержки вам нужен?'
MESSAGE_FOR_GET_SUPPORT: str = "Какой вид технической поддержки вам нужен?"

MESSAGE_FOR_PRODUCTS_SERVICES: str = (
'Мы предлагаем следующие продукты и услуги. '
'Какой из них вас интересует?'
"Мы предлагаем следующие продукты и услуги. "
"Какой из них вас интересует? "
)


Expand All @@ -52,34 +51,67 @@ class Form(StatesGroup):


QUESTIONS: dict[Form, str] = {
Form.first_name: 'Введите ваше имя:',
Form.first_name: "Введите ваше имя:",
Form.phone_number: (
'Введите ваш номер телефона (в формате +7XXXXXXXXXX '
'или 8XXXXXXXXXX):'
)
"Введите ваш номер телефона (в формате +7XXXXXXXXXX "
"или 8XXXXXXXXXX):"
),
}


def succses_answer(user_data: dict) -> str:
return (
f'Спасибо! Наш менеджер свяжется '
f'с вами в ближайшее время.\n'
f'Отправленная форма:\n'
f'Имя: {user_data['first_name']}\n'
f'Номер телефона: {user_data['phone_number']}'
f"Спасибо! Наш менеджер свяжется "
f"с вами в ближайшее время.\n "
f"Отправленная форма:\n "
f"Имя: {user_data['first_name']}\n "
f"Номер телефона: {user_data['phone_number']} "
)


INPUT_NUMBER_PHONE: str = (
'Номер телефона должен быть в формате +7XXXXXXXXXX '
'или 8XXXXXXXXXX. Попробуйте снова.'
"Номер телефона должен быть в формате +7XXXXXXXXXX "
"или 8XXXXXXXXXX. Попробуйте снова. "
)

INPUT_NAME: str = (
'Имя должно содержать только буквы. Попробуйте снова.'
)
INPUT_NAME: str = "Имя должно содержать только буквы. Попробуйте снова."

START_INPUT_USER_DATA: str = (
'Пожалуйста, оставьте ваше имя и контактный номер, '
'и наш менеджер свяжется с вами.'
"Пожалуйста, оставьте ваше имя и контактный номер, "
"и наш менеджер свяжется с вами. "
"Оставляя контактные данные, вы соглашаетесь на их обработку "
"в соответствии с нашей политикой конфиденциальности."
)

MESSAGE_FOR_NOT_SUPPORTED_CONTENT_TYPE = (
"Бот не может обрабатывать этот тип контента. У программистов лапки."
)

MESSAGE_FOR_GET_FEEDBACK = (
"Вы давно не взаимодействовали с ботом. Не хотите оставить отзыв?"
)

MESSAGE_FOR_GET_FEEDBACK_YES = (
"Спасибо за обращение! Если у вас будут вопросы, "
"не стейсняйтесь обращаться снова. Хорошего дня! "
)

MESSAGE_FOR_GET_FEEDBACK_NO = (
"Если у вас будут вопросы, "
"не стейсняйтесь обращаться снова. Хорошего дня! "
)


class FeedbackForm(StatesGroup):
"""Форма для фидбека."""

rating = State()
feedback_text = State()


FEEDBACK_QUESTIONS: dict[FeedbackForm, str] = {
FeedbackForm.rating: "Оцените работу бота от 1 до 10:",
FeedbackForm.feedback_text: (
"Пожалуйста, напишите, что вам понравилось или что можно улучшить:"
),
}
Loading

0 comments on commit d6f3a0e

Please sign in to comment.