From 70ea8899e25eb84d977c08cbd7e8098d65f12ee5 Mon Sep 17 00:00:00 2001 From: DerGrumpf Date: Wed, 8 Jan 2025 11:38:31 +0100 Subject: [PATCH] Added: Student Ranking --- .gitignore | 2 +- assets/Student_list.csv | 33 ++++++++++ assets/Student_list.xlsx | Bin 0 -> 10602 bytes assets/convert.py | 42 ++++++++++++ assets/test.db | Bin 0 -> 49152 bytes main_menu.py | 13 +++- model.py | 135 +++++++++++++++++++++++++++++---------- student_ranking.py | 37 +++++++++++ test.db | Bin 36864 -> 49152 bytes view.py | 5 ++ 10 files changed, 232 insertions(+), 35 deletions(-) create mode 100644 assets/Student_list.csv create mode 100644 assets/Student_list.xlsx create mode 100644 assets/convert.py create mode 100644 assets/test.db create mode 100644 student_ranking.py diff --git a/.gitignore b/.gitignore index 0d1eaa6..0f4c902 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ # ---> ImGUI -imgui.ini +*.ini # ---> Python # Byte-compiled / optimized / DLL files diff --git a/assets/Student_list.csv b/assets/Student_list.csv new file mode 100644 index 0000000..e05d8f5 --- /dev/null +++ b/assets/Student_list.csv @@ -0,0 +1,33 @@ +First Name,Last Name,Sex,Tutorial 1,Tutorial 2,Extended Applications,Numpy & MatPlotLib,SciPy,Monte Carlo,Pandas & Seaborn,Folium +Abdalaziz,Abunjaila,Male,30.5,15,18,28,17,17,17,22 +Marleen,Adolphi,Female,29.5,15,18,32,19,0,17,24 +Aurela,Brahimi,Female,17.5,15,15.5,26,16,17,19,16 +Cam Thu,Do,Female,31,15,18,34,19,20,21.5,22 +Nova,Eib,Female,31,15,15,34,20,20,21,27 +Nele,Grundke,Female,23.5,13,16,28,20,17,21,18 +Anna,Grünewald,Female,12,14,16,29,16,15,19,9 +Yannik,Haupt,Male,18,6,14,21,13,2,9,0 +Janna,Heiny,Female,30,15,18,33,18,20,22,25 +Milena,Krieger,Female,30,15,18,33,20,20,21.5,26 +Julia,Limbach,Female,27.5,12,18,29,11,19,17.5,26 +Viktoria,Litza,Female,21.5,15,18,27,13,20,22,21 +Manthey,Leonie,Female,28.5,14,18,29,20,10,18,23 +Izabel,Mike,Female,29.5,15,15,35,11,4,19,21 +Lea,Noglik,Female,22.5,15,17,34,13,10,20,0 +Donika,Nuhiu,Female,31,13.5,18,35,14,10,17,18 +Julia,Renner,Female,27.5,10,14,0,20,17,11,20 +Fabian,Rothberger,Male,30.5,15,18,34,17,17,19,22 +Natascha,Rott,Female,29.5,12,18,32,19,20,21,26 +Isabel,Rudolf,Female,27.5,9,17,34,16,19,19,21 +Melina,Sablotny,Female,31,15,18,33,20,20,21,19 +Alea,Schleier,Female,27,14,18,34,16,18,21.5,22 +Flemming,Schur,Male,29.5,15,17,34,19,20,19,22 +Marie,Seeger,Female,27.5,15,18,32,14,9,17,22 +Lucy,Thiele,Female,27.5,15,18,27,20,17,19,18 +Lara,Troschke,Female,28.5,14,17,28,13,19,21,25 +Inga-Brit,Turschner,Female,25.5,14,18,34,20,16,19,22 +Alea,Unger,Female,30,12,18,31,20,20,21,22 +Marie,Wallbaum,Female,28.5,14,18,34,17,20,19,24 +Katharina,Walz,Female,31,15,18,31,19,19,17,24 +Xiaowei,Wang,Male,30.5,14,18,26,19,17,0,0 +Lilly-Lu,Warnken,Female,30,15,18,30,14,17,19,14 diff --git a/assets/Student_list.xlsx b/assets/Student_list.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..403425cb77c49d9d24c0c5127f0e2ca42578c502 GIT binary patch literal 10602 zcmb_?1z42r(m%q|Al+TkB`CRsba$7_vcL+ynWHb6!_U3qR{ zMtT=lkb@P-9_|1EGI~H<7$qgJ#J`iEM}Qq%fQ+`Tu8yL-ye?o{2n^)H19yZtAl_KR zonatX#8+ni55aJaB~k9`pUh-+&N zUY|2S0=% zY=Z}G57DrE00FyRjX?up8O~5E2tBrq{#O2C>{wrQCj?NH} zm5VI|;tI3p`9bubWBXgywjgJSm5!@3!b1PQOYk%8eN2vgN`hC8|-;)pZk ze=ov6J?aY0?T8=*adw45{`9He+TEWl5q|!^=XlM-AXib&3S#ve=Dgp-s)Xh*VSI}6 z?OiowB&4ew8xh7WuA&IsMJ|5Lb{D z$QAV62!EQ%-w5=lnf{$b0{^*0|6WPI{^Kuk5K;TezyEYwgfP56>&N9!tHb!7JRDnk zJbiZq3F$Ea2?-Bjb=UBP@n-Nzdg9#V=iDPt%mfYOe)ehUc)9y_%KZftA=Ki6 zSP==O==7zstcUL_D#QR|k^N2-_kb)d;o1+j6e<(Y)bEZ$Y45LAwv4IoeMr?mW3aH%F4B@u?t_`3@@mxA?{_P_Qq}VgX2*S3{ zSw&?YRP27Pw7MqPC>(Y1&&>^2k-+;6(1@GW$LbTu_riBIduC{o`zJbiS)zT%;fZfN z^m0ntsU@@T&kh%llV^d29_z`mxlj+;dw)9P7^%b&>7xZ#x5#OtpL`e-$sy0~kTgzx zC&Ac!=h<|$Ti@(ug_GVB!y_^j>WZZdL4Ic)RCEWulBjVopjh^Z`coiW!j)h%wQF}9 z)#pOcj}+1^92&>0mf7FknaCCiPT)>U?3}-S_BB=xvr_6@+|67uef-4YpRwh~ETaba zDuWPlcr-yQ_P8X zOr6x_4c?b@sr|bi#Yo|^kt~{>yO&KGhyE54UJI1#R>PHH96O~X4!r$F1Dkg}P-@PT zRGVhl=dn5Do|8<&j>3fQZ17VA=vniAo9;HPp26%PPzJy2mf#Qb-!fK!P_vB>s!ISa z(6V2i@u9Mu3PmO}Vs&Z3bSGmvnEPHw@MDp(Ouh>Wb`_Fszyc3+W@1j`lbPXuP5y+D zsq(3qqKm88e%6ya-iDN*c%z>#LgVGyR=2_ZoQGqcxETj#^Q zzhD(&P!VI=OV+ipQ~0Ck%)F z=1!D}$|)0_dQ7+xPDuCFB~yhy-0j9<4K2gk+`9!+8u@A%X+rEi<}vzJt9ZC%3j(q5PA+6fHe{5Y`pv89j zPG3dh9WE&^b&VqTI>%1USpzYlh5 zUSI+BqYS~@B|N6bO zM~C&gz-o$zY!hBuM6YXf_ku~QvEg-&%L0@&-Hvrm%_q&CWt|D;v%qf`A<@hcZRy1i zZkl_tx#3@mT4JV<*LhFAURQkbG6s65n|@Csq<-02p#RY_fl+n1EoqI>3i=D%dS9F} zM{Tv^CbHq?ddUQ$A{?S;0!qBt6Y5&zR7q8kFFFLrf>h!cN;!{_ezohybtkF?ggw_H zY@70jUH{1BeqNTpXLW^f(hr*X@a2jbtu4CMmDyR8@4kwG#ZyZug1cK10?nWZUFt=FR)`#>9yiLucChj?0e+tWlc(}cpv%J@9DhTv{P(k3O-}$X4%TSI zdOZS7sg$gOSy7`z>J^pRK*hNj1U~h-GHZ91lPD=FMApz2Gr7{OY9Niz*jq+96irP0 z#_HHpv3r-Ea|@aR1zhRYc-m zeT%a?rn6|qv{M(JxPF*D!Gt&>*|0(A1|OlD z>&aYdTc|21N*gC6Q^7~85ONJlqkhgal;;H-P@R8D;emGCjj+jY`2!5OJ7-}i35k&Iwu>wt?VX%T3l~*|0K5hQW zB@dSG1=9)HubNg!0xV!7G(Ca134Ye}KeJR=teHmhRbr>y?1NqYNichpNAUf}mKMs$ zM}R(2%M*;*nsYCs=`~X~k39)-YV)-bbG%PCy){P#pOOL~_XD4I?c;i`kDdU#?k&jg zHBs6Q+(0(2sBly@#N+)ex}zoC5!Vj5Wg1Y)FBQxN6tR1_PDRiqgXiC)TFjg z-M26ChJw1ilsq3(?M&y}?zeqW;2ndd@n=Ya2lJrUQH7O|NZ$6-a^|7j#Yp627O}JG zMd~^Oyy$7l3Kn)UkqnV{>$a^NU8LRplor?%tNxdlgBREQch`0?lnV_BsfZ27v3P<^D6qW&=05tl2Kj|y(a`%DNN2PAeOC8q{DUW6RfKA; z)%VYGYC02{Ju$gSbf!)`BI|b^guyTIrbz?FX7jckAlgy@mhRw}q>Kycx`(5Jib9i5 z=~JMLQb9k_pXZr+d(9w%Kg zF9mxbSF-fdY&|7*sS>T6&$9S|!He#Jpf{0>EAmy76+#IwBgM;&05AiS-ojJD^5l?- zpm%Ono^_*y!+kO)asy3^k@_wa6UrI1SxwRenvXOb_H?>2?ta;jr+ACoQTfRuxU{~< z(_7$>_>CU-_B^^NP9qy;Yf0t}?Xnov5|kz2Ml_&ROBkqL!k;w#&}z_(hDu3cK=WZi zvghG3?Ikn{J;_>eMyn-Yd3VgQlj$d)Z<=pn`^vs5|$494~2Cwj; z_k1r`%VvDf-wx|1R~Fa%9=3!(X2W~v0xCO>632$iksB$$|&U^b!-j%dl1 zmci2@DkrHXL^o^>yWz9Ah*V{h^u=h-$Z1Qw@i(zj)3U6x^X_w@ka{tWRk5f_f5>@TKtD5Ewcp)i=lda-QtyOvFG^?yo|waLyn57T~7P<2($v#IJr^KMoR* zgmV!C+4$>&M1&%%PNe&reGS{v(bAw7vEomB+iVl_Z{HPfDB8cHN^n#Epc$w?{psN)iejue-XLip{553X8MUZxSN zA+I(k-6=N+4H=d{`tocd9*j_n42;(Vt}+et0#Y@-W9aLl4bJ_N84;WL6iiiCd6$HH z@sk^HxKOnht;~iCQcf&WybWMPfaPET$9zAyUsW|W8dwDRfx^V?TiDE2l z=g`s39G;mJfx?1t^DMKo%R!aT5VY_**;_<&Z-RVpJ6JQ!c?Bcy<}zB&P|;-&ya)s0 zP~4rbr`5sKSoZW}kaA2>>RxW;u97F4Ief)w*#3cQ-!Zdy^OYVsQ<-n~(_YR5Cdr0a zNOk2ORNJ?fA&VmYCxs%cAMtDw+l1BH{LWJwF;-EBN~<+#(K~U0Yd8RVOx(1X8~&~N zolH5GZw8HGn^gDQH7XG4*2Fcz`bUeqqteq%n6szdl6|7E5xspW{?@b_H%n6;}AdDx!Dq2Uc;vb zG55wMol%98mf{NRA2>G7Ga3b6kPq)r8V{_yp9!JiirHF8Cw6;O(U1zRz1)@3kH1eF zDLsEvwDe`@qq?VY{BJ(;V&-U&4urFQ@upYu+N`~mjuty4Y<$Zvas#PIYkq>5q%KS- zug*XEj)^j=p5&gc7QH#;vu543UWO*l;3gU#v1E<2t{I{wtyX^eSUJ>VoB5xkOVP7nn&YTWQOMdC! z!9)F%|Xpp|Hs^Zh|KD69aI%7q!wpxr@xyV6YHOM@j`E0S!@riqr znzPgTj;??38NdIRd_erp5yt7~6AE<;i2IlH4+D4HjA`|es)`>{Lo1)Wj(MrNU6)TR z_@N+PXt-xL@JNRcCp#P4oieq~+7l3&Ny{W`c*xQdQ~0vQhWEwlzTpT!MvI&}K0KbS zzSP0=?3A%w5{1eGH?Xuk;ohgGi+e@SoAY9=MYySvlo-x>bj!sKmb!~Urd;&AcjURD zJr2^6xXAocjx7C&rOC<#GOuX7Bo%8PCtnPok(F)JCJ=VHJPRXG5`vAbRS3FSSW}fS z+8yF{Jz+8%rdYCE0=&l*SW6w5LnmGI!K5m0IPjd-dlbb0Retj-L)5NlL}XKBg*G#5 zIm+>}S@VNHFySR0q5aW2S;zv4yjR@L~+TzuKylY9l|BUiomqN%j#3vUH#$a2daUzAm1 zx{I@Hb6{6lWsGF;sI2Wx6h_pu9qeBnoH|vdWC#NZNtOo*iTsCy|JiN%xto(}Z09mr zNqEjl>08W#wH)L!}9ay>%7sC%79jqk_PL~iojZcT{9RWz?TxAfo?>*-Uua6wOe&M~q0dHz6yib>J94^64hX;8+vpuo1 z3B`6OJ{!E`+_&5O20S)OI4gcpOT{L?slJl=t)8pl(X6uYth=@oUYx)8aNxpzQ)WhC${a3gA{0NWUzKj*pfJ{)c<4kG5NW1*Jl@ip9XS5Eoj7AhTJgpAp*^*Om|q_m_3D4pgCrVBfA=Fngr!B z7!RR$g8FBV$;3hne7xkef87 zZ?)1sKXi~?qESCxUJyb+W7URjNY7@u5RdNjO zvP^lKloN5cAB^~1uvU6u!2hnXf}d3ogehk@=Zw5}IF8a3!P?m#$kN6=k%Vc)YK^&S zoi^YhnZd5I0!tov#==(u?9vWo0{=m2_Vga5OD_z>r!OA0$2Q!6O zF(vrS%yUQm^RE`Iidru7D@Ap$1Y^`^XZKiuB2TRu)=Eh#Es{6 zcG2V$w(PS9n|#Y>Y^tX;r-M=U?E?##!QxFZtmJ!u)OPZ-t_i2Qa*QD`#@k)8t+_7? zZ4y{2Ph!XhY((v*QYipSHOcoU9#bAa!aeVKAy6zYK z!G9owj_^&=j28#F-2Kg`QgTbPK{R+@Q)!|ZHTfsU`krM(>!N+wyddGilfYUJsFtF} z7#e<^R3F2WHyX8qoqUX)jBEdm{?zu;Ze4+YKbBIuT2v|{^GhZJ2PIht0F>g$rGUyr zLVh+i{^h38_^$0)+6IGFG%1;#m=@2m;yZd%CH%~ZFBxy#Oka`*u6D3kM{D7Zrb!)= zPv39Ps-qHUQs4}$D0RWb&ZP;=$GfL1Do*@73VR_yu_Hx-L|;Nm-v+tjYj9m)XkDP{ z4HY|ujlns~$n^Cgg*A-Ww8B~*$`3+{bI9xr+Le1b3wzf72^211I_X30Tf48ARXFWJ zC~?kqKQZYAIkrlZ%N&Xe`fa3=kTMG3(k*d=?{XK)EsYXQlv5}T#FZ8o&@9&CkXl~K z@v;kKbCTTSTP%(CM^|4kN@h?nE#$*^aKOwY7(r84S3dvc1xqIeu3ZR$&8BJ=t5OC- z9ohNLaFfE9cLB9hwu()g1_4$vK1MP)1Rl}jaHL>(WcGi&(3FLH01Oq9>v0IWi` z-*?zZ5emWv9ST#$Umh=_LkM z=;X;X5fjsj64EwMG!SWdqwCJbK|;2IMNziFU-Mytz-y(a5z(AdR5VU6D4+?V@hsAy zW9Q1|q_NcH6ek`D!ww88XT?gAFvjm;o<8npakidj%2ft6nrl6hC7R456@KPxJh42y=Jd~T&V?3HB^ zKZTfgWJr$$Y#(^bK!Uks;*_nRa_yVmEjb&}Rx`-l*6l%GQa5q?-2$3e`59khuq5k5 za38D%tVf;F-+n>3HLJ8dz4)c3;l_y}$>dCUz?LNLWb8@S1yeC?xZA9{WchwX(Ol2v z*rEH#>Jn4voyAg_xXPe<-WNGjlN!?j4@Z3BW=&vUJlMK}QF?3Z*OpF%g_jh}e7Jqr zF0?H+P0@VVQs9dgt(6{Y85i@DG`;r+-W{7B2#hBbhrl&XcTVICnqC%Q`PiOvb_q3= z7Nl_Srrh5#UFW5N*VKraors$;)y^!w*lwVyd<-Os+!C46_s~GBq$|@7+FS4Q`!{E0 zJO=7s7-^04CLZoSme}4tlS4x>(}RrMoFF}LO1vDHOh|WQl$CQIM?_F15dzWmWV^?XJG+}`$D5LxDmM^S-M>GThRB9~x_)y;?K*+$=OO+= zw<8X^{d79wFW~Q6+E+kC85D5=5vkd=2KROF^-k#(><5?$>-T-r>lCgxw*I0}iSvWP zpKY$|(CfW}zo1cw-aJC`zv(1gr*pl|{uiA*MA`j%)%`m9dhPfxG%;e|`X~CImE`O2 z>jl)m;OdAy@2^|lt8(gf{Pj)pU-&$V>-g_m=IaEmC*gk)2&ef@;I}EcrV1*e>U(wc P1{Y6nAa literal 0 HcmV?d00001 diff --git a/assets/convert.py b/assets/convert.py new file mode 100644 index 0000000..4ce3dd4 --- /dev/null +++ b/assets/convert.py @@ -0,0 +1,42 @@ +import pandas as pd +import pprint +import sys +sys.path.append('..') +from model import * + +df = pd.read_csv("Student_list.csv") +courses = { + 'Tutorial 1': 31, + 'Tutorial 2': 15, + 'Extended Applications': 18, + 'Numpy & MatPlotLib': 35, + 'SciPy': 20, + 'Monte Carlo': 20, + 'Pandas & Seaborn': 22, + 'Folium': 27 + } + +# Create Class +clas = Class.create(name='WiSe 24/25') +#print(clas.id) + +# Create Courses +for k, v in courses.items(): + Lecture.create(title=k, points=v, class_id=clas.id) + #print(l.title, l.points, l.class_id, l.id) + +for index, row in df.iterrows(): + s = Student.create( + prename=row["First Name"], + surname=row["Last Name"], + sex=row["Sex"], + class_id=clas.id + ) + + for title, points in list(row.to_dict().items())[3:]: + Submission.create( + student_id=s.id, + lecture_id=Lecture.select().where(Lecture.title == title), + points=points + ) + diff --git a/assets/test.db b/assets/test.db new file mode 100644 index 0000000000000000000000000000000000000000..b29087fab36b46af642e8102a9b8569c49cb7f32 GIT binary patch literal 49152 zcmeHw3z!^LnRfNHs_U9$GMP-SovsBk0fw&Xx^)mq69x#mK@te}&`Fx4$z&!@W`G1Q zG{j}W71s-jt0=21D2f8&1;q;>UQk3pK~Qm5L{?T@kYzz(<$uq24iL!c`Q7K)XP>=P zKk$8%nfIKkde5c4?>*J0)*ip2J>DvxH9EGvIbND7% zfB7HqnZ17Q@+0aPJm(S%f7SFe6=#RN-FD2!%}b0U^n3A(^pi4>GLSNmGLSNmGLSNm zGVs5Sfl*EEix*@%J?)Xrt@CzHY~0@7xwAbwvSGNjX?$X=wV}QF)nAsDt{G~q8!9hb zb>z@V<;tsn*b7}LuU@tHpDN{rl~?Pk42-H>4!CoCVsmR`{51#Ex*qUVwCsR;{dM5N zBa3R^f(4m9YsZ@#hg+|n^s7Iq;xOwPN30ln{mHjCS8&1WhK?RuQ(m=tU3t|BD^`?` zTeECsW6jCs=eFx9Zyp8u0alxC0n>%;17UTaezOK1mhY~Htf6FRcMw;7OmGX&=HA|0atXb%X;lN%rq8E?-e*mrX zx|e?C5@ap=A8Nr@YIK$B-%U-ZJj28RRU{H_hb&uBO?TZ!X ze&-rz#Hl+|?MLk!@Qd`5GLSNmGLSNmGLSNmGLSNmGLSNmGLSNmGVq_zzyVrO>CcoJ zM~x1*C$`U)<*Q**jXcj&i^{N z1W&pzZH^6(PM4xleUj{7C@OtGuiex>ZkHSvBykYd@y09lLNIE1ToT4Udkm zXm50-mDj=`j-y;riBV|iyzv&EhuU0j?AS5f-qak&6Hz;-Nz3_BHK`q#Eh-C8Zr#NA z=vccsT=pF)*o#81c3|dpU~j$@T#dpg(b1Ng^N`}a=sf5A-g(mbC+AV;5&RjX1%oLc(Gm~Q`o6D6-Z2iAn z+N?O=cK*gW#aU=SZ-3K%r+uou(E7dgRqJBwcx#^dTk}ii9&@ER(|FYQv~jMn)Nu5l z>DTJR`eHp_`a$W#s385M45SRC45SRC45SRC45SRa!a!73mASL~ON|xn;o)5eub5ch z92?oz8ab-9y*b?4cWtIVh$k~+->=SBmD#<$rN&9^=IFVt_WI_?mX+N~RD)_%4d$uJ z{9YVsd2@VgbF4kmT;Ckt-TgQLo&b%#V6Lk4%|)q|DAGcS;f>9S?UR(MMnN1^=cr0= zA4)ZbTg?+jwzS5&m#BGuSgY4(&Rq9eb1}LUTqc* z#!hiXbF8^;Y!s!owYnb<%YOAR_WDt%pB0+ev}@hgc58T&B2}*%fb*H4f)ybu*0x%c zTvjqzulZ3__xsSieQ2hmhFjaWw@0?D-L!RLOx{q*VB*)JuwI)Xu7{Ba{BWz?orGjC z_WWu!2zynfpW3N4jHX?S?FL52M|O3iAsNKdVN?xk(@~6F)3Tk-jjiD|6Prhe&+1+% zsE2hws`cQaSWjBj9B+c{=9tyE%d)TQ|1GKw&pB{5Yt4 zkv~ySb({GD(L>2E8Z>lA1pShhn|&$kCDZw&tpdt?h~Kr&kT@kzcPms?tOK zq19Y9x@EY%ty_tBupUPBYTdJO6vo1`-Hf`G?e3i}9!$boweANN1}*PFBja0JyH>Pt zf?fMvJQznw5QKrr`VbCuVtX4c@nToD-OcW&7bUf@p41Ew$0imcZbf_h#^$E2-3x_r zy;k!B9oNJPt!xit>w@JN@{@G(c#sYCn(vixD0YI!Hb+L9$F$nr`&~R(t4FmYscNi= z&>K!hk@mJ@niD(5IC|`kTSr>wHitKNzal^I(8K*Aim@wN zg%N)A*u==@$(qRvF{5~c1(fMwWk%0w4z)LSKSnjE<9e!jH0xC0mo~ST*KM6Ra176k4s31_tYnt&3qZa zit`2MM(5Mcwa&+!E1fHx_d1t3mpFTzw>i6=31^41%{dDdq@R?5l!26il!26il!26i zl!26il!26il!26i|H}-pmG&|-^O>2)%v@&XFf*H(S}IPZ4e;k+Fy|GS)>&UR;u({xUCPH2WMabu#t~ z_OtfC*uTN9fCoPE80t^IfQhwRJkciETN7uj#I&$ZuVZ?jwW z2K!`tt-aDd+HTl~+M#`jJz%@`T)WSnY8!UJddd2O^^EnT^|;Y~bH-D~Z;W3WKQ(@2+--cz_`2~W<3{5; zvex>hICtq3_Y(qMxIW>Ra`ueu}^kaNqe7{^_m|#<4v>CQ z22uu622uu622uw8%NZ!dz!g<%2V9^3wOWc?n&-`%iTY7_XKypVQ#MSPuxAu-LJWOjJscP_b7M2 z#cfa875$=A@-OsrDDR&QZ_YiZlm7j3;Aa@UN_hasU#NGYe-N)U%%*|4M z$lX2M{eZi>x%)nM-{bBs?!L=hzw#aKzRlgYxVw|PZ*q4BceitQ8*?+2Z*cc@?!Ly| zSGl{DyRUHfW$tcau21SQv z$&QhI6SMXXvZG{2$ZjV)Om-XDv&puZwYHMoLiQ}OEwY=*ZX&ypY?E2@OtKruo zvZs+fmFy{GPiEFQiR^l^Cz3sZ>^ib*$*v)LJhS?7WLJ}2MRq0G6=au_J(lb;W=qGA zJ(}!MWQWKeNp>mOBgi(G)s~Pwoa`IP9!B;JWDg~~m~5R{H6a_5jmU;%1F|);K3R|1 zVwLP6WCzI}O!gqM2a;Vxc7WN!Lb3;t-Jk4!WdDM!OSVFG0kios+4*GWk)2C+4%yjc zXOZn^HaC-OAK4jXd&y2G+e3C5*{RHCr;v5X+GH)VCRu~5PWI1T|L6JtRV@F%+xdty z>MX$<0Dg(=e2;yCy}$LG^&RBWXIqC_x_Q6(VY6ipBD?*Dafz|Un63XxzaH7=;ks73 z*ZDW71y?w2XR%}0KSOT+R(rKwww|_bM<%}63ay;^ee-hj4D$fw#;&rgWF{6tsr-IGdcnDcBD{892{gX3w(z*}4^Z{2A6E=8NW?=4Ix3vy9C8CgXhL zNW;<}&_9aI*DL+8bcgc+XILR6?pEbW`UThv` z_9HLy9j zJM)X?1?Dny8nXJUjqOIHzodUhe>bvjxAfc6=dowvXPpb2)Z#0X51Na zX4sG0UxJ=;ihZEt_!GK7bq&E3ltR61@a2%0y%|rfvob!Lavlm zNEXnzETAeR3ltTS1ququ0(pgGft*6JKvwxZ6(dzZ3^qhh28Xj~Cc6;cF> z3Mm2wg%p9jLW)36Aw?jo+(pGm5YV_FpeiH?6crK#3JM7Vd4&XloN@b{g%T$cy0FBE5szP!=Q6V{?ppYDpS4a-XDI^DE zm7Ay-sR0^S15}07fTBWbKtUljAg_=bkW)wv$ST)SF%knbE(WLyi2+50#DIcAVnALY zF(9XWoL}3=s2FJh8rK3;g|vX8LRvsUAuS-UkQR_rNDIg+e@n$k3edO|peiH<6cv&J z3JOU9d4;5aoI+ASR(THQk~2`DI}1mqP`0&)r|0a@izDn>$p#)SY? zAt9iskPuK%NC?O)Bn0G?i}fkc2ji2ykg0kRtzoHPK9Gys(}fFfxC1=0ZWqygke1IV7j;3NTPBmt--0Tf9B zD3An@CkY@&5g@`|IbnWpIyx0l>TdbrT;}r{|l7<=PCWqQTm_t z8Jx0zjk14ruk61-*?*q0{~Tri*+mRa$-hR)ze>q}aj)b*Psx9dlK*Ul!72CGDEC(> z_b*cJU)U@6&r$B5<&XNa1YM)lU!~N)NU48;Qvdv3sehI~@lSBd{8h^QibI&r7$KGyUX`W}U!>YG#JO(Y`L&m6atg*k5!JdF$#H#dm z{TSrL&zJ5meWr9tX>;lD(k$&+?OyHE+Qr&N?J#Yo`i%Mm^*Z(K>Y3`H>Wt#k#qSqC zQQTA9P+VN>Ej(5DUg4TT2c0%4^yGh+|8D;3{CWAc`Gxsh?vdOrx%cHpb4zpcvd?6H zko{zKPj*9gake+}ROZgiRhjcMCuY2iiOYHY$K6s?GMP-nQYCL$z}6jp9lL$FX9-YI z-*;0Ufbe#Ru;#V|s33Vc1VGieR*l`w0+gRCt0}I>Nf5i61Slsxr#PwOcI%2?K1x;+`Qu zMJW++z+S%Lo-RNIOL{o$g#$`Y6QI20#UD7FABS<`o+?0H*z&-;=bj=!S;_k`P*W9e zyr>VH3=r5dmxSHfit2%1_uZ3teTFtmcKT85dv$NodInM(hPuR?q(U$o*WD9Eg~c9e zg+V>8h3*LgR4}BVT2c)ncbx#qyIAB$ahSMk1xQX>v13EZUuB&R6=mqF+rAwXSd@@ipHuQUJxO(i)^sHa-3EMXOC4Na4=R7)^@C+^|= zV47NzgS-US_C^6JW~Cs^Tj2XJ0g_K!H8!?9_YDG+mrkWMY{wRO?x6ydlg{6@u!bG5 z+{FTvElSTRU^|9Y>HvWyP1hi)W5Md?h6 zn+`gi8wyZiitM~G86@?Z8wikmqVkhk9QbZcfO7JhVvK^s^#w?NFT|#0)p}g<00K>_ zbTY%MkiDSlR(VB5IhU9y;@EQ!5g=9Cygs6VBz6Y{s5n*1fQPN168B&Ml21)2h>f}2 zg9Io)M^=+puVEuD_do%X)8r+77{~4+0m@46x!CY8smB8Y0AW5aE{VI(=U(L1F#Rs% z^%XSf?HPQcFSrK?ken^guh($;`wNhKhQb^cd4ap10Lj_HHhlpm^1l$Ed_~3?`u!xdK#>3}$RahR~@NxN`(Z#uh-4SFeWdYypzZ z=Kx{bv?y?A36P8}fNBUb!%9CuU@I?S3mDvB!q}b3E6Qn-0S{0W^J3NQ6Cl}46%At2 zPyEQ8AwaSr2oQqpsOt6#kZh&`2zTOI-JLE#c}cVfP#B@-E$U$)wUNs$IYgn)z8w%) zZ0Y9*?le)MoGt8`hch~kNA46}UsjtbJ7|pX%d5JM0I8BGDH@E? z4ZXNxGmzGh-Ee@3tJwR{wM0eot`&#qHlAw=P`)fZr2xae?ivCl?^-c#UYOl=0g{sy z`dZqpV{znWCNpn_KlmXPwvhGR4sAr$bE3f?BjFmkG*n1xjpygra& z(E|&%V_-!kD8!g(uXn*59h1r2D#A z`gQ5crT3LaO2?Ec+Kbu)+6~$s?F=o^rm4SGzolNK?p9Aw4^d0SM~h!AexUfK;_@PH z4uyvcHy17|Y%LsG=*|Boe@Fhx{JHt#^9Mq<_(kq>xp(Ha3CxW!E6GfSCnJ><&~M`_M`{A`O@+n*o7hA^}(vdB98=Ye0qdkhOqF1ZK)u zV<->G(LjeX0ktu+J8QrO*mM~!FEWC@F05gDW!Be3O3)|kYp4qmPCa%zA}8pR1ti$n zxE^?jBFHDKM~ZZzSKilfK)(jMM841~ ziGXoH4;yTw6-B}@T_(jQ*q;|t1Wt=GhD>9+d}!jW$k;d8?TB1qx=dF@T~U~@X-^~z z)8)M@3mbODAI-L@}Y^nuoGk_9g#0g&q^m+%xBnIdZ0rIgW8xr z*@PBWW86L6jz}DOWa?rvh?_BDZ?_{dhaPz+!%pu^Fzblap-0}ypetgCxE+x@^vEZ) zAV3q~rY@3)9{Ft`z|PxjVxjCI)98_RvcN|tLkoz!p+~03;u@iKRl|XfNE~`5o6u^w zVL%7&h|FP{d_t?mRZQM)N2CtZe^x*enugp#v{^phoc9V8Njl22$*5PW1C z9i$R0dz+fyH|N3uJtQvZkjN#dDw*;KR5eK0a6&dgsH|ko3!Cj@L;DE#PUI6T?V38- z0QF+rW^r7F*EmHM-J(WBkq}tlCP4Bq4RHjPzudP9kZe5;HPt-iFz#CfNFJnl9#;0M z?wbWDFL^mTYO3N67P{vPki3^c_Q&BC?PeggF(td?Kx7*D$eN(a_Vf=cyMTobGDUh9 zfU*Rcr*a;vPir_5T{}TAjdVS6&*dlPsM2nTz7M&`Jx74#WL15ZuDcTgB-6EVI4?lI zcgF=tJ|;2NLg+U;1xPmiC#v zlKvSyi~b2b%YT{?8B_2)`8V~C=wo;yeScjkJzTmO-zz`6G*p_e{Xx55yB@3mO&low zqzt4Cqzt4Cqzt4C{7+`Uy--B@Wlf@w)**b=NbeD$epwce0fj6C;bcd|`ej*q1XPSD z7fF-|_RF$hAE+>)xf@Dv3D)I7tubHSH)aDUhGd5nOT_x~Qv z^CZb64v4i6Jlxq4A^%)CUF?aoDh{}XCkAunBNF0Rz}8#N5-6ECRv&~c5MzbD(-J6| z%mWmjOk-;#n*~aiQUZl+naN(81WHa<0I85&<3@p!cd`Ia??mxHrwJ7Dq`8x=#~}j> zS&e7%8t2Hwu{z#nhrW%jxIv&~k|I!$*_fVkhCs<#gPLAtS9-cY$z&eXg?9onrTjF3 zl6NvFXi*Ik>!|`IXAN>3q(`@Nia^OEMH~^8h4o73WT2o}%#qGxP~)l|di6=Xs@Zb7 z@YGk#))m$Zl)RGxL;Bx|0#%ee22zK@7Dw#naDqU|>B3v{e75kkPN3wS3{qkpkIi=0 z3Y45Kw#3esRo4iVyp#EOooNCs@pz!n$!0I9UqE+q*_@3|%bs!W9LH;%C40^jSBeK- o@WfJQwLr-`nTIQ2isLGQlFwuwm}PVJN`aDzJy>Rr5-4c@59Bc`i~s-t literal 0 HcmV?d00001 diff --git a/main_menu.py b/main_menu.py index a9a4e19..4a1f8f2 100644 --- a/main_menu.py +++ b/main_menu.py @@ -6,12 +6,20 @@ class MainMenu: def __init__(self): super().__init__() + self.new = False + self.new_text = str() + def __call__(self): + if self.new: + self.create_new_file() + with imgui.begin_main_menu_bar() as main_menu_bar: if main_menu_bar: with imgui.begin_menu("File", True) as file_menu: if file_menu.opened: - imgui.menu_item("New", " ", False, True) + new, _ = imgui.menu_item("New", " ", False, True) + if new: + self.new = True imgui.menu_item("Open", " ", False, True) imgui.menu_item("Save", " ", False, True) imgui.menu_item("Save as", " ", False, True) @@ -24,3 +32,6 @@ class MainMenu: clicked, _ = imgui.menu_item(l.name.title(), None, False, True) if clicked: return l + + def create_new_file(self): + pass diff --git a/model.py b/model.py index 4040768..56aa96d 100644 --- a/model.py +++ b/model.py @@ -1,7 +1,11 @@ from peewee import * from datetime import datetime -db = SqliteDatabase('test.db') +import json +from typing import TextIO +from pathlib import Path + +db = SqliteDatabase(None, autoconnect=False) class BaseModel(Model): class Meta: @@ -30,39 +34,59 @@ class Submission(BaseModel): points = FloatField() created_at = DateTimeField(default=datetime.now) -db.connect() -db.create_tables([Class, Student, Lecture, Submission]) - -if __name__ == "__main__": - '''import random - # Generate Test Data - class1 = Class.create(name="WiSe 22/23") - class2 = Class.create(name="WiSe 23/24") - class3 = Class.create(name="WiSe 24/25") - - phil = Student.create(prename="Phil", surname="Keier", sex="Male", class_id=class1.id) - calvin = Student.create(prename="Calvin", surname="Brandt", sex="Male", class_id=class2.id) - nova = Student.create(prename="Nova", surname="Eib", sex="Female", class_id=class1.id) - kathi = Student.create(prename="Katharina", surname="Walz", sex="Female", class_id=class3.id) - victoria = Student.create(prename="Victoria", surname="Möller", sex="Female", class_id=class3.id) - - lec1 = Lecture.create(title="Tutorial 1", points=30, class_id=class1.id) - lec2 = Lecture.create(title="Tutorial 1", points=30, class_id=class3.id) - lec3 = Lecture.create(title="Tutorial 2", points=20, class_id=class1.id) - lec4 = Lecture.create(title="Tutorial 2", points=20, class_id=class2.id) - lec5 = Lecture.create(title="Extended Applications", points=44, class_id=class1.id) - - sub1_phil = Submission.create(student_id=phil.id, lecture_id=lec1.id, points=random.randint(0, lec1.points)) - sub2_phil = Submission.create(student_id=phil.id, lecture_id=lec3.id, points=random.randint(0, lec3.points)) - sub3_phil = Submission.create(student_id=phil.id, lecture_id=lec5.id, points=random.randint(0, lec5.points)) - sub1_nova = Submission.create(student_id=nova.id, lecture_id=lec1.id, points=random.randint(0, lec1.points)) - sub2_nova = Submission.create(student_id=nova.id, lecture_id=lec3.id, points=random.randint(0, lec3.points)) - sub1_kathi = Submission.create(student_id=kathi.id, lecture_id=lec3.id, points=random.randint(0, lec3.points)) - sub1_vici = Submission.create(student_id=victoria.id, lecture_id=lec2.id, points=random.randint(0, lec2.points))''' +def load_from_json(fp: Path) -> None: + ''' + Rebuilding Database from a given json + ''' + with open(fp, "r") as file: + data = json.load(file) + for c_k, c_v in data.items(): + Class.create( + name=c_k, + id=c_v["DB ID"], + created_at=c_v["Date"] + ) + #print(f"KLASSE = {c.id} {c.name} ({c.created_at})") + + for student in c_v["Students"]: + Student.create( + id=student["DB ID"], + created_at=student["Date"], + prename=student["First Name"], + surname=student["Last Name"], + sex=student["Sex"], + class_id=c_v["DB ID"] + ) + #print(f"STUDENT = {s.id}. {s.prename} {s.surname} {s.sex} ({s.created_at}) Klasse: {s.class_id}") + + for submission in student["Submissions"]: + Submission.create( + id=submission["DB ID"], + created_at=submission["Date"], + points=submission["Points"], + lecture_id=submission["Lecture ID"], + student_id=student["DB ID"] + ) + #print(f"SUBMISSION = {sub.id}. {sub.points} Lecture: {sub.lecture_id} Student: {sub.student_id} ({sub.created_at})") + + for lecture in c_v["Lectures"]: + Lecture.create( + id=lecture["DB ID"], + created_at=lecture["Date"], + title=lecture["Title"], + points=lecture["Points"], + class_id=c_v["DB ID"] + ) + #print(f"LECTURE = {l.id}. {l.title} {l.points} ({l.created_at}) Klasse: {l.class_id}") + +def dump_to_json(fp: Path, indent=None) -> None: + ''' + Dump existing Database to Json + ''' classes = Class.select() d = {c.name: { - "DB ID": c.id, + "DB ID": int(c.id), "Date": c.created_at.isoformat(), "Students": [ { @@ -96,5 +120,50 @@ if __name__ == "__main__": for c in classes } - import json - print(json.dumps(d)) + with open(fp, "w") as file: + json.dump(d, file, indent=indent) + +db.init('test.db') +db.connect() +db.create_tables([Class, Student, Lecture, Submission]) + +def main(): + import random + # Generate Test Data + class1 = Class.create(name="WiSe 22/23") + class2 = Class.create(name="WiSe 23/24") + class3 = Class.create(name="WiSe 24/25") + + phil = Student.create(prename="Phil", surname="Keier", sex="Male", class_id=class1.id) + calvin = Student.create(prename="Calvin", surname="Brandt", sex="Male", class_id=class2.id) + nova = Student.create(prename="Nova", surname="Eib", sex="Female", class_id=class1.id) + kathi = Student.create(prename="Katharina", surname="Walz", sex="Female", class_id=class3.id) + victoria = Student.create(prename="Victoria", surname="Möller", sex="Female", class_id=class3.id) + + lec1 = Lecture.create(title="Tutorial 1", points=30, class_id=class1.id) + lec2 = Lecture.create(title="Tutorial 1", points=30, class_id=class3.id) + lec3 = Lecture.create(title="Tutorial 2", points=20, class_id=class1.id) + lec4 = Lecture.create(title="Tutorial 2", points=20, class_id=class2.id) + lec5 = Lecture.create(title="Extended Applications", points=44, class_id=class1.id) + + sub1_phil = Submission.create(student_id=phil.id, lecture_id=lec1.id, points=random.randint(0, lec1.points)) + sub2_phil = Submission.create(student_id=phil.id, lecture_id=lec3.id, points=random.randint(0, lec3.points)) + sub3_phil = Submission.create(student_id=phil.id, lecture_id=lec5.id, points=random.randint(0, lec5.points)) + sub1_nova = Submission.create(student_id=nova.id, lecture_id=lec1.id, points=random.randint(0, lec1.points)) + sub2_nova = Submission.create(student_id=nova.id, lecture_id=lec3.id, points=random.randint(0, lec3.points)) + sub1_kathi = Submission.create(student_id=kathi.id, lecture_id=lec3.id, points=random.randint(0, lec3.points)) + sub1_vici = Submission.create(student_id=victoria.id, lecture_id=lec2.id, points=random.randint(0, lec2.points)) + + return + fp = Path().cwd()/"Test.json" + dump_to_json(fp) + db.close() + db.init("Test.db") + db.connect() + db.create_tables([Class, Student, Lecture, Submission]) + load_from_json(fp) + + +if __name__ == "__main__": + # main() + dump_to_json(Path().cwd()/"TEST.json") diff --git a/student_ranking.py b/student_ranking.py new file mode 100644 index 0000000..e8e9e1a --- /dev/null +++ b/student_ranking.py @@ -0,0 +1,37 @@ +import imgui +import numpy as np + +from model import * + +class StudentRanking: + def __init__(self): + super().__init__() + + def __call__(self): + students = Student.select().where(Student.class_id == 1) + lectures = Lecture.select().where(Lecture.class_id == 1) + + overall_points = sum([l.points for l in lectures]) + + ranking = list() + avg = list() + for s in students: + rank = sum([sub.points for sub in Submission.select().where(Submission.student_id == s.id)])/overall_points + ranking.append((f"{s.prename} {s.surname}", rank)) + avg.append(rank) + ranking = sorted(ranking, key=lambda x: x[1], reverse=True) + avg = sum(avg)/len(avg) + + flag = True + + with imgui.begin("Student Ranking", False, imgui.WINDOW_NO_MOVE | imgui.WINDOW_NO_RESIZE | imgui.WINDOW_NO_COLLAPSE): + for n, rank in enumerate(ranking, start=1): + if rank[1] < avg and flag: + imgui.separator() + flag = False + + imgui.text(f"{n}. {rank[0]} {rank[1]:.1%}") + + imgui.separator() + imgui.text(f"Average: {avg:.1%}") + diff --git a/test.db b/test.db index f80bd51879fd882ffbc475487fd80fa2707b8aa8..b29087fab36b46af642e8102a9b8569c49cb7f32 100644 GIT binary patch literal 49152 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 delta 1201 zcmaKr&r1|x7{}k4cV@>C+-KL?WYcWbgMzC&?~nNv5lm5s%nXXWI^==_lh(3HbXoB) zD5P75pt^MlA?R#>Kwtz4Q5QX=hw5M#554cKrPWI?40HHA-+AWqerIV3FFn;Cp3I>> zgpmEHa!yBmuV$V@Cx&GNAK)b{uNDhUXpLY44Mfw)^?HT!8g;2d-7$xZIlMyI86vN7 zPPiMA5&e*4HOiHwLrKU+v_q2CC{vLvWHj)*iefzzx)H3y3%C!Lq5D~}0J>+c+^O}p zs;WuX;T{R9Mh*>VT6E)HbD@#MX@wrwRWuJ>?z2%WY5ORxgae;AUR6Jcp8b_g`mqxC zgCGn?wZF1SzZ!Np@jJ8c-A1qv-(VYdU~jcJ^B$@Owl&klnx-4_5z9xcV{F@9aw5Nv z;2k`H6x{s2IJhtQmTy|^00~U^B3zd$Q?da;lVtg@Kv8D>GqaERdxRmM^Dwj)IbRkX`llk+F zcz(7yDfUsH4WoqcaZLpGl4q-xumUdODOCR4)=t^E#Yt-Naie) zhz}*|za?6rBlrk!;4$2VD=-YY5V@Og4Ouy)i6)tPkLsna7kD8X%C#W_cPJq@^u2J% zY(p4#sv*bY?w}~HW@{0)+f3`vf6e7WqcbS_YRjDp${ None: io = imgui.get_io() @@ -29,11 +30,15 @@ class GrapherLayout: super().__init__() self.student_graph = StudentGraph() + self.student_ranking = StudentRanking() def __call__(self): set_layout((1, 0.4), (0, 0.02)) self.student_graph() + set_layout((0.3, 0.6), (0, 0.42)) + self.student_ranking() + class EditorLayout: def __init__(self): super().__init__()