Public release from ruodoo-project: 19.0 - 2026-05-31 21:19:12 UTC
This commit is contained in:
3
mklab_base_indicators_report/models/__init__.py
Normal file
3
mklab_base_indicators_report/models/__init__.py
Normal file
@ -0,0 +1,3 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from . import hg_index
|
||||
66
mklab_base_indicators_report/models/hg_index.py
Normal file
66
mklab_base_indicators_report/models/hg_index.py
Normal file
@ -0,0 +1,66 @@
|
||||
from odoo import models, fields, api
|
||||
import networkx as nx
|
||||
import matplotlib.pyplot as plt
|
||||
import io
|
||||
import base64
|
||||
import logging
|
||||
|
||||
class HgIndex(models.Model):
|
||||
_inherit = 'hg.index'
|
||||
|
||||
def generate_graph_image(self):
|
||||
hg_link = self.env['hg.link'].search([('source_id','=', self.node_id.id)])
|
||||
nodes = self.node_id | hg_link.mapped('target_ids')
|
||||
internal_code = self.internal_code_id
|
||||
Index = self.env['hg.index'].sudo()
|
||||
Index_by_code = Index.search([('internal_code_id','=', internal_code.id)])
|
||||
|
||||
|
||||
G = nx.DiGraph()
|
||||
|
||||
# Добавляем все вершины: node_id и related_ids
|
||||
# Используем node_id.id как ключ, но для отображения можно имя
|
||||
for rec in hg_link:
|
||||
if rec.source_id:
|
||||
node_key = rec.source_id.name
|
||||
# Добавляем узел с именем, например, названием
|
||||
label_value = sum(Index_by_code.mapped('current_value'))
|
||||
G.add_node(node_key, label=label_value)
|
||||
|
||||
# Добавляем связанные узлы как отдельные вершины и ребра
|
||||
for related_node in rec.target_ids:
|
||||
related_key = related_node.name
|
||||
label_values = Index_by_code.filtered(lambda r: r.node_id == related_node)
|
||||
label_value = sum(label_values.mapped('current_value'))
|
||||
G.add_node(related_key, label=label_value)
|
||||
G.add_edge(node_key, related_key)
|
||||
|
||||
# Определяем расположение узлов
|
||||
pos = nx.spring_layout(G, seed=1)
|
||||
|
||||
plt.figure(figsize=(10, 8))
|
||||
|
||||
# Рисуем граф без автоподписей (with_labels=False)
|
||||
nx.draw(G, pos, node_size=3000, node_color='lightblue', with_labels=False)
|
||||
|
||||
# Формируем словарь меток с безопасным приведением к числу
|
||||
labels = {}
|
||||
for n, d in G.nodes(data=True):
|
||||
try:
|
||||
label_value = float(d.get("label", 0))
|
||||
labels[n] = f'{n}\n{label_value:.2f}'
|
||||
except (ValueError, TypeError):
|
||||
labels[n] = f'{n}\n{d.get("label", "")}'
|
||||
|
||||
# Отрисовываем метки отдельно
|
||||
nx.draw_networkx_labels(G, pos, labels)
|
||||
|
||||
# Сохраняем рисунок в буфер
|
||||
buf = io.BytesIO()
|
||||
plt.savefig(buf, format='png')
|
||||
plt.close()
|
||||
buf.seek(0)
|
||||
|
||||
# Кодируем изображение в base64 для отображения в вебе
|
||||
image_data = base64.b64encode(buf.read()).decode('utf-8')
|
||||
return image_data
|
||||
Reference in New Issue
Block a user