3l4iy-dZddlmZmZmZmZmZmZmZm Z m Z m Z m Z m Z mZddlmZddlmZddlmZmZddlmZGddeZGd d e Zy ) Execution history tab) QWidget QVBoxLayout QHBoxLayout QTableWidgetQTableWidgetItem QPushButton QComboBoxQLabel QMessageBox QHeaderView QTextEditQDialogQDialogButtonBox)Qt)DatabaseManager)datetime timedelta)PathcLeZdZdZfdZdZdZdZdZdZ dZ d Z xZ S) HistoryTabrct|t|_|j |j y)zInitialize history tabN)super__init__rdb_init_uirefresh)self __class__s gui/history_tab.pyrzHistoryTab.__init__s* !#  c t}|j|t}|jt dt |_|j jdd|j|j jj|j|j|j |jt dt |_ |jjgd|jjj|j|j|j|jt dt |_|jjgd|jjj|j|j|j|jt!d}|j"j|j|j||j%|t'|_|j(j+d |j(j-gd |j(j/}|j1d t2j4j6|j1d t2j4j8|j1d t2j4j6|j1dt2j4j6|j1dt2j4j6|j1dt2j4j6|j1dt2j4j6|j(j;t&j<j>|j(jAt&jBjD|j(jFj|jH|j|j(t}t!d|_%|jJj"j|jL|jJjOd|j|jJt!d|_(|jPj"j|jR|j|jP|jt |_*|j|jT|j%||j(jVj|jXy)zCreate UI layoutzJob:z (All Jobs)NzStatus:)(All)successfailedtimeoutrunningqueuedzPeriod:) Last 24 hours Last 7 days Last 30 daysAll timeu 🔄 Refresh)IDJobStatusz Start TimeDurationz Exit CodeLogru 📄 View LogFu🗑️ Clear Old History)-r setLayoutr addWidgetr r job_filteraddItem_populate_job_filtercurrentIndexChangedconnectr status_filteraddItems period_filter addStretchr clicked addLayoutrtablesetColumnCountsetHorizontalHeaderLabelshorizontalHeadersetSectionResizeModer ResizeModeResizeToContentsStretchsetSelectionBehaviorSelectionBehavior SelectRowssetSelectionMode SelectionModeSingleSelectionitemDoubleClicked_on_row_double_clicked view_log_btnview_log setEnabled clear_btnclear_old_history stats_labelitemSelectionChanged_on_selection_changed)rlayout filter_layout refresh_btnheader button_layouts r rzHistoryTab._init_uis v$ v/#+  d3 !!# ++33DLLA0y 12&[ ##%   ..66t||D 2 23y 12&[ ##%   ..66t||D 2 23  "!.1 ##DLL1 ,'"^  !!!$ ,,.  ,,.##A{'='='N'NO##A{'='='E'EF##A{'='='N'NO##A{'='='N'NO##A{'='='N'NO##A{'='='N'NO##A{'='='N'NO '' (F(F(Q(QR ##L$>$>$N$NO $$,,T-H-HI$$ '8 !!))$--8 $$U+ 1 12$%@A &&t'='=>/  ""8 0 01' ''//0J0JKr!c|jj5}|j}|jd|j }dddD]$}|j j |d|d&y#1swY3xYw)z*Populate job filter dropdown with all jobsz'SELECT id, name FROM jobs ORDER BY nameNnameid)rget_connectioncursorexecutefetchallr;r<)rconnrgjobsjobs r r=zHistoryTab._populate_job_filterpsz WW # # % %[[]F NND E??$D %  = ?z& ORDER BY e.start_time DESC LIMIT 1000rer3rdstatusr$u ✅ Successr%u ❌ Failedr&u⏱️ Timeoutr'u▶️ Runningu ⏸️ Queuedr4 start_timer5z%Y-%m-%d %H:%M:%Send_time.u—r6 exit_coder7u 📄 Viewr8c32K|]}|ddk(s dyw)rqr$r3N.0es r z%HistoryTab.refresh..sHAq{i/GaH c32K|]}|ddk(s dyw)rqr%r3Nrwrxs r r{z%HistoryTab.refresh..sF1akX.EQFr|zTotal: z | Success: z | Failed: )rF setRowCountr; currentDataappendr@ currentTextrBrnowr isoformatrrfrgrhrirowCount insertRowsetItemrstr fromisoformatstrftimesplitlensumr[setText)rqueryparamsjob_idrqperiodrpcutoffrjrg executions executionrow status_textrrrsduration duration_textruexit_code_textlog_itemtotalr$r%s r rzHistoryTab.refreshzs q! ,,.   ( (E MM& !##//1 W  ( (E MM& !##//1 Z (=(>)\\^ie&<DD ct|jjdk\}|jj|y)zHandle selection changerN)rFrrVrX)r has_selections r r]z HistoryTab._on_selection_changeds- --/14  $$]3r!c$|jy)zHandle row double-clickN)rW)rrs r rUz!HistoryTab._on_row_double_clickeds  r!) __name__ __module__ __qualname____doc__rrr=rrWrZr]rU __classcell__rs@r rrs3SLj<i V.:4 r!rc0eZdZdZdfd ZdZdZxZS)rzDialog to view execution logct||||_|jd|d|j dd|j |j y)z Initialize log viewer. Args: execution: Execution record dict parent: Parent widget zExecution Log - rdi iXN)rrrsetWindowTitlesetMinimumSizer _load_log)rrparentrs r rzLogViewerDialog.__init__&sX  " .y/@.ABC C%  r!c pt}|j|d|jdd|jdd|jdxsdd|jd }t|}|j |t |_|j jd |j jd |j |j ttjj}|jj|j|j |y ) z Create UIz Job: rdz | Status: rqz | Exit Code: ruzN/Az | Start: rrT MonospaceN)rr9rr r:rlog_text setReadOnly setFontFamilyrrCloserejectedr?reject)rr^ info_text info_labelbuttonss r rzLogViewerDialog._init_ui8s v4>>&123"nnX678!!% !>%%o6tH~446 MM & &'< =  Gh$ 'ffh  ' MM & &{ 3 ' '  G MM & &)A!'E F F Gs0 B! B1#B!BB!! C*C  C)N)rrrrrrrrrs@r rr#s&$"4Gr!rN)rPyQt6.QtWidgetsrrrrrr r r r r rrr PyQt6.QtCorercorerrrpathlibrrrrwr!r rsG  (QQh>Gg>Gr!