)i01SrSSKrSSKJrJrJrJrJrJrJ r J r J r J r J r JrJrJr SSKJr SSKJr SSKJr "SS\5rg) zq Backup Profile Editor Dialog Allows creating and editing backup profiles with source paths and exclude patterns N)QDialog QVBoxLayout QHBoxLayout QFormLayout QGroupBox QLineEditQSpinBox QCheckBox QListWidget QPushButtonQDialogButtonBox QFileDialog QMessageBoxQLabel)Qt)logger)Databasec^\rSrSrSrSS\S\4U4SjjjrSrSr Sr S r S r S r S rS rS\4SjrSrSrU=r$)BackupProfileDialogz+Dialog for creating/editing backup profilesdb profile_idc>[TU]U5 X lX0lUSLUlUR UR(aSOS5 UR SS5 UR5 UR(aUR5 gg)NzEdit Backup ProfilezNew Backup ProfileiiX) super__init__rris_editsetWindowTitlesetMinimumSize _setup_ui_load_profile_data)selfparentrr __class__s 0c:\PYTHON\Scheduler\gui\backup_profile_dialog.pyrBackupProfileDialog.__init__sr  $"-  T\\1G[\ C%  <<  # # % c [U5nURS5 [S5n[U5n[ 5UlUR R S5 URSUR 5 [ 5UlURR S5 URSUR5 URU5 [S5n[U5n[5n[ 5Ul URR S5 URUR5 [S 5nURRUR5 URU5 URS U5 [!5UlUR"R%S S 5 UR"R'S 5 UR"R)S5 URSUR"5 [+S5UlUR,R/S5 URSUR,5 URU5 [S5n[U5n [1S5n U RU 5 [35UlUR4R7[2R8R:5 U RUR45 [5n [S5n U RRUR<5 U RU 5 [S5n U RRUR>5 U RU 5 U RA5 U RCU 5 URU5 [S5n[U5n[1S5nURU5 [35Ul"URDR7[2R8R:5 URURD5 [5n[S5nURRURF5 URU5 [S5nURRURH5 URU5 [S5nURRURJ5 URU5 URA5 URCU5 URU5 [M[LRNRP[LRNRR-5nURTRURV5 URXRURZ5 URU5 g)zSetup dialog UIzBasic Informationz"e.g., Daily Backup, Weekly ArchivezProfile Name *:zOptional descriptionz Description:zBackup Settingsze.g., D:\backupsz Browse...zBackup Root *:imz daysz Retention:zEnable this profileTz Source Pathsz0Directories to backup (at least one required) *:zAdd Directory...zRemove SelectedzExclude Patternsz'File patterns to exclude (glob syntax):zAdd Pattern...zAdd Common PatternsN).r setSpacingrrr name_editsetPlaceholderTextaddRowdescription_edit addWidgetrbackup_root_editr clickedconnect_browse_backup_rootr retention_spinsetRangesetValue setSuffixr enabled_check setCheckedrr sources_listsetSelectionMode SelectionModeSingleSelection _add_source_remove_source addStretch addLayout patterns_list _add_pattern_remove_pattern_add_common_patternsr StandardButtonSaveCancelaccepted _save_profilerejectedreject)r!layout basic_group basic_layoutsettings_groupsettings_layoutbackup_root_layoutbrowse_root_btn sources_groupsources_layout sources_labelsources_buttons_layoutadd_source_btnremove_source_btn exclude_groupexclude_layout exclude_labelpatterns_buttons_layoutadd_pattern_btnremove_pattern_btnadd_common_btn button_boxs r$rBackupProfileDialog._setup_ui%sT"" 34 ";/ " ))*NO-t~~> )  001GHND,A,AB%##45%n5)] )  001DE$$T%:%:;%k2''(@(@A$$_5/1CD&j $$Q, $$R( %%g.|T-@-@A&'<= %%d+r4#5#56(".1 $]3QR   /'M **;+D+D+T+TU  !2!23!,$%78&&t'7'78((8'(9:!!))$*=*=>(():;))+  !78'""45 $]3HI   /(] ++K,E,E,U,UV  !3!34"--%&67''(9(9:))/:():;""**4+?+?@))*<=$%:;&&t'@'@A)).9**,  !89'&  + + 0 0  + + 2 2 3  ##D$6$67##DKK0$r&cDURRUR5nU(d7[R"USSURS35 UR 5 gUR RUS5 URRURSS55 URRUS5 URRUS 5 URR[US 55 US n[!U["5(a[$R&"U5nUHnUR(R+U5 M URS /5n[!U["5(a[$R&"U5nUHnUR,R+U5 M g![.aNn[0R2"S U35 [R"USSU35 UR 5 SnAgSnAff=f)zLoad profile data in edit modeErrorzProfile z not foundNname descriptionr+ backup_rootretention_daysenabledsourcesexclude_patternszError loading profile data: zFailed to load profile: )rget_backup_profilerrcriticalrNr-setTextr0getr2r6r8r:r;bool isinstancestrjsonloadsr<addItemrD Exceptionrerror)r!profilerlsourcepatternspatternes r$r &BackupProfileDialog._load_profile_datas gg00AG$$T7ht>Oz4Z[  NN " "76? 3  ! ! ) )'++mR*H I  ! ! ) )'-*@ A    ( (1A)B C    ) )$wy/A*B Ci(G'3''**W-!!!))&1"{{#5r:H(C((::h/#""**73$  LL7s; <  w2J1#0N O KKMM s A"G%E!G HAHHc[R"USURR5=(d S5nU(aURR U5 gg)z Browse for backup root directoryzSelect Backup Root Directoryr+N)rgetExistingDirectoryr2textrp)r! directorys r$r5'BackupProfileDialog._browse_backup_rootsM44  *  ! ! & & ( .B   ! ! ) )) 4 r&cr[R"USS5nU(a[URR 55Vs/sH+o RR U5R 5PM- nnX;aURRU5 g[R"USS5 ggs snf)zAdd source directoryzSelect Source Directoryr+ Duplicatez%This directory is already in the listN) rrranger<countitemrrwr information)r!riitemss r$r@BackupProfileDialog._add_sources44  %  ?DTEVEVE\E\E^?_`?_!&&++A.335?_E`%!!)))4''k;bc `s2B4c|URR5nUS:aURRU5 gg)z Remove selected source directoryrN)r< currentRowtakeItemr!currents r$rA"BackupProfileDialog._remove_sources6##..0 a<    & &w / r&cSSKJn URUSS5up#U(aUR5(aUR5n[ UR R 55Vs/sH+o@R RU5R5PM- nnX%;aUR RU5 g[R"USS5 gggs snf)zAdd exclude patternr) QInputDialogzAdd Exclude Patternz5Enter glob pattern (e.g., *.log, */.git/*, */temp/*):rz#This pattern is already in the listN) PyQt6.QtWidgetsrgetTextstriprrDrrrrwrr)r!rr}okrrs r$rE BackupProfileDialog._add_patterns0"**  ! C  '--//mmoG@EdFXFXF^F^F`@ab@a1'',,Q/446@aEb#""**73''k;`a"2cs-2Cc|URR5nUS:aURRU5 gg)zRemove selected exclude patternrN)rDrrrs r$rF#BackupProfileDialog._remove_patterns6$$//1 a<    ' ' 0 r&c/SQn[URR55Vs/sH+o RRU5R 5PM- nnSnUH*nXS;dM URR U5 US- nM, US:a[ R"USSUS35 g [ R"USS5 g s snf) zAdd common exclude patterns)z*/.git/*z*/venv/*z*/__pycache__/*z*/node_modules/*z*.tmpz*.logz */.cache/*z*/temp/*rr)zPatterns AddedzAdded z common pattern(s)z No Changesz+All common patterns are already in the listN)rrDrrrrwrr)r!common_patternsrexisting added_countr}s r$rG(BackupProfileDialog._add_common_patternss  @ETEWEWE]E]E_?`a?`!&&++A.335?`a &G&""**73q ' ?  # #  %78   # #= !bs2C returncURR5R5(d3[R"USS5 URR 5 gUR R5R5(d3[R"USS5 UR R 5 gURR5S:Xa[R"USS5 gg)zValidate form inputszValidation ErrorzProfile name is requiredFz!Backup root directory is requiredrz)At least one source directory is requiredT) r-rrrwarningsetFocusr2r<r)r!s r$_validate_inputs$BackupProfileDialog._validate_inputss~~""$**,,   &8:T U NN # # %$$))+1133   &8:] ^  ! ! * * ,    " " $ )   ";  r&c UR5(dgURR5R5nURR5R5nUR R5R5nUR R5nURR5n[URR55Vs/sH,nURRU5R5PM. nn[URR55Vs/sH,nURRU5R5PM. nnUR(aQUR R#UR$UUUUUUUS9 [&R("SUR$SU35 O;UR R+UUUUUUUS9n [&R("SU SU35 UR-5 gs snfs snf![.a>n [&R0"SU 35 [2R4"USS U 35 Sn A gSn A ff=f) zSave profile to databaseN)rrgrirlrhrmrjrkzUpdated backup profile z: )rgrirlrhrmrjrkzCreated backup profile zError saving profile: rfzFailed to save profile: )rr-rrr0r2r6valuer: isCheckedrr<rrrDrrupdate_backup_profilerrinfocreate_backup_profileacceptrxryrro) r!rgrhrirjrkrrlrmrr~s r$rL!BackupProfileDialog._save_profile,s:$$&& 2 P>>&&(..0D//446<<>K//446<<>K!00668N((224G t0066899A!!&&q)..09 t11779: :A""''*//1:   ||--# +# +%5#1#.  5doo5FbOP"WW:: +# +%5#1#;  5j\D6JK KKMK  B P LL1!5 6  w2J1#0N O O Ps7CH0)3H&'H03H+6B/H0& H00 I8:4I33I8) r2rr0r:rr-rDrr6r<)N)__name__ __module__ __qualname____firstlineno____doc__rintrrr r5r@rArErFrGrrrrL__static_attributes__ __classcell__)r#s@r$rrsd5&8&&& n%` D5 d0 b&1 "H$27P7Pr&r)rrurrrrrrrr r r r r rrr PyQt6.QtCorerlogurur core.databaserrr&r$rs>   "QP'QPr&