diff --git a/src/bot/handlers/unverified/callbacks/menu.py b/src/bot/handlers/unverified/callbacks/menu.py index 69be429..0e9fb93 100644 --- a/src/bot/handlers/unverified/callbacks/menu.py +++ b/src/bot/handlers/unverified/callbacks/menu.py @@ -111,7 +111,7 @@ async def call_finish_verification( status = await verify_student( tg_user=telegram_user, name=data["full_name"], - student_id=int(data["self_id"]), + self_id=int(data["self_id"]), is_student=data["role"] == "student", group_id=data["group_id"], session=session, diff --git a/src/bot/handlers/unverified/commands/menu.py b/src/bot/handlers/unverified/commands/menu.py index 9f4fe84..8242a93 100644 --- a/src/bot/handlers/unverified/commands/menu.py +++ b/src/bot/handlers/unverified/commands/menu.py @@ -1,4 +1,3 @@ -from aiogram import F from aiogram.fsm.context import FSMContext from aiogram.types import Message diff --git a/src/bot/services/types/verification_statuses.py b/src/bot/services/types/verification_statuses.py index f449cd9..90bc272 100644 --- a/src/bot/services/types/verification_statuses.py +++ b/src/bot/services/types/verification_statuses.py @@ -14,6 +14,4 @@ class VerificationStatus(Enum): NOT_FOUND = auto() - ALREADY_BOUND_TO_CURRENT_ACCOUNT = auto() - - ALREADY_BOUND_TO_ANOTHER_ACCOUNT = auto() + ACCOUNT_ALREADY_BOUND = auto() diff --git a/src/bot/services/verification.py b/src/bot/services/verification.py index ddc7e19..00af038 100644 --- a/src/bot/services/verification.py +++ b/src/bot/services/verification.py @@ -5,7 +5,6 @@ __all__ = [ from loguru import logger as loguru_logger -from sqlalchemy.exc import NoResultFound from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.future import select @@ -39,7 +38,7 @@ async def verify_student( tg_user: TelegramUser, name: str, is_student: bool, - student_id: int, + self_id: int, group_id: str, session: AsyncSession, ) -> VerificationStatus: @@ -58,44 +57,56 @@ async def verify_student( VerificationStatus: result of the verification process. """ if tg_user.university_member_id is not None: - return VerificationStatus.ALREADY_BOUND_TO_CURRENT_ACCOUNT + return VerificationStatus.ACCOUNT_ALREADY_BOUND - query = ( - select(Student) - .where(Student.name == name) - .where(Student.student_id == student_id) - .where(Student.group_id == group_id) - ) + if is_student: + query = ( + select(Student) + .where(Student.name == name) + .where(Student.student_id == self_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) + found_member = result.scalar_one_or_none() - try: - student = result.scalar_one() - - if student.tg_users: - return VerificationStatus.ALREADY_BOUND_TO_ANOTHER_ACCOUNT - - except NoResultFound: + if found_member is None: # FIXME: placeholder. # 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( name=name, - student_id=student_id, + student_id=self_id, group_id=group_id, ) - session.add(student) + tg_user.university_member_id = student.id # pyrefly: ignore + student.tg_users.append(tg_user) - tg_user.university_member_id = student.id # pyrefly: ignore + await session.commit() - student.tg_users.append(tg_user) + loguru_logger.debug( + f"Successfully bound user {tg_user.id} to student {student.id}" + ) + + return VerificationStatus.SUCCESSFULLY_BOUND + + found_member.tg_users.append(tg_user) await session.commit() loguru_logger.debug( - f"Successfully bound user {tg_user.id} to student {student.id}" + f"Successfully bound user {tg_user.id} " + f"to university_member {found_member.id}" ) return VerificationStatus.SUCCESSFULLY_BOUND diff --git a/src/bot/utils/registry/__init__.py b/src/bot/utils/registry/__init__.py index f8ed7fc..fd2bef3 100644 --- a/src/bot/utils/registry/__init__.py +++ b/src/bot/utils/registry/__init__.py @@ -103,7 +103,7 @@ class RouterRegistry: if isinstance(chat_types, ChatType): chat_types = [chat_types] - if isinstance(filters, Filter): + if isinstance(filters, (Filter, State)): filters = [filters] elif filters is None: filters = list()