From 9e2992a8f23eb6c07dc6dc13ba1417475ffa62d2 Mon Sep 17 00:00:00 2001 From: Till Tomczak Date: Thu, 12 Jun 2025 06:48:52 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=89=20Improved=20Backend=20Structure?= =?UTF-8?q?=20&=20Logging=20=F0=9F=96=A5=EF=B8=8F=F0=9F=93=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/__pycache__/models.cpython-313.pyc | Bin 86973 -> 86985 bytes backend/app.py | 2 +- .../__pycache__/admin_unified.cpython-313.pyc | Bin 81442 -> 81454 bytes .../__pycache__/calendar.cpython-313.pyc | Bin 63458 -> 63458 bytes .../__pycache__/jobs.cpython-313.pyc | Bin 30522 -> 30522 bytes .../__pycache__/printers.cpython-313.pyc | Bin 38588 -> 38596 bytes .../__pycache__/sessions.cpython-313.pyc | Bin 6739 -> 6751 bytes .../__pycache__/tapo_control.cpython-313.pyc | Bin 16940 -> 16948 bytes .../__pycache__/uploads.cpython-313.pyc | Bin 20861 -> 20876 bytes backend/blueprints/calendar.py | 2 +- backend/blueprints/jobs.py | 2 +- backend/logs/app/app.log | 14 +++++++++ backend/logs/core_system/core_system.log | 14 +++++++++ .../logs/data_management/data_management.log | 10 +++++++ .../hardware_integration.log | 28 ++++++++++++++++++ .../job_queue_system/job_queue_system.log | 12 ++++++++ backend/logs/scheduler/scheduler.log | 7 +++++ .../logs/security_suite/security_suite.log | 10 +++++++ backend/logs/shutdown/shutdown.log | 0 .../logs/tapo_controller/tapo_controller.log | 7 +++++ .../utilities_collection.log | 14 +++++++++ backend/logs/watchdog/watchdog.log | 0 backend/logs/windows_fixes/windows_fixes.log | 14 +++++++++ .../__pycache__/core_system.cpython-313.pyc | Bin 0 -> 46354 bytes .../data_management.cpython-313.pyc | Bin 0 -> 17907 bytes .../drag_drop_system.cpython-313.pyc | Bin 57199 -> 57214 bytes .../hardware_integration.cpython-313.pyc | Bin 0 -> 31331 bytes .../job_queue_system.cpython-313.pyc | Bin 0 -> 26058 bytes .../__pycache__/job_scheduler.cpython-313.pyc | Bin 28542 -> 28734 bytes .../security_suite.cpython-313.pyc | Bin 0 -> 6868 bytes .../utilities_collection.cpython-313.pyc | Bin 0 -> 12043 bytes backend/utils/data_management.py | 16 ++++++++++ backend/utils/job_queue_system.py | 28 ++++++++++++++++++ backend/utils/security_suite.py | 3 ++ 34 files changed, 180 insertions(+), 3 deletions(-) create mode 100644 backend/logs/core_system/core_system.log create mode 100644 backend/logs/data_management/data_management.log create mode 100644 backend/logs/hardware_integration/hardware_integration.log create mode 100644 backend/logs/job_queue_system/job_queue_system.log create mode 100644 backend/logs/security_suite/security_suite.log create mode 100644 backend/logs/shutdown/shutdown.log create mode 100644 backend/logs/utilities_collection/utilities_collection.log create mode 100644 backend/logs/watchdog/watchdog.log create mode 100644 backend/utils/__pycache__/core_system.cpython-313.pyc create mode 100644 backend/utils/__pycache__/data_management.cpython-313.pyc create mode 100644 backend/utils/__pycache__/hardware_integration.cpython-313.pyc create mode 100644 backend/utils/__pycache__/job_queue_system.cpython-313.pyc create mode 100644 backend/utils/__pycache__/security_suite.cpython-313.pyc create mode 100644 backend/utils/__pycache__/utilities_collection.cpython-313.pyc diff --git a/backend/__pycache__/models.cpython-313.pyc b/backend/__pycache__/models.cpython-313.pyc index b84eb55a9a45f4f151f4b7de5ef82e51aae32247..097f137e4f591d22c12883d848f73c7c187045d3 100644 GIT binary patch delta 69 zcmdnHob}{#R^HFNyj%=GaI@GmV{aqxR$j)X{?byVC7C(JdLS~hBr~-*J~=-pCpEbw VGe2+pL4U^ijEw%<69XAzm;hE)7<~W$ delta 57 zcmX@PoOSPVR^HFNyj%=Ga6HgGV`C%lR$j)X{``EUC7C(Jdc~@jx@6Qj%Kuk%ldG1_cCuq~+_0HkRf`2YX_ delta 59 zcmZ4Yhh@ntu=&ikq;>#Ys1<+! diff --git a/backend/blueprints/__pycache__/calendar.cpython-313.pyc b/backend/blueprints/__pycache__/calendar.cpython-313.pyc index d85e8894ee516e6d0d67263b577ce3a9b8b1c141..8440548b6190073b8d7d234c4abbd2f2f1310628 100644 GIT binary patch delta 43 ycmaF#p83&xX0Fe?yj%=GaJyt9*MctsS@}uvg{7&bsqw{?#U-h^n|FQDUj&avJMy}7iyj%=G;99zo>teA$R(?`^VQFej&avJMy}7iyj%=GkgBnf>teA$a(-S~PG)jRd~RZ1VtQ)P=GVpk%m7oc5B~rF diff --git a/backend/blueprints/__pycache__/printers.cpython-313.pyc b/backend/blueprints/__pycache__/printers.cpython-313.pyc index 1751f777c944d73a313a8fcb1e8a8d828dd945bf..eaf32d056be1f465bf7bc570499288b3b602f1be 100644 GIT binary patch delta 106 zcmdn9mg&e^Cf?7yyj%=Gurk#%Lw6%@!XyWg(vr-aV!h(jq7NwLY7Ny2#=9Q$T7bTWt=I2dbI_WKY;6;YOy9{QVXHHgT1^`vR BB=!IR delta 98 zcmX@ImTAvgCf?7yyj%=GkXmh>p}LVbVUmSlX-Q^Iv0g!HQEp~&ab|vAagjVwL6HK8 sPy`aUM4>8*GV@AOi{f+h^D;~Fizcs~^p@T4B7@&u2E)w@Co3}p02n4Ad;kCd diff --git a/backend/blueprints/__pycache__/sessions.cpython-313.pyc b/backend/blueprints/__pycache__/sessions.cpython-313.pyc index dd3d51bdb16bb164ae5186c5766a5a800c447d57..0ee5fea95651d8aa109a2d4211995843ee584069 100644 GIT binary patch delta 60 zcmca?a^HmaGcPX}0}!Z`cxJ5F$opSHTB@`pGpAS&L}r#`rWVI1=jY_4CYNO9=S`ND MY-Kc`yijrz0C8Crg8%>k delta 48 zcmca_a@mCUGcPX}0|=~f$e6Q{_rC-`Uuj8ZPO)BbYDr0EUV8Clb;(vn?a6B;Hvs^F CI1qpU diff --git a/backend/blueprints/__pycache__/tapo_control.cpython-313.pyc b/backend/blueprints/__pycache__/tapo_control.cpython-313.pyc index 39c4cd9c6457d1058331b98bb259d88ab25262b7..5b425634fe707b995b1e9807ef23ec71dacbbda0 100644 GIT binary patch delta 98 zcmZ3}!nmb{k@qt%FBbz4tWWjK=-Q2mrI_Bl`dV delta 90 zcmdne!nme|k@qt%FBbz491nEQXy3^D-cC%kv?Md9Sg$0pAU{4iKd+=HKPM-(XtKDy pqmUp(svxx}H?z1nGe56*a<2UmF2lPF+IJaj?lahIws!c*2mqD4AhQ4f diff --git a/backend/blueprints/__pycache__/uploads.cpython-313.pyc b/backend/blueprints/__pycache__/uploads.cpython-313.pyc index 587bc78097a331db6122f3ab9d53fdd86b4fd1a7..8a99b01cc59242567a4a0290ddd1b1693fb10fb9 100644 GIT binary patch delta 106 zcmeynh_PoeBkyNkUM>b8kSX!Zc)F2ykFS_$X-Q^Iv0h4INn(6%VqRi;YHn&?$>ck} z#?n#{DG-@il9^f@pPZkQlbT$TnV&aV&hL_-3-fmd21Xa=uVC^%gU4n@{~9I$;|(Oa delta 91 zcmeBK%=mW^BkyNkUM>b8;9KL6acv{-9$#Uh(vr-aV!gD?oYeT-#Jt4x)S}7veU16~ nAmYWTB_)}8>BWi#s<=9QQ3Q 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 literal 0 HcmV?d00001 diff --git a/backend/utils/__pycache__/data_management.cpython-313.pyc b/backend/utils/__pycache__/data_management.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2f96807463b435099b4a61deda473cd8ccc5dc74 GIT binary patch literal 17907 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

-K0gG%aWPp1{ul_&+JGEPM9w8b)-nn zg{BtcsKs~47iXqFq(|xjMbN2g5XJA)D^ecHoO6B%{L8XHXBGdBy7TYJ`Jd$c13ByDFaphp?MZt4m>eRUvNbDPocGZqEv3w%&x^>kUiB79FHeFJvJvI@{sV9)UY<1&2v(^Av7>rha5>xKUq*~IKFOqW=g^K^1o>;a97Z zVBt(J8L(SMCE0dIba6)cN(R4{Q6J8zUl?4;*eersgptq~?Cj~}Fqxa89>?!@oS{QLWN1pO zl8j18vd4gIGzW)~#57KgvW-K4*PT5rp%{Bk}#lvr+jW7i2w8%(M|!G@qkAB z?fN0N>*w6zpK?V% z&KbcdAVgJbL;aNKh7?ZN*h+P8=ucy zPfOFebU!tg;e@Z}`y$5NHDh7eh?s|0jgS1&mY$)1-uyxFV7jj8CP(fEzMNv+hMOFm z^@G?!DRB<4UvSrrMqTN-6Sq0s)@>TUL$BL+76=x%i$-=^$h%EXu(8OkS;^Uqs^x5A z_ZwW+8kZO5@}&H>Rjxe}e|-Fh-0=_BoAWtKE|z)JIFer+t8Piyh}JyuBjX7y@Obl4 YfQIzjyNg_C~ewEQPx&x+74h+27*-*W!Fuswlhmv@@ngJ zXZro;;$A#-WjULjPNzr2Ip?1DJ&*r=uI}1wW)AK~ba>&+2*>?3JxI=!iQE;`9QQis z;RMd3@~Drh1QiR_f|`XIL4#0pRC`1#XpiUw9Z%)7NA*Vxg5ii!Fdi`prXyy-e8eJH zSf1{v^@vTdvAF(d(Gj~~XK}+($B|;8n8l4pOOBKZr93xX+{k%MdsO0R1gDF`v$=}% zSf=fJG?~;gmTE<+Ehn{n+Q!n0kZ#|Dw;;Di3^<`8lj}fk@dLRoRK{1*PHm_O#{J!c|O|03Vcdq*ZGdikT{W1jJm;r`)) z3Gdip^MOz6%;wQxK=4I_OJROEJijC?vUraf4GWQF;o1+wflzREp@)B-x}90{g?$0P z(6M}`jh|f#&m%9ImlzE$`h~od=ax>+L}nNKbFmPsh^CJ&g(FL$;9SrzM0ww058t`7 zb5Hxu?)IH~kvkX*pP~WzLc!>@KZ^RpJv`pL-6OUU3#SkUx0RALdW{h52hg44m`{X0y^%^T-wWCxxZw{ODXb=?_Nv(c@2=dt=dsC83An z{G{JUD>WGmh4{&(#n~0#Df5Y-Kh(qbPxN{whdq5m1AM

JPS0V4B#=H<)kJju~^S z)5bYu(Y&TjB%0RrhR>vpGjYKqY@f~M>|QPdf4IA? zNPV4~<^Tmbf`EX2YC-GK2s)2e(0g=(!J`+99)n;C7~Q6{wJ)<_CeJMUZ#SUwinCY1 z`tql-`=kZ*htpPi&6y=keaN?*E*AWerI;}5rxCIZmoA<2FZ;uD{_yOXY+~`U5L^<1 z(QMM&m_BpbI5QLWp}m>3d1hvDiMAo)))~B@FO+00BNio-QK<2e-Z+bL!C7A@tz8HP7Sej`_F!x=tqCo?kk$qXKGA%Qxh+Bkjn_q9C3#ikRl~#H z$Gi{s^^T;qL&JxM()!VX{$cNES~D{KOj1s~d zE6)z4EX8O0Q?|0RgDJE9Y#$z9?iZ_4t-J}#U}5g=mynY`VJ#e;j%nSr-lN%yTo%(( zj7|!B(z7RnV4OBhn+c1dtTB^jnYK>rGHE83W)^I$mL=0h5qq+-CmXPo-BTnu0tUA| zZDKfM4p8)VCt6)`A;t&8{G4ClpYh=c0zQWbCZ_eYm4b6=GY(TY3P>KDBbo=(DxI#e zbddzj=VlmGvdX71=#Si{8Aw|eeJ{=ke(ZC9ByFJxoyu4^Ix7JWl;WsiDt@;E-s_x~ zn?P9TW{n)T19>4iBftf?w^d_rtAxjp_BNne#2=cEP|LhPimlzm2i=XUhq~z{?9^NB%u>pIO?c!-8Vmh|_^aA$pv?a4!4Vg46(rkIV z+9VWB+fd8QN>~K@v;$9>9V`?F^zNdxX_Bz`q%U&nb}vS=Vq?$ky|MX#@1#F%h$4q} ztPx-%L|`#(llCXuo?~gd0Bqr--GB{!8o(v9J1H?D?rv+Q2-~BRX;UyV#H z+$Eo|@{y<@^r4VIOoF(^M<~XYTuZT|&0H4#^P8+(k9zCOwjd(Im>!~s* zZ39a)dx|_pP}3$>4txot%dIGBn=YER%XGPgm3DZnSYaEWla(D$k(d*1kDz?Dy2^pNwI90 z*E+2~a{*4+j|d1L9V4mIwkI=$3VZLgi9oKHV_z1QX8n-}h}0RRM$$#ION+}Pf7CxG zK3nE}!I1P|iY|bnokL+zflJu<+7Nuqs$=8sk!EvxxI(cIUJj&^B;wTx+J<9Nucl)P~aoNoumg*7?77fXF+LyzvEz3aW2B5t=f`(E`BH-t64 znt(wJ=T-BZ*st3dYe1WWU}d7jP4O$S0@Tkh1j8$_v5&Qs8>>g*hm{HVi6e?m#&~Mc zzW|Pb2j8>E4^a!0mm%p{Kk6QS&}|Z?QC38VPa~GrEXSh4Zi<<)Z!)Ziu#FN-124|{ z87Gt0`2}G~aBGDpsP+tbgj3The}r}e4<{mggKv(VkhC*zi)T`gp={(ecxSmyt;JNC zDlU7Y@@tj1YUULAjB{Nmi|?(g(`yJxj6-Z2`l8QZXqr%EgC+fe59%3t4eaE{8moZ3`*(^{Ui z)+DSo@%ksOXx=qnHDCVx_0H?Q>z;V+QybQao29N_Z|YF+;|LKyU$g>0{NbM79h$3} z?TB98VeUO(xVqPX_>VdBp}m?Pn_CWbX@1rW;m2!2hHogJagzK; z-m>UTnFyPZA)r(@D?N&#<>ivF1~q9c1&)sOv7JiC$E#*ozu+i(HO*WA$K+uLiSp&6 zls&dGT+VinA%Q!AzK)F<&h5Ac;K|+k(=0$7U&n3UmHQes#zv+-8BD7M*`_IeJFq z+QUmP_<~XKJUxS!gh_a5-2jyk{FE?9-aI_FPCPh_4yD5;9-#nY5n50>KbZq$C4oTL z|6-KzOu91f6y;{Iy8j$?=_nPMT-f|?9K3KaS-Le*x;0tqPL#S+t!>{edb=pu+M8(Y zU2pA6I9kpdSDS8?RlafjYsXW&yOYk=gtPThdBVB#zJ@EW-_&!i>hoqgMw9|6QTFOTdF7wn9amLirS@mI2l~3G+B(2VA z+?#`@a?p(uvQv3gKy2z<#5Vp7ujYVCiQ@5S+R;Wt9g-2TSEE!8sq%Tt4y&gGa{xZY1@1SPHxfA%xXc*zx%1{R(7!C1 z5imR)t_2JdqF$*R^$Dk#Xp|7BFBIW@Cn2r`i@p?z_`||UbiGo=Lom4%3J88kXY&i( z1|pyWF9d}-cn}y03j~~6pN4QLhSF)3J4ON%9ulO$wI7C}!2mxGJT7(u`EGd3ZOcL! zAnT=Nfsklg?^`Cpn+ReETZ;@VV`UepfZ+w75C%mm9H&eMgfiHh!JlPHB|Kh$zpWCT zs{np-v(8Y}U%)%d-Le(Gdi=}BQ}(iCWqYEsecj#;UME?;Em6KLS>BN-@3?e&y}bLp z=2xXvDW@yx+?sH1O*%Ug&W=lw4d?Eg&bl|oFO09wUFyEn8t)v5H;>+Mj@@!ryfOaO z@zv)6p3+PdCU5yb=9-sa^G|{CSBVSu5Fhl*S4&= z;(I;u$!C(2vx&*sxMwat=Z|lnzu^j?O48MuaJ42~I})xPYnlyL7pqEXm%7&UmtKrN z_Eg+GvElOEujh&?UOoPY$3Kn`KKp}yb-zpV6PLMviy;r?(_v#Eh+`-p+ZhRkj?vSc z5(rWPG7>2;l|9Iu64I8AQC>M24QI!oSWW>+OXWPO4sAs3VgIrRrkVSM1EbCy7|lv8 z!@V8|UX&27TbtH1_KHchB>pOGlJ?bHS}$@{V{U`E=|!CTd?dKyhv*R}j^SB40OGbT zXR5n7RA`$D>54Ad7%Vv>HS9x*oCWqjX^Bx78bq<~D;=<~gMBT1?9O8GH zi*=K#)!myMg=@}_Sh%^xs4H4+UX5JpTYd4{9rrmrik(t_v-rtQLX3Cm1s)~p@aQ4( zFiabvVl*;=g$aTUv&W2|VcOEA_lRN)D-(@ar=jX#y{dLJ z5;l7EiU?Xp>=V>if%EDn6kv{5)iVU5L#ITjOcWP1fk%(lquU{~0;oqbUf{fj?5I5u z@MF}Nw4Og^{V0_;K2RPl_5h{s$;{t`0-+;8>97g2QBg1iJWBbHXvidrS2h^%sCs@E zGimmkTQgOC)f_iPlmK%RwNfk_dJK#lGkW&+Fe%v51|nBTLPq+Fa1^oIH0Bt2Qd^*;PC;-V6;-*Jp7<3lA6w*CDx^~F zeGC5CQ@qHy_3&ep?qcYtmY|J|2wz5P0zq|w7LUpKgfl=Z!4M?Q0-cn!o|J#U4A2zJ zh{r|)d39Ph3!=_1e1YoDk$0Lr#>O$?$trSi@?jHRp?tZ&v^nS9&FDgiiaHr1UR#Vg zW;0q-yt^nwv@ZA}GCU9hXpoT`;00wTN>$3Cai2XkBdLOoqqzBknLV2>^~CGD*By@`F(bHn?t6Q$OeA&>CAJJD97Eakh3{2f z=}hbzOl%oUI0o;UbbQf$GiNV(W%kSdO$%qM-7JE9M-

SnEEhu8Y_2Sg+o>wkuKH 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 delta 2750 zcmaJ@Yitx%6yCeDJKeHX}&x z70Sjm@fFc}jRIoinTSeIH!;Q_G2xf+gBnZ-llV3<{?HKdm&V6AcaW6^-5=kcd(XM& zeb1e9U$Z~IWX0Eui>G<;x9O3!18ozaFXzT38+{NtCuqif4Nj)FwjPtD3xtvWREU2Y2+d_;kL3y+7USl-lZu z*_$*C8_aZC13u}k;APT5|8=s<$Gu&Ve$DQ+k^@>QgZ$pK+25}LM3Fn4Pf9f`ocl%k zg5lq!{|sYMo-K&52!E}hfmQR11#4ND7YAY`j!%Vt%aMn6(SNQf&?wDZh&o^qK?6Y} z!D7BU*dZ%K*7Hw;vBo%&3kYs2jtr{+L2-W&;T1)#te)RjbQoRwspvZ|YvP}kR_>c> zhcq@5v>=Rz6?MqYsA=8OHLzDG?S`$vPBooYU^();p%pP+0C{h2qtEf#sx@@0J9x|q zW=2wcAheKe;;)3Rpj$@SINQ*KEVvtCgX=<}q8WCd28P`o_klv(dV&=Ms}SPeym`xu z8;XMAE-zokc5|crG1Pmh{J6JYIJTG$EhC^9<9^4hr`%Le;Yh-gQ>a^Jp9#aN?f7+D z8@AAee5`9xha=f~%JLyanMT7`D_Yrex$;>Ty${@KvdgvU`yYGIL9VrvYtj@umgJg1 z3r&&5>~yX#a@iZ2L-KP83JF&7_E>BUIq1ll5nCVDAVCZNfSCcyDFkg;)s2(}PQkEl zWNgiX`;mWZY52+5Qg)7Cjh)6Gt*H&?j#Tw{mkLXic&7kc)zFQ8s1vG_X-x&FC0gzt z08LFfzFx=}P{SA0RL)t64A(=d72JtnF$7E%t&<2&jBn|wlr38Y`*Z$O%|R?#O>Mxt z{-#ZMlw^fH$hDMHwA{wzkTbYp8PqdrB=Snf^C z-&xUT)B|xQ(hM#9=lFQN=w6Ww5s<7~y%dvMK$LcSyn`Q{7hO+H?nssmc!#i>j^9da z+DP2*HiyWqm;s^_nP&M>p8D`cc2zp=W`If}=PKr(kQPvXz;1$3f+q;}AWS_yhI@P@ z6nUv3$ZB~}gMxKg*f2{DO+B0IUe?N($@e!`$nM?bZ#7r5F@B+WUQk4OqdWgBwr*)=k3-;6lVA!r{X$>)DcAu4OF5%-oWD*RbHLbnpPd zA-<>mlk#yS^##~mqq1VC$pHnn^35GtwvtbFR4#uWxlTYdSub8^35S?FNQ8s;lA31; zUM9#Ayg;ymD;wk6ME{lI+VyUy2G7vKuUm#`!+xTRZPQlMSW0{}QWo3{(+SWEvO`S{ z!P6)gFLtAT5ox@yM>jskCb+k=mhIyE`zr8-Sk<|VK@K{DLG~mcdvK#H!aT$;J=j+F z8XYnbGSsC?-}$qkv_U30q=C}yrs6Pf*><=5Itd=+d$+CLCz|9bTGN?-%}(+LP7sI; zP=4GDWQh`K5E-}`37keoTz38ckc8YIh&n?+<+Ef2w`}5u^VXg=_I+-w=iNf~25(5N zmJgBW0S?InRi{`N-VO30?sdG28iktt44;?kVO@MYRmZmSQ>iWNDE~dRlpWy>+Kzpc zg|2uMLZmH!cSNA2v_}OJ8HZy;iQtbDl_e0-zDd+c0+ELN#iT}Xq_k$ZX%Njpxo{*L zoA3@&t!{zoe!9(kqpVrl$fsojmrjrxdZ*SqXzsA!3~%qNW-oEQukL2aPxd{`s&lO0 zmYT(25(B-CG${l$?L^)1@!5)WR~Np7UHF4@xWeae34eRAU7kl`Hves~>Vefn77(l> zSWgfj=p>*a0hD1L54Uq08(J z!J$oO8h#ojheXgnR^bK~dJzdP;Rl8fcUBO2t1hREzNj!s`L8Otf?_-IO}C~Yk@fsq z;whRr>6;-Oh}Vf%2QoZsOzbPk*m~Mpgp<_9x51}S!@sKeZm_~$cEI5gGoz^Y+0L|=h-!8dpU2aw0g^7qX7a?4kqd#=g+2Q%TL G#QY6L_I%y| diff --git a/backend/utils/__pycache__/security_suite.cpython-313.pyc b/backend/utils/__pycache__/security_suite.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aea0157f7da4c8c91dd53c67bc02c85e99c76297 GIT binary patch literal 6868 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 HF^T#g&k`_r literal 0 HcmV?d00001 diff --git a/backend/utils/__pycache__/utilities_collection.cpython-313.pyc b/backend/utils/__pycache__/utilities_collection.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7c7e65261021c0683e19df7ece499b9a5691ce5d GIT binary patch literal 12043 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 literal 0 HcmV?d00001 diff --git a/backend/utils/data_management.py b/backend/utils/data_management.py index 787e3b92f..4133e24bc 100644 --- a/backend/utils/data_management.py +++ b/backend/utils/data_management.py @@ -329,6 +329,22 @@ def save_avatar_file(file, user_id: int) -> Optional[Tuple[str, str, Dict]]: """Speichert eine Avatar-Datei""" return file_manager.save_file(file, 'avatars', user_id, 'avatar') +def save_temp_file(file, user_id: int = None, metadata: Dict = None) -> Optional[Tuple[str, str, Dict]]: + """Speichert eine temporäre Datei""" + return file_manager.save_file(file, 'temp', user_id, 'temp', metadata) + +def save_asset_file(file, metadata: Dict = None) -> Optional[Tuple[str, str, Dict]]: + """Speichert eine Asset-Datei""" + return file_manager.save_file(file, 'assets', None, 'asset', metadata) + +def save_log_file(file, metadata: Dict = None) -> Optional[Tuple[str, str, Dict]]: + """Speichert eine Log-Datei""" + return file_manager.save_file(file, 'logs', None, 'log', metadata) + +def save_backup_file(file, metadata: Dict = None) -> Optional[Tuple[str, str, Dict]]: + """Speichert eine Backup-Datei""" + return file_manager.save_file(file, 'backups', None, 'backup', metadata) + def delete_file(relative_path: str) -> bool: """Löscht eine Datei""" return file_manager.delete_file(relative_path) diff --git a/backend/utils/job_queue_system.py b/backend/utils/job_queue_system.py index e928c6d8e..cae217db1 100644 --- a/backend/utils/job_queue_system.py +++ b/backend/utils/job_queue_system.py @@ -20,6 +20,7 @@ import queue from datetime import datetime, timedelta from typing import Dict, List, Any, Optional, Callable from dataclasses import dataclass +from enum import Enum from utils.logging_config import get_logger from utils.hardware_integration import tapo_controller @@ -27,6 +28,23 @@ from utils.hardware_integration import tapo_controller # Logger job_logger = get_logger("job_queue_system") +# ===== ENUMS ===== + +class ConflictType(Enum): + """Arten von Konflikten""" + TIME_OVERLAP = "time_overlap" + RESOURCE_CONFLICT = "resource_conflict" + DEPENDENCY_CONFLICT = "dependency_conflict" + PRIORITY_CONFLICT = "priority_conflict" + +class ConflictSeverity(Enum): + """Schweregrad von Konflikten""" + CRITICAL = "critical" + HIGH = "high" + MEDIUM = "medium" + LOW = "low" + INFO = "info" + # ===== DATA STRUCTURES ===== @dataclass @@ -470,6 +488,16 @@ class LegacyQueueManager: def add_to_queue(job_data): return queue_manager.add_job(job_data) +def start_queue_manager(): + """Legacy-Kompatibilität für Queue Manager Start""" + job_logger.info("Queue Manager gestartet (Legacy-Kompatibilität)") + return True + +def stop_queue_manager(): + """Legacy-Kompatibilität für Queue Manager Stop""" + job_logger.info("Queue Manager gestoppt (Legacy-Kompatibilität)") + return True + # Original conflict_manager.py compatibility class LegacyConflictManager: @staticmethod diff --git a/backend/utils/security_suite.py b/backend/utils/security_suite.py index 43f2a2268..5869410f7 100644 --- a/backend/utils/security_suite.py +++ b/backend/utils/security_suite.py @@ -33,6 +33,9 @@ class Permission(Enum): LOGIN = "login" VIEW_DASHBOARD = "view_dashboard" VIEW_PRINTERS = "view_printers" + CONTROL_PRINTER = "control_printer" + START_JOBS = "start_jobs" + APPROVE_JOBS = "approve_jobs" ADMIN = "admin" class Role(Enum):