o /iê-ã@sœdZddlmZmZmZmZmZmZmZm Z m Z m Z ddl m Z ddlmZddlmZddlmZddlmZddlmZdd lmZGd d „d eƒZd S) z? Jobs Widget for Python Scheduler Display and manage jobs list é) ÚQWidgetÚ QVBoxLayoutÚ QHBoxLayoutÚ QTableWidgetÚQTableWidgetItemÚ QPushButtonÚ QHeaderViewÚQLabelÚ QMessageBoxÚQMenu)ÚQt)ÚQAction)Úlogger)ÚSchedulerDatabase)ÚSchedulerConfig)ÚJobEditorDialog)ÚScheduleEditorDialogcsˆeZdZdZdedef‡fdd„ Zdd„Zdd „Zd d „Z d e fd d„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd„Z‡ZS)Ú JobsWidgetzJobs list and management widgetÚdbÚconfigcs*tƒ ¡||_||_| ¡| ¡dS©N)ÚsuperÚ__init__rrÚ _setup_uiÚrefresh)Úselfrr©Ú __class__©ú&c:\PYTHON\Scheduler\gui\jobs_widget.pyrs  zJobsWidget.__init__cs$tˆƒ}tƒ}tdƒ}| d¡| |¡| ¡tdƒˆ_ˆj d¡ˆjj  ˆj ¡| ˆj¡tdƒˆ_ ˆj j  ˆj ¡ˆj   d¡| ˆj ¡tdƒˆ_ˆjj  ˆj¡ˆj  d¡| ˆj¡tdƒˆ_ˆjj  ˆj¡ˆj  d¡| ˆj¡td ƒˆ_ˆj d ¡ˆjj  ˆj¡ˆj  d¡| ˆj¡td ƒˆ_ˆjj  ˆj¡| ˆj¡| |¡tƒˆ_ˆj d ¡ˆj gd ¢¡ˆj ¡ dtjj¡ˆj  tj!j"¡ˆj #d¡ˆj $tj%j&¡ˆj 't(j)j*¡ˆjj+  ˆj,¡ˆjj-  ˆj.¡ˆjj/  ‡fdd„¡| ˆj¡dS)zSetup UIzConfigured Jobsz#font-size: 14px; font-weight: bold;zNew Jobz;background-color: #4CAF50; color: white; padding: 5px 15px;ZEditFúRun NowzCreate ScheduleÚDeletez(background-color: #f44336; color: white;ZRefreshé)ZIDÚNameÚTypeZEnabledZ CriticalityZTagséTcsˆ ¡Sr)Ú _edit_jobr©rrrÚZsz&JobsWidget._setup_ui..N)0rrr Ú setStyleSheetÚ addWidgetÚ addStretchrZ new_job_btnÚclickedÚconnectÚ_new_jobÚ edit_job_btnr&Ú setEnabledÚ run_job_btnÚ_run_jobÚcreate_schedule_btnÚ_create_scheduleÚdelete_job_btnÚ _delete_jobÚ refresh_btnrÚ addLayoutrÚtableÚsetColumnCountÚsetHorizontalHeaderLabelsÚhorizontalHeaderÚsetSectionResizeModerÚ ResizeModeÚStretchZsetSelectionBehaviorZSelectionBehaviorZ SelectRowsÚsetAlternatingRowColorsÚsetEditTriggersÚ EditTriggerÚNoEditTriggersZsetContextMenuPolicyr ZContextMenuPolicyZCustomContextMenuZcustomContextMenuRequestedÚ_show_context_menuZitemSelectionChangedÚ_on_selection_changedZitemDoubleClicked)rÚlayoutÚ header_layoutZ header_labelrr'rrsV                       zJobsWidget._setup_uic CsözÕ|j ¡}|j t|ƒ¡t|ƒD]µ\}}|j |dtt|dƒƒ¡t|dƒ}|  |j  ¡¡|ddkr?|  t j j¡|j |d|¡|j |dt|dƒ¡t|d rZd nd ƒ}|d ri|  t j j¡n|  t j j¡|j |d |¡dd l}t|d ¡ƒ}|ddkr’|  t j j¡n |ddkrŸ|  t j j¡|j |d|¡|dr²| |d¡ng}|r»d |¡nd} |j |dt| ƒ¡qt dt|ƒ›d¡Wd Styú} zt d| ›¡t |dd| ›¡WYd } ~ d Sd } ~ ww)zRefresh jobs listrÚidÚnameÚ criticalityÚcriticalr%éÚjob_typeÚenabledu✓ Yesu✗ NoéNÚhighéÚtagsz, ú-ézRefreshed jobs table: z jobszError refreshing jobs: ÚErrorzFailed to load jobs: )rÚ get_all_jobsr9Ú setRowCountÚlenÚ enumerateÚsetItemrÚstrÚsetFontZfontZ setForegroundr Z GlobalColorÚredZ darkGreenZgrayÚjsonÚupperZ darkYellowÚloadsÚjoinrÚdebugÚ ExceptionÚerrorr rK) rZjobsÚrowÚjobZ name_itemZ enabled_itemr^Z crit_itemrRZtags_strÚerrrr^s@     "€þzJobsWidget.refreshcCsFt|j ¡ƒdk}|j |¡|j |¡|j |¡|j |¡dS)zHandle selection changerN)rXr9Z selectedItemsr/r0r1r3r5)rZ has_selectionrrrrEs    z JobsWidget._on_selection_changedÚreturncCsD|j ¡ ¡}|s dS|d ¡}|j |d¡}|r t| ¡ƒSdS)zGet selected job IDNr)r9ZselectionModelZ selectedRowsreÚitemÚintÚtext)rZ selected_rowsreZ job_id_itemrrrÚ_get_selected_job_id—s  zJobsWidget._get_selected_job_idcCs.t||jƒ}| ¡r| ¡t d¡dSdS)zOpen dialog to create new jobz!New job created, refreshing tableN)rrÚexecrrÚinfo)rÚdialogrrrr. s þzJobsWidget._new_jobcCsJ| ¡}|sdSt||j|d}| ¡r#| ¡t d|›d¡dSdS)z Open dialog to edit selected jobN)Újob_idzJob z edited, refreshing table)rlrrrmrrrn)rrprorrrr&§sþzJobsWidget._edit_jobc Cs| ¡}|sdS|j |¡}t |dd|d›dtjjtjjB¡}|tjjkr~z0ddlm }||j|j ƒ}|j |dd }t  |d d |d›d |›d ¡t  d|›d¡WdSty}}zt  d|›¡t |dd|›¡WYd}~dSd}~wwdS)z Execute selected job immediatelyNzRun Jobz Execute job 'rIz' now?r)Ú JobExecutorZ manual_gui)Ú triggered_byz Job StartedúJob 'z' started (Execution ID: z!) Check History tab for results.zManually executed job z from GUIzError executing job: rUzFailed to execute job: )rlrÚget_jobr ZquestionÚStandardButtonÚYesÚNoZdaemon.job_executorrqrZ execute_jobÚ informationrrnrcrdrK)rrprfÚreplyrqÚexecutorÚ execution_idrgrrrr2²s6 ü  ý"€þózJobsWidget._run_jobc Cs¤| ¡}|sdSz$t||j|j|d}| ¡r*t |dd¡t d|›d¡WdSWdSt yQ}zt  d|›¡t  |dd |›¡WYd}~dSd}~ww) z Create schedule for selected jobN)Zpre_selected_job_idÚSuccesszBSchedule created successfully! Check the Schedules tab to see it.zCreated schedule for job z from Jobs tabzError creating schedule: rUzFailed to create schedule: ) rlrrrrmr rxrrnrcrdrK)rrprorgrrrr4Ñs.üýú"€þzJobsWidget._create_schedulec Csê| ¡}|sdS|j |¡}t |dd|d›dtjjtjjBtjj¡}|tjjkrsz"|j |¡t  |dd|d›d¡|  ¡t   d |›¡WdSt yr}zt  d |›¡t |d d |›¡WYd}~dSd}~wwdS) zDelete selected jobNz Delete Jobz%Are you sure you want to delete job 'rIz!'? This action cannot be undone.r|rsz' deleted successfullyz Deleted job zError deleting job: rUzFailed to delete job: )rlrrtr ÚwarningrurvrwÚ delete_jobrxrrrnrcrdrK)rrprfryrgrrrr6és. û  "€þùzJobsWidget._delete_jobc CsÐ| ¡}|sdS|j |¡}|d }z/|jj||d|r dnd}t |dd|d›d|›¡| ¡t d |›d |›¡WdSt yg}zt  d |›¡t  |d d |›¡WYd}~dSd}~ww)z%Toggle enabled status of selected jobNrN)rNÚdisabledr|rsrIz' z Toggled job z enabled=zError toggling job: rUzFailed to toggle job: ) rlrrtÚ update_jobr rxrrrnrcrdrK)rrprfZ new_enabledZ status_textrgrrrÚ_toggle_enableds    "€þzJobsWidget._toggle_enabledc Cs| ¡}|sdS|j |¡}t|ƒ}td|ƒ}|j |j¡| |¡td|ƒ}|j |j ¡| |¡|  ¡td|ƒ}|j |j ¡| |¡|  ¡|drSdnd}t||ƒ} | j |j ¡| | ¡|  ¡td|ƒ} | j |j ¡| | ¡| |j ¡ |¡¡dS) zShow right-click context menuNzEdit...r zCreate Schedule...rNZDisableZEnabler!)rlrrtr r Z triggeredr-r&Z addActionr2Z addSeparatorr4rr6rmr9ZviewportZ mapToGlobal) rÚpositionrprfZmenuZ edit_actionZ run_actionZschedule_actionZ toggle_textZ toggle_actionZ delete_actionrrrrDs2           zJobsWidget._show_context_menu)Ú__name__Ú __module__Ú __qualname__Ú__doc__rrrrrrErjrlr.r&r2r4r6rrDÚ __classcell__rrrrrs?1  rN)r†ÚPyQt6.QtWidgetsrrrrrrrr r r Ú PyQt6.QtCorer Ú PyQt6.QtGuir ÚlogururÚ core.databaserÚ core.configrZgui.job_editor_dialogrZgui.schedule_editor_dialogrrrrrrÚs0