# FitnessCenter (Django + Bootstrap)

Простой сайт фитнес‑клуба с регистрацией, логином и покупкой абонементов. Упакован в Docker.

## Стек и зависимости
- Backend: Python 3.13, Django 5.1.4 (`requirements.txt`).
- Frontend: Bootstrap 5 (CDN), шрифт Manrope (Google Fonts), кастомный CSS `static/css/main.css`.
- БД по умолчанию: SQLite (`db.sqlite3`). Настроена смена на Postgres при необходимости.
- Docker: `python:3.13-slim`, entrypoint выполняет миграции и стартует `runserver`.
- Встроенный список клубов (Ростов-на-Дону) доступен во всех шаблонах через context processor.

## Маршруты и HTTP‑запросы
Все маршруты определены в `club/urls.py` и подключены через `gymclub/urls.py`.
- `GET /` — главная витрина с планами (`views.home`).
- `GET /register/` — форма регистрации.
  `POST /register/` — создаёт пользователя и профиль, логинит, редирект в кабинет.
- `GET /login/` — форма входа.
  `POST /login/` — аутентификация через Django `AuthenticationForm`.
- `POST /logout/` (кнопка делает обычный GET, но view вызывает `logout` и редиректит) — выход из аккаунта.
- `GET /dashboard/` — личный кабинет (требует авторизации): активный абонемент, история, покупка новых.
- `POST /subscribe/<int:plan_id>/` — покупка абонемента, создаёт `Subscription` с расчётом даты окончания.
- `admin/` — стандартная Django‑админка для планов/подписок/профилей.

Примечания:
- Все формы используют CSRF‑токен.
- Сообщения пользователю выводятся через Django messages (успех/ошибка).
- API JSON не реализован; взаимодействие сервер‑рендерингом HTML.
- Проверка паролей упрощена: отключена `CommonPasswordValidator` (часто используемые пароли не блокируются).
- Телефон проверяется на реальный российский номер: формат +7XXXXXXXXXX, сохраняется в профиль.

## Модели данных (`club/models.py`)
- `MembershipPlan`: `name`, `description`, `duration_days`, `price`, `created_at`.
- `Profile`: `user` (OneToOne), `phone`, `created_at`.
- `Subscription`: `user`, `plan`, `start_date`, `end_date`, `created_at`, вычисляемый `is_active`.
- Миграция `0002_default_plans` создаёт 3 дефолтных тарифа (1, 3, 12 месяцев).
- Контекстный список клубов в Ростове-на-Дону (5 адресов).

## Формы
- `RegistrationForm` (расширенный `UserCreationForm`): username, имя, фамилия, телефон, email, пароль ×2; автосоздаёт `Profile`.
- `LoginForm` (`AuthenticationForm`) с Bootstrap‑классами.

## Шаблоны и статика
- Базовый шаблон: `templates/base.html` (шапка, футер, вывод messages).
- Страницы: `home.html`, `register.html`, `login.html`, `dashboard.html`.
- Статика: `static/css/main.css`, `static/img/logo.jpg`.

## Как запустить в Docker
```bash
# 1) Скопируйте пример env
cp .env.example .env
# 2) Соберите контейнер
docker compose build
# 3) Запустите
docker compose up
```
Приложение будет доступно на http://localhost:8000

## Локальный запуск без Docker
```bash
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
python manage.py migrate
python manage.py runserver
```

## Переменные окружения
- `DJANGO_DEBUG` (True/False)
- `DJANGO_ALLOWED_HOSTS` (список через запятую)
- `DJANGO_SECRET_KEY`

## Структура проекта
- `gymclub/` — настройки Django.
- `club/` — модели, формы, views, urls.
- `templates/` — Bootstrap‑шаблоны.
- `static/` — CSS и логотип.
- `docker-compose.yml`, `Dockerfile`, `entrypoint.sh` — контейнеризация.

## Замена БД на Postgres (пример)
Добавьте сервис postgres в `docker-compose.yml` и смените `DATABASES` в `gymclub/settings.py` на `django.db.backends.postgresql` с нужными переменными (`HOST`, `PORT`, `USER`, `PASSWORD`, `NAME`).
