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] )