# DRF Rack # Библиотека классов расширений для Django REST Framework # # Автор: Николай В. Анохин # Все права защищены. Лицензия: 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