rL5izdZddlmZmZmZmZmZmZmZm Z ddl m Z ddl m Z ddlmZddlmZmZGddeZy ) Dashboard overview tab)QWidget QVBoxLayout QHBoxLayoutQLabel QGroupBox QListWidgetQListWidgetItem QPushButton)Qt)QFont)DatabaseManager)datetime timedeltacFeZdZdZfdZdZdZdZdZdZ dZ xZ S) DashboardTabrc`t|t|_|j y)zInitialize dashboardN)super__init__rdb_init_ui)self __class__s ;/mnt/ssd/data/python-lab/DaemonControl/gui/dashboard_tab.pyrzDashboardTab.__init__s! !# cxt}|j|td}t}|j d|j d|j ||j|t}td}t}td|_ td|_ td|_ |j|j|j|j|j|j|j||j|td}t}td |_ td |_td |_|j|j|j|j|j|j|j||j|td } t} td |_td|_| j|j | j|j"| j| |j| |j%|t} td} t} t'|_| j|j(| j| | j| td}t}t'|_|j|j*|j|| j||j%| t-d}|j.j1|j2|j||j5y)zCreate UI layoutzDaemonControl DashboardTJobszTotal: 0z Enabled: 0z Disabled: 0z Last 24 Hoursz Executions: 0u✅ Success: 0u ❌ Failed: 0StatuszDaemon: Unknownz Database: OKz Active JobszRecent Executionsu🔄 Refresh DashboardN)r setLayoutrr setPointSizesetBoldsetFont addWidgetrrtotal_jobs_labelenabled_jobs_labeldisabled_jobs_labeltotal_exec_labelsuccess_exec_labelfailed_exec_labeldaemon_status_labeldb_status_label addLayoutr active_jobs_listrecent_exec_listr clickedconnectrefresh addStretch)rlayouttitle title_font stats_layout jobs_group jobs_layout exec_group exec_layout status_group status_layout lists_layout active_group active_layout recent_group recent_layout refresh_btns rrzDashboardTab._init_uis v01W #4  j!#} v& !m &z 2"("6#)-#8 d334d556d667[)z*/ !m & 7"()9":!'!8d334d556d445[)z*!* # #)*;#< %n5 8 89 4 45}-|,&#} !/ # +  5 56}-|,!!45 # +  5 56}-|,&"":; ##DLL1%rc|j|j|j|jy)zRefresh all dashboard dataN)_refresh_job_stats_refresh_execution_stats_refresh_active_jobs_refresh_recent_executions)rs rr2zDashboardTab.refreshis2 ! %%' !!# '')rc|jj5}|j}|jd|j d}|jd|j d}||z }ddd|j j d|jj d|jj dy#1swYdxYw)zRefresh job statisticszSELECT COUNT(*) FROM jobsrz+SELECT COUNT(*) FROM jobs WHERE enabled = 1NzTotal: z Enabled: z Disabled: ) rget_connectioncursorexecutefetchoner%setTextr&r')rconnrKtotalenableddisableds rrEzDashboardTab._refresh_job_statsps WW # # % '[[]F NN6 7OO%a(E NNH Ioo'*GwH ' %%w&78 '')G9(=>   ((:hZ)@A ' 's ACC%ctjtdz }|jj 5}|j }|j d|jf|jd}|j d|jf|jd}|j d|jf|jd}ddd|jjd|jjd |jjd y#1swYdxYw) z.Refresh execution statistics for last 24 hours)hourszc SELECT COUNT(*) FROM executions WHERE start_time >= ? rzz SELECT COUNT(*) FROM executions WHERE start_time >= ? AND status = 'success' zy SELECT COUNT(*) FROM executions WHERE start_time >= ? AND status = 'failed' Nz Executions: u ✅ Success: u ❌ Failed: ) rnowrrrJrKrL isoformatrMr(rNr)r*)rcutoffrOrKrPsuccessfaileds rrFz%DashboardTab._refresh_execution_statss;)""55 WW # # % *[[]F NN""$& (OO%a(E NN""$& (oo'*G NN""$& (__&q)F' ** %% UG&<= ''-y(AB &&fX'>?/ * *s B-E  Ec|jj|jj5}|j }|j d|j }ddds|jjdy|D]3}|dr|dnd}|dd|}|jj|5y#1swY`xYw)zRefresh active jobs listz SELECT j.name, s.cron_expression FROM jobs j LEFT JOIN schedules s ON s.job_id = j.id AND s.enabled = 1 WHERE j.enabled = 1 ORDER BY j.name NzNo active jobscron_expressionz (no schedule)name - )r.clearrrJrKrLfetchalladdItem)rrOrKjobsjobschedule item_texts rrGz!DashboardTab._refresh_active_jobss ##% WW # # % %[[]F NN ??$D %  ! ! ) )*: ; 9589J5K301Q`"6{m3xj9 %%--i8 9 % %s 2CCc"|jj|jj5}|j }|j d|j }ddds|jjdy|D]r}|d}|dk(rd}n|dk(rd}n |d k(rd }nd }tj|d }|jd }|d|dd|} |jj| ty#1swYxYw)z(Refresh recent executions list (last 10)z SELECT e.status, j.name, e.start_time, e.exit_code FROM executions e JOIN jobs j ON j.id = e.job_id ORDER BY e.start_time DESC LIMIT 10 NzNo recent executionsstatusrYu✅rZu❌timeoutu⏱️u▶️ start_timez%H:%M:%S r]r^) r/r_rrJrKrLr`rar fromisoformatstrftime) rrOrK executions executionrgiconritime_strres rrHz'DashboardTab._refresh_recent_executionss ##% WW # # % +[[]F NN  *J +  ! ! ) )*@ A' 9 "8,Y& Dx' Dy(#D#D%33Il4KL %..z:#fAi&7%8H:F %%--i8 9 + +s 2DD) __name__ __module__ __qualname____doc__rrr2rErFrGrH __classcell__)rs@rrr s- N`*B"@:9.!9rrN)rtPyQt6.QtWidgetsrrrrrr r r PyQt6.QtCorer PyQt6.QtGuir corerrrrrrr{s3 (I97I9r