si,.dZddlmZmZmZmZmZmZmZm Z m Z m Z m Z ddl mZddlmZmZddlmZddlmZddlmZGdd eZd S) zD All Backups Dialog - Shows complete backup history with statistics ) QDialog QVBoxLayout QHBoxLayout QPushButton QTableWidgetQTableWidgetItemQLabel QMessageBox QGroupBox QHeaderViewQAbstractItemView)Qt)QFontQColor)logger)datetime)Optionalc:eZdZdZfdZdZdZdZdZxZ S)AllBackupsDialogz4Dialog showing all backup operations with statisticsct|||_||_d|_|d|dd||dS)NAll Backup Operationsii) super__init__db parent_widgetselected_operationsetWindowTitleresize _setup_ui_load_all_backups)selfparentr __class__s -c:\PYTHON\Scheduler\gui\all_backups_dialog.pyrzAllBackupsDialog.__init__s    #"& 3444 D#       ct|}|dddd|dtd}t|}t d|_t }|d|j|| |j| |td}t|}t|_ |j d|j gd|j t jj|j d|j t*jj|j t*jj|j t*jj|j j|j |j j!|j"|j #d d |j #d d |j #d d|j #dd|j #dd|j #dd |j #dd|j #dd| |j | |tI}t d}| ||%tMd|_'|j'j(|j"|j')d| |j'tMd} | j(|j*| | |+|dS)zSetup dialog UIzBackup StatisticszLoading statistics... r)IDProfilez Backup NameTypeStatusz Start TimeDurationFilesTr2Pdxu-💡 Tip: Double-click a backup to restore itu🔄 Restore SelectedFCloseN),rsetContentsMargins setSpacingr r stats_labelr setPointSizesetFont addWidgetr backups_tablesetColumnCountsetHorizontalHeaderLabelshorizontalHeadersetSectionResizeModer ResizeMode InteractivesetStretchLastSectionsetSelectionBehaviorr SelectionBehavior SelectRowssetSelectionMode SelectionModeSingleSelectionsetEditTriggers EditTriggerNoEditTriggersitemSelectionChangedconnect_on_backup_selected doubleClicked_restore_selected_backupsetColumnWidthr addStretchr restore_btnclicked setEnabledaccept addLayout) r!layout stats_group stats_layout stats_font table_group table_layout button_layout info_label close_btns r$rzAllBackupsDialog._setup_ui sT""!!"b"b111" 344 ";// !"9::WW ###   ,,,t/000%%% 788 ";// )^^ ))!,,, 446 6 6     ++--BB;CYCefff ++--CCDIII //0A0S0^___ ++,=,K,[\\\ **+<+H+WXXX /778PQQQ (001NOOO ))!R000 ))!S111 ))!S111 ))!R000 ))!R000 ))!S111 ))!S111 ))!S111t1222%%%$ KLL  +++  """&'>??  (()FGGG ##E*** 0111(( !!$+... ***'''''r%c  |jd}t|}td|D}td|D}td|D}|rt |dd}t |d d} t j|}t j|} |d } | d } | |z j } nM#t|d kr |d d n|} t|d kr |d d n|} d } Yn xYwd } d } d} d|d|d|d|d| d| } t| tr | d| dz } |j | |jt|t!|D]5\}}t#t%|d}|t(jj|j|d||j|d}|r|dn d|d}t#|}|j|d||dd }t#|}|j|d|t#|d}|j|d||d }t#|}|t(jj|d d!kr#|t7d"n]|d d#kr#|t7d$n.|d d%kr"|t7d&|j|d'||d}|rQ t j|}|d(}n(#t|d)kr |d d)n|}YnxYwd }t#|}|j|d*||d+r|dr| t j|d}t j|d+}||z }|d,kr|d-d.} n|d/kr |d,z d-d0} n |d/z d-d1} n#d } YnxYw|d d%krd2nd } t#| }!|!t(jj|j|d3|!|d4d}"|d5d}#|"dkr|"d|#d6nd }$t#|$}%|%t(jj|j|d7|%7d S#t:$r;}&t=jd8|&tAj!|d9d:|&Yd }&~&d Sd }&~&wwxYw);z)Load all backup operations and statistics?Blimitc32K|]}|ddkdVdS)status completedr1N.0ops r$ z5AllBackupsDialog._load_all_backups..js0#Z#Z"blk>Y>YA>Y>Y>Y>Y#Z#Zr%c32K|]}|ddkdVdS)rofailedr1Nrqrrs r$ruz5AllBackupsDialog._load_all_backups..ks0 T Tr2h<8;S;S;S;S;S;S T Tr%c32K|]}|ddkdVdS)rorunningr1Nrqrrs r$ruz5AllBackupsDialog._load_all_backups..ls0!V!VBxLIz4AllBackupsDialog._load_all_backups..p qr%)keyr|c|dSr{rqr}s r$rz4AllBackupsDialog._load_all_backups..qrr%z%Y-%m-%d %H:%MNzN/Aru📊 Total Backups: u | ✅ Completed: u | ❌ Failed: u | ⏳ Running: u 📅 Date Range: u → z (z days)id profile_idnameProfile r1 backup_namer3operation_typer5rorpgreenrwredryoranger7z%Y-%m-%d %H:%M:%Sr8end_time<z.1fsimhz Running...r9 files_total files_linkedz links)r;zError loading all backups: ErrorzFailed to load backups: )"rget_recent_backup_operationslensumminmaxr fromisoformatstrftimedays isinstanceintr@setTextrD setRowCount enumeraterstrsetTextAlignmentr AlignmentFlag AlignCentersetItemget_backup_profileget setForegroundr total_seconds Exceptionrerrorr critical)'r! operations total_backupscompleted_backupsfailed_backupsrunning_backupsoldestnewest oldest_dt newest_dt oldest_str newest_strtime_span_days stats_textrowrtid_itemprofile profile_name profile_itemr backup_item type_item status_text status_itemr|dttime_str time_itemstartendduration duration_str duration_itemrr files_str files_itemes' r$r z"AllBackupsDialog._load_all_backupsbs0 P==F=KKJ OOM ##Z#Z #Z#Z#Z Z Z  T TZ T T TTTN!!V!Vj!V!V!VVVO #Z-F-FGGG UZ-F-FGGG U + ( 6v > >I ( 6v > >I!*!3!34D!E!EJ!*!3!34D!E!EJ&/)&;%ANN+03F b0@0@fJ03F b0@0@fJ%*NNN" " !"B}BB"3BB-BB!0BB%/ BB6@ BB .#.. :9>9999   $ $Z 0 0 0   * *3z?? ; ; ;$Z00M ?M ?R*3r$x==99(()9)EFFF"**37;;;'44R 5EFF29\wv?\"\JZ?\?\ / == "**3<@@@!ff]E:: .{;; "**3;???-R0@-ABB "**39===!l .{;; ,,R-=-IJJJh<;..--fWoo>>>>\X----fUmm<<<<\Y..--fX.>.>???"**3;??? - %[%3J??#%;;/B#C#C[69*oo6J6J:crc??PZ$H,X66 "**39===66*%%X"&&*>*>X - ( 6r,7G H H&4R ^DD$'%K#>#>#@#@$b==.6+=+=+=+=LL%__.6rk+@+@+@+@LL.6tm+B+B+B+BL-', 35h<93L3L< > ..r/?/KLLL"**3=AAA!ff]A66 !vvna88 GRUV{CClCCCC\a -i88 ++B,<,HIII"**3:>>>>[M ?M ?^ P P P L:q:: ; ; ;  w0N10N0N O O O O O O O O O PsfB'X*ADXAE  J4X>)P('X(!Q  AX&A1TXTC1X Y0YYc |j}|s#|jdd|_dS|d}t |j|d}|j|d}|j|d}|dko|dk}|j||ro |j d }|D]}|d |kr ||_dSdS#t$r)} tj d | d|_Yd} ~ dSd} ~ wwxYwdS) zHandle backup selectionFNrr7r5rpbackuprkrlrz!Error getting operation details: )rD selectedItemsr\r^rrritemtextrrrrr) r!selectedrop_idror can_restorerrtrs r$rWz$AllBackupsDialog._on_backup_selecteds%3355    ' ' . . .&*D # FqkooD&++C3388::;;#((a005577+00a88==??,K81K  ##K000  / /!WAAAOO $B$x5((24/) / / / DDDEEE*.''''''' / / /s3E E FE<<Fc N|jstj|dddS|jd}|stj|dddS|j|jd}|s'tj|dd|jdd dS d d lm}|||d |}| dS#t$rH}tj d |tj|ddt|Yd}~dSd}~wwxYw)zRestore the selected backupz No Selectionz+Please select a completed backup to restoreNrrz%Selected operation has no backup namerrz not foundr)BackupRestoreDialog backup_rootzError opening restore dialog: zRestore FailedzFailed to open restore dialog: )rr warningrrrrgui.backup_restore_dialogrexecrrrr)r!rrrdialogrs r$rYz)AllBackupsDialog._restore_selected_backups|&   n6c d d d F-11-@@    g/V W W W F',,T-D\-RSS   w0l4;RS_;`0l0l0l m m m F  E E E E E E)(w}/E{SSF KKMMMMM    L=!== > > >   ;3q66;;          s#-C D$=DD$) __name__ __module__ __qualname____doc__rrr rWrY __classcell__)r#s@r$rrs>> ! ! ! ! !@(@(@(DAPAPAPF///:r%rN)rPyQt6.QtWidgetsrrrrrrr r r r r PyQt6.QtCorer PyQt6.QtGuirrlogururrtypingrrrqr%r$rs1 %%%%%%%%OOOOOwOOOOOr%