From f3a59ac778fa03a1d1750be814b9c5665c66763a Mon Sep 17 00:00:00 2001 From: Melchior Reimers Date: Tue, 27 Jan 2026 13:08:14 +0100 Subject: [PATCH] updated dashboard --- dashboard/__pycache__/server.cpython-313.pyc | Bin 0 -> 23990 bytes .../__pycache__/worker.cpython-313.pyc | Bin 0 -> 36468 bytes src/analytics/worker.py | 19 ++++++++++++++---- 3 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 dashboard/__pycache__/server.cpython-313.pyc create mode 100644 src/analytics/__pycache__/worker.cpython-313.pyc diff --git a/dashboard/__pycache__/server.cpython-313.pyc b/dashboard/__pycache__/server.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b0984a863c969197e11559a95af7eeb287cad131 GIT binary patch literal 23990 zcmd^nX>c6bd06+{_kqFSCeR>p4Ty^bcmO<>;IRUM<*{fE7bIapL!dzn2{f?X1CnUR z5wwzHtdferD9S>Wlr^&KGB!??pemP5sZQKPg#k6Hu^gU^;R>!?kzk+gNpKI#x0ByAgWj=BUFN!!QVf*WA%V;;c+cgL7_ z)F=2x{epiqAOsj{lHN_RPS!O@3&F|Yc(c~Mai6rY?p|8|_Y6Xh0J+D2&{C{-(gCgc zSpOi+2H4=Bl|Z&?<;I;29iWvbHe5#?Pz!{}q-VUtfYMUXW(6BLU{Rih=#Eg8Y*dG; znv7~qCA@&+D*XxYIT@X-8n9fTS-ViZV{27xwcc6{TQgY`pxD}et5C~+j;))lW9ujD z*@j8qq<^w*GB9AV!|?Ebz`^dSqi))6(n15g-Y4)^XOjL+uv5cB=`)O*=rh>Ck6MKNhyVq#tI7njPC}#!6~7?@+T-tJz2? zf9xpR1@r8N{~q}7h5tVI-#1w|;A8ifw7PqTR{OP9*)g06yBBKP*nyJTdv>UOK(GCp ziid+GHCuM5c}TB$j`Vw&tkz&j?baP?4{5bET&Ng1&mK{+a1`zuc8)>%ILs@+zEaYD z+YarY(AsB*p`L|3iS_h7)IQn4o*J5$rWS?djU+E>j|*ICZgEC`oZ}KRoFGch zUXhGL3e9Lu_AV`7pHEIhtL~Ykz)hzXg_XQR0fS5%pICsNdZ!JXP?QxOz6}4LFmTyJ zF+i}dsRRxXN^8h(p$=JR>6qobRA1U%Z<3$k?)J>37Ul&fH1aO>30$ds!~hgI;Wj7q zEUn}{0t|nO)DUU`DhmH%7%oq!RqA7JwOn%`>pdvj4*o_2Vn@B@3($Gz>624&_RM(R zo|suk@_8>jUmRxHH!h5y&fDKy=EM|%8M(k-$~(#P%yr2*mr5-S_4Z2kp~1esJ^~2n zaHf(A+~RU7?-01uvcONPv>7_1C>Q)ALO%JofP!zp*}jIk zx3HEt)kj}*Xt{BkwGP^NOWZP!ZI}F58`-(QFQFVLed$lzb`K{8P2{Ywdt1R1EJw@?WV=kr4a$Sd){_aT;v7ZO?g|2yPL{;IE@I2dFLf{&xXd8rgQ?8w~8qt zW+PK2Q^VdAQk17Ta)cQ82{qWTpNxHq3})uKa1ink8{$vkvPuR*qe%TbNB_;y zKRuZ4*ld-VzWePD4#tv<2rD;cyp11v+cMs^Pbk`c zj{Yc6ziE{R#xjA|WY=pZklu{97eQcH1mxhw4_?0{$1i7Je?z`FArD;11g^@itN*)T zMVL>;CYZ=u!`9(;>PL=dytWV9PdTkW?y5RvvA$=)blx_TNF}CW+4LVCcyj0)A@L0= zPT_*!Zw6$dUif3_9!m@4w*aS*de0>JISy!ca(a$qUR@LxfEjSYGLUv4%f_DMQ+F1H z6vxA^a!xPKFE0Q=cVgcnmlCR=^%yN2f}4m#Q5UFsmNciW(3G~6!clL(llqSw<^;st&oo!HCC${5mtsUdey0jXgRJh3;JUh?fnofibVx)3D z@A4|N>iJyqdWuQhxFK*iVAWF`Gt4LES455h)(y*#T%HpdX<2yhhts#14jy(%is6#H z#Le@ZS{&=~oL^2!DdzT~aGe7_J;!s<(&+?j7bdYRG6`%GL=15Xh`?Nezrjt-03}-K z@koE`!Sjqik(&ov!|2bL2m6bgO2KBF?r4W~Z|@?63W(amQjAH6q`a%B#`NMcpX%r& zrDWd#?Sq_RAaQx2V@XI(b4(}m=5m4uk!6L{xQ!c|D+W&7zM%jU2zZ(zRrOwHg~bI% z*`j*hojE`QgZq^^#_U~=8k$u5Rpyweej=@o7Wi_1&Q z^%VlC=Pn9(IMrM@sN%FhNFmP090dV;|6_|q1s7zaCIQbCyBA;HB?tF1#R*f9oj z{8%X(hPI($`-Hm~ZLBa8WBS4o*wz9HH`0lnMgl9ta0^SRl`dvFF+aUL4|Tl;$rOnF7~WGP}3yzycZ+<>NbQI?K=b4dYdo3ATbBw%)(w+ zlDu`Ei-z*`HNWzS@mw*4wmt`qvK17g|rfbNAlewEM&A&P;XZf12KE`Rk7Fb=)6( za6P;KY_@0gVItde;UibzYu>lLa@FMzToVP0xoIml?NOT!?b?WEgL~F&AA5JF2eRG{ z+1BwJ5$XI}CqpMIXvt6b94JN!Q^f8G?(#-B_A8=`?Xl;|M%`4WY>| zzD?6vu7d)F+yiN6&Z(Vgv|XxFw|J*=4z$6%Yf+YuER)5wIC#XgrSaj?Xf=daq2wm~ ziztoZ;uIW|zjgJ@N8TD0#UGjRfUEpgZ9Ogd2o``iFC>JOB9R6`2ofyN>oyh-N}9&v zffdphEG%42OkGC>>Mc5>W{8%eBMf>_f2>VIs16H4MBKvKkgscbGkw6Saa`m#j*4Q* zkF{&`9(Z>$0Z{z z>?B+&OJA~dSfd=v#{3tqm=xW%Vpvc5=0Dmg5y9*Us)#ouKx;vcx)c;pQhEcV(SXtTF}^D@Y2 z1Ab^T8hZOoA!Lt+*3LZhQM$DBOQ(0;_KxeGYoqqV(4I_a&!%nj%6EggzJaYP-wQsV zGkqr??EA3q%zA3$?7c6h-^^6UHk;qC?s~Xy&G%xU{xu&AqoQV`UJkY9!qpqQk*kkB^*ckJ0_Ajj3Y9LuYxT^t3S;&~@(hvdP8~b-3N1A# z5)In5Mbv+L$xi83R;5V7K{G=O$Uxwx?oChq$RKXio2KA$2)d<`y$b?D^ zq9LLonYfcM4wZiZ|03=!a;_bqC*>*xS-c|)cMBA?LJwQu7Cvct+x|Foam{W>>5q0e zf3fb(>va2oUtJ@fs zy^XT1QB`_|JBB-HDM}8<^s<;*TCXK!ra-K-zo^*t8e zLsB8u3c22iujBFKeG`8|?*56tB=-Otj{Cu;SrHGwH4^v1wUVe7QDPaa>i6=&xLrT6 zzy{dras(l6AIAnue&BQmeBduaT@HzsUP`n?s1dNt@*%b+9xA8wpi+)M7)edP^`hk* zIK{ja12uU)(0~uegKTX)3@~;5)^5Nzj55g9lesjIx$Gk8Mv`vocPlU^g&@c>Z1bRn zuP|9SE40x9(b>&MO!NLTAY`9qh9Hsfq36#JW)@Xu#)tWk;R1?>wNbEph(#CnVm!>Y zkoAgONU*JO8_c^cZe`m^IViNO=YkuaJM?ESkWgI97+K3svX*;ySh;Y~+JMTWtc{L; zAkwAyhq5j*if(f4=@0V3&w$%rGO9i@s(o=Qw6>qL(;tsOdI0xaQELa3m5NvB`w-j( z@rv=FvQx}g_MnD64R+>_;WX+Fxp9;gOMa~G?q{~2q|)=Fotwiuo*4H(p%XJmW-+9l zp(3n5_k4&J6iwTS{!0vjAa27Ml!@qbPrF@fy1K%xs74y>>}p-7}L!pZl#vF`FVz4 z7MR@#w3`8s0)#B2-uoeVJ)kdz7Y#92w5Aj#54;s-T|##q;P5oIH3aBdURqK;ZXFsA zQ+n?rQ$=tsUmRk_7QsH&Epp%mR?HBufo#cv?}ca1sNNNk=~z@_Hew#|7^9Dn6IeJn z#LS95WMzcH806*M#>lJ&lz<-bC+o2E5_6WnotRI~Fbd9km~+6ind=-VFz`P+#0c#G zYk(>E*bXM`)*8~Lza55jD@9RW)3hyJ*ZS0@DQc3(aLX7&29Zghq||_u-pP3+?IJ1_ zYD1+uB<4xA=pDH`1+!i*aR*7eut*tyx#FW(yrR_9`!MN)dR`gHvR!J}$y0O`{YW08 zG*5Ts>2|3Cd}}lM?qEQ@?8wuxPd&;2(Lwa7rHhd~jBc)%9Oy2AJR9DhAQ66-R$T2? z@c9X6AwzMWjOjz&2~C)9xN&yE7(z+S&&3*o2$R?|Zb<2LIUFKPIXq&1SzIy(wh*S+ z^G5L5v>ie_XatqgZo?0UO^{Vbr0SCfJhm30NyoDeqM|#D_aac~E%I2p|I8J)Z^5z~ z&%E6TigamuN};W!qq0bP)5XlfzD57t^#r)6Q;UoeD+Zoj zh-{I@b)1(X8dvmrGy*qac@ofJ?1bkv0Gp%DICyGP%62H3aLl8I%AkcPZx@&5lPS2R zgyfRpeGyI|LQowf)}Oo+;`ex%cdSyt=s*F?{*-VTFK^%lVhAbW3S9C&LcFI`%}ISy z^{0SRrmbb(qvTI5B$o0Xr3Oj+GzjwKT0w6Qc+m6CyHoRt>)d=kpaaY%x%nA^!R}ET z$ousTF%O)Ic=qx^Jx|#rBF0zYf|ULg*Iy+nw#rtX()YG-7wY^B{>4wMigNp_E~>I` z^|gFt5H8VutLGm({aI(T8fF%D>vkcIe8$N z3EY%jH^HCf3anRUoz;-4?#b1+=4xA?I&D>+HBZ4u)$Ykv);+ab$)iVk%vJ6OfEo`N zoqSYfVLH=FL$a&#!;8(KT_ z*yUdz+PJZCC4GIfQSLZ=-}B(mgV@7^^7t3z*AsGrlf$za*X)}8<6y%^eDh=`*t=%? zDA<-xWrJO^s|#_{uzKNp5>qPp^jqtaszghjqwGdvl z=9g=RKk^3F{vhk!l@4dUyK{|uH-|HgJ#SwqIIOi{XrZER9qey(eK^;(e`_w=bvzU9 zkjE$F$z*ms`J+*J@%QD>KLZ^70p0w#xijqr*si8rQ`<%o(bbr1Z2s2VH|M_Jooyfa zLHE|{o6VcUoBf-Kzi@rOJJUXrZ9FUQ0u<9@baSpbmd393w&q&9)0o-oFGRh>JXu3k zHm9RomQ197?es^H&dq^rq)+zs6&#LmEi7%_o(=4|r8-yLxQ;zDkzAy9y#rG9(Oh)b zIyTqTkZag0*LT5ayX}RjkC+o1h&geS&UialPlKVf*aQ7BxS9iR2jp7z16TZURd?Av zS9X)>o68#Y0~!Mj|InLCjvTpvUOqA=kG&~}g^Wum-a%#``LB`|s_ioUn_tyYwI|7~ z<1E}}X_70VOZ=^qyGCp1A2&6Q+FUg0-L{`}4qM^jr`@5^K;2J|ojd{$ z4-YqvMqK}`YS;n~Qe&xgc46^0(9`Y&#P&k`Wl@kBcx@Fk(pw-9YxY@|CWapH4x0={ z;C*Io7@-P=BQ%4kzFv}c^*g}_O>4?+0@QUh1ZiPh#LNLcYSycyOzwOOdQ!pQu{|uU zoZ%)=szxU;EDh&Ceh`*cwpN+2v>-7`0HUwCwA$q&dyTh9KnV|%xmI9U+DpteQf97| z%3Mum6+M<#wIoNEzXIb?JizD3vN6NTvZ--rM4P;X`WM=mArK8j1?Dn|@8X%8oUSYB z{$fwuq||W?areIWrw|S{#2o5k`un<=f&E>~!ND$O-(h&@KX`z-1iQrZuHy+J_6bH? zKIz2E8NB=@T#^g0S%l9+>eE*=&4;*_NdzytmbdFaJM^V!SjiVlj3|&8eq@c!8aZZ_ zR2Pj@eN}&6NJx!}3k-#zg+yr(9h6T_DV0WmGhi!_3^J_+R z0xyB^Y*uqXq7)K#fyeAkTwZp;V@TIe-Y_r7ZQQWs?J!Wbd^h6+`i7wZ4SUqtB#=M z)Uy|^wJ?G!dAL}lHtaAjTHz-^eW{p}$j>JK=m}i%VZ0blQq_q%E)_+?HLp3pPjC3sQhDwAKcEKJ0~9 zW=vVaZI9bJ)9CQ*vKJyAWca_Xp?&4e88%eea1?2m13+25P7^{$@z z7$c@sk>IxoOXEIp-GDH7@ZnaNe7F%3miB9ic&j90U&m(6re~{Jjt*pe18Zk+Na3-J zYYbdLCc)0kmetU;V<*AIxs8b`d!k#3^A(GnoH`RlM1D3VilI^_c1V*KB`rk(U1(Ld zlx1x0Qg%24ipdM&tUZK@dHZ$71B}f_^89g%4RnKD9hiI2lnw!NFCJqUUgm@`ntT*` ze7VZTDwb2QxfC|`-dEtgBMiI;W(9_v%POxzzBSAfN9pg9Z3z;d0OU==Dqh;*qJ|Ea zQn2l`s4VR%B`<_nO{wwTOVg$pYz4AxQA*(WnR0BTsE%l2BTJl+T$};!0wG(+7^#O8 zl`%BvLDKWdg=C7^-$wvT7=*NUyQx9xnNc^iVswD3zw9-7USjme< zqCWi7nf_6x`#IR%KL0x$pMZ?RoZ&X+$jnhQB=ruSXh@%Dz)Em%6Q&FYP#jo!P90)q_&J?~{V$x@a@zGFattIh*B6vV3 z7`NgsAxdl!5f_C&1b}-WK8gPs63Zl&-JN%&K zL6!Wu8MzWP(Ak2+72RJ5QT>Ou;GHY_aBr@+e{1;N+naL*%6(`*^aLeuey?q-raq5%{W*!T zmKbtP`Y0H2Sr3|L&F}tdTBoY(d6xy~QqlD;;rNId3WNe;s+klWgVT_B{u#8H&mi5@l56Qm9|S{Er}wcp zwAK#isKQ>T^%KugquFy*6pD^S3ae*YT0 z38ozo9ztU~01|%*Q1nTr ztS9X^ke1E0OCfeC5NubGUOCZ)D@ESr3$lAAevI`1A1zvFA(**Zi6;p50EFtckvSn^PYxz;*ags_F_>uZ8Zs}?S@cbSf|n-1~=dj@YMa>P-kUEeI(#{pFUQHJ|l?P zFzu(ENA7sx$SaD1v@6(d2($fcBiDndA%Hr_?j^f+KMCwLMjmAQaUb=6_1Iul&0K?knB{0_06puR2 zEx{*Cn3K!Nc`&TzD>MTHc(b&3&5Sq{kmKOZ?$vZDuQayP}vMlsS zHnf&WE-f-qa_g~)!W2}IY#5d(IY@a78pD{jyqz#Y;r9@r0=a5&RHEe3Iaf@oG?y>H zIOpKI5T>X`cu!7!#Z7YH=dU2fh*0gA6xC;Ce&bDY>u{B$DKA=PQv zfno@Hg(JUlOo$2jK$n}D_BMIb~1Ql35~ovYal`F_oz`#qVOk&J63=c?Ff zkzI}O+FzaH6UtWQTs;q8l&EQYJGHrgb>vZXtCE2DnP}}s&4vfQCUtnTbL*^JaU8xF zm8-7b7}*#~UzVd?5aktdtd7AqCMsIeBk7^dt8(ygF4Df~N=sXHa`oKK?&5_Nat#~GML}sr%Iz7I=lCDX6H}-Jk;gB4^m1&$WP}CXAMa!d`cQ@WZ@1oo@^04Ni zM;_-g_3%Lq>WlF0(x(wmg=2NJP(xMkerNICVtV#|N2cdgw(9iigpMpUXHe=ugE@dP5#mu+3;m+_Jg}{egFE+OjVB@?cMwXIeaYRItETm zr++>AIbo~_y~@BMvRSC57+}6G{oo@c~ z_HVa;Czh_?9L_fOWDcLp>^h&Vys+jrS}mCa_^5CLeNK}9kNN6em(Tm|jfglLs*R^)|^oChmHds4( z!^9?aoC1q?Hz*$*4^$|5n*;9`_D}q5XW6sof&MY)f!|5}Dvu!gD1$6eA=}!(RZ^@F z)%oNtj%ja|BCYM%0D*=t;3=72$W#=*eSN|im=Eyl@4(HZ&;co-fc_{12k06ONvDd! zpF!y*BsnMv5|ZPff+y(*%?~2-={MwwEAksx<*S_Rn|=PbPng|w-ZceuG|5j*Nlx%2 z;9v3t#B9N*JZ*D}Kp$-=%D^Yqz64#tS1X0z$2)x zXCE91+M8SoPc4DDr5#HHMtt>%&oq!Ul;K2(x(czmwiKV4{09<`jMu#Xq z0B=`#8-7uq0}j zgme&-7}3cI^B~KK>wvptYAWwszMX_=^LZ=yto9LAytu~ zDsr}pT%>Bf)wmSg6did=*=Y-y%xK#mxxeIIi`}~>?>&}@9)B>g>dsK-A47iim#Wty zUv7A6q3J^q|7-~qFja6-UjNr(UyT8mxRdp?uR3#q(ASb*O>X$pcd~)rRqvygy?^Ch zJG4HQ@h}f6q1@wB;a9Sr7(9C`)(-(QIv~57R~=6sUO3JhkphMHw5Z&-M($sFu;+pJ zpyT_W&kVfwzer)B&PIpQEopJ{RQm3>dkPdhZe6;+=e~Hq<9nZfhL6A$Ep{^UU0J&N zsbxPM+vqP)aNA^`;SDEJQ^5Sf9Ie4NW$D_d7MoI9SHKj6*r*LPX6c%zmRD(L>C`g{ z@7P9dfn*gfT2wgM-JYd8o?1L~Q#$gDf*XRx3YY;5P-#qdGg-PBP#CGrRn+Aw8*|ax zr~bHwj^%QX9M4U4Xbw zsK(p$&SF`*^Qonmj->$yaNC-GhBt)XTfqFnbqxoyTLFFp=9lh&M&VtB!(;(o*wLn- z%(DjIVA0^V1=EF_I$cN=26WikEM4~)XIh)9X@JS*BGtKYG*?ykG&ly$=6u0|6%&sG z;es6#FzZNF!AX)Xm|ww7k{${Gyd(*+Pr-tpBm-2q@)>CeJFhQTNbXf*sIagMS sWG-cl&D#3fd}~tHTKjW2AU5wGjlDItZrzA&wq$L+1v_P{BWLmd0EQhc9{>OV literal 0 HcmV?d00001 diff --git a/src/analytics/__pycache__/worker.cpython-313.pyc b/src/analytics/__pycache__/worker.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9fc3e69b9e3ae2b9c15dc72892b976ccb3ba609f GIT binary patch literal 36468 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 literal 0 HcmV?d00001 diff --git a/src/analytics/worker.py b/src/analytics/worker.py index ef5065e..d1688f5 100644 --- a/src/analytics/worker.py +++ b/src/analytics/worker.py @@ -665,8 +665,7 @@ class AnalyticsWorker: logger.info(f"Processing yesterday's data: {yesterday}") self.process_date(yesterday) - # Heute wird nur verarbeitet, wenn es bereits Trades gibt (normalerweise am Ende des Tages) - # Aber wir prüfen trotzdem, ob es Daten gibt + # Heute wird verarbeitet, wenn es bereits Trades gibt if today not in existing_dates: # Prüfe ob es heute schon Trades gibt query = f"select count(*) from trades where date_trunc('day', timestamp) = '{today}'" @@ -674,6 +673,8 @@ class AnalyticsWorker: if data and data.get('dataset') and data['dataset'][0][0] and data['dataset'][0][0] > 0: logger.info(f"Found trades for today ({today}), processing...") self.process_date(today) + else: + logger.info(f"No trades found for today ({today}) yet, will process later") # Hauptschleife: Prüfe regelmäßig auf fehlende Tage logger.info("Starting main loop - checking for missing dates every hour...") @@ -688,12 +689,22 @@ class AnalyticsWorker: self.process_missing_dates() last_check_hour = current_hour - # Stelle sicher, dass gestern verarbeitet wurde - yesterday = (now - datetime.timedelta(days=1)).date() + # Stelle sicher, dass gestern und heute verarbeitet wurden + today = now.date() + yesterday = today - datetime.timedelta(days=1) existing_dates = self.get_existing_dates('analytics_custom') + if yesterday not in existing_dates: logger.info(f"Processing yesterday's data: {yesterday}") self.process_date(yesterday) + + # Prüfe heute, ob es Trades gibt + if today not in existing_dates: + query = f"select count(*) from trades where date_trunc('day', timestamp) = '{today}'" + data = self.query_questdb(query) + if data and data.get('dataset') and data['dataset'][0][0] and data['dataset'][0][0] > 0: + logger.info(f"Found trades for today ({today}), processing...") + self.process_date(today) # Prüfe ob es Mitternacht ist (00:00) - verarbeite dann gestern if now.hour == 0 and now.minute == 0: