Spaces:
Running
Running
File size: 5,046 Bytes
4ad5efa |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
import gradio as gr
import logging
from datetime import datetime
from pathlib import Path
import matplotlib.pyplot as plt
logger = logging.getLogger("jira_assistant_interface")
def on_viz_generate_clicked(viz_type, limit, groupby_text, app):
"""
Обробник для кнопки "Генерувати".
"""
groupby_map = {"день": "day", "тиждень": "week", "місяць": "month"}
groupby = groupby_map.get(groupby_text, "day")
if not hasattr(app, 'current_data') or app.current_data is None:
return gr.Plot.update(value=None), "Спочатку завантажте та проаналізуйте дані"
fig = app.generate_visualization(viz_type, limit=limit, groupby=groupby)
if fig:
return fig, None
else:
return None, f"Не вдалося згенерувати візуалізацію типу '{viz_type}'"
def save_visualization(viz_type, limit, groupby_text, filename, app):
"""
Зберігає згенеровану візуалізацію у файл.
"""
try:
groupby_map = {"день": "day", "тиждень": "week", "місяць": "month"}
groupby = groupby_map.get(groupby_text, "day")
fig = app.generate_visualization(viz_type, limit=limit, groupby=groupby)
if fig is None:
return "Помилка: не вдалося створити візуалізацію"
if not filename:
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
viz_type_clean = viz_type.lower().replace(' ', '_').replace(':', '_')
filename = f"viz_{viz_type_clean}_{timestamp}.png"
if not any(filename.lower().endswith(ext) for ext in ['.png', '.jpg', '.svg', '.pdf']):
filename += '.png'
reports_dir = Path("reports/visualizations")
reports_dir.mkdir(parents=True, exist_ok=True)
filepath = reports_dir / filename
fig.savefig(filepath, dpi=300, bbox_inches='tight')
plt.close(fig)
return f"✅ Візуалізацію збережено: {filepath}"
except Exception as e:
import traceback
error_msg = f"Помилка збереження візуалізації: {str(e)}\n\n{traceback.format_exc()}"
logger.error(error_msg)
return error_msg
def create_visualizations_tab(app):
"""
Створює вкладку 'Візуалізації' у Gradio інтерфейсі.
"""
with gr.Tab("Візуалізації"):
gr.Markdown("## Типи візуалізацій")
with gr.Row():
viz_type = gr.Dropdown(
choices=[
"Статуси", "Пріоритети", "Типи тікетів", "Призначені користувачі",
"Активність створення", "Активність оновлення", "Кумулятивне створення",
"Неактивні тікети", "Теплова карта: Типи/Статуси",
"Часова шкала проекту", "Склад статусів з часом"
],
value="Статуси",
label="Тип візуалізації"
)
viz_generate_btn = gr.Button("Генерувати", variant="primary")
with gr.Accordion("Параметри візуалізації", open=False):
with gr.Row():
viz_param_limit = gr.Slider(minimum=5, maximum=20, value=10, step=1,
label="Ліміт для топ-візуалізацій")
viz_param_groupby = gr.Dropdown(
choices=["день", "тиждень", "місяць"],
value="день",
label="Групування для часових діаграм"
)
with gr.Row():
viz_plot = gr.Plot(label="Візуалізація")
viz_status = gr.Textbox(label="Статус", visible=False)
with gr.Row():
viz_filename = gr.Textbox(
label="Ім'я файлу (опціонально)",
placeholder="Залиште порожнім для автоматичного імені"
)
viz_save_btn = gr.Button("Зберегти візуалізацію", variant="secondary")
viz_save_status = gr.Textbox(label="Статус збереження")
# Прив'язка подій
viz_generate_btn.click(
lambda t, l, g: on_viz_generate_clicked(t, l, g, app),
inputs=[viz_type, viz_param_limit, viz_param_groupby],
outputs=[viz_plot, viz_status]
)
viz_save_btn.click(
lambda t, l, g, f: save_visualization(t, l, g, f, app),
inputs=[viz_type, viz_param_limit, viz_param_groupby, viz_filename],
outputs=[viz_save_status]
)
|