Консольное приложение для учета концертных выступлений: регистрация концертов, исполнителей, площадок и концертных программ, контроль доступности площадок и статистика мероприятий.
Приложение для учета концертных выступлений: регистрация концертов, исполнителей, площадок и концертных программ, а также контроль основных параметров предстоящих мероприятий (дата, вместимость площадки, цена билета, возрастное ограничение).
- Организаторы концертов и концертные директора;
- администраторы концертных площадок;
- зрители, интересующиеся афишей выступлений.
Предметной областью являются концертные мероприятия. Каждый концерт проходит на определенной площадке, в нем участвует один или несколько исполнителей, а содержание выступления определяется концертной программой. Система учитывает даты концертов, вместимость площадок, рейтинги исполнителей и параметры программ (продолжительность, возрастное ограничение).
Основные сущности предметной области представлены классами пакета models.
Атрибуты: id, name (имя), genre (жанр), rating (рейтинг популярности).
Методы: from_data() / to_data() (преобразование JSON), __str__().
Атрибуты: id, name (название), city (город), capacity (вместимость).
Методы:
is_suitable_for(people_count)— проверка вместимости;validate_capacity(capacity)(@staticmethod) — проверка корректности вместимости;from_data()/to_data(),__str__().
Атрибуты: id, name (название), duration (продолжительность, мин),
age_limit (возрастное ограничение).
Методы:
is_allowed_for(guest_age)— проверка допуска зрителя;from_data()/to_data(),__str__().
Связывает объекты Performer, Venue и Program — хранит ссылки
на связанные объекты, а не только их идентификаторы.
Атрибуты: id, title, performer, venue, program, date,
expected_guests, base_ticket_price, is_cancelled.
Методы:
get_status(today)— статус концерта (запланирован / идет / завершен / отменен);calculate_ticket_price()— цена билета с учетом рейтинга исполнителя;check_venue_fit()— проверка вместимости площадки;calculate_revenue()— ожидаемая выручка;cancel()— отмена концерта (изменение состояния, объект остается в коллекции);blocks_venue(venue_id, date)— блокирует ли концерт площадку на дату;from_data()/to_data(),__str__().
Отмененный концерт площадку не блокирует — на ту же дату можно добавить новый концерт.
- просмотр и поиск концертов по названию;
- просмотр, поиск и отбор площадок по вместимости;
- проверка доступности площадки на дату;
- добавление концертов (с проверкой занятости площадки и вместимости);
- отмена концертов (с сохранением объекта в коллекции);
- статистика: число запланированных, прошедших и отмененных концертов, ожидаемые зрители.
Код приложения расположен в пакете src/:
src/main.py— точка запуска: загрузка данных, меню, сохранение;src/menu.py— консольное меню и обработчики пунктов;src/models/— объектная модель предметной области:src/models/performers.py— классPerformerи функции коллекции;src/models/venues.py— классVenueи функции коллекции;src/models/programs.py— классProgramи функции коллекции;src/models/concerts.py— классConcertи функции коллекции;src/models/__init__.py— импорт классов из пакета;
src/storage.py— преобразование JSON ↔ объекты, сохранение и загрузка;src/utils.py— безопасный ввод чисел и дат;src/settings.py— настройки окружения;data/— JSON-файлы данных (performers, venues, programs, concerts);data/originals/— эталонные копии данных для восстановления после тестирования (make restore-dataилиcp data/originals/*.json data/);tests/— автоматизированные тесты pytest;tools/— вспомогательные скрипты (извлечение текста из PDF).
Данные хранятся в каталоге data/ в формате JSON — списки словарей.
JSON-файлы не содержат сведений о внутренней структуре объектов: концерт
хранит идентификаторы связанных исполнителя, площадки и программы
(performer_id, venue_id, program_id). При загрузке идентификаторы
преобразуются в ссылки на объекты (Concert.from_data()), при сохранении —
обратно (Concert.to_data()). Даты хранятся в формате ISO (ГГГГ-ММ-ДД).
- Python 3.13+;
- Django 5.2 (веб-интерфейс, ПР5–ПР6);
- Django Template Language (шаблоны, ПР6);
- pytest (тесты);
- flake8 (проверка качества кода).
Установка зависимостей:
uv syncКонсольная версия (сохранена с ПР3):
python -m src.mainВеб-версия, фронтенд (Django + шаблоны, ПР5–ПР6):
uv sync
uv run python manage.py migrate
uv run python manage.py runserverПосле запуска открыть в браузере:
http://127.0.0.1:8000/
Доступные страницы фронтенда: / (главная), /concerts/,
/concerts/<id>/, /venues/, /venues/<id>/, /performers/,
/performers/<id>/, /programs/, /programs/<id>/.
Несуществующие адреса и идентификаторы возвращают страницу 404.
Собственные стили, скрипты и логотип лежат в
homepage/static/homepage/ (css/style.css, js/main.js,
img/logo.png) и подключаются через {% static %} —
отдельная сборка фронтенда не требуется, достаточно запущенного
runserver в режиме DEBUG=True.
/— главная страница: описание приложения и навигация (view-функцияindex(), приложениеhomepage, шаблонhomepage/templates/homepage/index.html);/concerts/— список концертов изdata/concerts.json(view-функцияconcerts(), шаблонconcert_list.html, карточкаincludes/concert_card.html, счётчик{{ concerts|length }});/concerts/<int:concert_id>/— страница концерта: исполнитель, площадка, программа, дата ({{ concert.date|date:"d.m.Y" }}), цена билета (calculate_ticket_price()), ожидаемая выручка (calculate_revenue()), проверка вместимости (check_venue_fit()), статус (get_status(), фрагментincludes/concert_status.html) (view-функцияconcert_detail());/venues/— список площадок изdata/venues.json(view-функцияvenues(), шаблонvenue_list.html, карточкаincludes/venue_card.html);/venues/<int:venue_id>/— страница площадки + проверка доступности на текущую дату (is_venue_available()) и связанные концерты (view-функцияvenue_detail());/performers/— список исполнителей (view-функцияperformers(), карточкаincludes/performer_card.html);/performers/<int:performer_id>/— страница исполнителя и связанные концерты (view-функцияperformer_detail());/programs/— список программ (view-функцияprograms(), карточкаincludes/program_card.html);/programs/<int:program_id>/— страница программы и связанные концерты (view-функцияprogram_detail()).
Если концерт, площадка, исполнитель или программа с указанным
идентификатором не найдены, страница возвращает код статуса 404
(status=404 if ... is None else 200, ветка {% else %} в шаблоне).
Для несуществующих адресов настроен обработчик handler404
(homepage.views.page_not_found, шаблон templates/404.html).
Представления готовят данные и передают их в шаблоны через контекст
(render(request, "имя_шаблона.html", context)).
Генерация HTML в Python-коде веб-представлений не используется,
функция page() из ПР5 удалена.
- базовый шаблон
templates/base.html(блокиtitleиcontent, Bootstrap 5.3 через CDN, собственный CSS, логотип, навигация, подвал с текущим годом черезmain.js); - наследование: дочерние шаблоны через
{% extends "base.html" %}; - навигация вынесена в
templates/includes/navigation.html(ссылки только через{% url %}, жёстких адресов нет); - повторяющиеся фрагменты — включаемые шаблоны:
concert_card.html,concert_status.html,venue_card.html,performer_card.html,program_card.html; - циклы
{% for ... %}{% empty %}{% endfor %}, условия{% if %}{% else %}; - фильтры:
|length(счётчики списков),|default:"Без названия",|date:"d.m.Y"(дата концерта — объектdate); - пространства имён URL:
homepage,concerts,venues,performers,programs(app_nameв каждомurls.py); - статика в
homepage/static/homepage/:css/style.css,js/main.js,img/logo.png(подключение через{% load static %}/{% static %}). Данные по-прежнему в JSON, Django ORM не используется.
- просмотр списка концертов и информации о концерте;
- просмотр списка площадок и информации о площадке;
- просмотр списков исполнителей и программ;
- проверка доступности площадки на текущую дату;
- проверка вместимости площадки, цены билета и выручки.
Эти операции реализованы в ПР3 и работают в консольной версии. В веб-интерфейсе они появятся, когда будут добавлены формы и POST-запросы:
- добавление концерта (с проверкой занятости и вместимости);
- отмена концерта;
- поиск концертов по названию и площадок по названию;
- отбор площадок по вместимости и сортировки;
- проверка доступности на выбранную дату
(
/venues/<id>/availability/), статистика (/stats/).
concerty/ # пакет настроек Django-проекта
templates/ # base.html, 404.html, includes/navigation.html
homepage/ # приложение: главная + 404 (templates, static)
concerts/ # приложение: концерты (views, urls, templates)
venues/ # приложение: площадки (views, urls, templates)
performers/ # приложение: исполнители (views, urls, templates)
programs/ # приложение: программы (views, urls, templates)
src/ # консольное приложение и объектная модель (ПР3)
data/ # JSON-файлы данных
tests/ # автоматизированные тесты pytest
docs/ # документация (включая ПР5_Django_Base.md)
pytestflake8Маршрутизация двух уровней: concerty/urls.py подключает
homepage.urls, concerts.urls, venues.urls, performers.urls,
programs.urls через include(). Динамические адреса используют
конвертер <int:..._id>/.
uv run python manage.py runserverНа следующих этапах планируется:
- подключение базы данных (переход с JSON на Django ORM);
- реализация пользователей;
- разработка API;
- контейнеризация приложения;
- настройка CI/CD.