Skip to content

About

Консольное приложение для учета концертных выступлений: регистрация концертов, исполнителей, площадок и концертных программ, контроль доступности площадок и статистика мероприятий.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

48 Commits

Folders and files

Repository files navigation

Concerty - система учета концертных выступлений

Консольное приложение для учета концертных выступлений: регистрация концертов, исполнителей, площадок и концертных программ, контроль доступности площадок и статистика мероприятий.

Назначение

Приложение для учета концертных выступлений: регистрация концертов, исполнителей, площадок и концертных программ, а также контроль основных параметров предстоящих мероприятий (дата, вместимость площадки, цена билета, возрастное ограничение).

Целевая аудитория

  • Организаторы концертов и концертные директора;
  • администраторы концертных площадок;
  • зрители, интересующиеся афишей выступлений.

Предметная область

Предметной областью являются концертные мероприятия. Каждый концерт проходит на определенной площадке, в нем участвует один или несколько исполнителей, а содержание выступления определяется концертной программой. Система учитывает даты концертов, вместимость площадок, рейтинги исполнителей и параметры программ (продолжительность, возрастное ограничение).

Объектная модель

Основные сущности предметной области представлены классами пакета models.

Performer — исполнитель

Атрибуты: id, name (имя), genre (жанр), rating (рейтинг популярности). Методы: from_data() / to_data() (преобразование JSON), __str__().

Venue — площадка

Атрибуты: id, name (название), city (город), capacity (вместимость).

Методы:

  • is_suitable_for(people_count) — проверка вместимости;
  • validate_capacity(capacity) (@staticmethod) — проверка корректности вместимости;
  • from_data() / to_data(), __str__().

Program — программа

Атрибуты: id, name (название), duration (продолжительность, мин), age_limit (возрастное ограничение).

Методы:

  • is_allowed_for(guest_age) — проверка допуска зрителя;
  • from_data() / to_data(), __str__().

Concert — концерт

Связывает объекты 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.

Страницы веб-интерфейса (ПР6)

  • / — главная страница: описание приложения и навигация (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 удалена.

Шаблоны (ПР6)

  • базовый шаблон 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 не используется.

Основные операции

Используется в веб-интерфейсе (ПР5)

  • просмотр списка концертов и информации о концерте;
  • просмотр списка площадок и информации о площадке;
  • просмотр списков исполнителей и программ;
  • проверка доступности площадки на текущую дату;
  • проверка вместимости площадки, цены билета и выручки.

Отложено до следующих работ

Эти операции реализованы в ПР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)

Запуск тестов

pytest

Проверка качества кода

flake8

Django

Маршрутизация двух уровней: 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.

Ссылки

About

Консольное приложение для учета концертных выступлений: регистрация концертов, исполнителей, площадок и концертных программ, контроль доступности площадок и статистика мероприятий.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages