База данных
Модели базы данных 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
Получает намерение пользователя по умолчанию.
Оно заменяет собой параметр класса по умолчанию. Описывает что пользователю интереснее всего в расписании. Для учеников это обычно класс. для преподавателей может быть предмет.
Для обратной совместимости пытается предоставить класс как намерение по умолчанию. В будущих версиях данный подход будет изменён.