Перейти к содержанию

База данных

Модели базы данных Postgres.

TODO: Переместить компонент на уровень бота.

CountedUsers(total: int, notify: int, active: int, cl: Counter[str | None], hour: Counter[int]) dataclass

Результат подсчёта пользователей.

Предоставляет статистические данные о хранилище пользователей. Сколько пользователей считаются активными (временная метка последнего обновления совпадает с расписанием), а также какие классы заданы у пользователей. Используется в методе для подсчёта количества пользователей.

  • total (int): Сколько всего пользователей платформы.
  • notify (int): Сколько пользователей включили уведомления.
  • active (int): Сколько пользователей использую платформу.
  • cl (Counter): Счётчик классов пользователей.
  • hours (Counter): счётчик времени отправки расписания.

total: int instance-attribute

notify: int instance-attribute

active: int instance-attribute

cl: Counter[str | None] instance-attribute

hour: Counter[int] instance-attribute

UserIntent

Bases: Model

Хранилище заготовленных намерений пользователя.

  • user: Какому пользователю принадлежат.
  • name: Строковое имя намерения.
  • intent: Запакованное в строку намерение.

user: fields.ForeignKeyRelation[User] = fields.ForeignKeyField('models.User', 'intents') class-attribute instance-attribute

name = fields.CharField(max_length=64) class-attribute instance-attribute

intent = fields.TextField() class-attribute instance-attribute

User

Bases: Model

Пользователь расписания.

  • id: Telegram ID пользователя.
  • create_time: Когда был зарегистрирован в боте.
  • cl: Выбранный пользователем класс или без привязки.
  • set_class: Устанавливал ли пользователь класс.
  • notify: Отправлять ли уведомлений пользователю.
  • intents: Намерения пользователя.

id = fields.BigIntField(pk=True) class-attribute instance-attribute

create_time = fields.DatetimeField(auto_now_add=True) class-attribute instance-attribute

update_tome = fields.DatetimeField(auto_now=True) class-attribute instance-attribute

last_parse = fields.DatetimeField(auto_now_add=True) class-attribute instance-attribute

cl = fields.CharField(max_length=4, default='') class-attribute instance-attribute

set_class = fields.BooleanField(default=False) class-attribute instance-attribute

notify = fields.BooleanField(default=True) class-attribute instance-attribute

hours = fields.IntField(default=0) class-attribute instance-attribute

intents: fields.ReverseRelation[UserIntent] instance-attribute

get_stats(sc: Schedule) -> CountedUsers async classmethod

Подсчитывает пользователей хранилища.

Вспомогательная статистическая функция. Используется для сбора различной информации о пользователях. К примеру число пользователей, которые считаются активными. Также считает количество пользователей по классам.

set_cl(cl: str, sc: Schedule) -> bool async

Устанавливает класс пользователя по умолчанию.

.. note:: У нас есть намерения по умолчанию.

Как только намерения по умолчанию станут основным способом
использовать расписание, то классы по умолчанию благополучно
исчезнут вместе с методами хранилища.

Для начала вам нужно передать относительно какого расписания устанавливается класс. Вы можете передать как строку или None. None используется чтобы явно отвязать пользователя от класса. Если такого класса нет в расписании, функция вернёт False. Иначе же произойдёт следующее.

  • Класс будет установлен на заданный.
  • Флаг установленного класса станет True.
  • Время последней проверки сравняется с временем расписания.

unset_cl() -> None async

Переводит пользователя в режим выбора класса.

В отличие от полного сброса пользователя, некоторые параметры остаются не тронутыми. Потому предпочтительнее именно не сбрасывать данные, а снимать флаг выбора класса этим методом.

  • Снимает флаг выбора класса пользователя.
  • Сбрасывает класс по умолчанию.
  • Не трогает все остальные параметры пользователя.

get_hour(hour: int) -> bool

Отправлять ли расписание в указанный час.

set_hour(hour: int) -> None

включает рассылку расписание в указанный час.

reset_hour(hour: int) -> None

Отключает рассылку расписания в указанный час.

get_hours() -> Iterator[tuple[int, bool]]

Получает в какие часы включено расписание.

reset_hours() -> None

Сбрасывает часы отправка расписания.

get_updates(sc: Schedule) -> UpdateData | None async

Возвращает компактную запись о всех новых обновлениях.

Получает все новые записи об изменениях в расписании, начиная с текущей отметки last_parse пользователя. Все записи об изменениях сживаются при помощи :py:func:sp.sp.utils.compact_updates. После получения всех изменений, метка последней проверки сдвигается до времени последней записи об изменениях.

.. note:: Хранилище изменений

В скором времени этот метод будет перенесён в хранилище
списка изменений.

intent_or(intent: Intent | None = None) -> Intent async

Возвращает выбранное намерение или намерение по умолчанию.

При фильтрации значений чтобы указать некоторое обязательное намерение.

main_intent() -> Intent async

Получает намерение пользователя по умолчанию.

Оно заменяет собой параметр класса по умолчанию. Описывает что пользователю интереснее всего в расписании. Для учеников это обычно класс. для преподавателей может быть предмет.

Для обратной совместимости пытается предоставить класс как намерение по умолчанию. В будущих версиях данный подход будет изменён.