From 903a16373e2c4fdb5f401b0e61f321e03347e0cf Mon Sep 17 00:00:00 2001 From: erjemin Date: Sun, 9 Aug 2026 23:30:48 +0300 Subject: [PATCH] =?UTF-8?q?add:=20=D0=90=D1=80=D1=85=D0=B8=D1=82=D0=B5?= =?UTF-8?q?=D0=BA=D1=82=D1=83=D1=80=D0=B0=20=D0=B8=D1=81=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20DSL=20=D0=B8=20=D0=A0=D0=B5?= =?UTF-8?q?=D0=B5=D1=81=D1=82=D1=80=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D1=87=D0=B8=D0=BA=D0=BE=D0=B2=20(DSL=20Query=20Registry)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _prj_blueprint/DSL.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/_prj_blueprint/DSL.md b/_prj_blueprint/DSL.md index 7c74ca2..ed03c62 100644 --- a/_prj_blueprint/DSL.md +++ b/_prj_blueprint/DSL.md @@ -186,4 +186,30 @@ 5. Валидация slug - Добавить в валидатор админки статей (TbArticle) проверку на несовпадение slug с существующими роутами сайта из `urls.py` (чтобы не было конфликта URL-ов). +--- + +## 6. Архитектура исполнения DSL и Реестр обработчиков (DSL Query Registry) + +Для предотвращения написания «макаронного» кода во вьюхах и обеспечения высокой расширяемости система исполнения DSL строится на основе паттерна **«Реестр обработчиков» (Registry Pattern)**. + +### Принцип разделения ответственности: + +1. **Вьюха `hub_detail` (`HubView`):** + - Выступает исключительно в роли входных ворот. + - Ищет объект `TbArticle` по слагу и передаёт его в контекст шаблона `content/hub.html`. + - Не содержит хардкода выборок, разбора параметров и формирования SQL-запросов. + +2. **Template Tag `{% render_hub_blocks article %}`:** + - Читает массив `j_article_metadata['hub']` из полученной статьи. + - Итерируется по кортежам DSL и передаёт их в ядро исполнения DSL. + - Вызывает шаблоны визуальных компонентов (`carousel.html`, `grid.html`, `list.html`, `teaser.html`) с контекстом, подготовленным обработчиками. + +3. **Реестр обработчиков выборок (`DSLQueryRegistry`):** + - Модуль, содержащий карту функций-обработчиков (Query Handlers), зарегистрированных через декоратор `@DSLQueryRegistry.register("prefix")`. + - Каждое пространство имён 1-го позиционного параметра (`articles:type`, `offers:artist`, `offers:format`, `offers:style`, `single_slug`, `!module`) имеет свой изолированный обработчик на 3–5 строк кода. + +### Принцип обработки автоматических пресетов для товаров (`ArticleType.ITEM`): +- Если для конкретного релиза/товара `j_article_metadata['hub']` пуст, ядро DSL формирует динамический виртуальный массив блоков на основе Foreign Key связей объекта (`k_item_to_artist`, `k_offer_to_label`, `k_style`). +- Виртуальные блоки прогоняются через тот же самый реестр `DSLQueryRegistry`, обеспечивая единообразие вывода контента без загромождения БД и дублирования логики. + film0069t-2001.08.xx \ No newline at end of file