Небольшое веб-приложение для каталогизации музыкальных альбомов. Проект сделан в стиле SDD: сначала зафиксированы сущности, ограничения и пользовательские сценарии, затем собран минимальный вертикальный путь от данных до интерфейса.
- искать альбомы по названию альбома, исполнителя или песни;
- фильтровать каталог по исполнителю;
- добавлять исполнителей и песни;
- создавать и редактировать альбомы с треклистом;
- удалять альбом вместе с его треками;
- показывать один и тот же трек в разных альбомах под разными номерами;
- запускаться локально или через
docker compose up.
Artist 1 ─── * Album 1 ─── * Track * ─── 1 Song
Artist— имя исполнителя;Album— название, исполнитель и год выпуска;Song— название песни;Track— связь песни с альбомом и её порядковый номер.
Номер трека уникален внутри альбома. Связь Track намеренно вынесена в отдельную модель: одна и та же песня может находиться в нескольких альбомах и иметь в них разные номера.
Нужен Python 3.12+.
python -m venv .venv
# Windows PowerShell
.venv\Scripts\Activate.ps1
pip install -r requirements.txt
python manage.py migrate
python manage.py seed_demo
python manage.py runserverОткрыть: http://127.0.0.1:8000/
docker compose up --buildОткрыть: http://127.0.0.1:8000/
Миграции и идемпотентное заполнение демо-данными выполняются при старте
контейнера, поэтому после запуска каталог сразу готов к проверке. SQLite
хранится в named volume sqlite_data. Исходники не монтируются внутрь
контейнера: это делает запуск повторяемым и не требует autoreloader для
демонстрационного сценария. Контейнер ограничен 256 МБ оперативной памяти.
Для локальной настройки доступны переменные окружения:
DJANGO_SECRET_KEY— ключ Django;DJANGO_DEBUG—1или0;DJANGO_ALLOWED_HOSTS— список хостов через запятую.
python manage.py test
python manage.py checkТесты проверяют:
- повторное использование одной песни в разных альбомах;
- запрет одинакового номера трека в одном альбоме;
- отображение и поиск данных;
- создание альбома с треком;
- каскадное удаление треков вместе с альбомом.
Приложение намеренно не использует отдельный frontend-сборщик: для такого объёма требований серверный Django-rendering даёт меньше движущихся частей и простой запуск. Интерфейс разделён на переиспользуемый базовый шаблон, страницы каталога и формы. Модель Track отвечает за предметные ограничения треклиста, а транзакция используется при сохранении альбома и его треклиста. Docker-образ содержит только приложение и зависимости, миграции выполняются при запуске.
Следующий естественный шаг для production-версии — добавить аутентификацию, API для внешнего клиента, обложки альбомов и PostgreSQL.