113 lines
3.8 KiB
Markdown
113 lines
3.8 KiB
Markdown
|
|
# Сервис расписания для сына
|
|||
|
|
|
|||
|
|
Сервис для управления и отображения расписания занятий с поддержкой веб-интерфейса и Telegram-бота.
|
|||
|
|
|
|||
|
|
## Компоненты
|
|||
|
|
|
|||
|
|
1. **Backend (FastAPI)** - API для работы с расписанием
|
|||
|
|
2. **Публичная веб-страница** - отображение расписания на сегодня/завтра (для планшета)
|
|||
|
|
3. **Веб-админка** - управление расписанием на неделю
|
|||
|
|
4. **Telegram-бот** - просмотр и редактирование расписания, напоминания
|
|||
|
|
|
|||
|
|
## Установка и запуск
|
|||
|
|
|
|||
|
|
### Требования
|
|||
|
|
|
|||
|
|
- Docker и Docker Compose
|
|||
|
|
- Telegram Bot Token (получить у @BotFather)
|
|||
|
|
|
|||
|
|
### Настройка
|
|||
|
|
|
|||
|
|
1. Скопируйте файл `.env.example` в `.env` и укажите токен Telegram-бота:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
cp .env.example .env
|
|||
|
|
# Отредактируйте .env и замените your_telegram_bot_token_here на ваш реальный токен
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Токен можно получить у [@BotFather](https://t.me/BotFather) в Telegram.
|
|||
|
|
|
|||
|
|
2. Запустите сервис:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
docker compose up -d
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Сервис будет доступен на:
|
|||
|
|
- Публичная страница: http://localhost:8123/
|
|||
|
|
- Админка: http://localhost:8123/admin
|
|||
|
|
- API: http://localhost:8123/api
|
|||
|
|
|
|||
|
|
### Использование Telegram-бота
|
|||
|
|
|
|||
|
|
1. Найдите вашего бота в Telegram
|
|||
|
|
2. Отправьте команду `/start`
|
|||
|
|
3. Используйте кнопки для просмотра и добавления записей
|
|||
|
|
|
|||
|
|
## Структура данных
|
|||
|
|
|
|||
|
|
### Task (Задача)
|
|||
|
|
- Привязка только к дате, без времени
|
|||
|
|
- Может повторяться еженедельно
|
|||
|
|
- Отображается выше событий со временем
|
|||
|
|
|
|||
|
|
### Event (Занятие)
|
|||
|
|
- Привязка к дате, времени начала и длительности
|
|||
|
|
- Пересечения по времени запрещены
|
|||
|
|
- Имеет напоминания в Telegram (за 5 минут до начала)
|
|||
|
|
|
|||
|
|
## API
|
|||
|
|
|
|||
|
|
### GET /api/schedule?from=YYYY-MM-DD&to=YYYY-MM-DD
|
|||
|
|
Получить расписание в диапазоне дат
|
|||
|
|
|
|||
|
|
### POST /api/events?kind=task
|
|||
|
|
Создать задачу
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"date": "2024-12-02",
|
|||
|
|
"title": "Название задачи",
|
|||
|
|
"repeat_weekly": false,
|
|||
|
|
"copy_to_weekdays": [2, 3, 4]
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### POST /api/events?kind=event
|
|||
|
|
Создать занятие
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"date": "2024-12-02",
|
|||
|
|
"start_time": "14:30",
|
|||
|
|
"duration_min": 60,
|
|||
|
|
"title": "Название занятия"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### PUT /api/events/{id}
|
|||
|
|
Обновить запись
|
|||
|
|
|
|||
|
|
### DELETE /api/events/{id}?scope=one_date|series
|
|||
|
|
Удалить запись (для weekly tasks можно указать область применения)
|
|||
|
|
|
|||
|
|
## Резервное копирование
|
|||
|
|
|
|||
|
|
База данных хранится в `data/schedule.db`. Для резервного копирования:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# Создать backup
|
|||
|
|
docker compose exec backend python -c "import shutil; shutil.copy2('/app/data/schedule.db', '/app/data/schedule.db.backup')"
|
|||
|
|
|
|||
|
|
# Восстановить из backup
|
|||
|
|
docker compose exec backend python -c "import shutil; shutil.copy2('/app/data/schedule.db.backup', '/app/data/schedule.db')"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Особенности
|
|||
|
|
|
|||
|
|
- Таймзона: Europe/London
|
|||
|
|
- Неделя начинается с понедельника
|
|||
|
|
- Дискретность времени: 15 минут (00, 15, 30, 45)
|
|||
|
|
- Диапазон времени: 08:00-20:00
|
|||
|
|
- Автообновление публичной страницы: каждые 5 минут
|
|||
|
|
- Напоминания в Telegram: за 5 минут до начала события
|
|||
|
|
|