Skip to content
4 changes: 2 additions & 2 deletions controllerBD/db_loader.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, declarative_base
from sqlalchemy.orm import declarative_base, sessionmaker

from data.config import DB_DSN

engine = create_engine(DB_DSN, pool_pre_ping=True, isolation_level='AUTOCOMMIT')
engine = create_engine(DB_DSN, pool_pre_ping=True, isolation_level="AUTOCOMMIT")
Session = sessionmaker(bind=engine)

Base = declarative_base()
39 changes: 32 additions & 7 deletions controllerBD/services.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,9 @@ def update_one_user_mets(first_user: int, second_user: int):
"""Записывает в user_mets информацию об одном пользователе."""
with Session() as db_session:
first_user_mets = (
db_session.query(UserMets.met_info).filter(UserMets.id == first_user).first()
db_session.query(UserMets.met_info)
.filter(UserMets.id == first_user)
.first()
)
user_mets = json.loads(first_user_mets[0])
new_met_id = (
Expand Down Expand Up @@ -101,18 +103,37 @@ def get_defaulf_pare_base_id():
def get_user_count_from_db():
with Session() as db_session:
all_users = db_session.query(Users).count()
active_users = db_session.query(UserStatus).filter(UserStatus.status == 1).count()
active_users = (
db_session.query(UserStatus).filter(UserStatus.status == 1).count()
)
return {"all_users": all_users, "active_users": active_users}


def get_active_user_names_from_db():
users = []
with Session() as db_session:
for active_user_id in [user.id for user in db_session.query(UserStatus).filter(UserStatus.status == 1).all()]:
user_tg_username = db_session.query(Username).filter(Username.id == active_user_id).one_or_none().username
user_name = db_session.query(Users).filter(Users.id == active_user_id).one_or_none().name
for active_user_id in [
user.id
for user in db_session.query(UserStatus)
.filter(UserStatus.status == 1)
.all()
]:
user_tg_username = (
db_session.query(Username)
.filter(Username.id == active_user_id)
.one_or_none()
.username
)
user_name = (
db_session.query(Users)
.filter(Users.id == active_user_id)
.one_or_none()
.name
)
users.append({"name": user_name, "tg_username": user_tg_username})
return users


def get_user_id_from_db(teleg_id: int) -> int:
"""Получает id юзера в базе по телеграм id"""
with Session() as db_session:
Expand All @@ -123,7 +144,9 @@ def get_tg_username_from_db_by_teleg_id(teleg_id: int) -> int:
"""Получает телеграм-юзернейм по telegram id"""
with Session() as db_session:
base_id = get_user_id_from_db(teleg_id)
answer = db_session.query(Username.username).filter(Username.id == base_id).first()
answer = (
db_session.query(Username.username).filter(Username.id == base_id).first()
)
if answer:
return answer[0]
return None
Expand All @@ -132,7 +155,9 @@ def get_tg_username_from_db_by_teleg_id(teleg_id: int) -> int:
def get_tg_username_from_db_by_base_id(base_id: int) -> int:
"""Получает телеграм-юзернейм по id в базе"""
with Session() as db_session:
answer = db_session.query(Username.username).filter(Username.id == base_id).first()
answer = (
db_session.query(Username.username).filter(Username.id == base_id).first()
)
if answer:
return answer[0]
return None
Expand Down
2 changes: 1 addition & 1 deletion data/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,4 @@
ADMIN_TG_ID = os.getenv("ADMIN_TG_ID")
DEFAULT_PARE_iD = os.getenv("DEFAULT_PARE_iD")
DEFAULT_PARE_USERNAME = os.getenv("DEFAULT_PARE_USERNAME")
IS_FOR_BUR = os.getenv("IS_FOR_BUR", False)
IS_FOR_BUR = os.getenv("IS_FOR_BUR", False)
1 change: 0 additions & 1 deletion handlers/admin/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +0,0 @@

38 changes: 19 additions & 19 deletions handlers/admin/admin_report.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,41 +8,41 @@ def prepare_user_info():
"""Формируем список пользователей со штрафными баллами и другой инф."""
with Session() as db_session:
query = text(
"""SELECT
mr.about_whom_id,
ui.teleg_id,
ui.name,
un.username,
"""SELECT
mr.about_whom_id,
ui.teleg_id,
ui.name,
un.username,
COUNT(
CASE
WHEN mr.grade = 0 THEN 1
ELSE NULL
END
) AS cnt_fail,
MAX(mr.date_of_comment) AS last_comment,
) AS cnt_fail,
MAX(mr.date_of_comment) AS last_comment,
mr.comment,
bl.ban_status
FROM mets_reviews AS mr
LEFT JOIN user_info AS ui
LEFT JOIN user_info AS ui
ON mr.about_whom_id = ui.id
LEFT JOIN tg_usernames AS un
LEFT JOIN tg_usernames AS un
ON mr.about_whom_id = un.id
LEFT JOIN (
SELECT
banned_user_id,
MAX(id) AS max_id,
SELECT
banned_user_id,
MAX(id) AS max_id,
ban_status
FROM ban_list
GROUP BY banned_user_id, ban_status
) AS bl
) AS bl
ON mr.about_whom_id = bl.banned_user_id
WHERE mr.grade = 0
GROUP BY
mr.about_whom_id,
ui.teleg_id,
ui.name,
un.username,
mr.comment,
GROUP BY
mr.about_whom_id,
ui.teleg_id,
ui.name,
un.username,
mr.comment,
bl.ban_status
ORDER BY MAX(mr.date_of_comment) DESC;
"""
Expand Down
21 changes: 7 additions & 14 deletions handlers/admin/ban_handlers.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,12 @@
from controllerBD.db_loader import Session
from controllerBD.models import BanList, Holidays, UserStatus
from handlers.admin.handlers import admin_menu
from handlers.admin.validators import ban_validator, comment_validator, unban_validator
from handlers.admin.validators import (ban_validator, comment_validator,
unban_validator)
from handlers.decorators import admin_handlers
from keyboards.admin import (
add_to_ban_list,
admin_ban_markup,
admin_cancel_markup,
back_to_main_markup,
ban_list,
cancel,
remove_from_ban_list,
)
from keyboards.admin import (add_to_ban_list, admin_ban_markup,
admin_cancel_markup, back_to_main_markup,
ban_list, cancel, remove_from_ban_list)
from keyboards.user import back_to_main
from loader import bot, logger
from states import AdminData
Expand Down Expand Up @@ -59,10 +54,9 @@ async def ban_list_add(message: types.Message):
async def ban_list_add_answer(message: types.Message, state: FSMContext):
"""Получение ответа от админа и проверка введенного id."""
logger.info(f"Для добавления в бан введен пользователь " f"с if {message.text}.")
user_id = message.text
if not await ban_validator(message):
return
await state.update_data(banned_user_id=user_id)
await state.update_data(banned_user_id=int(message.text))
await comment_to_ban(message)


Expand Down Expand Up @@ -137,10 +131,9 @@ async def ban_list_remove(message: types.Message):
async def ban_list_remove_answer(message: types.Message, state: FSMContext):
"""Получение ответа с id пользователем для вывода из бана. Валидация."""
logger.info(f"Для вывода из бана введен пользователь " f"с if {message.text}.")
user_id = message.text
if not await unban_validator(message):
return
await state.update_data(unbanned_user_id=user_id)
await state.update_data(unbanned_user_id=int(message.text))
await comment_to_unban(message)


Expand Down
41 changes: 15 additions & 26 deletions handlers/admin/handlers.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,33 +6,23 @@

from controllerBD.db_loader import Session
from controllerBD.models import UserStatus
from controllerBD.services import get_user_count_from_db, get_active_user_names_from_db
from handlers.admin.admin_report import prepare_report_message, prepare_user_info
from controllerBD.services import (get_active_user_names_from_db,
get_user_count_from_db)
from handlers.admin.admin_report import (prepare_report_message,
prepare_user_info)
from handlers.decorators import admin_handlers
from handlers.user.check_message import prepare_user_list, send_message
from handlers.user.get_info_from_table import get_id_from_user_info_table
from keyboards.admin import (
admin_cancel_markup,
admin_change_status_markup,
admin_inform_markup,
admin_menu_button,
admin_menu_markup,
admin_pair_generation_markup,
cancel,
change_pair_generation_date,
change_status,
do_not_take_part_button,
force_pair_generation,
go_back,
inform,
inform_active_users,
inform_bad_users,
pair_generation,
renew_pair_generation,
send_message_to_all_button,
stop_pair_generation,
take_part_button,
)
from keyboards.admin import (admin_cancel_markup, admin_change_status_markup,
admin_inform_markup, admin_menu_button,
admin_menu_markup, admin_pair_generation_markup,
cancel, change_pair_generation_date,
change_status, do_not_take_part_button,
force_pair_generation, go_back, inform,
inform_active_users, inform_bad_users,
pair_generation, renew_pair_generation,
send_message_to_all_button, stop_pair_generation,
take_part_button)
from loader import bot, logger
from match_algoritm.MatchingHelper import start_algoritm
from states import AdminData
Expand Down Expand Up @@ -77,8 +67,7 @@ async def inform_message_1(message: types.Message):
for user in active_users:
await bot.send_message(
message.from_user.id,
f"Имя: {user['name']}\n"
f"Телеграм: @{user['tg_username']}",
f"Имя: {user['name']}\n" f"Телеграм: @{user['tg_username']}",
)


Expand Down
9 changes: 6 additions & 3 deletions handlers/admin/validators/validators.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,8 @@ async def resolve_user_input_to_db_id(user_input: str):
return (
True,
db_id,
f"Найден пользователь по явно указанному внутреннему ID: {internal_user.name}",
f"Найден пользователь по явно указанному внутреннему ID: "
f"{internal_user.name}",
)
return False, None, f"Пользователь с внутренним ID {db_id} не найден"
except ValueError:
Expand Down Expand Up @@ -136,14 +137,16 @@ async def resolve_user_input_to_db_id(user_input: str):
telegram_user.id,
f"⚠️ ВНИМАНИЕ: ID {user_id} найден у двух пользователей! "
f"Выбран по Telegram ID: {telegram_user.name}. "
f"Для точности используйте @username или укажите 'db:{user_id}' для внутреннего ID.",
f"Для точности используйте @username или укажите "
f"'db:{user_id}' для внутреннего ID.",
)

# Случай 4: Не найден ни по одному типу ID
return (
False,
None,
f"Пользователь с ID {user_id} не найден ни в внутренней базе, ни среди Telegram ID",
f"Пользователь с ID {user_id} не найден ни в внутренней базе, "
f"ни среди Telegram ID",
)

return False, None, "Неверный формат ввода. Введите число (ID) или username с @"
Expand Down
4 changes: 3 additions & 1 deletion handlers/user/check_message.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,4 +53,6 @@ async def change_status(teleg_id):
"""Смена статуса участия."""
with Session() as db_session:
user_id = get_id_from_user_info_table(teleg_id)
db_session.query(UserStatus).filter(UserStatus.id == user_id).update({"status": 0})
db_session.query(UserStatus).filter(UserStatus.id == user_id).update(
{"status": 0}
)
36 changes: 19 additions & 17 deletions handlers/user/first_check.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,31 +13,33 @@
async def check_and_add_registration_button(message: types.Message):
"""Проверка пользователя для последующих действий."""
text = (
"Добро пожаловать в бот!\n\n"
"Для подбора пары нужно пройти небольшую регистрацию: "
"представиться и ответить на пару вопросов о себе, "
"чтобы собеседнику было проще начать с тобой разговор. Если"
" отвечать не хочется, то часть шагов можно пропустить.\n\n"
'Нажми кнопку "Регистрация" ниже.\n\n'
"Для общения, помощи и рассказов о том, как прошла "
"встреча присоединяйся к нашему IT сообществу в "
"телеграм https://t.me/ViribusUnitisGroup"
)
"Добро пожаловать в бот!\n\n"
"Для подбора пары нужно пройти небольшую регистрацию: "
"представиться и ответить на пару вопросов о себе, "
"чтобы собеседнику было проще начать с тобой разговор. Если"
" отвечать не хочется, то часть шагов можно пропустить.\n\n"
'Нажми кнопку "Регистрация" ниже.\n\n'
"Для общения, помощи и рассказов о том, как прошла "
"встреча присоединяйся к нашему IT сообществу в "
"телеграм https://t.me/ViribusUnitisGroup"
)
if IS_FOR_BUR:
text = (
"""
text = """
Привет!

Добро пожаловать в бот для знакомств 2-й смены лагеря "Буревестник" 2025!

Каждый день мы будем подбирать для тебя нового собеседника из нашей смены. Ты сможешь узнать, кто это, и пойти познакомиться с ним вживую! Распределение происходит ежедневно, так что не упусти шанс найти новых друзей.
Чтобы начать, пройди небольшую регистрацию: представься и ответь на пару вопросов. Это поможет твоему новому знакомому завязать разговор.
Каждый день мы будем подбирать для тебя нового собеседника из нашей смены. \
Ты сможешь узнать, кто это, и пойти познакомиться с ним вживую! \
Распределение происходит ежедневно, так что не упусти шанс найти новых друзей.
Чтобы начать, пройди небольшую регистрацию: представься и ответь на пару вопросов. \
Это поможет твоему новому знакомому завязать разговор.

Нажми кнопку "Регистрация" ниже, чтобы найти первого собеседника!

Для общения всей сменой, помощи и рассказов о встречах присоединяйся к нашему общему чату в Телеграме: https://t.me/+Nrp4dllTGetkNDJi

Для общения всей сменой, помощи и рассказов о встречах присоединяйся к нашему \
общему чату в Телеграме: https://t.me/+Nrp4dllTGetkNDJi
"""
)
if not await check_user_in_base(message):
await bot.send_message(
message.from_user.id,
Expand Down
4 changes: 3 additions & 1 deletion handlers/user/get_info_from_table.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,9 @@ def get_user_data_from_db(teleg_id):
def get_user_status_from_db(user_id):
"""Получение статуса участия пользователя из БД"""
with Session() as db_session:
user_status = db_session.query(UserStatus).filter(UserStatus.id == user_id).first()
user_status = (
db_session.query(UserStatus).filter(UserStatus.id == user_id).first()
)
return user_status.__dict__


Expand Down
Loading
Loading