Fix [verification]: fix verification status & refactor code

This commit is contained in:
Kirill Samoylenkov 2025-11-08 15:38:12 +05:00
parent a511f7df3f
commit 680e19b3e7
5 changed files with 36 additions and 28 deletions

View file

@ -111,7 +111,7 @@ async def call_finish_verification(
status = await verify_student( status = await verify_student(
tg_user=telegram_user, tg_user=telegram_user,
name=data["full_name"], name=data["full_name"],
student_id=int(data["self_id"]), self_id=int(data["self_id"]),
is_student=data["role"] == "student", is_student=data["role"] == "student",
group_id=data["group_id"], group_id=data["group_id"],
session=session, session=session,

View file

@ -1,4 +1,3 @@
from aiogram import F
from aiogram.fsm.context import FSMContext from aiogram.fsm.context import FSMContext
from aiogram.types import Message from aiogram.types import Message

View file

@ -14,6 +14,4 @@ class VerificationStatus(Enum):
NOT_FOUND = auto() NOT_FOUND = auto()
ALREADY_BOUND_TO_CURRENT_ACCOUNT = auto() ACCOUNT_ALREADY_BOUND = auto()
ALREADY_BOUND_TO_ANOTHER_ACCOUNT = auto()

View file

@ -5,7 +5,6 @@ __all__ = [
from loguru import logger as loguru_logger from loguru import logger as loguru_logger
from sqlalchemy.exc import NoResultFound
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select from sqlalchemy.future import select
@ -39,7 +38,7 @@ async def verify_student(
tg_user: TelegramUser, tg_user: TelegramUser,
name: str, name: str,
is_student: bool, is_student: bool,
student_id: int, self_id: int,
group_id: str, group_id: str,
session: AsyncSession, session: AsyncSession,
) -> VerificationStatus: ) -> VerificationStatus:
@ -58,38 +57,39 @@ async def verify_student(
VerificationStatus: result of the verification process. VerificationStatus: result of the verification process.
""" """
if tg_user.university_member_id is not None: if tg_user.university_member_id is not None:
return VerificationStatus.ALREADY_BOUND_TO_CURRENT_ACCOUNT return VerificationStatus.ACCOUNT_ALREADY_BOUND
if is_student:
query = ( query = (
select(Student) select(Student)
.where(Student.name == name) .where(Student.name == name)
.where(Student.student_id == student_id) .where(Student.student_id == self_id)
.where(Student.group_id == group_id) .where(Student.group_id == group_id)
) )
else:
# Fixme: Add Teacher query.
# https://github.com/orgs/dibuildo/projects/2/views/1?pane=issue&itemId=135551755
query = (
select(Student)
.where(Student.name == name)
.where(Student.student_id == self_id)
)
result = await session.execute(query) result = await session.execute(query)
found_member = result.scalar_one_or_none()
try: if found_member is None:
student = result.scalar_one()
if student.tg_users:
return VerificationStatus.ALREADY_BOUND_TO_ANOTHER_ACCOUNT
except NoResultFound:
# FIXME: placeholder. # FIXME: placeholder.
# In a real scenario we should return NOT_FOUND. # In a real scenario we should return NOT_FOUND.
loguru_logger.info(f"Creating new student: {name}") loguru_logger.debug(f"Creating new student: {name}")
student = Student( student = Student(
name=name, name=name,
student_id=student_id, student_id=self_id,
group_id=group_id, group_id=group_id,
) )
session.add(student) session.add(student)
tg_user.university_member_id = student.id # pyrefly: ignore tg_user.university_member_id = student.id # pyrefly: ignore
student.tg_users.append(tg_user) student.tg_users.append(tg_user)
await session.commit() await session.commit()
@ -99,3 +99,14 @@ async def verify_student(
) )
return VerificationStatus.SUCCESSFULLY_BOUND return VerificationStatus.SUCCESSFULLY_BOUND
found_member.tg_users.append(tg_user)
await session.commit()
loguru_logger.debug(
f"Successfully bound user {tg_user.id} "
f"to university_member {found_member.id}"
)
return VerificationStatus.SUCCESSFULLY_BOUND

View file

@ -103,7 +103,7 @@ class RouterRegistry:
if isinstance(chat_types, ChatType): if isinstance(chat_types, ChatType):
chat_types = [chat_types] chat_types = [chat_types]
if isinstance(filters, Filter): if isinstance(filters, (Filter, State)):
filters = [filters] filters = [filters]
elif filters is None: elif filters is None:
filters = list() filters = list()