From 54d717369a9b731c05c36936582d3e5e52d1e9d5 Mon Sep 17 00:00:00 2001 From: "Nick V. Anokhin" Date: Tue, 14 Jul 2026 12:56:07 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D1=82=D0=BB=D0=B0=D0=B6=D0=B5=D0=BD=20?= =?UTF-8?q?=D0=BA=D0=BB=D0=B0=D1=81=D1=81=20SessionManager?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- net/xeaf/rack/managers/account_manager.py | 41 ++++++++++++++++++++--- net/xeaf/rack/managers/session_manager.py | 19 +++++++---- 2 files changed, 48 insertions(+), 12 deletions(-) diff --git a/net/xeaf/rack/managers/account_manager.py b/net/xeaf/rack/managers/account_manager.py index e8819de..d79100d 100644 --- a/net/xeaf/rack/managers/account_manager.py +++ b/net/xeaf/rack/managers/account_manager.py @@ -7,7 +7,7 @@ """ Описание класса AccountManager """ - +from net.xeaf.rack.enums import AuthRejectReason from net.xeaf.rack.models.account_model import AccountModel @@ -17,14 +17,45 @@ class AccountManager: """ @classmethod - def check_account(cls, username: str) -> None: + def check_account_auth(cls, account: AccountModel | None) -> AuthRejectReason | None: """ - Проверяет Аккаунт с указанным именем + Проверяет возможность авторизации Аккаунта + + :param account: Аккаунт + :return: Причина отказа в авторизации или None, если авторизация возможна """ - account = AccountModel.objects.filter(username=username).first() if account is None: - raise ValueError("Account not found") + return AuthRejectReason.INVALID_USERNAME_OR_PASSWORD + if not account.is_active: + return AuthRejectReason.ACCOUNT_IS_NOT_ACTIVE + if account.joined_at is None: + return AuthRejectReason.REGISTRATION_IS_NOT_COMPLETE + + return None + + @classmethod + def check_username_auth(cls, username: str) -> AuthRejectReason | None: + """ + Проверяет возможность авторизации Аккаунта с заданным именем + + :param username: Имя Аккаунта + :return: Причина отказа в авторизации или None, если авторизация возможна + """ + + account = cls.find_by_username(username) + return cls.check_account_auth(account) + + @classmethod + def find_by_username(cls, username: str) -> AccountModel | None: + """ + Возвращает Аккаунт с указанным именем + + :param username: Имя Аккаунта + :return: Аккаунт или None, если Аккаунт не найден + """ + + return AccountModel.objects.filter(username=username).first() @classmethod def restore_account(cls, account: AccountModel) -> None: diff --git a/net/xeaf/rack/managers/session_manager.py b/net/xeaf/rack/managers/session_manager.py index 50e66c0..8a08c25 100644 --- a/net/xeaf/rack/managers/session_manager.py +++ b/net/xeaf/rack/managers/session_manager.py @@ -47,16 +47,17 @@ class SessionManager[T:SessionModel]: :return: Объект данных сессии """ + # Отсекаем ошибки активности и регистрации + reason = AccountManager.check_username_auth(username) + if reason is not None: + cls._raise_auth_error(reason) + # noinspection PyTypeChecker account: AccountModel | None = authenticate(username=username, password=password) - # Обрабатываем ошибки + # Обрабатываем ошибки проверки пароля if account is None: cls._raise_auth_error(AuthRejectReason.INVALID_USERNAME_OR_PASSWORD) - elif not account.is_active: - cls._raise_auth_error(AuthRejectReason.ACCOUNT_IS_NOT_ACTIVE) - elif account.joined_at is None: - cls._raise_auth_error(AuthRejectReason.REGISTRATION_IS_NOT_COMPLETE) # Создаем и возвращаем объект сессии AccountManager.restore_account(account) @@ -145,11 +146,15 @@ class SessionManager[T:SessionModel]: if cls.__model_class is None: model_path = ConfigurationManager.get_string("AUTH_SESSION_MODEL", "net_xeaf_rack.SessionModel") app_label, model_name = model_path.split(".") - model = apps.get_model(app_label, model_name) + + try: + model = apps.get_model(app_label, model_name) + except LookupError: + model = None # Нет класса if not model: - raise ImproperlyConfigured("AUTH_SESSION_MODEL must be set in settings.py") + raise ImproperlyConfigured("Correct AUTH_SESSION_MODEL must be set in settings.py") # Некорректный класс if not issubclass(model, SessionModel):