From 9b9b459d8f49dd6792f101a6dd8e399592046f76 Mon Sep 17 00:00:00 2001 From: Xatiko <107261855+Anymorexxx@users.noreply.github.com> Date: Mon, 25 Nov 2024 19:40:12 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F:=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=BF=D1=80=D0=BE=D0=B1=D0=BB=D0=B5=D0=BC?= =?UTF-8?q?=D0=B0=20=D1=81=20=D0=B7=D0=B0=D0=B2=D0=B8=D1=81=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=D0=BC=20=D0=B8=20=D0=BD=D0=B5=D0=BE=D0=B1=D1=85?= =?UTF-8?q?=D0=BE=D0=B4=D0=B8=D0=BC=D0=BE=D1=81=D1=82=D1=8C=D1=8E=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B8=D0=BD=D1=83=D0=B4=D0=B8=D1=82=D0=B5=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=B7=D0=B0=D0=B2=D0=B5=D1=80=D1=88?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B?= =?UTF-8?q?=20=D0=BF=D1=80=D0=BE=D0=B3=D1=80=D0=B0=D0=BC=D0=BC=D1=8B,=20?= =?UTF-8?q?=D0=BD=D0=B5=D0=BA=D0=BE=D1=82=D0=BE=D1=80=D1=8B=D0=B9=20=D1=84?= =?UTF-8?q?=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=BE=D0=BD=D0=B0=D0=BB=20=D0=B2?= =?UTF-8?q?=D0=BD=D0=B5=D1=81=D1=91=D0=BD=20=D0=B2=20=D1=80=D0=B0=D0=B7?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D1=83=20=D1=81=20=D1=81?= =?UTF-8?q?=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D0=BD=D0=B8=D0=B5=D0=BC=20'?= =?UTF-8?q?=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=BE=D0=BD=D0=B0=D0=BB=20?= =?UTF-8?q?=D0=BD=D0=B5=D0=B4=D0=BE=D1=81=D1=82=D1=83=D0=BF=D0=B5=D0=BD',?= =?UTF-8?q?=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0?= =?UTF-8?q?=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B0=20=D0=B1=D1=83=D1=80?= =?UTF-8?q?=D0=B3=D0=B5=D1=80-=D0=BC=D0=B5=D0=BD=D1=8E=20(=D1=82=D0=B5?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D1=8C=20=D0=BD=D0=B0=D0=B6=D0=B0=D1=82=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=BD=D0=B0=20=D0=BE=D0=BF=D1=80=D0=B5=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D1=91=D0=BD=D0=BD=D1=83=D1=8E=20=D0=BA=D0=BD=D0=BE=D0=BF?= =?UTF-8?q?=D0=BA=D1=83=20=D0=B2=D1=8B=D0=B7=D1=8B=D0=B2=D0=B0=D0=B5=D1=82?= =?UTF-8?q?=20=D0=BE=D0=BF=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D1=91=D0=BD=D0=BD?= =?UTF-8?q?=D1=83=D1=8E=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8E),=20?= =?UTF-8?q?=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8F=20feature=5Fin=5Fdev?= =?UTF-8?q?elopment=20=D0=B2=D1=8B=D0=BD=D0=B5=D1=81=D0=B5=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=B2=20utils.py.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __pycache__/config.cpython-313.pyc | Bin 709 -> 777 bytes config.py | 5 +- .../__pycache__/db_events.cpython-313.pyc | Bin 1915 -> 1958 bytes .../__pycache__/db_session.cpython-313.pyc | Bin 1339 -> 2238 bytes database/__pycache__/models.cpython-313.pyc | Bin 2526 -> 3914 bytes database/db_events.py | 19 +- database/db_session.py | 42 +- database/models.py | 1 - logs/logfile.log | 923 ++++++++++++++++++ logs_export.csv | 4 + src/__pycache__/utils.cpython-313.pyc | Bin 442 -> 2260 bytes .../__pycache__/admin_logging.cpython-313.pyc | Bin 2010 -> 3079 bytes .../__pycache__/content.cpython-313.pyc | Bin 1001 -> 1001 bytes .../__pycache__/db_management.cpython-313.pyc | Bin 1994 -> 2730 bytes .../knowledge_base.cpython-313.pyc | Bin 2692 -> 2722 bytes .../__pycache__/notification.cpython-313.pyc | Bin 0 -> 1782 bytes .../__pycache__/statistics.cpython-313.pyc | Bin 1525 -> 6590 bytes src/admin_functions/admin_logging.py | 1 - src/admin_functions/knowledge_base.py | 1 + src/admin_functions/notification.py | 28 +- src/main.py | 22 +- src/ui/__pycache__/admin_ui.cpython-313.pyc | Bin 9847 -> 11183 bytes src/ui/__pycache__/auth_ui.cpython-313.pyc | Bin 10171 -> 10171 bytes src/ui/admin_ui.py | 92 +- src/ui/auth_ui.py | 1 - src/utils.py | 28 + 26 files changed, 1054 insertions(+), 113 deletions(-) create mode 100644 logs_export.csv create mode 100644 src/admin_functions/__pycache__/notification.cpython-313.pyc diff --git a/__pycache__/config.cpython-313.pyc b/__pycache__/config.cpython-313.pyc index a11615e38ecc9bbd03e1bc0f460423c5f89a0f3f..27b3c8f741c4c0225ac115744c8e5c216f757caa 100644 GIT binary patch delta 139 zcmX@g+R4WInU|M~0SKmfxuox#$ScX{Gf~}@Cz!WLAegU6Fr8mhU}C{?u3Idbd1?6} zewsp?r5G6*)o%&;`G4Rr`?!X=`rHx>4R(!paSU;Eas)Db{M~~mOEZ~r m$pKAg1mfbt$x%!xq76JB*cilQE-(n)5RtgZAXp>=lmh@YS|kSm delta 70 zcmeBVJIc!YnU|M~0SG2dv`IIb$ScX{GEv=?C7oB3Z(_xAW5 diff --git a/config.py b/config.py index 3e41e86..ba3fe0d 100644 --- a/config.py +++ b/config.py @@ -24,5 +24,6 @@ DATABASE_URL = "sqlite:///database/DogAcademy.db" # Обновлено на п # Иконки SETTINGS_IMG = "assets/settings.png" -# Уровни уведомлений (для дальнейшей настройки) -NOTIFICATION_LEVEL = "info" # Возможные значения: "info", "warning", "error" \ No newline at end of file +# Утилиты +NOTIFICATION_LEVEL = "info" # Возможные значения: "info", "warning", "error" +USE_DATABASE_LOGS = True \ No newline at end of file diff --git a/database/__pycache__/db_events.cpython-313.pyc b/database/__pycache__/db_events.cpython-313.pyc index b221d7677ef6dfc9ededc81a4723c231931d69fe..ee32482f4610dcbcbbd9922c070dd0ab08dddc58 100644 GIT binary patch delta 368 zcmX|5%}T>S7~D;=Nt%+XXrVs{_25B8@zhf(2!fD+m*TCUb&WPO?drEFD)dco(DV>t757K-m%_-UZwu-cp*F0K*2Ks;e CzgI*6 delta 333 zcmX|(KTE@45XRq2^5$PnOYM?&&@6({#lgX$2;v|lgG0bcs2W3B8ymSd`5+Ry_yGh* zarScvfqVcrF{6w3M)2T%Ja^A?_dNLNJFVl`jLN#3rn`^M_~MX;HH%mTAqxP(lUfOt zKt;9FYN!PqIcaUeP>(p#NOj-%lz)7vdudY4L?Xl@U(u+Yl*Rn@$yIhZ`89vQ#j2=H z%(Lv~I$qX1&T^6X98I#(sy>t}7`+{-mkJown&)SIxtF)NLHG~K#eh(2rAQEmB!x_Q zvT##6c05nw<*f6^Rj9v%Sy{$Gb!rUHyN4r6;h6BkS|a;9GpG0YZJ8ypxG diff --git a/database/__pycache__/db_session.cpython-313.pyc b/database/__pycache__/db_session.cpython-313.pyc index d7d1221e0181239ceff2f5ba2369b0138cc95cab..2eda8912ad7fec19eac60e08a1957e169fcc41fc 100644 GIT binary patch literal 2238 zcma)7-A^1<6u+|{v%~Bz2(4X%X*=0s?3#8^o2H>r5*kV(2q;4z44W+bF)Z8e7k74} zH9jmESO}7^TN5=;kAt>^oxrtdQjb7o%{}AQd|FEmXk3@ovagMb|mT&0a%{+1wt+q^a_6VTiP_OHM>utAn9Ii+8 zj(Qt3yBjp0u0a+hl9}E?Z*@Y#ruRwtyV3C~Of#t9)Kz%Rp?h zO+L>*x~lM5wgsoEvNg7%@DE}8FSsR5zw46<&e^ zOQ3H{8K*`4g2L}u%GP;>t?)V2!F~j)1Yi9reh+pURr7gOe*aV=T8PG=db;~_$-a0r zp=WNZiCFO+@Qi&4R=^|h)H+*1C&ASJa;auP{T!dgw|EIXZhBT#Rf-i*?7=6#IueOv z)&DCfs#=`H+xH+25bdV$VlW{^PpukQ!m5UZEnuP$BAB^Zz`)0tUMTHq z*)Os!$kaR>sFfmIe%w?5D#lZ*Hq3{FJ_k=wG=d_Et?30I4D3B6^2FOQ-@{xdtz%6N zpz)RiX&@T=Wh@9C33sf~)Y)tyIj(=&j>CUKm?24_L5K6O*Cd6ItBStQArwDY0Gg{J zZ^;S@ps5}k^t=XiwyZ#v1K1!Q%kXUgXxJ)jLs+-i_ZVEZ!8QQ&BSi)5WJlFEXk7!0 z7GK9hUs%bo3_&BTo&%3Ip0%@sKs>Y;&=Ydflc0lQ^ETb_bk5M}^C+li#B8;sb|oA1 z3~avypK%c;C|{9C0qzOzVl}?JExocU1$LyW}mq+%Kl}UV098vE+^GFg_4j#)@a(=U38RAL;Xjr?`MUrB delta 480 zcmdldxSNabGcPX}0}y0iw@IJIJdv+JE{02q!4xC}1V!AzoKg%$Ji%N*k~f`IlY8Qv zKyip1gk%9y%s~8k55r^@Mh~VG-N{*uQHtrT(d;l~!7QeX5VisX&6v+{D;Yk6oHKa|i)gf{xsC5|@Lu2x zzrqnQS)Wyk&FLzKbCK}m2-a!VMM6M5MZzFL1W4TCPERd~FHS8k&dkp%k^qW;0;(7k zx*&svx-BoTh=7%A@=boo9^wL$zQqpH0CEXf7rL<=Ho5sJr8%i~MRGtTppYzf01_XV i85tR$POjq65WmSK*sa;X{)vT+(S`A|028Aq*ct#vm4_(+ diff --git a/database/__pycache__/models.cpython-313.pyc b/database/__pycache__/models.cpython-313.pyc index 9b809a5b587e05c24684bffdfcf8b08a6ad9b980..21b985a4a5ad585ac4098886fd1e3f8b03544ae6 100644 GIT binary patch literal 3914 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 E0PwUG&;S4c diff --git a/src/admin_functions/__pycache__/admin_logging.cpython-313.pyc b/src/admin_functions/__pycache__/admin_logging.cpython-313.pyc index 0a722fc15f8f81fb8fc6977b8d6eaf3884f9e3c8..c5bdf41c8a4e9eeeb913d802edd5e8ca2577844a 100644 GIT binary patch delta 1838 zcmaJ>Uu;uV7(e&+^!EQhH@0p-xPS$UY`_3RC((^5#_TiSy&>SE!Q6G3i#)FB`_?_F90*WX1{Lc6HeBXD@ z{SNc31b1(EJWd3|bzwYn(1Fk|oM{hRi`e*dZTDaW5n)=Q5Tm>z#E_Cq9spt}J(M_fl&j29_UDQj zZ9hOdn^Om2E%$}?C|Z(l5Z2@YIkYFQYMPP(t{e!xJ`l;7ayWDnJ`%>v&Rq)- zoLO_~SvAL`bdly2o!NLM>Aap4+qJ=Jg=vAgF%0k#ng?u-xVUz`XS)|pbWZT1LzW{# zQ!b+n3X9RwR$w8Y+81JQ=dc_WnGLedWD6OFvxRgK1d;-27YhuRG?mu=u$+iF!DOK+ zrGD`5hNsGC1Q=c+FWNPm{=o%jON{KS=_sJy|*F}8?h5d1Q(#zc%ZH9tnd%OUl0*x z^c20Dxc^u0A)bf&eN%a^bg`f_F_B?nI&+sl z3eaHqjFLKEdsjR;T=tABba8N&s_NOSx)ioBTe6rd zx`o5m+5_>s3fManN^&tni={$}IiYRT7VS%C)m*BhEN^-&(%_`3q~O;Ni*z5~ZvY?~ z_D~Ef6ZJ)Aolz3diT>lGW799kV{_5*g|XO7EY6&>6R*uS>DmvLT@_{}JVoY677OWY zrbJcdo}3sRpNKb&AV;hDvM{TzB%qe<5JKbaAj>lK@puki>H>6{Mvno{FGKqipo)IQ zzE$fw?zxSnmC5DFi*rWbVdI5U>vQV*+j z<(W$}pKLPrq>cO%7>tN95wxCDV(kOGc&v_T(`xF{)ce!bi3WD8#4f~EW9tV-etcs+ zd%hZjjayQq`?+iG^;hSsu^ad_4Se$#wg|!9kRja*P`2~b2b0=aCM?lVEhx!Ce=Qr=Z_1u{v)tkjmfqJ0!oAgd4z-;NeqL yWV?yFZlJD)XIsM=xV-PZeGS*HhI`w6hgA^o`vqZCxNq+g-V`?WI)tcThW`f_1F75q delta 685 zcmZ`%&ubGw6rS0g$^J-|Xwx*IR9Q7xS7E_}(m)Zsc#4Z=um~O`jhk4qo0Zv(iQ--H zB4s>y^dcezFCP5^^ddAO6sGi~2an?V2RO6M(jIh%d2il)@B7~TdRph@)zq>~AllmQ zdjAUs;JXa+rpzbl+V-kjM$3Q}2o_fBL#MF)d8O8cd8+UQF;p?qHhZgFb&1+k+u9L) zKD{*eHn^kbXxn73;gUxX!KBbshwv6`TRC{>i6*+IBMD!yzf93}oF;iwl46Bgp@4M*WxHws4K zFy<(}AC0NJQwLI6l@_Hbu|N1@#dCCuM97t7z;Uay=?Bc!&K?s2xJNso&vDY(41Bhr zT&o&V>2479V|qq#6NIYT#h(Z&pId_%W?l*%t!&s(pmJLh^k;doY>Fsu*o zS430rVXCXJUX}Ih!aUZcnA?pXayX_H_Q|lJ!G0Rg8W*Itd^_8=>1pA4(VsksXmU{g zqF7mCFU=>9bgm_XtzqI*x-1r{x@_dW#|!{I{so@^ delta 20 acmaFK{*s;hGcPX}0}wRdwb{shj~M_${RTV$ diff --git a/src/admin_functions/__pycache__/db_management.cpython-313.pyc b/src/admin_functions/__pycache__/db_management.cpython-313.pyc index 5ae9899a5ba72bf48f9272a964892469b45b0ccc..a7c40b3692465b35b12efdcf47b4d9bfdc775e99 100644 GIT binary patch delta 1152 zcmZ`&UuYaf82@JW_ICGjw`t1RTztrFV*a>N8u41hekX?E-E zZv9ugX;sLBAYl>uqy-;@KBd)Sv9`fC^+9H-P+5t#&==oAu7zTK@S8J-CF;QZzHh#n z-#6dP{N{)5v-jz(LLmp(o_POY}|o(%8JV;NH0RWsK{fOp=Cd9Q zh@dYcEW!1R$_if$(oMQ^7Y0niifCA`fKognj}bL~Nw!EaJ}Xa`+Szt2+OFMjs;_q{ zVwJd%{WTK%%~OOzAfLSv-AbAYFo32MQ6d1M438RnToV; zE4Kj+7=XDun*W;jMz!hIy;OVV&3Wgj5Kx+HM;*pImP&rW%uK3@(yKK)u+t3lydcfH z_ed@!jxR3X!1lMkbh}n-%c~lA)!JdUA7@9f`?xD=Y$KDGqj7pG52fKVFJA3^XgUA0 zTD+$ACu;xc<9uxLyFPBcoILjmpR8^GyhHIcOhr`)5<1 zT=Z(;5obR;h)aaZ{YMctBtpn9P+W)Jbr}5(_O8RoIt<*%?K=Hzl6zoD+00NfNj6nV TdbCY-Cn>fb)X6wy;#>U%ttC*m delta 376 zcmZ9Gy-EW?6ou!;{h6KYZZy9VL82H#8iUb7F=(fdR5EQq!K@OD2JYD*tB|g-PP&xa`+#Xq%LHBSD0-YJ`d3g-$M>r?B+h9RhzTw3ulu)QfVd`KogHbg;<=?Zi6ii0 zD+>Dqfwm6Y(9nnH4X~-zznZjlGwel!;1KuJ7StEp3f~I=Fd_LVDNRXjN~-dXt*{x* ILLPOAKZz1f=>Px# diff --git a/src/admin_functions/__pycache__/knowledge_base.cpython-313.pyc b/src/admin_functions/__pycache__/knowledge_base.cpython-313.pyc index eb424814ef4a35164f21eb82b69fadcdc6861314..558f9ec8083cfd7490d6595a8b77eceb6fb8ddef 100644 GIT binary patch delta 244 zcmZn>T_no;nU|M~0SKPYbV+yI$UBe2p$f>G$`H*65(R-^MpGzTfkBQTni(R>z!1uS z5RYboi3YJv?qw3^WC~^uX0c=r;+(veN!EZtlhvlNpPIfeHZv CLp~z_ delta 114 zcmZ1^+9JyPnU|M~0SGLv+oW@E*Od-H6?`$doOHIxUlbHBapH0!lnyb z6)rYi*m_~t#YP|v6wsR-!D%#kCX4vw9h@SpT0m2DCd)F(PX5K|&!{!oi%W`8Z*nS^ O2`4jSGGmc2P#OSAEh*Cg diff --git a/src/admin_functions/__pycache__/notification.cpython-313.pyc b/src/admin_functions/__pycache__/notification.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1bc62d5b5252a65a325289ddf8aeda1502400735 GIT binary patch literal 1782 zcmbtUU1%It6u$Gb*~yyiSeg(Ul4g>2g#jCEO0b)XAf`pEU3G^@Vpqr6`B^8OolWn| znxr5EA0!2#A_Plc8nIyeAcjI9h!!7xoN1Jmt3H{RywwH~eDa*xpQbh7gBSMPbIv{I zyWg36&hBQj83OC4x2Gy+1VVmCqrJqIvil4ut3)FjcaBgFcK#gy3Qu{3JVi!{CJYcw zoZy?$RH$%jY6p#i$}!0@LOXP;w%I&xO0H$>Dxj>AQi4i(jiZ9b4-hIMCQWG~?W&~I zF4j}1g|6e8M(Ec39pq)U$sv*iKOj$bKLOxXashqGDz-?qZQMu6G^cSIuL*f!ns}Xv zX;R#a*-9y<_vSWrO@!=J9?IWy6LNTL!A<*OPD7zumzLI~dO?Q#)9z z$}_%PVdA`DEirBpOwn;Yk7Df*Ssph`^I4VuJNr_t>Y9pX_+v&knk%^(b7}9Pq z81DdzQ}aV6dbShpAONBTu4O0ifK9PZdI-Z))UCW1suJVFi!61P8daO6oMZzoCiq@8 z%C^U{RXYfbimiKz`J_{$RU_1~iG$Fn&NI2AHbanAV0#Yhnm4EobkZ#Z*4>E=u(uRg z?DW~m((AM~XPaSAnyOXw7fr*mt4pPTnkB=ky1wqzeG@x9DEWK(er$e;NxJU(Zm8?5 zZ|_KqwcYrAgRej=lVAJ#Kb!e<=9+Ws@aDm|@AQiJapq^K=W6Ck=Bj)}zNW2RT9IQ( z-5wggF>`%p&H8fg^SSkf@AJ_cZ$-xY@zBDG_@gucDGg~LmIfNqa4Ze4y}3Rbp*FES zJaS|4`r<9|>&)%UW^W^3i1URXmbUV<(L0sMtKTQ&1Fp#b0cC4ELJcNRgRwN&kVax@ zWNl%+7)c}dq*J>DG2F2b_EkaOH2n%=+t32r=uVO{1S>nkD_A;1RHwfu^(?p z8FQWnu}rq*{)VjFla-r?)@Hvr5}laZlFu~cLM#`e*UDS68A&F^P*tFZVWWd6j({kr zY3wc^rUJSvqwCe0RrgTu(e+Dp!)u+$y6(6%2tC)g{hF@RV~CKj?9+7^kkB=CBMhlq zu7`G@>$gdAVY3>1CyD~cA;8)Eh&RQ}IiK4o#uNIZv`N{1I+KeQ?B2Rr$CNhUpk qCf1NZGU@py(--JT@Zld=fC={nj^lnIy}yy6zr-wOaSsT}B=H{!Nt)CE literal 0 HcmV?d00001 diff --git a/src/admin_functions/__pycache__/statistics.cpython-313.pyc b/src/admin_functions/__pycache__/statistics.cpython-313.pyc index b999857e60b156ba3225950d23ccf24ee2d39293..3b6c06cf20d3cf4557c79f2d1d42d9b8c107c881 100644 GIT binary patch literal 6590 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 bgudk)*}89cG_tmDchs?~AFi{pZp!r^E)w&D delta 907 zcmZuvT}u>E7(O#|c6R-kRX5GmzQzh<&=eCPKhRK6i8WX^q3FU!cXnHLoL%Na#T#8E zj0#ldM(QG@tHKMB3QgSdADoE=QQR$!6tuD$H^dEA+B;meE#L~FFj5pLZe^hvH&_K<&+~CX@>}=p zFmA9{Jm=~~vLQNi&J4+tb+S#~k)>Xd1+?e%sx!>fGw*P`w3C=gGT6x9cP;!gg>d=MkjdleciN zZ8*fH#87@rHcUmQcqC;$yyIGrB~+F2%4AyBqPHbM_rRW%HIvj6l1CJk;J3lV0P(^!mH}qa9xhq*6_{K0?OV@@8_cWH_04sbHh+3M9SK7xZMo~G6RbZIb3thNuVo-Z|(^f zmkmc~nz0`g)Cp1%^_t0q2G^pO*)M`unR5G6u)R-r&AmqYWmt3(fciSdQc+7)I&}#` h_g6Nm0KRh!!+b^Mc~qH4m-479k7^FEp9vh6{sOhe82A7H diff --git a/src/admin_functions/admin_logging.py b/src/admin_functions/admin_logging.py index 411a4d2..9cf3bce 100644 --- a/src/admin_functions/admin_logging.py +++ b/src/admin_functions/admin_logging.py @@ -52,4 +52,3 @@ def export_logs(): writer.writerow(["Время", "Действие", "Пользователь"]) writer.writerows(data) print("Логи успешно экспортированы в logs.csv") - diff --git a/src/admin_functions/knowledge_base.py b/src/admin_functions/knowledge_base.py index 88dadaa..539c3d6 100644 --- a/src/admin_functions/knowledge_base.py +++ b/src/admin_functions/knowledge_base.py @@ -42,6 +42,7 @@ def view_knowledge_base(frame): def generate_questions(frame): + print("Я по приколу вызвался") """Генерация вопросов на основе текстов.""" clear_frame(frame) tk.Label(frame, text="Генерация вопросов", font=("Comic Sans MS", 16)).pack() diff --git a/src/admin_functions/notification.py b/src/admin_functions/notification.py index 2d17ae5..c7da8e2 100644 --- a/src/admin_functions/notification.py +++ b/src/admin_functions/notification.py @@ -1,21 +1,17 @@ -from tkinter import messagebox +import tkinter as tk +from datetime import datetime class Notification: - def __init__(self, root): - self.root = root + def __init__(self, parent, message, timestamp): + self.frame = tk.Frame(parent, bg="#2f2b38", pady=5) + self.frame.pack(fill="x", pady=5) - def show_info(self, title, message): - """Отображение информационного уведомления""" - messagebox.showinfo(title, message) + self.message_label = tk.Label(self.frame, text=message, bg="#2f2b38", fg="#b2acc0", font=("Comic Sans MS", 12)) + self.message_label.pack(side="left", padx=10) - def show_warning(self, title, message): - """Отображение предупреждения""" - messagebox.showwarning(title, message) + self.timestamp_label = tk.Label(self.frame, text=self.format_timestamp(timestamp), bg="#2f2b38", fg="#b2acc0", font=("Comic Sans MS", 10)) + self.timestamp_label.pack(side="right", padx=10) - def show_error(self, title, message): - """Отображение ошибки""" - messagebox.showerror(title, message) - - def show_notification(self, title, message): - """Отображение общего уведомления""" - self.show_info(title, message) + def format_timestamp(self, timestamp): + """Форматирование метки времени.""" + return datetime.strptime(str(timestamp), "%Y-%m-%d %H:%M:%S").strftime("%d-%m-%Y %H:%M:%S") diff --git a/src/main.py b/src/main.py index 992fe5d..73f6bb3 100644 --- a/src/main.py +++ b/src/main.py @@ -1,24 +1,26 @@ -from tkinter import Tk -from tkinter import messagebox -from src.ui.auth_ui import DogAcademyApp # Изменил на правильный путь -from database.db_session import init_db +from tkinter import Tk, messagebox +from src.ui.auth_ui import DogAcademyApp # Путь к приложению +from database.db_session import init_db, close_sessions # Функция для закрытия сессий def on_close(): """Обработчик закрытия окна.""" if messagebox.askokcancel("Выход", "Вы действительно хотите выйти?"): - root.destroy() + print("Закрытие игры...") + close_sessions() # Закрытие всех сессий перед выходом + root.quit() # Завершаем главный цикл приложения + root.destroy() # Закрытие окна def main(): """Основной запуск приложения.""" global root - # Инициализируем базу данных + # Инициализация базы данных init_db() - # Запускаем графический интерфейс - root = Tk() - root.protocol("WM_DELETE_WINDOW", on_close) + # Создаем экземпляр приложения app = DogAcademyApp(root) - root.mainloop() + root.protocol("WM_DELETE_WINDOW", on_close) # Перехват события закрытия окна + root.mainloop() # Запуск основного цикла обработки событий if __name__ == "__main__": + root = Tk() # Создание корневого окна main() diff --git a/src/ui/__pycache__/admin_ui.cpython-313.pyc b/src/ui/__pycache__/admin_ui.cpython-313.pyc index af8aa7ac876bd76344decbbc15e6e26d5a5bed98..c80b50d863fe119e4b61bae66313c895b333cbbf 100644 GIT binary patch delta 4880 zcmb6dTW}lI_3rBZmMp&|%j-wt2ogK*#KD-DIEiB%n`A9AtvkrFCCdU?GFNf}{gD%< z)S>CvW|QVoTEesgb?8hTk`R-Sq{9p!9om^y5kzd=0S12jQyhm*pu==}&PuXn5(?}% zM|;mX_uTV7cXOxXPY2AmO(s2o=c$)lgJ)JwnoF7ZWZjl#j_`z6J)&03bq8i5#K>?-$*Mwkvf0H$%Ng$Hk{wshJ z!ajA0@UBUxsV2lj_Orravt4+AwF_pOzK~};Bn(`cC#YCt*k*Rw*nApLbb`04LZNUg zg-^{5wq4zwZWY}NJ83(D4&hyk!`2C}F|dau14?0Y?M-A|Ca)NXVH>|z{&+u#y zIzoOnvbfx;?^sCaus%@;>Bd`U!$hqs+3WCSv1_)L#c7_~VS)!^RGnW9HM zx*lsz)1HFd8(+$oHL4;8k6}ON_BS5BoVW81-r1<&h(`~?`K<82fpDk7#mJ%)9%Bzy zllS!}oUHk{c;(OvEq`(T}2~VXEkK@Ra|!Vxsk= zZbEmi=quU>#7;NFa>(~|PKf~Es29N9YEU1bpF$F9nvITC|Kaw%=i8=Rj_pX|8Shyd zZWhr4bV=J3_6_yW^EhmenE`w`O3o{$TQ7H=?@Fz0rP%0cHGny& zAL34!r{i9z)w&Z_u|Bo2U9>)uwl$_6*e6=|r)`^4TRTN- z*StZEC#zwzqp(arX8NL@I9#`~ed@LX`qgd1I`p3zEr68E1CUlkn)J6+N{4>T@`auh zmz}boicYgh*ZTL0HjL>(6P;q=@}iL*Zz@ntRG%N%2-GyrqD+&O0XxTJK< z_^H!Vu z|ADjhmR(<2FkzT4CN}3yE0?r#XZxqw8JlS3-m^Y%yNp!VEfkT8`)K!tJEfh>8XCeR zcoLI~r7WhSxJS<2!}x|O#54eU<$T?q=??bn zRTZkpuvll3Q?NLk%qf9&j>8S$1?M}~N)&+_Wo;K;EZ-5wP5^Fo#xru~*o;_gA4@F- z?&qBZ+HB?w+$*Uw{UD}OBuUm5V7;vETjWp-B zLRM6A9ONgDaN?wR9E4nf#i*>=71#jca3k2eWK8lGZu$avQ;u{u%+js*!K!mgO|^*q zwusZ?K+O*{eOUNc71#1-L}NBW7`66^ohfbktX4m+eO{Y3+U8kOFsz)lRL)w;(zcb* z(RBJdMq;oWt)1|X)&5=Ypx=mk@3N>jf!yyCb@1FJIS4l(2#0fKi!&o%pnzp@7rw48 zP2`1n$uU1L%Fl{71nXIlb!*1cf@u8Rw{1sd$QMf`QscW z{|F7mpLrLE|2L3(zAKO?Yeo}t4hi=~Y5Im3I zAq2ld@Gt^&4t+`ZZ*9eZJeKz1+K>bIof*U0c#bTvn^e^c5k{-3S}1H~R80#VtW~vb zq1LS0u)rx*VRpf&Q#luk0sOmIq1u|cMWQHop`?jF35_*C=?3BO3Oln-II*HG0sl`z z`|C&Ip>Qlyh4MX8Zn^m7o$0%+_=dw!GVa~k>G5_w+OlI$_m46z2OQx6!njU x1I_f0K!D~)Vl4pX6%51tgA{&5T>m7MACX4*gPWDmwvw~#Q7~H<2trxT{{R5cb6Wra delta 3471 zcmahLZERE5^}Xk>XZtWN2M$+>V8zy&Uv?i7e1 zF+nD1>k>OX!~?jU6a^imILMO{z)OQpQWkWPHI>W;Cg`qWg2GM?7i1Vxe)-y#Vw)j` zM?zzAT#hJXN<4Y_&+F?A$7mv+go)vKHlCP>DdC6`8j)4S&l>L0m?D$V2_lavGXi_n z&X&-hIsC9btcWZ7t%fZ+2CI=0`Y%TvTR~m?FY8KxV{j)ThV=w2O{#EOERQCmrbN4CI7%IFT~P5(M1m5dTa zPAZ|ed^$9eN+uI=;y}7nJ(-vY#S#&f@N|u9mfbpY*L90aTY+hT|Hmz``s>UPz}y#P z`+=&CctNh04O%?R4sK^&Ph!483;bPW!|Gn8NdHh8TCg;-F)-Nowx&}p;Ij4;?T$9D{a$-lo0haW?S^(o ze^mn7wDwzVT0f^vH%i*IJXt>r$SwV4V4Rgw0;>N;yQ$5>e@>e>2_W*WKB->-&G{5Y zUVA%70Lf|4o?AB3(w?eD{!hU?7}tKMU-+EN;eg+6*v3f|5+VS?qzge0eao}Hq!&;X z!y%DAq#mGmJvGWpfKD9oW z0ky6Y_B<+xvnFnNclHQcA8%0wtBkHi#}VAdI8UM8lTR${7AlAneXk?%+9|=EMPp@%k0muBl@+`H6wU->Js@ks2&jGcF|~rb&2x>JmS^;qXEdQN zE4Iu9GP?)#-2&a~E(YN(zLLe*doIR7-HK^|z)P(P3#qG0!OjEz!)L*O# zM;6_7*vmu4?sSv>nNn|n?ekm61`OLq44ZW%5erXQ$rDJy*OP2UP=`Erf?#odU<2T{ z7f_c7H?j(kHhQOGVH=i8B>48`ivMvG^j@j)vg7olnoDdyeWCV` z#aZUeYv5-{n+v2GKtg*1 z8i5;73NK39uk{zTS^Y)*oCFBeO5n^xi*OsTJK9bC5_uWdMYpEx#Etm>bBmk@?jzpp z2ZFJFUwAAU-#0!^>o%9QUqzX30GMR%@nx^IE$~(Mc-JNV$NX#MT6NdLq2UE30gwI! z+s*wO9_k+MQ-FOY-p4%z{4hrz*;a+QElfY{I`$^GHSM-U$N0((E6$UPAn95^vW~9Ts%H$wAXEsa$#I_>%CW2k`AO77(f`}eKfJK<#4I+CH;Bga-GHFGC7L4*x zNKMMg=x9hzCP@@hP*FpnDaO14xhp85ut>+BtT-&#d`sR+n|rCL*w(VN$z$8GBw1}S zZb{&5hq)!5v-NNfd5f(%r;eKb3d50n7WzDe>+Of4f{G3x4&p%S@!SDn)^)62aK!sJ|n-+$R991`oh;X76m!Bc?r6GHn)-g0Z_$$ AKL7v# diff --git a/src/ui/__pycache__/auth_ui.cpython-313.pyc b/src/ui/__pycache__/auth_ui.cpython-313.pyc index 3ab9d5c8389a9596351a36790db39c61b8dd7781..833dcab055ede63d4c438ba3da0afeca5a2e2ec3 100644 GIT binary patch delta 22 ccmdn(zuTYpGcPX}0}#AxbV+aB$h%G*09E@3YXATM delta 22 ccmdn(zuTYpGcPX}0}y в разработке.\nВ планах реализовать: создание оповещений для пользователей (обновления, новости), сообщения от БД (корректность работы)", + bg=BACKGROUND_COLOR, + fg=TEXT_COLOR, + font=("Comic Sans MS", 16) + ).pack(expand=True) def show_security(self, frame): - clear_frame(frame) - tk.Label(frame, text="Раздел Безопасность", bg=BACKGROUND_COLOR, fg=TEXT_COLOR, font=("Comic Sans MS", 16)).pack() + """Отображение экрана безопасности""" + clear_frame(frame) # Очищаем текущий экран + tk.Label( + frame, + text="Модуль <Безопасность> в разработке.\nВ планах реализовать: управление доступом (создание других админов, смена пароля администратора).", + bg=BACKGROUND_COLOR, + fg=TEXT_COLOR, + font=("Comic Sans MS", 16) + ).pack(expand=True) def change_ui_settings(self, frame): clear_frame(frame) diff --git a/src/ui/auth_ui.py b/src/ui/auth_ui.py index 7e0f3ae..88e76b7 100644 --- a/src/ui/auth_ui.py +++ b/src/ui/auth_ui.py @@ -219,4 +219,3 @@ class DogAcademyApp: def show_user_dashboard(self): """Перейти к главному меню пользователя после авторизации.""" UserApp(self.root, self) - diff --git a/src/utils.py b/src/utils.py index 4250849..f6c0b15 100644 --- a/src/utils.py +++ b/src/utils.py @@ -1,4 +1,32 @@ +import tkinter as tk + def clear_frame(frame): """Удаление всех виджетов из фрейма.""" for widget in frame.winfo_children(): widget.destroy() + +def feature_in_development(frame): + """Сообщение о том, что функционал недоступен.""" + clear_frame(frame) # Очистка фрейма перед выводом сообщения + tk.Label( + frame, + text="Этот функционал пока что недоступен, в разработке.", + bg="#403d49", # Фон сообщения + fg="#b2acc0", # Цвет текста + font=("Comic Sans MS", 16) + ).pack(expand=True) + + +def create_tooltip(widget, text): + """Создание подсказки для виджета.""" + tooltip = tk.Toplevel() + tooltip.wm_overrideredirect(True) # Отключаем рамки окна + tooltip.wm_geometry(f"+{widget.winfo_rootx() + 20}+{widget.winfo_rooty() + 20}") + label = tk.Label(tooltip, text=text, bg="#333", fg="#fff", font=("Comic Sans MS", 10), padx=5, pady=5) + label.pack() + + def hide_tooltip(event): + tooltip.destroy() + + widget.bind("", lambda event: tooltip.deiconify()) + widget.bind("", hide_tooltip) \ No newline at end of file