Подготовка к замене AuthRejectReason

This commit is contained in:
2026-07-14 12:38:23 +03:00
parent c0cefe2f32
commit 5c39031f04
13 changed files with 251 additions and 18 deletions

View File

@@ -8,3 +8,4 @@
Пакет служебных классов и функций
"""
from .date_utils import DateUtils

View File

@@ -0,0 +1,9 @@
# DRF Rack
# Библиотека классов расширений для Django REST Framework
#
# Автор: Николай В. Анохин <n.anokhin@xeaf.net>
# Все права защищены. Лицензия: MIT
"""
Классов авторизации
"""

View File

@@ -0,0 +1,61 @@
# DRF Rack
# Библиотека классов расширений для Django REST Framework
#
# Автор: Николай В. Анохин <n.anokhin@xeaf.net>
# Все права защищены. Лицензия: MIT
"""
Описание класса ExpiringTokenAuthentication
"""
from typing import Any
from rest_framework.authentication import TokenAuthentication
from rest_framework.request import Request
from net.xeaf.rack.managers import LocaleManager
from net.xeaf.rack.managers import SessionManager
from net.xeaf.rack.models import AccountModel
from net.xeaf.rack.models import SessionModel
class ExpiringTokenAuthentication(TokenAuthentication):
"""
Реализует механизм авторизации для Токенов со сроком действия
"""
AUTH_TOKEN_PARAM = "x-auth-token"
""" Идентификатор параметра токена """
def authenticate(self, request: Request) -> tuple[AccountModel | None, CoreSessionModel | None] | tuple[Any, Any] | None:
"""
Метод авторизации
:param request: Информация о запросе
"""
LocaleManager.adjust_request_language(request)
key = request.query_params.get(self.AUTH_TOKEN_PARAM, None)
if key is not None:
return self.authenticate_credentials(key)
return super().authenticate(request)
def authenticate_credentials(self, key: str) -> tuple[AccountModel | None, CoreSessionModel | None]:
"""
Проверка Токена авторизации
:param key: Токен авторизации
"""
session = SessionManager[SessionModel].find_by_token(token=key)
if not session or session.is_expired():
return None, None
account = session.account
if not account.is_active or account.is_deleted():
return None, None
SessionManager.renew_session(session)
return session.account, session

View File

@@ -0,0 +1,46 @@
# DRF Rack
# Библиотека классов расширений для Django REST Framework
#
# Автор: Николай В. Анохин <n.anokhin@xeaf.net>
# Все права защищены. Лицензия: MIT
"""
Описание класса DateUtils
"""
import datetime
from django.utils import timezone
class DateUtils:
"""
Реализует функции работы с датами и временем
"""
@classmethod
def now(cls) -> datetime.datetime:
"""
Возвращает текущую дату и время
"""
return timezone.now()
@classmethod
def shift_time(cls, date_time: datetime.datetime | None = None, days: int = 0, hours: int = 0, minutes: int = 0, seconds: int = 0) -> datetime.datetime:
"""
Добавляет к дате и времени заданное количество дней, часов, минут и секунд
:param date_time: Дата и время
:param days: Количество дней
:param hours: Количество часов
:param minutes: Количество минут
:param seconds: Количество секунд
:return: Дата и время с добавленным временем
"""
if date_time is None:
date_time = cls.now()
return date_time + datetime.timedelta(days=days, hours=hours, minutes=minutes, seconds=seconds)