&4nie?dZddlmZmZmZmZmZmZmZm Z m Z m Z m Z ddl mZmZddlmZmZddlmZddlmZddlmZddlmZGd d eZd S) z< Sync Widget for GUI - Manages sync profiles and operations ) QWidget QVBoxLayout QHBoxLayout QPushButton QTableWidgetQTableWidgetItemQLabel QMessageBox QGroupBox QHeaderViewQAbstractItemView)Qt pyqtSignal)QFontQColor)logger)datetime)Database)SchedulerConfigceZdZdZeZdedeffd ZdZ dZ dZ dZ d Z d Zd Zd Zd ZdZdZxZS) SyncWidgetz0Widget for managing sync profiles and operationsdbconfigct||_||_||dS)N)super__init__rr _setup_uirefresh)selfrr __class__s &C:\PYTHON\Scheduler\gui\sync_widget.pyrzSyncWidget.__init__sH    c$t|}|dddd|dt}t d}t }|d|d||| || td|_ |j j |j| |j td|_|jj |j|jd| |jtd|_|jj |j|jd| |jtd |_|jd|jj |j| |jtd |_|jj |j|jd| |jtd |_|jj |j| |j||t9d }t|}t;|_|jd |j gd|j!"tFj$j%|j!&d|j'tPj)j*|j+tPj,j-|j.tPj/j0|jj1|j2|jj3|j|j4dd|j4dd|j4dd|j4dd|j4dd| |j| |dt9d}t|}t;|_5|j5d|j5 gd|j5!"tFj$j%|j5!&d|j5'tPj)j*|j5.tPj/j0|j54dd|j54dd|j54dd|j54dd|j54dd|j54d d|j54dd| |j5| |ddS) zSetup sync UI componentsu📁 Directory Sync ProfilesTu➕ New Profileu✏ EditFu 📅 Scheduleu ▶ Run Nowu 🗑 Deleteu 🔄 Refreshz Sync Profiles)IDNameSource DestinationEnabledr2i,P)stretchzRecent Sync Operations)r'ProfileStatusz Start TimeDurationCopiedDeleteddN)6rsetContentsMargins setSpacingrr r setPointSizesetBoldsetFont addWidget addStretchrnew_btnclickedconnect_create_profileedit_btn _edit_profile setEnabled schedule_btn_schedule_syncrun_btn _run_sync delete_btn_delete_profile refresh_btnr addLayoutr rprofiles_tablesetColumnCountsetHorizontalHeaderLabelshorizontalHeadersetSectionResizeModer ResizeMode InteractivesetStretchLastSectionsetSelectionBehaviorr SelectionBehavior SelectRowssetSelectionMode SelectionModeSingleSelectionsetEditTriggers EditTriggerNoEditTriggersitemSelectionChanged_on_profile_selected doubleClickedsetColumnWidthoperations_table) rlayout header_layout title_label title_fontprofiles_groupprofiles_layoutoperations_groupoperations_layouts r!rzSyncWidget._setup_ui sT""!!"b"b111"$ ;<< WW ###4   J''' ,,,  """##455  $$T%9::: ---#J//  %%d&8999   ''' ...'88 !))$*=>>> $$U+++ 1222"=11  &&& $$T^444 ---%m44 ''(<=== ""5)))000&~66  ((666 0111'''#?33%n55*nn **1--- 557 7 7     ,,..CCKDZDfggg ,,..DDTJJJ 001B1T1_``` ,,->-L-\]]] ++,=,I,XYYY 0889RSSS )11$2DEEE **1b111 **1c222 **1c222 **1c222 **1b111!!$"5666333%%=>>'(899 , ,,Q/// 779 9 9     ..00EEkF\Fhiii ..00FFtLLL 223D3V3abbb --.?.K.Z[[[ ,,Q333 ,,Q444 ,,Q444 ,,Q444 ,,Q444 ,,Q444 ,,Q444##D$9:::)155555r"cV||dS)zRefresh all dataN)_load_profiles_load_operations)rs r!rzSyncWidget.refreshs,  r"c |j}|jt |t |D]\}}t t|d}|tj j |j |d|t |d}|j |d|t |d}|j |d|t |d}|j |d||d rd nd }t |} | tj j |d r#| td n"| td |j |d| dS#t$r;} t!jd| t%j|dd| Yd} ~ dSd} ~ wwxYw)z Load sync profiles from databaseidrnamer- source_pathr/destination_pathr0enabledu✓ Yesu✗ Nogreenredr1zError loading sync profiles: ErrorzFailed to load sync profiles: N)rget_all_sync_profilesrS setRowCountlen enumeraterstrsetTextAlignmentr AlignmentFlag AlignCentersetItem setForegroundr Exceptionrerrorr critical) rprofilesrowprofileid_item name_item source_item dest_item enabled_text enabled_itemes r!rrzSyncWidget._load_profilessI# Vw4466H   + +CMM : : : )( 3 3 B B W*3wt}+=+=>>(()9)EFFF#++CG<<<-WV_== #++CI>>>/w}/EFF #++CK@@@-W5G-HII #++CI>>>-4I,>LyyH / == --b.>.JKKK9%> ..vg???? ..ve}}===#++CLAAAA5 B B8 V V V L<<< = = =  w0TQR0T0T U U U U U U U U U VsG4G88 H=0H88H=cb |jd}|jt |t |D]+\}}t t|d}|tj j |j |d||j |d}|r|dn d|d}t |}|j |d||d }t |} | tj j |d d kr#| td n|d d kr#| td n]|d dkr#| tdn.|d dkr"| td|j |d| |d} | rQ t!j| } | d} n(#t | dkr | ddn| } YnxYwd} t | } |j |d| |drq|dr\ t!j|d}t!j|d}||z }|dd}n#d}YnxYw|d dkrdnd}t |}|tj j |j |d||dd}t t|}|tj j |j |d||d d}t t|}|tj j |j |d!|-dS#t*$r"}t-jd"|Yd}~dSd}~wwxYw)#zLoad recent sync operations)limitrur profile_idrvProfile r-status completedrzfailedr{runningorangecompleted_with_errors darkoranger/ start_timez%Y-%m-%d %H:%M:%SNzN/Ar0end_time.1fsz Running...r1 files_copiedr& files_deletedr<zError loading sync operations: )rget_recent_sync_operationsrhr~rrrrrrrrrget_sync_profilerrr fromisoformatstrftimeget total_secondsrrr)r operationsroprr profile_name profile_item status_text status_itemrdttime_str time_itemstartendduration duration_str duration_itemr copied_itemr deleted_itemrs r!rszSyncWidget._load_operationssK @;;";EEJ  ! - -c*oo > > >$Z00C DC DR*3r$x==99(()9)EFFF%--c1g>>>'222l3CDD29\wv?\"\JZ?\?\ / == %--c1lCCC!l .{;; ,,R-=-IJJJh<;..--fWoo>>>>\X----fUmm<<<<\Y..--fX.>.>????\%<<<--f\.B.BCCC%--c1kBBB - %[%3J??#%;;/B#C#C[69*oo6J6J:crc??PZ$H,X66 %--c1i@@@66*%% X"&&*>*> X- ( 6r,7G H H&4R ^DD$'%K#>#>#@#@*2'9'9'9'9 -', 35h<93L3L< > ..r/?/KLLL%--c1mDDD "vvna88 .s.JKKK%--c1lCCCCGC DC DJ @ @ @ L>1>> ? ? ? ? ? ? ? ? ? @sKH5R8)I"!R"!JAR AL21R2L86E R R. R))R.c*t|jdk}|j||j||j||j|dS)zHandle profile selectionrN)rrS selectedItemsrHrJrKrMrO)r has_selections r!rezSyncWidget._on_profile_selectedsD/==??@@1D    /// $$]333  ... ""=11111r"c|j}|sdS|d}t|j|dS)zGet selected profile IDNr)rSrrintitemtext)rselectedrs r!_get_selected_profile_idz#SyncWidget._get_selected_profile_idsc&4466 4qkoo4&++C3388::;;;r"c ddlm}ddlm}|||j}||jjkrCtj d| |j dSdS)zCreate new sync profilerSyncProfileDialogQDialogzNew sync profile createdN) gui.sync_profile_dialogrPyQt6.QtWidgetsrrexec DialogCodeAcceptedrinforprofile_changedemit)rrrdialogs r!rGzSyncWidget._create_profiles======++++++""411 ;;==G.7 7 7 K2 3 3 3 LLNNN  % % ' ' ' ' ' 8 7r"cpddlm}ddlm}|}|st j|dddS|||j|}||j j krGtj d|d| |jdSdS) zEdit selected sync profilerrr No SelectionzPlease select a profile to editNz Sync profile z updated)rrrrrr warningrrrrrrrrr)rrrrrs r!rIzSyncWidget._edit_profiles======++++++2244    n6W X X X F""4*== ;;==G.7 7 7 K< <<< = = = LLNNN  % % ' ' ' ' ' 8 7r"cddlm}ddlm}|}|st j|dddS|j|}|st j|dd|d dS|||j|j }|j d |d |j d |j|}|dkr|j|||jjkr9t)jd |t j|dd|d ddSdS)z.Open schedule dialog for selected sync profiler)ScheduleEditorDialogrrz#Please select a profile to scheduleNr|rz not foundzSync: rvTz"Created schedule for sync profile Successz#Schedule created successfully for 'z2'. Check the Schedules tab to view and manage it.)gui.schedule_editor_dialogrrrrr rrrr name_inputsetText sync_radio setChecked sync_combofindDatasetCurrentIndexrrrrr information)rrrrrrindexs r!rLzSyncWidget._schedule_sync+sCCCCCC++++++2244    n6[ \ \ \ F'**:66   g/P*/P/P/P Q Q Q F&%dDGT[AA !!"<76?"<"<=== $$T***!**:66 A::   - -e 4 4 4 ;;==G.7 7 7 KIZII J J J  #AgfoAAA      8 7r"c"|}|sdStj|ddtjjtjjz}|tjjkr |j|tj d|| |j dS#t$r;}tjd|tj|dd|Yd}~dSd}~wwxYwdS)zDelete selected sync profileNzDelete ProfileziAre you sure you want to delete this sync profile? This will also delete all associated sync operations.zDeleted sync profile zError deleting profile: r|zFailed to delete profile: )rr questionStandardButtonYesNordelete_sync_profilerrrrrrrr)rrreplyrs r!rPzSyncWidget._delete_profileOs72244   F$   D  & *[-G-J J    K.2 2 2 V++J777 @J@@AAA $))+++++ V V V ;;;<<<$T74TQR4T4TUUUUUUUUU V 3 2s'AC D 0DD c|}|sdS|j|}|sdStj|dd|ddtjjtjjz}|tjjkrdS ddlm }||j}| |}| dr| d i}tj |d d |dd | d dd| ddd| ddd| dddd n6tj |dd |dd| dd|dS#t$r;}t!jd|tj|dd|Yd}~dSd}~wwxYw)z-Execute sync for selected profile immediatelyNzRun SynczExecute sync profile 'rvz' now?r) SyncModulesuccessstatszSync CompletedzSync 'z*' completed successfully! Files scanned: files_scannedz Files copied: rz Files deleted: rz Duration: duration_secondsrrz Sync Failedz ' failed: rz Unknown errorzError executing sync: r|zFailed to execute sync: )rrrr rrrrmodules.sync.sync_moduler execute_syncrrrrrrrr) rrrrr sync_moduleresultrrs r!rNzSyncWidget._run_synchsv2244   F'**:66  F$   rsS ('''''''%%%%%%%%""""""''''''DPDPDPDPDPDPDPDPDPDPr"