Files

67 lines
2.7 KiB
Python
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.

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