Files
drf-rack/net/xeaf/rack/models/mixins/expired_at_mixin.py

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