Spaces:
Running
Running
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] | |
) | |