ֳiGdZddlZddlmZmZmZmZmZmZm Z m Z m Z m Z m Z mZmZmZddlmZddlmZddlZddlmZddlmZGdd eZdS) z@ Job Editor Dialog Form for creating and editing scheduled jobs N)QDialog QVBoxLayout QHBoxLayout QFormLayout QGroupBox QLineEdit QTextEdit QComboBoxQSpinBox QCheckBox QPushButton QFileDialogQLabel QMessageBox)Qt)logger)Path)SchedulerDatabasecjeZdZdZddedeffd ZdZdefdZ d Z d Z d Z d e fd ZdZdZxZS)JobEditorDialogz Dialog for creating/editing jobsNdbjob_idcjt|||_||_|du|_||jrdnd|d|d||jr| dSdS)NzEdit JobzNew JobTiX) super__init__rr is_edit_modesetWindowTitlesetModalsetMinimumWidth _setup_ui_load_job_data)selfparentrr __class__s (C:\PYTHON\Frank\gui\job_editor_dialog.pyrzJobEditorDialog.__init__s     "$. $*;JJJKKK d S!!!    "    ! ! ! ! ! " "ct}td}t}t|_|jd|d|jt|_|j d|jd|d|j| || |td}t}t|_ |j gd|d |j t}t|_|jd | |jt#d |_|jj|j| |j|d |t|_|jd |d|jt}t|_|jd| |jt#d |_|jj|j| |j|d|| || |td}t} t|_|jgd|jj|j| d|jt|_|jd| d|jt=d|_|j d|j!d| d|jtE|_#|j#$d|j#%d| d|j#tE|_&|j&$d|j&%d| d|j&tE|_'|j'$d|j'%d| d |j'tE|_(|j($d|j(%d!| d"|j(tE|_)|j)$d|j)%d!| d#|j)|j#*d$|j&*d$|j'*d$|j(*d$|j)*d$| | | |td%} t} tWd&|_,|j,-d| d|j,tWd'|_.|j./d(| d|j.tWd)|_0|j0-d|j0/d*| d|j0tE|_1|j12dd+|j13d,|j14d-| d.|j1tE|_5|j52dd/|j53d| d0|j5tE|_6|j62dd,|j63d|j64d-| d1|j6t|_7|j7gd2|j78d3| d4|j7t|_9|j9d5| d6|j9t|_:|j:d7|j:;tyj=|j:/d8| d9|j:| | | | t} | >|j?rRt#d:|_@|j@j|jA| |j@t#|j?rd;nd<|_B|jBCd|jBj|jD| |jBt#d=|_E|jEj|jF| |jE|G| | |d>S)?zSetup dialog UIzBasic Informationze.g., DataHub Daily Refreshz Job Name:*<z$Description of what this job does...z Description:zExecution Settings)batchscript python_modulez Job Type:*zC:\path\to\script.batz Browse...z Executable:*zOptional command line argumentsz Arguments:zC:\path\to\working\directoryz Working Dir:zSchedule Settings)cronintervalmanualzSchedule Type:*z$e.g., 0 7 * * mon-fri (7am weekdays)zCron Expression:zTCron Help | Format: minute hour day month weekdayTzcolor: gray; font-size: 10pt;r4zWeeks:imzDays:zHours:;zMinutes:zSeconds:FzAdvanced SettingszJob is enabledz Show Console Window (Debug Mode)zhDisplay a visible CMD window during job execution. Useful for debugging. Output is still logged to file.zMostra in DashboarduSe deselezionato, questo job non compare nella Dashboard (né in Recent Executions né nella Weekly Timeline). Utile per job frequenti/di servizio che non richiedono monitoraggio visivo.iQiz secondszTimeout: z Retry Count:z Retry Delay:)normal importantcriticalr4z Criticality:z,production, daily, datahub (comma-separated)zTags:zlascia vuoto per 'tutti i PC'zwHostname del PC su cui gira questo job. Lascia vuoto per eseguire su tutti gli host. Default: hostname del PC corrente.zHost:Test RunSaveCreateCancelN)Hrrrr name_inputsetPlaceholderTextaddRowr description_inputsetMaximumHeight setLayout addWidgetr job_type_comboaddItemsrexecutable_inputr browse_buttonclickedconnect_browse_executablearguments_inputworking_dir_inputbrowse_dir_button_browse_directoryschedule_type_combocurrentTextChanged_on_schedule_type_changed cron_inputr cron_helpsetOpenExternalLinks setStyleSheetr interval_weeks setMinimum setMaximum interval_daysinterval_hoursinterval_minutesinterval_seconds setVisibler enabled_checkbox setCheckedshow_console_checkbox setToolTipshow_on_dashboard_checkbox timeout_inputsetRangesetValue setSuffixretry_count_inputretry_delay_inputcriticality_combosetCurrentText tags_inputhostname_inputsetTextsocket gethostname addStretchr test_button _test_run save_button setDefault _save_job cancel_buttonreject addLayout) r"layout basic_group basic_layout exec_group exec_layoutexec_path_layoutworkdir_layoutschedule_groupschedule_layoutadvanced_groupadvanced_layout button_layouts r%r zJobEditorDialog._setup_ui's  344 "}} #++ **+HIIIL$/:::!* //333 112XYYYND,BCCCl+++%%%344 !mm 'kk $$%I%I%IJJJ<)<==='== )  001KLLL""4#8999(55 "**4+BCCC""4#5666>+;<<<({{ //0QRRR<)=>>>%!* 112TUUU  !7888!,[!9!9 &..t/EFFF  !7888>>:::[)))$$$##677%--#,;;   ))*H*H*HIII  3;;D222'jj &&q))) &&r***x)<===%ZZ %%a((( %%c***w(:;;;&jj &&q))) &&r***x)<=== (  ((+++ ((,,,z4+@AAA (  ((+++ ((,,,z4+@AAA &&u--- %%e,,, &&u--- ((/// ((///  111(((##677%-- )*: ; ; ((...r4#8999%./Q%R%R" "-- D    r4#=>>>*34I*J*J' '224888 '22 Z   r4#BCCC%ZZ ##Au--- ##D))) $$Z000z4+=>>>!) ''2... ''***~t/EFFF!) ''4000 ''+++ ((444~t/EFFF!* ''(K(K(KLLL --h777~t/EFFF#++ **+YZZZw888'kk ../NOOO ##F$6$8$8999 && 1   w(;<<<  111((($   """   6*:66D    $ , ,T^ < < <  # #D$4 5 5 5&1B'PvvQQ ##D)))  ((888 0111(22 "**4;777 2333''' vr& schedule_typec|dk}|dk}|j||j||j||j||j||j||j||dkr|jddS|jddS)zHandle schedule type changer,r-r.zManual execution onlyze.g., 0 7 * * mon-friN) rPr[rQrTrWrXrYrZr<)r"ris_cron is_intervals r%rOz)JobEditorDialog._on_schedule_type_changeds 6)#z1  ""7+++ !!'*** &&{333 %%k222 &&{333 ((555 ((555 H $ $ O . ./F G G G G G O . ./F G G G G Gr&ctj|ddd\}}|rn|j||js=|jt t|jdSdSdS)zOpen file picker for executablezSelect Executabler/zAll Files (*.bat *.cmd *.py *.exe *.vbs);;Batch Files (*.bat *.cmd);;Python Files (*.py);;VBScript Files (*.vbs);;Executables (*.exe)N) rgetOpenFileNamerDrkrJtextstrrr#)r" file_path_s r%rHz"JobEditorDialog._browse_executable s"2    T   1  L  ! ) )) 4 4 4)..00 L&..s4 ??3I/J/JKKKKK  L L L Lr&cntj|dd}|r|j|dSdS)z(Open folder picker for working directoryzSelect Working Directoryr/N)rgetExistingDirectoryrJrk)r"dir_paths r%rLz!JobEditorDialog._browse_directorysN3  &     5  " * *8 4 4 4 4 4 5 5r&c. |j|j}|s5tj|dd|jd|dS|j|d|j |dpd|j |d|j |d |j |d pd|j|d pd|j |d t!j|d }|d dkr/|j|ddn|d dkr|j|dd|j|dd|j|dd|j|dd|j|dd|jt9|d|j|d|j|d|j|d|j |d|drt!j|dng}|j!d"||j#|dd|j$t9|dd |j%|d!dpdtMj'd"|jd#dS#tP$rO}tMj)d$|tj*|dd%||Yd}~dSd}~wwxYw)&z"Load existing job data for editingErrorzJob ID z not foundNname descriptionr/job_typeexecutable_path argumentsworking_directoryrschedule_configr,r-weeksrdayshoursminutessecondsenabledtimeout_seconds retry_countretry_delay_seconds criticalitytagsz, show_consoleFshow_on_dashboardThostnamez Loaded job z for editingzError loading job data: zFailed to load job: )+rget_jobrrwarningrur;rkr> setPlainTextrBrhrDrIrJrMjsonloadsrPgetrTrcrWrXrYrZr\r]boolrarerfrgrijoinr^r`rjrinfo Exceptionerrorr6)r"jobrres r%r!zJobEditorDialog._load_job_data"s3+ '//$+..C #D'3TT[3T3T3TUUU  O # #CK 0 0 0  " / /M0B0Hb I I I   . .s: ? ? ?  ! ) )#.?*@ A A A  ( ([)9)?R @ @ @  " * *3/B+C+Ir J J J  $ 3 3C4H I I I"j->)?@@O?#v--''(;(;FB(G(GHHHH_%33#,,_-@-@!-L-LMMM"++O,?,?,J,JKKK#,,_-@-@!-L-LMMM%../B/B9a/P/PQQQ%../B/B9a/P/PQQQ  ! , ,T#i.-A-A B B B   ' ',=(> ? ? ?  " + +C ,> ? ? ?  " + +C0E,F G G G  " 1 1#m2D E E E.1&kA4:c&k***rD O # #DIIdOO 4 4 4  & 1 1#''.%2P2P Q Q Q  + 6 6tCGGDWY]<^<^7_7_ ` ` `   ' ' B(?(?(E2 F F F K?dk??? @ @ @ @ @    L7A77 8 8 8  w0Jq0J0J K K K KKMMMMMMMMM s AP;O!P;; RARRreturnch|js1tj|dd|jdS|js1tj|dd|jdS|jdkr\|j s1tj|dd|j dSdS)zValidate form inputszValidation ErrorzJob name is requiredFzExecutable path is requiredr,z2Cron expression is required for cron schedule typeT) r;rstriprrsetFocusrDrM currentTextrP)r"s r%_validate_inputsz JobEditorDialog._validate_inputsQs##%%++--   &8:P Q Q Q O $ $ & & &5$))++1133   &8:W X X X  ! * * , , ,5  # / / 1 1V ; ;?''))//11 #D*<>rsss((***utr&c |sdS |j}i}|dkr/|j|d<n|dkr|j|d<|j|d<|j |d<|j |d<|j |d<|j }|rd | d Dng}id |jd |jpdd |jd|jd|jpdd|jpdd|d|d|jd|jd|jd|jd|jd|d|jd|jd|j}|jr^|jj |j!fi|tEj#d|j!d|d tIj%|dd|d d nU|jj&d'i|}tEj#d!|d|d tIj%|dd|d d"|d#|'dS#tP$r;}tEj)d$|tIj*|d%d&|Yd}~dSd}~wwxYw)(zSave job to databaseNr,r-rrrrrc^g|]*}||+S)r).0ts r% z-JobEditorDialog._save_job..ys-III!qwwyyIAGGIIIIIr&,rrrrrrrrrrrrrrrrrz Updated job z: SuccesszJob 'z' updated successfullyz Created job z' created successfully (ID: )zError saving job: rzFailed to save job: r)+rrMrrPrrrTvaluerWrXrYrZrisplitr;r> toPlainTextrBrDrIrJr\ isCheckedrarerfrgr^r`rjrr update_jobrrrr information create_jobacceptrrr6)r"rr tags_textrjob_datarrs r%rszJobEditorDialog._save_jobes$$&&  F5 L 4@@BBM O&&*./*>*>*@*@*F*F*H*H''*,,+/+>+D+D+F+F(*.*<*B*B*D*D'+/+>+D+D+F+F(-1-B-H-H-J-J *-1-B-H-H-J-J *,,..4466IMV^IIys';';IIII\^D,,..4466t5AACCIIKKStD/;;=="4#8#=#=#?#?#E#E#G#G  T16688>>@@HD  $T%;%@%@%B%B%H%H%J%J%Rd  "?40::<<"4#5#;#;#=#=t5;;==&t'='C'C'E'Et5AACC : D D F F $T%D%N%N%P%P!"D/4466<<>>#H( z""4;;;(;;; L4;LL(6:JLLMMM'i9i&AQ9i9i9ijjjj,+77h77 G6GGXf5EGGHHH'i9x&AQ9x9xou9x9x9xyyy KKMMMMM L L L L1a11 2 2 2  w0Jq0J0J K K K K K K K K K LsO'P Q 0QQcv|jsdStj|dd|jdtjjtjjz}|tjjkr ddlm }ddl m }|}||j |}| |jd }tj|d d |d tjd |jd|dS#t"$r;}tjd|tj|dd|Yd}~dSd}~wwxYwdS)zExecute test run of the jobNr7z Execute job 'z' now?r) JobExecutor)SchedulerConfig manual_test) triggered_byzTest Run StartedzJob execution started (ID: z!) Check History tab for results.zTest run started for job z , execution zError starting test run: rzFailed to start test run: )rrquestionr;rStandardButtonYesNodaemon.job_executorr core.configrr execute_jobrrrrrr6)r"replyrrconfigexecutor execution_idrs r%rpzJobEditorDialog._test_runs{  F$   :DO0022 : : :  & *[-G-J J    K.2 2 2 V;;;;;;777777(**&;tw77'33DKm3\\ '&c,ccc  _ __Q]__````` V V V <<<===$T74TQR4T4TUUUUUUUUU V! 3 2s3ArsU    ++++++jVjVjVjVjVgjVjVjVjVjVr&