Public release from ruodoo-project: 19.0 - 2026-05-10 21:19:01 UTC

This commit is contained in:
CI Publish Bot
2026-05-10 21:19:11 +00:00
commit cbf9e6e6d6
1213 changed files with 183945 additions and 0 deletions

View File

@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
from . import hg_index

View 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