Files

134 lines
5.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Техническая документация: mklab_base_indicators_report
**name:** `mklab_base_indicators_report`
**version:** 19.0.2025.11.24
**author:** MK.Lab
**depends:** `base`, `mklab_base_indicators_extended`
**Внешние Python-пакеты:** `networkx`, `matplotlib`
---
## Архитектура
Модуль не вводит новых моделей данных. Состоит из трёх компонентов: расширения существующей модели `hg.index`, HTTP-контроллера и визарда.
```
mklab_base_indicators_report
├── hg.index (расширение) — метод generate_graph_image()
├── NodeMetricsReportController — HTTP-контроллер /node_metrics/report/<id>
└── node_report_wizard — визард выбора показателя и запуска отчёта
```
---
## Компоненты
### `hg.index` — расширение
**Файл:** `models/hg_index.py`
Добавляет метод `generate_graph_image()` к существующей модели `hg.index`.
#### Метод `generate_graph_image()`
Строит направленный граф зависимостей для текущего показателя и возвращает PNG-изображение в виде base64-строки. Последовательность шагов:
**1. Сбор данных**
- Находит все `hg.link` где `source_id` равен вершине текущего показателя (`self.node_id`)
- Находит все `hg.index` с тем же `internal_code_id` что у текущего показателя
**2. Построение графа (`networkx.DiGraph`)**
Для каждой связи `hg.link`:
- Добавляет вершину-источник (`source_id.name`) с меткой — суммой `current_value` всех показателей по коду
- Для каждой вершины-приёмника (`target_ids`): добавляет вершину с меткой — суммой `current_value` показателей по коду, отфильтрованных по данному узлу
- Добавляет направленное ребро от источника к приёмнику
**3. Рендеринг**
| Параметр | Значение |
|---|---|
| Расположение вершин | `spring_layout`, `seed=1` (фиксированный, воспроизводимый) |
| Размер холста | 10 × 8 дюймов |
| Размер вершины | 3000 |
| Цвет вершины | `lightblue` |
| Метка вершины | `"название\nZZZZ.ZZ"` (название + числовое значение с двумя знаками) |
**4. Вывод**
Сохраняет изображение в `BytesIO` в формате PNG, кодирует в base64 и возвращает строку.
---
### `NodeMetricsReportController` — HTTP-контроллер
**Файл:** `report/index_report.py`
| Параметр | Значение |
|---|---|
| Маршрут | `/node_metrics/report/<int:index_id>` |
| Тип | `http` |
| Авторизация | `user` (требует входа в систему) |
Получает `index_id`, загружает запись `hg.index`, вызывает `generate_graph_image()` и возвращает HTML-страницу с тегом `<img>` где изображение встроено как base64.
При отсутствии записи с указанным `index_id` возвращает строку `"Record not found"`.
---
### `node_report_wizard` — Визард
**Файл:** `wizard/report_wizard.py`
**Тип:** `models.TransientModel`
| Поле | Тип | Описание |
|---|---|---|
| `index_id` | Many2one → `hg.index` | Выбранный показатель для построения графа |
#### Метод `action_generate_report()`
Читает `web.base.url` из системных параметров, формирует URL вида:
```
{web.base.url}/node_metrics/report/{index_id}
```
Возвращает `ir.actions.act_url` с `target='new'` — отчёт открывается в новой вкладке браузера.
---
## Представления и меню
**Файл:** `wizard/report_wizard.xml`
Форма визарда с полем `index_id` и кнопками «Показать отчёт» / «Отмена». Пункт меню добавляется в раздел отчётов модуля `mklab_base_indicators_extended`:
```
Слои показателей → Отчёты → Отчет показателей по узлам
```
---
## Права доступа
**Файл:** `security/ir.model.access.csv`
| Модель | Группа | Права |
|---|---|---|
| `node_report_wizard` | `group_indicators_admin` | CRUD |
---
## Тесты
**Файл:** `tests/test_report_wizard.py`
| Класс | Метод | Что проверяет |
|---|---|---|
| `TestReportWizard` | `test_wizard_create` | Создание визарда с `index_id` |
| `TestReportWizard` | `test_action_generate_report_returns_url_action` | Тип `ir.actions.act_url`, наличие `index_id` в URL, `target='new'` |
| `TestReportWizard` | `test_action_url_contains_base_url` | URL содержит значение `web.base.url` |
| `TestHgIndexGraphImage` | `test_generate_graph_image_returns_base64` | Метод возвращает base64-строку |
---