90 lines
2.9 KiB
Python
90 lines
2.9 KiB
Python
# DRF Rack
|
|
# Библиотека классов расширений для Django REST Framework
|
|
#
|
|
# Автор: Николай В. Анохин <n.anokhin@xeaf.net>
|
|
# Все права защищены. Лицензия: MIT
|
|
|
|
"""
|
|
Описание класса ExpiredAtMixin
|
|
"""
|
|
|
|
from django.conf import settings
|
|
from django.db import models
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
from net.xeaf.rack.utils import DateUtils
|
|
|
|
|
|
class ExpiresAtMixin(models.Model):
|
|
"""
|
|
Добавляет к модели свойство даты и времени истечения
|
|
"""
|
|
|
|
_RENEW_THROTTLING_SECONDS = getattr(settings, "AUTH_SESSION_THROTTLING", 0)
|
|
""" Не сохранять в БД, если сдвиг времени меньше этого значения """
|
|
|
|
expires_at = models.DateTimeField(
|
|
null=True,
|
|
blank=True,
|
|
editable=True,
|
|
verbose_name=_("rack.mixin.expires_at"),
|
|
)
|
|
""" Дата и время истечения """
|
|
|
|
def renew(self, seconds: int, force: bool = False, save: bool = False) -> None:
|
|
"""
|
|
Устанавливает время истечения на заданное количество секунд
|
|
|
|
:param seconds: Количество секунд до истечения
|
|
:param force: Признак принудительного обновления
|
|
:param save: Признак необходимости сохранения
|
|
"""
|
|
|
|
# Проверка значений
|
|
if seconds <= 0:
|
|
raise ValueError(f"The seconds parameter must be greater than 0")
|
|
|
|
# Если None - то значение не может быть просрочено
|
|
if self.expires_at is not None:
|
|
|
|
value = DateUtils.shift_time(seconds=seconds)
|
|
delta = (value - self.expires_at).total_seconds()
|
|
|
|
if delta >= self._RENEW_THROTTLING_SECONDS or force:
|
|
self.expires_at = value
|
|
|
|
# Проверяем сохранение
|
|
if save:
|
|
self.save()
|
|
|
|
def expire(self, save: bool = False) -> None:
|
|
"""
|
|
Устанавливает время истечения на сейчас
|
|
|
|
:param save: Признак необходимости сохранения
|
|
"""
|
|
|
|
self.expires_at = DateUtils.now()
|
|
if save:
|
|
self.save()
|
|
|
|
def is_expired(self) -> bool:
|
|
"""
|
|
Возвращает признак просроченного значения
|
|
|
|
:return: Признак просроченного значения
|
|
"""
|
|
|
|
# Если None - то значение не просрочено
|
|
if self.expires_at is None:
|
|
return False
|
|
|
|
return self.expires_at < DateUtils.now()
|
|
|
|
class Meta:
|
|
"""
|
|
Параметры класса
|
|
"""
|
|
|
|
abstract = True
|