<div align="center">

<img src="static/images/igor-bezrukavov.jpg" alt="Игорь Олегович Безрукавов" width="180" height="180" style="object-fit: cover; border-radius: 50%;">

# ИО · physics & math

### Персональный сайт преподавателя физики и математики

Подготовка к ОГЭ и ЕГЭ, индивидуальные консультации и удобная онлайн-запись.

![Python](https://img.shields.io/badge/Python-3.10%2B-3776AB?style=flat-square&logo=python&logoColor=white)
![Django](https://img.shields.io/badge/Django-5.x-0C4B33?style=flat-square&logo=django&logoColor=white)
![SQLite](https://img.shields.io/badge/SQLite-development-003B57?style=flat-square&logo=sqlite&logoColor=white)
![Status](https://img.shields.io/badge/status-in%20development-ee7046?style=flat-square)

</div>

<br>

## О проекте

Сайт Игоря Олеговича Безрукавова — преподавателя физики и математики, выпускника АГУ с опытом преподавания и репетиторства более 10 лет.

Главная задача проекта — превратить первый интерес ученика в понятный путь к консультации: показать подход преподавателя, помочь выбрать свободное время и сохранить заявку в рабочем кабинете.

## Возможности

| Для ученика | Для преподавателя |
| --- | --- |
| Адаптивный лендинг с личной подачей | Дашборд с ключевыми показателями |
| Раздельные направления: физика и математика | Управление свободными окнами |
| ОГЭ, ЕГЭ и школьная программа | Статусы заявок от «Новая» до «Проведена» |
| Выбор класса, формата и свободного времени | Быстрые массовые действия |
| Защита от двойной записи на один слот | Ссылка на онлайн-встречу и заметки |
| Политика конфиденциальности и согласие | Фильтры, поиск и история изменений |

### Как работает запись

```text
Преподаватель открывает время в админке
                    ↓
Свободный слот появляется на сайте
                    ↓
Ученик заполняет форму и выбирает слот
                    ↓
Заявка появляется в кабинете преподавателя
                    ↓
Подтверждение → консультация → статус «Проведена»
```

## Технологии

- **Backend:** Django 5, Python
- **Database:** SQLite для разработки
- **Frontend:** Django Templates, HTML, CSS
- **Admin:** кастомизированная Django Admin с дашбордом
- **Static:** локальные CSS и изображения
- **Timezone:** `Europe/Astrakhan`

## Быстрый запуск

### 1. Установка зависимостей

В терминале PyCharm, находясь в корне проекта:

```powershell
.\.venv\Scripts\python.exe -m pip install -r requirements.txt
```

### 2. Подготовка базы

```powershell
.\.venv\Scripts\python.exe manage.py migrate
.\.venv\Scripts\python.exe manage.py createsuperuser
```

Команда `createsuperuser` попросит придумать логин и пароль для кабинета преподавателя.

### 3. Запуск

```powershell
.\.venv\Scripts\python.exe manage.py runserver
```

После запуска:

| Адрес | Назначение |
| --- | --- |
| `http://127.0.0.1:8000/` | Публичный сайт |
| `http://127.0.0.1:8000/admin/` | Кабинет преподавателя |
| `http://127.0.0.1:8000/privacy/` | Политика конфиденциальности |

## Ежедневная работа преподавателя

1. Откройте раздел **«Расписание»** в админ-панели.
2. Добавьте свободное окно: дату, время, длительность, предмет и формат.
3. Убедитесь, что у слота включён флаг **«Открыт для записи»**.
4. Новая заявка появится в разделе **«Записи на консультации»**.
5. Проверьте контакты, подтвердите заявку и при необходимости добавьте ссылку на встречу.
6. После занятия переведите заявку в статус **«Проведена»**.

Отменённый слот снова становится доступным для записи. Копировать регулярное расписание можно массовым действием **«Создать копии на следующую неделю»**.

> Важно: сайт показывает только заранее созданные свободные окна. Если в расписании нет слотов, на главной странице будет отображаться `0` свободных мест.

## Статусы заявок

| Статус | Когда использовать |
| --- | --- |
| **Новая** | Заявка пришла с сайта и ещё не обработана |
| **Подтверждена** | Время согласовано с учеником |
| **Проведена** | Консультация состоялась |
| **Отменена** | Занятие отменено, слот можно использовать снова |
| **Не пришёл** | Ученик не подключился или не пришёл |

## Структура проекта

```text
teacher_site/
├── config/                       # настройки и маршруты Django
├── consultations/                # основное приложение
│   ├── migrations/               # миграции базы данных
│   ├── templates/
│   │   ├── admin/                # дашборд и тема админ-панели
│   │   └── consultations/        # публичные страницы
│   ├── admin.py                  # расписание, заявки и действия
│   ├── forms.py                  # форма записи и валидация
│   ├── models.py                 # слоты и записи
│   └── views.py                  # публичные страницы
├── static/
│   ├── admin/css/                # оформление кабинета
│   ├── css/                      # оформление сайта
│   └── images/                   # фотография преподавателя
├── manage.py
├── requirements.txt
└── README.md
```

## Проверка проекта

```powershell
.\.venv\Scripts\python.exe manage.py check
.\.venv\Scripts\python.exe manage.py makemigrations --check --dry-run
```

Обе команды должны завершиться без ошибок и сообщений о новых миграциях.

## Перед публикацией

В `config/settings.py` обязательно:

- заменить `SECRET_KEY` на секретное значение;
- установить `DEBUG = False`;
- указать домен в `ALLOWED_HOSTS`;
- настроить `STATIC_ROOT` и выполнить `collectstatic`;
- заменить SQLite на PostgreSQL, если проектом будут пользоваться постоянно;
- настроить резервное копирование базы и защиту админ-панели.

Для автоматических уведомлений в Telegram или по email понадобятся отдельные токены и данные для подключения. Сейчас заявки надёжно сохраняются в админ-панели, а поле напоминания позволяет отмечать обработку вручную.

## Идеи для следующего этапа

- Telegram-уведомление о новой заявке;
- автоматическое подтверждение и напоминание о занятии;
- интеграция с календарём преподавателя;
- онлайн-оплата консультаций;
- личный кабинет ученика;
- публикация отзывов и полезных материалов.

<br>

<div align="center">

Сделано для спокойной и понятной подготовки к экзаменам.

</div>
