2izSrSSKJrJrJrJrJrJrJrJ r J r J r J r J r JrJrJrJrJrJrJrJr SSKJr SSKJr SSKrSSKJr SSKJr "SS \5rg) z Schedule Editor Dialog for Python Scheduler Create and edit schedules for individual jobs or groups (with inline group creation) )QDialog QVBoxLayout QHBoxLayout QFormLayoutQLabel QLineEdit QTextEdit QComboBox QPushButton QMessageBox QGroupBox QRadioButton QButtonGroupQStackedWidget QListWidgetQListWidgetItemQAbstractItemView QCheckBoxQSpinBoxQWidget)Qt)loggerN)SchedulerDatabase)SchedulerConfigc ^\rSrSrSrSS\S\S\S\4U4SjjjrSr S r S r S r S r S rSrS\4SjrSrSrSrSrSrSrS\4SjrS\4SjrSrSrU=r$)ScheduleEditorDialogz6Dialog for creating/editing schedules (jobs or groups)dbconfig schedule_idpre_selected_job_idcX>[TU]U5 X lX0lX@lXPlUSLUlURUR (aSOS5 URSS5 URS5 UR5 UR (aUR5 gg)Nz Edit Schedulez New ScheduleiiXT) super__init__rrr r! is_edit_modesetWindowTitlesetMinimumSizesetModal _setup_ui_load_schedule_data)selfparentrrr r! __class__s 1c:\PYTHON\Scheduler\gui\schedule_editor_dialog.pyr$ScheduleEditorDialog.__init__s   &#6 't3 t/@/@OnU C% d      $ $ & cR$[U5n[S5n[5n[5UlURR S5 UR SUR5 [5UlURR S5 URRS5 UR SUR5 URU5 URU5 [S5n[5n[5n[U5Ul[S5UlUR R#S 5 UR R$R'UR(5 URR+UR S 5 URUR 5 [S 5UlUR,R$R'UR(5 URR+UR,S 5 URUR,5 [S 5UlUR.R$R'UR(5 URR+UR.S5 URUR.5 [S5UlUR0R$R'UR(5 URR+UR0S5 URUR05 UR35 UR5U5 [75Ul[;5n[U5n[=5UlUR>R S5 UR>R@R'URB5 UR[ES55 URUR>5 UR35 UR8RU5 [;5n [U 5n [5n [U5Ul#[S5Ul$URHR#S 5 URHR$R'URJ5 URFR+URHS 5 U RURH5 [S5Ul&URLR$R'URJ5 URFR+URLS 5 U RURL5 U R5U 5 [75Ul'[;5n [U 5n [=5Ul(URPR S5 U R[ES55 U RURP5 U R35 URNRU 5 [;5n[U5n[5Ul)URRR S5 UR[ES55 URURR5 [5nUR[ES55 [=5Ul*URTRW/SQ5 URURT5 UR35 UR5U5 UR[ES55 [Y5Ul-URZR][^R`Rb5 URZRS5 URURZ5 [5n[eS5Ul3URfRhR'URj5 URURf5 [eS5Ul6URlRhR'URn5 URURl5 UR35 UR5U5 UR[ES55 [Y5Ul8URpRS5 URURp5 [5n[eS 5Ul9URrRhR'URt5 URURr5 [eS!5Ul;URvRhR'URx5 URURv5 UR35 UR5U5 URNRU5 U RURN5 UR8RU 5 [;5n[U5n[=5Ul=URzR S"5 UR[ES#55 URURz5 UR35 UR8RU5 [;5n[U5n[=5Ul>UR|R S$5 UR[ES%55 URUR|5 UR35 UR8RU5 URUR85 URU5 URU5 [S&5n[5n[5nUR[ES'55 [=5Ul?UR~RW/S(Q5 UR~RR'UR5 URUR~5 UR35 UR5U5 [75UlB[;5n[U5n[5UlCURR S)5 UR[ES*55 URUR5 [ES+5nURS,5 URU5 [ES-5nURS 5 URS.5 URU5 UR35 URRU5 [;5n[U5n[5UlGURRS 5 URRS/5 UR S0UR5 [5UlJURRS 5 URRS15 UR S2UR5 [5UlKURRS 5 URRS35 UR S4UR5 [5UlLURRS 5 URRS55 UR S6UR5 [5UlMURRS 5 URRS55 UR S7UR5 [ES85n U RS,5 U RS 5 UR S9U 5 URRU5 [;5n![U!5n"[ES:5n#U#RS;5 U#RS 5 U"RU#5 U"R35 URRU!5 URUR5 [S<5UlPURR#S 5 URUR5 URU5 URU5 [5n$U$R35 [eUR(aS=OS>5UlRURRS?5 URRhR'UR5 U$RUR5 [eS@5n%U%RhR'UR5 U$RU%5 UR5U$5 UR5 UR5 UR5 UR5 gA)BzSetup dialog UIzBasic Informationze.g., Daily ETL PipelinezSchedule Name:zOptional description...<z Description:zWhat to ExecutezExecute Single JobTrzExecute Job Group (Chain)zExecute Backup ProfilezExecute Sync ProfilezSelect a job...z Select Job:zUse Existing GroupzCreate New GroupzSelect a group...z Select Group:ze.g., Data Processing Chainz Group Name:zError Handling:) stop_on_errorcontinue_on_errorskip_remainingzAvailable Jobs:duAdd Selected ↓uRemove Selected ↑z Jobs in Group (execution order):u Move Up ↑u Move Down ↓zSelect a backup profile...zSelect Backup Profile:zSelect a sync profile...zSelect Sync Profile:zWhen to ExecutezSchedule Type:cronintervalmanualz$e.g., 0 2 * * * or 30 14 * * mon-frizCron Expression:uFormat: minute hour day month day_of_week Examples: • 0 8 * * * = Daily at 8:00 AM • 30 14 * * mon-fri = Weekdays at 2:30 PM • 0 9 * * mon,wed,fri = Mon/Wed/Fri at 9:00 AMzcolor: #666; font-size: 10px;zICron Expression Helper (crontab.guru)z color: #2196F3; font-size: 10px;4zWeeks:imzDays:zHours:;zMinutes:zSeconds:z{Specify the interval duration. At least one value must be non-zero. Example: 2 weeks = execute every 2 weeks from first runz[Manual execution only - no automatic scheduling. Use 'Run Now' button to execute on demand.z color: #666; font-style: italic;z)Enabled (schedule will run automatically)SaveCreatezNbackground-color: #4CAF50; color: white; padding: 8px 20px; font-weight: bold;CancelN)Yrr rr name_inputsetPlaceholderTextaddRowr description_inputsetMaximumHeight setLayout addWidgetrrtarget_button_groupr job_radio setCheckedtoggledconnect_on_target_type_changed addButton group_radio backup_radio sync_radio addStretch addLayoutr target_stackrr job_combocurrentIndexChanged_on_job_selectedrgroup_selection_button_groupexisting_group_radio_on_group_selection_changednew_group_radio group_stackexisting_group_combogroup_name_inputgroup_error_comboaddItemsravailable_jobs_listsetSelectionModer SelectionModeMultiSelectionr add_to_group_btnclicked_add_jobs_to_groupremove_from_group_btn_remove_jobs_from_groupgroup_jobs_list move_up_btn _move_job_up move_down_btn_move_job_down backup_combo sync_comboschedule_type_combocurrentTextChanged_on_schedule_type_changedschedule_config_stack cron_input setStyleSheetsetOpenExternalLinksrinterval_weeks setMinimum setMaximum interval_daysinterval_hoursinterval_minutesinterval_seconds setWordWraprenabled_checkboxr%save_btn_save_schedulereject _load_jobs _load_groups_load_backup_profiles_load_sync_profiles)&r+layout basic_group basic_layout target_group target_layout radio_layoutjob_pagejob_page_layout group_pagegroup_page_layoutgroup_radio_layoutexisting_group_widgetexisting_group_layoutnew_group_widgetnew_group_layout error_layoutadd_remove_layout order_layout backup_pagebackup_page_layout sync_pagesync_page_layoutschedule_groupschedule_layout type_layout cron_widget cron_layout cron_help cron_linkinterval_widgetinterval_layout interval_help manual_widget manual_layout manual_labelactions_layout cancel_btns& r.r)ScheduleEditorDialog._setup_ui*s T" 34 "} #+ **+EF,doo>!* 112KL //3ND,B,BCl+%!!23 # #} #/#5 %&:; !!$' &&t'C'CD   **4>>1=t~~.'(CD   (()E)EF   **4+;+;Q?t//0()AB !!))$*F*FG   **4+<+ ''(D(DE   **4??A>t/! -+,9%h/" ))*;< **2243H3HI!!&"78!!$..1""$ ##H-Y ' 3)],8,>)$01E$F! !!,,T2 !!))11$2R2RS ))33D4M4MqQ$$T%>%>?+,>? $$,,T-M-MN ))33D4H4H!L$$T%9%9:##$67*+!(  +,A B$-K! !!445HI''(?@''(A(AB((* ""#89#9&'78!*  001NO""6-#89""4#8#89#} v&789!* '')  t556!""<0 ""6*;#<=#.=    112C2Q2Q2`2`a   11#6""4#;#;<(M +,> ? %%--d.E.EF##D$9$9:%01F%G" ""**2243O3OP##D$>$>?$$&""#45 ""6*L#MN*} --c2""4#7#78#} &}5   (():):;t//0(9 ""**4+>+>?t112!""<0 ""#34##D$4$45 ##J/i (5%K ,,-IJ$$V,D%EF$$T%6%67%%' ##K0I &y1#+ **+EF""6*@#AB""4??3##% ##I. 1 12}-&##45%-"m f%567#,;    ))*HI   33;;D&#f+fSYKq'IJ R__55s4yA((006 ''++D,D,DE( 5 LL/s3 4 4 5sCC D 'DD cURR5nURS5nUR5Vs/sHn[ U5PM nnSSS5 WHRnURR US5nUR RUSS[U5S3US5 MT gs snf!,(df  Nl=f![a#n[R"SU35 SnAgSnAff=f)zLoad existing groupsz&SELECT * FROM job_groups ORDER BY nameNrrz (z jobs)zError loading groups: ) r_get_connectionexecutefetchalldictget_job_group_membersrarlenrrr)r+conncursorrowgroupsgroupmembersrs r.r!ScheduleEditorDialog._load_groupsvs 7((*d&NO/5/@A/@$s)/@A+ ''77d D))11V}oRG ~V<$K B+* 7 LL1!5 6 6 7sAC$B=B8B=A C8B== C C C;C66C;cURR5nUH1nUS(dMURRUSUS5 M3 URR 5S:Xa8URRSS5 URR S5 gg![ a#n[R"SU35 SnAgSnAff=f) z"Load backup profiles for selectionenabledrrr(No enabled profiles)NFzError loading backup profiles: ) rget_all_backup_profilesrsrcount setEnabledrrrr+profilesprofilers r.r*ScheduleEditorDialog._load_backup_profiless @ww668H#9%%%%--gfowt}M$  &&(A-!!))*A4H!!,,U3. @ LL:1#> ? ? @s'B*A;B** C4CCcURR5 URR5nUH1nUS(dMURR USUS5 M3 URR 5S:Xa8URR SS5 URR S5 gURR S5 g![aZn[R"S U35 URR S S5 URR S5 SnAgSnAff=f) z Load sync profiles for selectionrrrrrNFTzError loading sync profiles: z(Error loading profiles)) rtclearrget_all_sync_profilesrrrrrrrs r.r(ScheduleEditorDialog._load_sync_profiless . OO ! ! #ww446H#9%%OO++GFOWT]K$$$&!+''(?F**51**40 . LL8< = OO # #$> E OO & &u - - .s&ACA;CC E)AD>>EcURR5(aURRS5 gURR5(aURRS5 gUR R5(aURRS5 gUR R5(aURRS5 gg)zHandle target type changerr3r4r5N)rM isCheckedrXsetCurrentIndexrSrTrUr+s r.rQ,ScheduleEditorDialog._on_target_type_changeds >> # # % %    - -a 0    ' ' ) )    - -a 0    ( ( * *    - -a 0 __ & & ( (    - -a 0)r0cURR5(aURRS5 gURRS5 g)z"Handle group selection type changerr3N)r]rr`rrs r.r^0ScheduleEditorDialog._on_group_selection_changeds?  $ $ . . 0 0    , ,Q /    , ,Q /r0 schedule_typec|SSSS.nURUS5n[R"SUSU35 URR U5 URR 5R 5 [R"SURR 5RR35 g) zHandle schedule type changerr3r4r:zSchedule type changed to 'z', switching to stack index zCurrent widget: N) getrdebugrxr currentWidgetupdateGeometryr-__name__)r+rtype_mapindexs r.rw.ScheduleEditorDialog._on_schedule_type_changeds1: ]A. 1-@\]b\cde ""2259 ""002AAC '(B(B(P(P(R(\(\(e(e'fghr0cUR(dUR(agURR5nU(aUR U5 gg)z?When job is selected from combo, pre-populate schedule settingsN)r%r!rY currentDatar)r+job_ids r.r[%ScheduleEditorDialog._on_job_selecteds@    8 8 ++-   ' ' / r0cURR5nU(dgUHn[UR55nUR [ R RUR[ R R55 URRU5 URRU5nURRU5 M g)zAdd selected jobs to groupN) re selectedItemsrtextrrrrdatarnrrtakeItemr+selected_itemsrnew_itemrs r.rk'ScheduleEditorDialog._add_jobs_to_groups11??A "D&tyy{3H   R__55tyyAYAY7Z [  ( ( 2**..t4C  $ $ - -c 2 #r0cURR5nU(dgUHn[UR55nUR [ R RUR[ R R55 URRU5 URRU5nURRU5 M g)zRemove selected jobs from groupN) rnrrrrrrrrrerrrrs r.rm,ScheduleEditorDialog._remove_jobs_from_groups--;;= "D&tyy{3H   R__55tyyAYAY7Z [  $ $ , ,X 6&&**40C  ) )# . #r0cURR5nUS:aYURRU5nURRUS- U5 URR US- 5 gg)zMove selected job uprr3N)rn currentRowr insertItem setCurrentRowr+ current_rowrs r.rp!ScheduleEditorDialog._move_job_upsj**557 ?''00=D  + +K!OT B  . .{Q ? r0c8URR5nXRR5S- :a`US:aYURRU5nURR US-U5 URR US-5 ggg)zMove selected job downr3rN)rnrrrrrrs r.rr#ScheduleEditorDialog._move_job_downs**557 --3359 9kQ>N''00=D  + +K!OT B  . .{Q ??O 9r0c`URRUR5nU(d7[R"USSURS35 UR 5 gUR RUS5 US(aURRUS5 USS:Xa\URRS 5 URRUS 5nUS :aURRU5 GO=USS :Xa[URRS 5 UR RUS 5nUS :aUR RU5 OUSS :Xa[UR"RS 5 UR$RUS 5nUS :aUR$RU5 OuUR&RS 5 UR(RS 5 UR*RUS 5nUS :aUR*RU5 UR,R/US5 [1US[25(a[4R6"US5OUSnUSS:Xa,UR8RUR;SS55 OUSS:XaUR<R?UR;SS 55 UR@R?UR;SS 55 URBR?UR;SS 55 URDR?UR;SS 55 URFR?UR;SS 55 URHRUS5 g![JaNn[LRN"SU35 [RP"USSU35 UR 5 SnAgSnAff=f)z'Load existing schedule data for editingErrorz Schedule z not foundNr description target_typerT target_idrbackup_profile sync_profilerschedule_configr;rAr<weeksdayshoursminutessecondsrzError loading schedule data: zFailed to load schedule: ))r get_scheduler r warningrrEsetTextrH setPlainTextrMrNrYfindDatarrTrsrUrtrSr]rarusetCurrentText isinstancestrjsonloadsryrr|setValuerrrrrrrrcritical)r+schedulerrrs r.r*(ScheduleEditorDialog._load_schedule_datasq5 ww++D,<,<=H##D'Yt?O?O>PPZ3[\  OO # #HV$4 5 &&&33H]4KL &%/))$///0EFA:NN2259-(,<<!!,,T2))228K3HIA:%%55e<-(N:**4000+1FGA:OO33E:  ++D1))44T:11::8K;PQA:--==eD  $ $ 3 3H_4M N@J8TeKfhk@l@lTZZ): ;?/*j8##,,VZZ-CD""++FJJvq,AB##,,VZZ-CD%%..vzz)Q/GH%%..vzz)Q/GH  ! ! , ,Xi-@ A  LL8< =  w2KA30O P KKMM s A"O%M/O P-AP((P-returnc URR5R5(d3[R"USS5 URR 5 gUR R5(a9URR5S:a[R"USS5 gGOURR5(aTURR5S:dURR5c[R"USS5 gGOFURR5(aSURR5S:dURR5c[R"USS5 gOURR5(a8UR R5S:a[R"USS5 gO}UR"R5R5(d[R"USS 5 gUR$R'5S:Xa[R"USS 5 gUR(R+5nUS :XaHUR,R5R5(d[R"USS 5 ggUS :XaUR.R15S:XaUR2R15S:XasUR4R15S:XaUUR6R15S:Xa7UR8R15S:Xa[R"USS5 gg)zValidate form inputsValidation ErrorzSchedule name is requiredFrzPlease select a jobzPlease select a backup profilePlease select a sync profilezPlease select a groupzGroup name is requiredz(Please add at least one job to the groupr;zCron expression is requiredr<z*Please specify at least one interval valueT)rErstripr rsetFocusrMrrY currentIndexrTrsrrUrtr]rarbrnrru currentTextryr|valuerrrr)r+rs r._validate_inputs%ScheduleEditorDialog._validate_inputs7s##%++--   &8:U V OO $ $ & >> # # % %~~**,q0##D*<>ST1   ( ( * *  --/!3t7H7H7T7T7V7^##D*<>^_8___ & & ( (++-1T__5P5P5R5Z##D*<>\]6[((2244,,99;a?''.@BYZ @,,11399;;''.@BZ[ ''--/14''.@Blm 00<<> F "??'')//11##D*<>[\2j (##))+q0""((*a/##))+q0%%++-2%%++-2##D*<>jkr0rcURRU5nU(d[R"SUS35 gURR S5 UR RU5nUS:aUR RU5 URR5(d!URRSUS35 US(GasURRUS5 [US [5(a[ R""US 5OUS nUSS :Xa5UR%S S 5nU(aUR&RU5 OUSS :XaUR(R+UR%S S55 UR,R+UR%SS55 UR.R+UR%SS55 UR0R+UR%SS55 UR2R+UR%SS55 [R6"SU35 g![4a#n[R"SU35 SnANBSnAff=f![4a#n[R8"SU35 SnAgSnAff=f)z3Pre-populate schedule settings from an existing jobzJob z not found for pre-populationNTrz Schedule for rrrr;rAr<rrrrrz*Could not parse schedule config from job: z'Pre-populated schedule editor from job zError pre-populating from job: )rget_jobrrrMrNrYrrrErrrurrrrrrryr|rrrrrrinfor)r+rrrr cron_exprrs r.r+ScheduleEditorDialog._pre_populate_from_jobisT* @''//&)CfX-JKL NN % %d +NN++F3Ez..u5??''))''-F }(EF?##((77O8LMUCMcRcNdfiCjCjTZZ,=(>?psuFqGF?+v5$*JJvr$: $ OO33I>_-;++44VZZ5KL**33FJJvq4IJ++44VZZ5KL--66vzz)Q7OP--66vzz)Q7OP KKA&J K!UNN%OPQs#STTU  @ LL:1#> ? ? @sU"S US US35 SnUR@R%5nUS:Xa+SURBR5R50nOUS:XaURDRG5URHRG5URJRG5URLRG5URNRG5S.nO0nUR R5R5URPRS5R5=(d SUUUUURTR5S.n URV(apUR&RX"URZ40U D6 [<R>"SURZS U S35 [R\"USSU SS35 O]UR&R^"S0U D6n [<R>"SU S U S35 [R\"USSU SSU S35 URa5 g![ba>n [<Rd"SU 35 [Rf"USSU 35 Sn A gSn A ff=f)zSave schedule to databaseNrr rr%r&rzAuto-created for schedule: )rr error_handlingr3)execution_orderzCreated inline group z: rr;r<)rrrrr)rr r r rrrzUpdated schedule Successz Schedule 'z' updated successfullyzCreated schedule z' created successfully (ID: rzError saving schedule: r zFailed to save schedule: )4r,rMrrYrrTrsrUrtr rr]rarbrr'rErcr*rcreate_job_grouprangernrrrrrradd_job_to_grouprr0ruryr|r+rrrrrH toPlainTextrr%update_scheduler informationcreate_scheduleacceptrrr ) r+r r  group_datairrrr schedule_datar rs r.r#ScheduleEditorDialog._save_schedules6$$&& L Q~~''))#  NN668 "",,...  --99; **,,,  OO779 $''.@B`a%,,6688")K $ 9 9 E E GI!% 5 5 : : < B B D)DT__EYEYE[EaEaEcDd'e*.*@*@*L*L*N"J !% 8 8 F: FI#4#7#7#=#=#?@#3388;!%2??+C+C!D00TUVWTW0XA KK"7 {"ZPVEWDX YZ")K!44@@BM&#)4??+?+?+A+G+G+I"J*,!00668 ..446!00668#44::<#44::< ##%,,.446#55AACIIKSt*&!.#200::<M  ''(8(8JMJ /0@0@/AMRXDYCZ[\''i:mTZF[E\\r9st"gg55F F  / }B}V?T>UVW''i:mTZF[E\\xzEyFFG:HI KKM Q LL21#6 7  w2KA30O P P QsCR)N-R S!4SS)'rirersrTrryrrHrrar]rcrnrbrSr\r`rrrrr|r%rYrMrqrorEr_r!rlrrxr rurtrUrLrX)NN)r __module__ __qualname____firstlineno____doc__rrintr$r)rrrrrQr^rrwr[rkrmrprrr*boolr,rr__static_attributes__ __classcell__)r-s@r.rrs@'#4'o'\_'~A''$t#l 5,7"@ .* 10isi0 3 /@@7r0$0d,@S,@\QQQQr0r) rGPyQt6.QtWidgetsrrrrrrr r r r r rrrrrrrrr PyQt6.QtCorerlogururr core.databaser core.configrrr7r0r.rQsI  +'S Q7S Qr0