From d619283d0932685ee2411c33672b83c928054123 Mon Sep 17 00:00:00 2001 From: Kobe Date: Fri, 6 Jun 2025 10:12:46 +0200 Subject: [PATCH] docker upload directories fixes --- Dockerfile | 2 +- __pycache__/tasks.cpython-313.pyc | Bin 2147 -> 2158 bytes app.py | 2 +- routes/__pycache__/admin.cpython-313.pyc | Bin 11403 -> 11410 bytes routes/__pycache__/contacts.cpython-313.pyc | Bin 24394 -> 24278 bytes routes/__pycache__/main.cpython-313.pyc | Bin 77952 -> 77824 bytes routes/__pycache__/room_files.cpython-313.pyc | Bin 48568 -> 49622 bytes routes/__pycache__/rooms.cpython-313.pyc | Bin 21105 -> 21113 bytes routes/admin.py | 6 ++-- routes/contacts.py | 2 +- routes/main.py | 2 +- routes/room_files.py | 32 +++++++++++++---- routes/rooms.py | 2 +- static/js/rooms/viewManager.js | 33 ++++++++++++++---- sync_room_files.py | 2 +- tasks.py | 2 +- 16 files changed, 62 insertions(+), 23 deletions(-) diff --git a/Dockerfile b/Dockerfile index 2912ce4..b90e9b9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -22,7 +22,7 @@ RUN pip install --no-cache-dir -r requirements.txt COPY . . # Create necessary directories and set permissions -RUN mkdir -p /app/uploads/rooms /app/static/uploads && \ +RUN mkdir -p /app/uploads/rooms /app/uploads/profile_pics /app/static/uploads && \ chown -R celery:celery /app && \ chmod -R 755 /app/uploads diff --git a/__pycache__/tasks.cpython-313.pyc b/__pycache__/tasks.cpython-313.pyc index 0c5c467b86e5753f2d731560440d526260d829e9..a367d139ecb50ce02e3a10ff30a6d55fa90da5b1 100644 GIT binary patch delta 88 zcmaDX@J@jDGcPX}0}w1);FRICk@qzVuaJIXL4kg0K~8>RO7Z4@EX9nB5tED9>Xa{N s+U_YnU~=5%pv`6bfD1uk*Mp)j21Q?pO}rkPb}=^XvP}ABe)bSX0Enm}IsgCw delta 77 zcmaDS@K}KNGcPX}0}!0GGs>{u$orawjaxq@u_SRbD{C<$W60!6wmSJ0vU`|!xa{}Y h>2uk_^MuKH%afKD!lJH+#a|4IzbuomS&BV`5dht28>RpN diff --git a/app.py b/app.py index 5ffd1a1..516d599 100644 --- a/app.py +++ b/app.py @@ -136,7 +136,7 @@ app = create_app() @app.route('/uploads/profile_pics/') def profile_pic(filename): - return send_from_directory(os.path.join(os.getcwd(), 'uploads', 'profile_pics'), filename) + return send_from_directory('/app/uploads/profile_pics', filename) if __name__ == '__main__': app.run(debug=True) \ No newline at end of file diff --git a/routes/__pycache__/admin.cpython-313.pyc b/routes/__pycache__/admin.cpython-313.pyc index 3304fd8105c4b44285467e31411d15c88924d941..8037f5b2fdfe165542baa3be38beb5b6f6c563bf 100644 GIT binary patch delta 62 zcmeB=TRm`jm<$k4gx@G OvdnreAmyy?!3qFxiW4vZ delta 55 zcmbOf*&WIInU|M~0SK0-IA)yO$Xm(D#;u={SdzGTGUrhyM#asMJPratYL?7;E+FNl H?!gKG&Fl~Y diff --git a/routes/__pycache__/contacts.cpython-313.pyc b/routes/__pycache__/contacts.cpython-313.pyc index 21bd10c532562544f46372f75274b411cae0be9a..efe899d2aa534bde4bb0dd0cd079d1aeaf8d3228 100644 GIT binary patch delta 2926 zcmai0S!`5Q7@phdOsC6qTDnfxX-f;Y3k6$NftIBOB5Mcj!j$3Kxt&frGk5s!9hM3d zB@$6wnnM61#02yKfHCF~;zS`fB3&&TVJXriOX=a?byq_4~j7 z-1*^K>G1=}{kPklXXC#sH?~fknsIxj{+VUJx%?h#4%7_nX3xq>I`)B|{|hv)maNF~ zSt7K=X5%yVGhbC{VTShE0!vv#Wof0qsLHl_b}Y5}i>qwZ7Faqk%w|eTJWJ+Q3*-jM z{Uz+ztZGNc99vxKFY}joX89}DX9>Pi@GH{1cL84|_|7z6y@0O~{K`4rQ_EME(yP}A zc2%0KpU3(*TQ6CsZkWe3ig{h(T)8RroqeC=neuiji9}~I5!IBC-kI__HcC=sYSejK zlIobt)mGia^`Hh0W}y;_MdCqHk0v9ehDc_6U87P{>W=HaLuzN^g}Wq~-7D0cEts;5 z$)3L9b~HBtRsvoCbOE+-F!Oa)p|Odep;C-CA-s`;j$HfFKWlUMm=-sbF+&eVBf3Ec zQr~+Dv-swZi>Gob#D)WyzaHS{a7&_o7WTGF&FqqQzqE?|;r&=@U~g89ZC;Bp>o~}H zv<>Y(KtBi5k(kipD(ygErwGI~L)FQ;5u%4#OZA`=gQ<(1tG>BPMzaXu28es*jz^;W zPQh1CnvO9o88^rU?kJ#(4c64vS-Xu#h~Fg#;cO13gU{o;^)Oa*yiA;G0$lny6k+wX zojdCh#K}$Pm==pg400giV@`mYVG>17%74(H7hHpP< zVv7;PCppMYN}w%-TX3lsPV}4kI9@QB2q}gt=PXDJEiwh}iH?gI`G$JSMH)6purFI* zatfu1Ioq11lZYMzz#wwnf?UyYP$vLW033!+0w6~wH_tiHTNoVSU=~2Igre)mH44!M zFNgxb+klIJQb0X>*jBO*2bHrk>7oz8eZ)bBBajX&4+SdMHJF&y^?ItHz17YWv9{Ay zR3;K3?4Pzat!D>&UX+sTgPz)H;TI&HIsgoi$ylz)*vnk~xq}2S0OqmEX%MX;!1FSR z%I-Hk%9t?yY%)Wvy?0aVVu=?I0q!bin>jI6*OjnJR~YMUS%F-dxw;w;aZ^M>WMKPC z2o_kckYyCQj5x7BdwtW$vD{6f9@C|mNw1j~R*j%W!S0pamIqvzE1V);0g*zHc~Na~1@H)G`#k(Vudr|D^awUt3g@HcO!IB_3Agxu*#H6~I-tZ9v{G97Vi8gc&DVjKbH*#UKYh(%!Mox%v~W182KlEoa!jQMe8f$N zutZ|Nc*<^W^W);%4?eV)hdK2WDUc=8F`*?%m+hpn>Y?EgxMiwDNg5L?bk#^E((m6v zIg1{0(##F2C-@gJu0*+4;414q6_Uizg|W;$Yj!jepA;seOYG;N#;T0BEHyFyK7d%> z@S2A73om;Y73~O9hAS;EWgO(i{ES}jpj!sW2M9^U;rh@Oc5|X7RKJK;x{zhZLYc*l z`PT_b7}}&7*B!Rp*>5W~FlnShdX(~xkmPLQE6Lq#=FsQT8P*$Uavs6b=U61*b55gq zn_UYu3^t-Eb1)sGCAp3V5SRg62iyg~zaoG12(9G+tZ#ikTpMFrC>d2Z(-R)!8Mf&a StaNm*)RvkW{ZY!s$o~K@c#q%! delta 2993 zcmah~X>3$g6rRU)X1YzMw4JuojVT4;wX_9k*`*!UvI-rx(katn=CvI=OMBiM3RNhG z5+iQS4SSRzM#TjsV-yt?;}4^lU}8ez(?9$$#$OuCZ{z*$YiDdz!~5~&-gEA`%XhwW z-n}oR@4uAnV|IJCiGRP{_4J(?wY#K?qx0@(_$t~rvn$R*wzR1blkIGWRKyzhWEOZG z-uz}WB1|TlKe4XfYgqn^zWL3PF`qwf4i%V8JYpB$%;`vZ-6r3h_C4%=aZz!Zsd;=U zE$|kUnW&z-x|pZ1&`~(CnJ>#%>@8xqrE*K-gm`C4l;cf2ClIJAJ{J4~( z+Y$qjcp#+exyc_hR!P#Fq}}?CB)Qp5TV45F&IQ$Q(DMSJXgKC4WiSyYB}8@XA6u6+ zH|fj#)FL&o;=D~#9qZ0htzepD_H*9)js^@@0UiZ30l+S;<)G)NN`QiWeodh$wZOcZ zg9<6QQ=f6TJs6K^fuN@PBVkn|Z*s_yH-jI3YUZ%5L>#ya@hbtlIb4&djg`0-Nb}e_ z*A8hhJL9@6)v)HW;OgaAvx0-1P3tk<2x#M=TL${#F@-k4uvr*laZORlcoD4K>|WVk zD;85TTU>s1Q5}Z)06RduE2}3Q;cxOEJfd5I@kC6cO!!nlGqY7xRT-!Cgo(e!26F}n z-NNJeX&$z=V#q0O^#pvW>rg+tThZ874I^%@TZ8dvG^~*Y7AprihjwDz1@Lpw?aELR=raWpscWlsea6NxwAQaFP*)}CH zG))N96X_8VIht}UlLm1BF{O5kRWPlwk85j2hG0DmfI#G`DY>E}a18^V0^lTF%(&?g0@V&}Gg(8p+ zBM-R>=hZ(j&gPsHyHnfXqU2qFKJv}q;FXjv%@vDTK#5uulEY}^Pq14w5q zOJr;}XMf@%2e1I*G0Ld}qy2z~WfGOWL3ad#LiFRw46$EZ9;=-$@uCsnt#XELiz=!b z=vC+fTig0b19GWnsY)!wMG+3sAsl}e#$2Nd8A74+uxspGt9t}FmYYb_W2zL>>D9A) z70n+ff78MyLj#$J6-p6ZK%`J)UR2(67e;~&g@~)mmk& zoza`v^DS77dNo|Ux{)xW#6N=9k&f}l0#U^%d{JB)i)?jQpe*I$so8oLyR@wT zyq|7yn9^75TD-S6qWJl*HGD{+ulS0qAfZ5FCmhbJW9@kO1Mk=7;xKppffUG+Zt06B zNR`br$nNaz*blV~7X}hqUxTV>iGfuA+a=GSZ@5#>@+*h=A2Ak)aIHX9Mn4sl#4&}i z^lT$K5{~r?kg}DXkzEg3^4w zh^Z5h0}zyo%L(BLx#9O}ur8Xo4O0}dY?(^4crpJwfe9_%uf$Y~DQo=SN;T|8M~QSN z`CSJ|*13pZ!aSYVrQ__c&Km1M?D{No`P_wQAG(z{t>93IPQv~kYw=a@or7T=oEC~F zIH_J37~nGC1^{9f$)r0N)dFys@iWO>6^(}y5oI;~!fia=CbfZm;@e(YaLzVrJC{3} dd%pd0$Hk6Ioo~w@9{4GLUDDe1gOq^{{spvXs3ZUY diff --git a/routes/__pycache__/main.cpython-313.pyc b/routes/__pycache__/main.cpython-313.pyc index fae39a5e6c4d00d0b756dff1a024b9103d9a0d19..559ffd548262e2a7180692d2fb368a4d10664f25 100644 GIT binary patch delta 5260 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 B$yNXW delta 5259 zcmb7IdvH|M8Q-(nz5B{0K(ZtxA=!`+vI&Hj0ZDi?JczrtgVA=AK#r=ib?KH{XgOAtT-Tboq4vT%2-DFyozr!TjEm`6rOP_hA zU5u`tCVu~vOPs$eLww%g9Obw9?UgCmXEHVC6T^5h@MMN~!dfVPzB)s^X`SeB_?>>& zRI@)-oU`UKw{R1S*|#wWV10u&7is0mMx~Paf(uF zCiBn=mn*$%oGy#5*JSc%iB4O&C%cmAD=Q7kIB`l+a-@FdPn}~LjHk31yP#l$6pW6rVUHDP>70 z<)Xk@o;7*MHvg0yQ{}|~wRpr~YnG>Ch?WqAsbagc+%qi+Wx6;hDKnB#W(v2f+;dG5 zN~O3-QfB#QUlzG*#db-VlVneoI4CLANhouLJGI<1F9~J7xG6Quvf$==lc;$rGk$++ z%5s-xYin%^2O1(;YW(q)Rq54*>p8;&mgGkWF zJ0VJ((kn~H;!%`WBmNd~M@J#sD>ij3A5{%g=K(0=>EgqVJmnb7sS@9GOjGm-i|L({ zWp`fHIlcq|)~v08wZRD0iAVKx>2j>4)`y#011%ft8pFJqS7Duu((S=?A%J|aic>ptltq}&i(lATWpgFOTP%KY z-ITjP`w3tbpboGa5CE(JK*gpa|4p^Gh{4_Y`4tq%uiedoP)mjMB^qj38{u;#laKM) zBCD&)Me)$fOx)E~RCpTkF|zj$OwYhCvu^)jd}r7Bl$r$Fpce+oXhoX%u#s9yv?-Ec zG~YER;UY(H05vx|Tq5kRO2| z?@8z~^T#mm6{mNXv3(+aPdN5I7U&=v5z4^Y5!n zF)X7};e&EDVv*pLKVBLCc29;yi9*AEF?R1FY1NPSPF3pRRhsJcu$;=Pu!b~~KJ!H_ z@soRf&LO$(1Ctj)qNd2;M?>}eRjFTd4;8JsfRJjfHcbA7EDzDU5dE(sSooc$HV7N zh>#H+D};>&WQhfzX1S<4leY^+;8U-Hp_VH~cYET${PaQFYKpfP{DlA`5Er1_kb9Lu z=X)T<2zj1}ohzB$D`m-oA~Vv#0IPg?JQX?~0MJWdl%z*8rn2 zy#~3YC^f+g!-0grfRpa{?jc)r)9#Sd2yBvFYv>n$`rlc~CAZfr|GAyziBacs#z3X! zq#i7<*_Np6xpU9YESUhQMn3(p6NYKdP$bkMyHiVjke?Ad&QGtrq9boe89u9K4{nfh z@oa%@`s1)C{>^#SHjfgw5VDiyjDekU)&Q290cNbx`)!Zf%UDesbwS0yF%k_nbGw>v zW-FE7fGINXh7{GfWu$tq%$I4Z(**hCMBVYaJj$G1cN@I9qJ zH7xujgbe`b(jRd-$}O6Q?w9UuE_SOuPzg@T?kqXdud}uYAMswN!Y0Wk@Lzg7W$QaF zSA9%#@L+wYH6)8jK9Y!?F?D_>%gr^a0ll%7Uk}^$4yi^nnKzd3*n|cM)V~)D)eEsk zuRQcTdY;NBqtV`Luu6UM{}M)z6gxypqvumCCN@&_1`nI1_l2cUKmi!hQ^&y@YOKkc z=tNM5&6Fl5bB@GP*Fd#uN_|^2+}Jqu2A3ZSoLZR?19J2>abahkjkvTNwAt?EW0}*s zgc9n7xrOk{tiP*JF!FPjI@{ktG|G)k`WZCaBIp5uC?8Nea#=wImFf3x(Z7WL1%U(I zpXIXEiS5Gh^#Z~`*<@h7V!Jq_K2pSLGVGE`V^g>p+up^FgX-}jR_r>2aWCMnl&p&% zBWh(ao9rUDC_6oBQ!&e4ODCQV`Fq&13)0AKGHd{AbdJdUK1`{bI7cRFL^q)ddmrp1 zd$9YnV)mq&Io10ov5DE2KE*U;Z7^DYZv*dFe>;gyiG22UG+00uBI<0X_ndrDrkv3UJmWTTY}v>J;qye06gv%XEGx z33wz%E~w9zvR{n0=Hn`%qm_ z!ER++)%FTjQihhweQ*Tv*3ufA0+ID~_eL8l>La{Se^vB=XTADS1*`IX0@fG+y7^*^ at_9%#1I<3SIo#0J6r9h~)x}fU>;D4-aHYur diff --git a/routes/__pycache__/room_files.cpython-313.pyc b/routes/__pycache__/room_files.cpython-313.pyc index 6167f99871ab08d916a170ca217f902d2d6c6983..1bc2819f2a747b1c3a254e79a697d9c30ebb33f4 100644 GIT binary patch delta 2639 zcmZ`)dr(x@89(Rl?!9;SUKZG09t$iiWO=Mw#DMaCSwSQs;vF6tYzQn5sS8^#Of|+t z)3mADsK}QXw0{6?rh!Jw~^r-k~Ut6YE~vx%~zybOe@^FTio5lUDwORPd4 zwXFzxUyo1|VJvjV#p4pFjWI%xT?f|^M4ShAPLb=WrAbL=4<`)Qh*ei$a)ig7((f>?_|KZY7;-rI$SL+&F!##)gC+s z@2<+gbxOduCb2S`7{lXn2u^jeff%8-E*Qv(R!*mmV`LE?nQ}Eum`uE+&8R}C z_73zM4uy_=T1^URQ6&5+-vWPr!3aM)Y=-s8MsN=ZSPl8fCUvW(+5mS23;6%agblE@ zCISvLafG5Kcb+mD$~Af<>5`eXBrsiT88~ALgN_5*K(?GUqM~$!S~*E5=bXW$$#Il0 zdsPusq(s4Bo-T~=A{Ke5BoiS4SrIW&`%KhdF`+`A31kmj;ctV+&L0XwzR!&$!qWv- zwd7Zw2uVZHohdA-h_qm_6A6-jp%WsxHR^3khvlc%kWUS|S6$JBV7M3HMK zJVoJY3LON9RkO3bL6#kKqjom$Y>BaJ(j*&cU01(xMo(P3fKLYMS}j&V?T-Ya7Y_Et3yGygBz}eM;+Yo^5&Vy72U3r zE<%>hM8D2BY9_luH+S+YGqi+`4ZHT70-=jefd#$Tz}bY5g{ zQ-gm&M8)eG`2%Vzs&x2MU>!UC z?i2a6X1Cl-Zp#1QdB+Oufqq9g^D%;V9QD|ytgN5q@NI~49>+If$a$W9f+3Fn0!j5r z${Q^KT3>O$`~K%a-;{O|+}~{q`hw;I6qetsxypDb-XoH*m3#Ja`>694+QMwOHeyzi zo_Sx*(zBCqL*Vnn+yyEhMMRzmr;ivE-TpHysl?tN57&Q`YZxb*cFxMYk*Q^GP!G3&?^#7O z*7j848*sEI9^Zmt?X*vOP5d*@Un9Y45i>FfBUK({(V(k`D0(WttZ zWVWz4RGUO5qEKDp<47T}btpKLjM32QQXjKi@C_Ak4+oc%a3>IwOszt`(1;sRwkirW z;z#^$dBm^z>)h$l(yWHe;TSA^DRGSy_AqfNJcVgvq87v2z7pPUf&0S`yodb(JW!(d zUnl9yBLw!E3S`+OTNg%Cb8C~8OtuE=UM9o3H_R*X{$=e{=Gal&+SJfSWWj~CM6cf3 z?($kTEZDU*-y=^!9wmP5E4(vc2Mxqh5GXWL=t9tXmR~sE7&v)0S6KG&;MUo!=sK!J zFWfXQyPVFtTE|Yi_@%42X2dSiG2wfO&^VGPY$w5I=}ik)LHEcPDw{S4dd|%U^T^Nt zSn;9a_e9HtXz8k(5~Dv9gP{A@PwxLLNbu9&O-25Zo+_--%xSKsrrzbKshQR^DknzGn5DmqJPRXlt;5^l zKW~NMX5fBv(_DdZ9wz-{0w@$>k9vXQ`5xf6OM+5y+>)$}$jII!D~`7_nXqkmnXDM! LRa1t%okaORX=m^J delta 1929 zcmZ`(drVVT7{8~F+sCDa(pFlav>=sM6mU$OY_2Vdpj2SmfoR=Gl~&oH#Y+=sbxz_E zaoHmCTjC=#I&pJGoXQPaodex;I?WIw8A;~=-9yxb@S1V5#hud%!^E9Ge)oLO-}imz zocq%@esG*8AC<|Z6khL(tm_7MpOXJ*;Qb+nuDk%ZJh_RF%3wUz3&|!uoNQ6T)-oyW zpuCb&9wcv2fiGVQ9~otEu0RRLje3*|>y1j8q&kTtB&(ExF0G0wl~fzTGDSgAnO=kC z=}%?KxoBdytPpI|RnS)<7GQ@NpevXGCt6gPlz~r8Q78|NnvyYIH<>XLaw&z3Lz6*6 zaaj_in~hHkWWZ~dLql3>q#6{ifcQi`j|mb?YbFDqPZIMy63%OO@kI0*UrkMwA3D+t z!7%F`bOH9x$`!MGirPwz(Yuo3q2DU!__GhAm|J4$PU#M5k67C!)^>{%xFZ=UV$=rL za(pP3%bj-*@#6V->^2ByeF!7-x5YRlrGjeN#BiL6ut1$C$Euh~RSKN^BoR)qQleH) zs!h<9p9srWhbJe?oX|U@IETxWNXsb)gSW%0acnlj7c6^`99#H{hss3dmQ$1~3Ll;T zY_F)KCCDLj$TR401v*jme7=ElKEsiqo#en(XQ8<$BBxSj1=wDF0(OfXC4wbA9vnF; zxNK3)-G)6_a_?A7MzOsFR0O`m5Rz89tKEKgWrfSnMicFM0&O5~*6D@p8X{~UP($E* z0@pFr2{FKat47+7H~F}Tx;fBp{eT;>wTi?c+T*LPbhBLZ;u1t(z#i&VVuHp ziHL1rwi^w1$u^w+GTB|h5Mm-(Dr#N+b>Ok5;4|N0&lV11o1eRA=ga6j#P?UYR(_Zt zLPn@tkwy;@)iB)N9tUSuXeY$n^i=f#vFszTnZUaQ?m_g*w_wfmRuAC1Fnz6;30 zDQXu=Ci+~p@zMWwkp+7LD$QS{Kp-&XEU`G*#XvxY?!&{tW>GBcPk z6w%Z8ICv4<@MLoK#!VvJ$(7v?L{_5x9l>DJan7^%WeFX=hkbD5&@AlHeW)Du!tACr z)CZ+ayU==Wps7z3p~QxvV>NzHjC?)FLoMLzDGxHo!`jnNBJ&!7>NCkN{DPCQtr!B)3t8638p4mN z%DdJOh&FgwUyY&8?_*tS-MI!fh~3O47&?<0ZZ8Gq1ue`tNf3T)e?xunmB@sno|$lO z(5!es+=S#J(HKI=4IkU%AoFZ2^EtAnq0u+qig-zf+ldlQDJ* zjE}~msTl1jg>dd$QHsWrgLy{^J}Wpl|I3n~EtuUIYw3xyc12mohxo+haUJn xfqXP12y2E|(6<+AYPwoZ0 TYl=6RudcZ)Y_nO}JB%Fw-;)=Y diff --git a/routes/admin.py b/routes/admin.py index 7f34e49..2233d75 100644 --- a/routes/admin.py +++ b/routes/admin.py @@ -13,7 +13,7 @@ def sync_files(): return jsonify({'error': 'Unauthorized'}), 403 try: - DATA_ROOT = '/data/rooms' + DATA_ROOT = '/app/uploads/rooms' admin_user = User.query.filter_by(is_admin=True).first() if not admin_user: return jsonify({'error': 'No admin user found'}), 500 @@ -73,7 +73,7 @@ def verify_db_state(): return jsonify({'error': 'Unauthorized'}), 403 try: - DATA_ROOT = '/data/rooms' + DATA_ROOT = '/app/uploads/rooms' verification_results = { 'rooms_checked': 0, 'files_in_db_not_fs': [], @@ -208,7 +208,7 @@ def cleanup_orphaned_records(): return jsonify({'error': 'Unauthorized'}), 403 try: - DATA_ROOT = '/data/rooms' + DATA_ROOT = '/app/uploads/rooms' rooms = Room.query.all() cleaned_records = [] diff --git a/routes/contacts.py b/routes/contacts.py index 6403e64..aa0d92b 100644 --- a/routes/contacts.py +++ b/routes/contacts.py @@ -15,7 +15,7 @@ import string contacts_bp = Blueprint('contacts', __name__, url_prefix='/contacts') -UPLOAD_FOLDER = os.path.join(os.getcwd(), 'uploads', 'profile_pics') +UPLOAD_FOLDER = '/app/uploads/profile_pics' if not os.path.exists(UPLOAD_FOLDER): os.makedirs(UPLOAD_FOLDER) diff --git a/routes/main.py b/routes/main.py index 8d3390b..be016a9 100644 --- a/routes/main.py +++ b/routes/main.py @@ -332,7 +332,7 @@ def init_routes(main_bp): is_admin=current_user.is_admin ) - UPLOAD_FOLDER = os.path.join(os.getcwd(), 'uploads', 'profile_pics') + UPLOAD_FOLDER = '/app/uploads/profile_pics' if not os.path.exists(UPLOAD_FOLDER): os.makedirs(UPLOAD_FOLDER) diff --git a/routes/room_files.py b/routes/room_files.py index 287bb91..32a29d6 100644 --- a/routes/room_files.py +++ b/routes/room_files.py @@ -217,7 +217,6 @@ def upload_room_file(room_id): # If we are overwriting, delete the trashed file record db.session.delete(trashed_file) - db.session.commit() existing_file = None file.save(file_path) @@ -347,6 +346,19 @@ def delete_file(room_id, filename): if not rf: return jsonify({'error': 'File not found'}), 404 + # If it's a folder, mark all contained items as deleted + if rf.type == 'folder': + folder_path = os.path.join(rf.path, rf.name) if rf.path else rf.name + contained_items = RoomFile.query.filter( + RoomFile.room_id == room_id, + RoomFile.path.like(f"{folder_path}%") + ).all() + + for item in contained_items: + item.deleted = True + item.deleted_by = current_user.id + item.deleted_at = datetime.utcnow() + # Mark as deleted and record who deleted it and when rf.deleted = True rf.deleted_by = current_user.id @@ -1052,6 +1064,9 @@ def delete_permanent(room_id): for item in contained_items: db.session.delete(item) + + # Delete the database record + db.session.delete(rf) log_event( event_type='file_delete_permanent', @@ -1066,10 +1081,15 @@ def delete_permanent(room_id): user_id=current_user.id ) except Exception as e: - print(f"Error deleting {rf.type} from storage: {e}") - - # Delete the database record - db.session.delete(rf) + print(f"Error deleting file {rf.name}: {str(e)}") + continue + + # Commit all changes + try: + db.session.commit() + except Exception as e: + print(f"Error committing changes: {str(e)}") + db.session.rollback() + return jsonify({'error': 'Failed to delete files'}), 500 - db.session.commit() return jsonify({'success': True}) \ No newline at end of file diff --git a/routes/rooms.py b/routes/rooms.py index b3ea612..75312c8 100644 --- a/routes/rooms.py +++ b/routes/rooms.py @@ -346,7 +346,7 @@ def delete_room(room_id): print(f"Attempting to delete room {room_id} ({room_name})") # Delete physical files - room_dir = os.path.join('/data/rooms', str(room_id)) + room_dir = os.path.join('/app/uploads/rooms', str(room_id)) if os.path.exists(room_dir): shutil.rmtree(room_dir) print(f"Deleted room directory: {room_dir}") diff --git a/static/js/rooms/viewManager.js b/static/js/rooms/viewManager.js index c56df66..4308b91 100644 --- a/static/js/rooms/viewManager.js +++ b/static/js/rooms/viewManager.js @@ -348,13 +348,32 @@ export class ViewManager { renderFileActions(file, index) { const actions = []; - // Add details button - actions.push(` - - `); + // Check if file can be previewed + const extension = file.name.split('.').pop().toLowerCase(); + const previewableExtensions = [ + 'pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', + 'txt', 'md', 'csv', 'py', 'js', 'html', 'css', 'json', 'xml', 'sql', 'sh', 'bat', + 'jpg', 'jpeg', 'png', 'gif', 'bmp', 'svg', 'webp', 'tiff', + 'mp3', 'mp4', 'webm', 'avi', 'mov', 'wmv', 'flv', 'mkv' + ]; + + if (previewableExtensions.includes(extension)) { + // Add preview button for previewable files + actions.push(` + + `); + } else { + // Add details button for non-previewable files + actions.push(` + + `); + } // Add download button if user has permission if (this.roomManager.canDownload) { diff --git a/sync_room_files.py b/sync_room_files.py index 3f08036..a9c2d50 100644 --- a/sync_room_files.py +++ b/sync_room_files.py @@ -3,7 +3,7 @@ from datetime import datetime from app import create_app from models import db, Room, RoomFile, User -DATA_ROOT = '/data/rooms' +DATA_ROOT = '/app/uploads/rooms' app = create_app() diff --git a/tasks.py b/tasks.py index 9149741..a29d5bf 100644 --- a/tasks.py +++ b/tasks.py @@ -20,7 +20,7 @@ def cleanup_trash(): try: # Delete the file from storage if it's a file if file.type == 'file': - file_path = os.path.join('/data/rooms', str(file.room_id), file.path, file.name) + file_path = os.path.join('/app/uploads/rooms', str(file.room_id), file.path, file.name) if os.path.exists(file_path): os.remove(file_path)