-(i0SrSSKJrJrJrJrJrJrJrJ r J r J r J r J r JrJr SSKJr SSKJr SSKJr SSKJr "SS\5rg ) zN Group Editor Dialog for Python Scheduler Create and edit job groups (chains) )QDialog QVBoxLayout QHBoxLayout QFormLayoutQLabel QLineEdit QTextEdit QComboBox QPushButton QMessageBox QListWidgetQListWidgetItemQAbstractItemView QGroupBox)Qt)logger)SchedulerDatabase)SchedulerConfigc^\rSrSrSrSS\S\S\4U4SjjjrSr Sr S r S r S r S rS rSrS\4SjrSrSrU=r$)GroupEditorDialogz&Dialog for creating/editing job groupsdbconfiggroup_idcL>[TU]U5 X lX0lX@lUSLUlUR UR (aSOS5 URSS5 URS5 UR5 UR (aUR5 gg)Nz Edit Groupz New GroupiXiT) super__init__rrr is_edit_modesetWindowTitlesetMinimumSizesetModal _setup_ui_load_group_data)selfparentrrr __class__s .c:\PYTHON\Scheduler\gui\group_editor_dialog.pyrGroupEditorDialog.__init__s    $D0 D,=,=L;O C% d      ! ! # c& [U5n[S5n[5n[5UlURR S5 UR SUR5 [5UlURR S5 URRS5 UR SUR5 URU5 URU5 [S5n[5n[5Ul URR/SQ5 URRS 5 URR R#UR$5 UR S UR5 ['5UlUR(R+S 5 UR(R-S 5 UR S UR(5 UR%5 URU5 URU5 [S5n[5n['S5nURU5 [/5UlUR0R3[4R6R85 UR0RS5 URUR05 [;5n [=S5UlUR>R@R#URB5 U RUR>5 [=S5Ul"URDR@R#URF5 U RURD5 U RI5 URKU 5 ['S5n URU 5 [/5Ul&URLRS5 URURL5 [;5n [=S5Ul'URNR@R#URP5 U RURN5 [=S5Ul)URRR@R#URT5 U RURR5 U RI5 URKU 5 URU5 URU5 [;5n U RI5 [=URV(aSOS5Ul,URXR-S5 URXR@R#URZ5 U RURX5 [=S5n U R@R#UR\5 U RU 5 URKU 5 UR_5 g)zSetup dialog UIzBasic Informationze.g., Daily ETL Pipelinez Group Name:z/Optional description of what this group does...Pz Description:zError Handling stop_on_errorcontinue_on_errorskip_remainingr-zError Handling:Tz.color: #666; font-size: 11px; margin-top: 5px;zJobs in Group (Execution Order)zAvailable Jobs:xuAdd Selected ↓uRemove Selected ↑z0Jobs in Group (top to bottom = execution order):u Move Up ↑u Move Down ↓SaveCreatezNbackground-color: #4CAF50; color: white; padding: 8px 20px; font-weight: bold;CancelN)0rrrr name_inputsetPlaceholderTextaddRowr description_inputsetMaximumHeight setLayout addWidgetr error_handling_comboaddItemssetCurrentTextcurrentTextChangedconnect_update_error_helprerror_help_label setWordWrap setStyleSheetr available_jobs_listsetSelectionModer SelectionModeMultiSelectionrr add_jobs_btnclicked_add_selected_jobsremove_jobs_btn_remove_selected_jobs addStretch addLayoutselected_jobs_list move_up_btn _move_job_up move_down_btn_move_job_downrsave_btn _save_groupreject_load_available_jobs)r$layout basic_group basic_layout error_group error_layout members_groupmembers_layoutavailable_labelbuttons_layoutselected_label order_layoutactions_layout cancel_btns r'r"GroupEditorDialog._setup_ui&sT" 34 "} #+ **+EFM4??;!* 112cd //3ND,B,BCl+% 01 "} $-K! !!**,  !!00A !!44<+>?t112!  ./'%!!##d.?.?FXN  ##$tu %%d&6&67  / * ""4;;/  ,( !!#r)cURR5nSSSS.nURRUR US55 g)zUpdate error handling help textz9Stop the entire group execution if any job fails (safest)z3Continue executing remaining jobs even if one failsz6Skip remaining jobs but mark group execution as failedr,r0N)r< currentTextrBsetTextget)r$ error_type help_textss r'rA$GroupEditorDialog._update_error_helpsG..::< X!VV %%jnnZ&DEr)cURR5nUHbn[USSUSS35nUR[R R US5 URRU5 Md g![a>n[R"SU35 [R"USSU35 SnAgSnAff=f) zLoad all available jobsname (ID: id)zError loading available jobs: ErrorzFailed to load jobs: N)r get_all_jobsrsetDatar ItemDataRoleUserRolerEaddItem Exceptionrerrorr warning)r$all_jobsjobitemes r'rX&GroupEditorDialog._load_available_jobss Lww++-H&#f+fSYKq'IJ R__55s4yA((006  L LL9!= >   g1Fqc/J K K LsBB C 4CC cURRUR5nU(d7[R"USSURS35 UR 5 gUR RUS5 US(aURRUS5 URRUS5 URRUR5nUHn[USS US S 35nUR[R R"US 5 UR$R'U5 [)UR*R-55HlnUR*R/U5nUR1[R R"5US :XdMPUR*R3U5 M M g![4aNn[6R8"S U35 [R:"USS U35 UR 5 SnAgSnAff=f)zLoad existing group datarszGroup z not foundNro descriptionerror_handlingjob_namerpjob_idrrzError loading group data: zFailed to load group: )r get_job_grouprr r{rWr5rir8 setPlainTextr<r>get_job_group_membersrrurrvrwrPrxrangerEcountr~datatakeItemryrrzcritical)r$groupmembersmemberr~iavailable_itemrs r'r#"GroupEditorDialog._load_group_datas GG))$--8E##D'VDMM?*3UV  OO # #E&M 2]#&&33E-4HI  % % 4 4U;K5L Mgg33DMMBG!&&*<)=VF8DTCUUV'WX R__55vh7GH''//5t77==?@A%)%=%=%B%B1%EN%**2??+C+CDxHXX0099!< A "  LL5aS9 :  w2H0L M KKMM s&A"G*%EG*$G** I4AH==IcURR5nU(dgUHn[UR55nUR [ R RUR[ R R55 URRU5 URRU5nURRU5 M g)z1Add selected jobs from available to selected listN) rE selectedItemsrtextrurrvrwrrPrxrowrr$selected_itemsr~new_itemrs r'rK$GroupEditorDialog._add_selected_jobss11??A "D&tyy{3H   R__55tyyAYAY7Z [  # # + +H 5**..t4C  $ $ - -c 2#r)cURR5nU(dgUHn[UR55nUR [ R RUR[ R R55 URRU5 URRU5nURRU5 M g)z9Remove selected jobs from selected list back to availableN) rPrrrrurrvrwrrErxrrrs r'rM'GroupEditorDialog._remove_selected_jobss00>>@ "D&tyy{3H   R__55tyyAYAY7Z [  $ $ , ,X 6))--d3C  # # , ,S 1#r)cURR5nUS:aYURRU5nURRUS- U5 URR US- 5 gg)z'Move selected job up in execution orderrN)rP currentRowr insertItem setCurrentRowr$ current_rowr~s r'rRGroupEditorDialog._move_job_upsj--88: ?**33K@D  # # . .{Q E  # # 1 1+/ B r)c8URR5nXRR5S- :a`US:aYURRU5nURR US-U5 URR US-5 ggg)z)Move selected job down in execution orderrrN)rPrrrrrrs r'rT GroupEditorDialog._move_job_downs--88: 006681< <PQAQ**33K@D  # # . .{Q E  # # 1 1+/ BBR n[,R:"SU35 [0R<"USSU35 SnAgSnAff=f)zSave group to databaseN)rorrr)execution_orderzUpdated group z: roSuccesszGroup 'z' updated successfullyzCreated group z with z jobsz' created successfully (ID: rrzError saving group: rszFailed to save group: )rr5rrr8 toPlainTextr<rhrrupdate_job_grouprclear_group_membersrrPrr~rrrvrwadd_job_to_grouprinfor informationcreate_job_groupacceptryrzr)r$ group_datarr~rrrs r'rVGroupEditorDialog._save_group s$$&& ( N,,.446#55AACIIKSt"&";";"G"G"IJ    ((E*E++DMM:t66<<>?A2277:D!YYr'?'?@FGG,,T]]FVWTW,X@  nT]]O2j>P=QRS''i7:fCUBVVl9mn 7733AjAt66<<>?A2277:D!YYr'?'?@FGG,,XqQRs,S@  nXJbF9K8LFSWSjSjSpSpSrRssxyz''i7:fCUBVVrs{r||}9~ KKM N LL/s3 4  w2H0L M M NsKK L%'4L  L%)rIrErrr8r<rBrrrSrQr5rLrUrP)N)__name__ __module__ __qualname____firstlineno____doc__rrintrr"rArXr#rKrMrRrTboolrrV__static_attributes__ __classcell__)r&s@r'rrsn0$#4$o$Y\$$"n$`F L D3 2 CC $ -N-Nr)rN)rPyQt6.QtWidgetsrrrrrrr r r r r rrr PyQt6.QtCorerlogurur core.databaser core.configrrrr)r'rs<  +'hNhNr)