From 322b67e26f2132075dd0277f7f18ae2e0f728a49 Mon Sep 17 00:00:00 2001 From: cedrick2711 Date: Thu, 23 Jul 2026 21:44:35 -0400 Subject: [PATCH] retrait de page html redondantes, ajout de la modification des username et affichage des userrname au lieu des noms complets --- instance/team_tryouts.db | Bin 172032 -> 176128 bytes migrate_usernames.py | 58 ++++++++++++++++++ routes/__pycache__/auth.cpython-313.pyc | Bin 7208 -> 7207 bytes .../__pycache__/evaluations.cpython-313.pyc | Bin 13868 -> 13867 bytes routes/__pycache__/matches.cpython-313.pyc | Bin 34655 -> 34654 bytes routes/__pycache__/teams.cpython-313.pyc | Bin 19319 -> 19306 bytes routes/__pycache__/tryouts.cpython-313.pyc | Bin 28549 -> 28550 bytes routes/__pycache__/users.cpython-313.pyc | Bin 78320 -> 78317 bytes routes/auth.py | 2 +- routes/evaluations.py | 4 +- routes/matches.py | 12 ++-- routes/teams.py | 20 +++--- routes/tryouts.py | 20 +++--- routes/users.py | 40 +++++++----- templates/layouts/base.html | 4 +- templates/layouts/macros.html | 4 +- templates/pages/add_note.html | 4 +- templates/pages/contracts.html | 2 +- templates/pages/dashboard.html | 6 +- templates/pages/edit_profile.html | 8 ++- templates/pages/edit_user.html | 4 +- templates/pages/evaluate_player.html | 12 ++-- templates/pages/evaluations.html | 6 +- templates/pages/match_form.html | 8 +-- templates/pages/notes.html | 6 +- templates/pages/one_on_one.html | 8 +-- templates/pages/personal_notes.html | 6 +- templates/pages/player_personal_notes.html | 4 +- templates/pages/players_to_evaluate.html | 4 +- templates/pages/profile.html | 5 +- templates/pages/teams.html | 24 ++++---- templates/pages/tryout_form.html | 6 +- templates/pages/upload_contract.html | 2 +- templates/pages/users.html | 6 +- templates/pages/view_tryout.html | 22 +++---- 35 files changed, 188 insertions(+), 119 deletions(-) create mode 100644 migrate_usernames.py diff --git a/instance/team_tryouts.db b/instance/team_tryouts.db index d0243f90695815b6effb952a1ca39b1c79109754..1de4424f95abaaf7653d4d814049576003d0e213 100644 GIT binary patch literal 176128 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 literal 172032 zcmeFa37BNrRUR0Tu}5Y^RP~nKU8=5EU0JHiuI=qhAwg$VXH{2sEnQjJYIVnhQQ`OthGz`)1%iOnDZGa!2y5NHhc*cf4r z1_7RPZbZB--p$Tz#@WC7Kn^O*)IN{Z-c=|auaqbwc9i!K5Z*_eis~1<6 zmsXdV)ujtpml@)brcYM9y`Ak=+pryb&D`~s1Q=*{n(IvzyU}bpTgIltylrXa;?qkjCwWO) z3{>s*+8w}p{fby)ZQJN=xL6X)hOnCJTQn?`yz7-uB9RI`qqoy_8{pYRyh^xdR+rzt z8n}JX;HN+}Rv-*?%l;y>vV3WI zW%>HW`Y@-$%5rc()VylBXx()~wN;QmU61-^-K>^T&^;-=7((6}ppA zClFO0eVz>}n6K6zTISkLWXFx~)YlJzj-6DJK=F3F+awA)_FSNoc=v{lu5TZ`c=5*d zTdONeFhDRnTg`Xufb$x9{;^=p^VhH3e14hne86dDTn0k_ja`Kw%kNyq*M}-lUQ}lD z^UoenrX3H>} z0Mi6BC;Ab*Ru1%aRE<6Qe5`PhU2Yq@YwgC`UB|f{Sq@#^>8DO)&R!2%>H@n;It>&25=&Pjwv(a_-;CA!{ zO5F05K(2cSRCeDxlP3Yx`)(0-U0ZNJ6apN&m-nD85Z`d&v2NVoV}(Q?;<;J>)v=yY z2BL9sNDZR`jIm=u$tK*$SRe{TVGr-gy3a3+<)n^S#V6beDZX^{cy1!>|G8V%PLpX>V1HJ{+vWGd3TSFL* zB~g7hIc&Ih;0_ogQBO12^h5`bN-5n{Ui`XTe*VTHjeWN@!t5Fs{5${NZ%h~F=jYQO zc*N}oLVtH=f^`^Qs3{Vn2JA)+Q)YC#ciSC%ZNun#5kJSPL1sJcK%5yYZ0xikaq`EN z6V~Z$!f54o%VfuGw72|mEaAG@U4xXXc?U*G%WCgz^_UAcZd_enx{jtZ*8Y%{Vn=n| zSQnhRh4(hW0^T2@_$y%iGLAuHkrcNaV;$m&c6V*N)5g5Wt-wn%sS%}FW3Mo7l~f#G zBt$Hh7Z)@6`M1vRr5xQg9ud0P#hKTyO4J9k?SuEhe-6xHZl11v5!3G{YG0iFO!@aq zzgPTB;hXc1WHH9-|bR!|((uryAzO;t8!u_4KV zqzb$Ul{85Z1^V}HFcxc+wPt}cW$WU?e5w2 z^>f3f&kdW~Bux*Vof|TFY!R5ed9?Dvh)HRJ$!FBN@3^=0j$6%^x%|?_XSxd_ukjko z+KwzZvM2)wDyLbNZOVq#P&wPO9gUM@NfH_Y%R0ahuZn!bmK9ksMa#B$RZ#_tHx*H_ zAtBIs*)*W8%Gx65a29JSCTlhn$+R1m!!<;nw;f5-Bvt?rK_1@D^|rCWtQxzmc4rGd zPOvCaS(GlK+i^N)ZuL6N+YZB@UNM?mX8SI4t9cLpIqMFBuO5Rg7Wd#2o9z(+2H!9{ zWb-KMrF6XV{D@6)g3VTAv*UC(+qSwaH0{;x1q1ZU5>=rgOSULFl3{{EimJka7TThr zNVcHD&C3oaH5|*56;_ZHyI~r<?55fH1@0R9P@Z zQ&vUJ6h%ekLB}P7vsqTOB|+jxdU>n8y#ac8)p5Gy(*&IYl}_=-9j9~G=vf=ULCN?>^Sn`?kl4s8R1bxq|+wJZ4Wy#uA zx;HO7I}3`J^OuONdIMzZ0y?hMrhTnrkY;K)2{N7aY02y8m37~}iBZs(~ zBRl3MXzVTR@EcFRyv;tnd)IzJy1XE&nqr$u!x5m*R70^$j+G4+DHsl73F&5~d#@pyrfg~7-RLOK4$F^;Ybzsm^9L@lr&;Wvg zbe02U*T93Cw#XYp8n+-YdfC_-{o<7;*D*x%4K6H|M}ExOX=cJfG7}#1G!q<)7@rpy zwJw6sVHHu7!Duqld}~VOLzl@Xt-_L5*5xiR13x#UbJOU zDn|xiXF~X6z%|ivEKUO736*8!Mll5$z9t%+(10tZ%7J5V7@DT?wkZ)gFXChsvjo#% zxadMIoi!pDkoRIB7sbG&6Em(Gt><49mv-)S`O9to!h&ElOpMG7*#@6%H3Ua-EW;5Y zs;~r!)g%r6tFj#1PzB&XYk(~(3Pfra$BFP`Yjy($5ExV?gBLW7mpBdd$S`dPMZjHw z7Ml%QR2^0{L4hn4T2d9TR~UM1*7h?njP0CPh74>*FhCFR*ulYUfB|l(1C#oH_x4NM zR?EJ;VmF^&db<70f@)zu3MQ{YEMc<^@U#XrB!I%3lG@OC(KLVu9u$Iu+hD=9a}99W zwj^qt3XVroz&CN03Hoi=imKTTt68=pYJ?4z*DS+k1>3)^)- zN~i&rr1oE(84^I!9&`*N*h#gx^Nc9olb2h)=U#dGHowCzs4Q=*4PJ%d1)^y|7GWfY zxEj(V8-k^VA}C4&oRT8jEDs^M3JDQJID(;>w&j=*Vsbo~OamRBqp3~iv2-`#j|c{+A(EsFGU;0C z$l&IY6Jr(FhA6seJ6o`L8_N7%ywJV=Qo~+(<*DmeE-pRqEWqd}$Ra>jA)Rt>%?X$JtseP`7y8)7)gn@*Cgn@*C zgn@*Cgn@*Cgn@*Cgn@*Cgn_Sm1}d2&>G9M(dvGpuc>I@k!1sq*^ZlVzeSgRm-yhPP z?+Tg!Rvv$1tqqX0z{#EVS>c6l3huVR!`VLNRFkv8J zAYmY3AYmY3AYmY3AYmY3AYmY3;7iZILm4jJ>>8%iYWeo<9lSqt3X)n_>Gt;W9XOad zk%q_Fyel=V<@7cTU#;o`nKS9|-ssAGnZFs)zthW8!#mDc5I%kfhYT-wqAZxw5foHo|-G%$0&bi~M+QfrrZlzYc zwQvwyJ9V(?f4q-mx>n2R++H)_slVqg9zFoI4lkyvB3L;+;s%j-_{>=UhYK%TRjk_`z9U-+2|V-wv1X`^OKK$G7J`&`9p>SP_bk zFCHxWDfFt07%U*hVyZNj!F!$$g?MuwiqApuL}&TxL3bU>LA_i|--f@64f8agtb4?a?%pA3l~Uj&Elq z#4&h071#ggtIworpRWBQcmm+ZYJXOHU+qrKs;$;8)P&lbYT4@V!)(CMR6kk$w(38t zzPsA2K2v?+Z-JR7A|wnX3?vLB3?vLB3?vLB3?vLB3?vLB41Adwn9HUgNslI7<_~7m z$I|`@mWS@orcb1UlPM40mrWl}2c}LQcqp4blb)C!=Yif)g860zNs1Q6aKS%vQ`1M0a{(mfWg;KB7!2xbqJsB4c2_p-5`D zvkL_xz~pQ~ot4LY=c23OiQHlu1i@-SLEx<3t!(7C zSUA5_#`XVf?Wa?eZG{A0PF&6&Au z_G8(nGk=o#Q0DB+ug`R69!h^at*8E5>Z5NAH}xlqsdVwwsimb7r=Azs^DKLoB|n@7 zpS?dLCplzzpHbxdaU?8J>x&+^769iFc^}}Bubv^`O8uk@j_=&_qY3*1k9?~O0hj70 zT<{PN@MoZ{h?iUuh{(5tkP@-}W*402f@u8yB#(UY#<1D?aX)x~k9p`5H1C5Lz=(WV7D4Cq$9?EAR2|;3LtzHn)sK4U z(5X}N4(Mt$?^vQUE;`In2GQA|21WKNU{K5yOY|c?^mwvUObO6s{V^YU$TEff$sYOg zA?#H_(hqy+oDzToe-`Kl8Z#721$0q=lZOua9)Jt^92z>sQ~_Pk5BbnT-5BZy8amaQ z1Wtd{Ll03A^7K@_qgs=|>W{eS**H#265ySrl)K_J{b3(^i0F_C(J-j`&a3*ohaShf zgY1-X2}%_GArBpFH85E0uUC1hHSx0kpob3n?$^kW`cv7ZS`#nn4+PNtvWHZNicYmA zUeNFN(D_g|?#~mzTfS)h&FlC1&_hJ;XXJyvqv|`)=?7i(Og#S%?;fMc&gutz=&}3^ zM;$#lO|SXTLsWzsqe#e6t%+0hst-NZ*u+t-iIeq;i#`+2R-@m}jH3r9>2n@>JpT@F zn51zg>a!ktJX__c`pyY@Ie;F+RypeE!SQ;@Lys5f!8_S#%y9K0pqEG-8E^1lsm8== z^@0l?a*6x&VJy{_Shb$_z=QF{J_pt4_lcr9vPwM%;3OF<#-xQhaw(8|zVI?- zN{6yiJ>!AL^1Uo|++fA}j0+ymj997}v3x!4g6~VuA?;=c&%u8e2XBV|KHh&9{P$RY z1^)Zy{z>@n(f7cAPOid#9(w}w|8(t(@ZZ!z?Tgh9RnJvES=p(~&wYHZKKoa*ADLY$ zf2RDt@`=(XO1Ddu;*S+?7Cu+_Fy#NA&c7#rH1`X+^;|joBiZLNpUZqWqs;uy%sXce zr++4Gq%)}>K+rejN5?4ulGNq0oE!`(~)&KC$U@clRNQsVf03Le4O$FnZNbN$5 zXw@JkI!*!%(K8|I-j6*ZMzn5_5*=p&#^~{wiFUDw&gnP}Fh&p0Dg?TL#*7;61reRq zaUNiV9wTK040ydJrN33pn+V9w#IQ+3j}9qFyWT_qK@aFm(CJboj1DOfUG^pd06kW( zs?ly1(WN?01dyREPNt3!RAW-bI?e+O!Q*MWO0^|bsN*!i2t1xTQk7lh>o^NAqGkF4 z0%?g3C$NO8<0QaH@>m_JPz_0C>o^BM24(C}zb=OJ0E)FJR6A1CI!*x$!Q*wPLNy~r zspAa52z>gf5nxuKT9G2xaROij9*=XXo-0xv^ZyZeELDV;q|xT`&Cy^q?Du zKLdsp*>`|J@m^3Odg(u)2bV4;=8}2&46B^s1qLHN>Ac9El~ll>L;_girT;{Bzp$ak zsLW6_63{s>{m;T?(jXNfXGvp*;vE5<_0s=rCZ0y}RDFl3Iye0X^jN&}RDFl3Iye2# zX5vIKFi}VGVQ^jX(tnUW80vl-Rrs~}EpP>6?pXi2YYvQT;&ht8^|0FgA^q}d7REWw9Ro{8e%m2~M_(k6*IAx{| zDPz6-Kc=NpCh7p3Q%U|$;+UB3moiU>;EI?3$MlbsX*vX#z5E|j$N=ZTF_6}wlzB7+ zm%RKxF6UHD=R`06kIQ+qDne?0VK_%0xl#!2?GfO z2?GfO2?GfO2?GfO2?GfO2?GfO2?Jje2F?@iowN%S=cg$|D+1u$kk;%Ets*3bP z0jnQMEmbq!p3&(!9ZFqEW6$JA(3P3jh2~iKiQEW!Ze}lNNmEqr2{;abh%x&*bw!Rl z4Tk`vOK^wf*O5X}HC9}NV*t`6xWUq%La34;Ey7U%q-t@`stU}s0RL_6H*3EF7m}ZZfrNpCfrNpCfrNpCfrNpCfrNpCfrNpCfrNp-RSXoe>2$i5 zDU#pSOo9Ba%;d@MxtSdKJv)=lXVay0IYWMxW^(XXsfg?Und%d%+Di3*hF{4~!a%}6 z!a%}6!a%}6!a%}6!a%}6!a%~n*E|FLe5RT@^Wx#7hmS$JnM%1w*E6e~-S$qed+XE3R_^_FwTX)zrKWb8Qh*^BL+E!Z}2=2oxMyzRh~S7Qm3v4lI@ zR(rF#wO*TvK2e`%;d#XVsdO!+^lK*wQ6(VCJ9Teo-SGq^q`8uIw>yB$Km*$j>~(0~ zaX@aP+ul0MEP<@s?JitwZ*`fwP75kIXFb&Q9pAo)v8;YJDK8>W6-~taKXu@1Ubzzj z5(W|m5(W|m5(W|m5(W|m5(W|m5(W|m5(d7i86fNbmD8zOrg{*5B|ixR2?GfO2?GfO z2?GfO2?GfO2?GfO2?M}D-^4TI(}U-imNNOJb!V$bmTQ?U$FX5uw%xgXmbqrY(s6gE z<1oE80}riRxA6lk^>&y}yXABlW6NfGot4D8?9+qx($Y-sa>p@x(B^Pe9#+%=_^#vJKFU1nINRiwanX7#ba%52 zci(DmIXm0KJKgCuTg~1sv(q)!owLl9ExUQAY3~@YpxrTGtAOR;m+^*r9e5j^)9Iq@ z+r}<|Z8Xj@*PVMk(kA=|7R#-jE`DRv*aix=dcf(3QNxC>oQ=F=Rnut4Cu^F@_FsVm z_Dkva7M7N>$m40RnNGWBko^pV`q2_Rie~SS)%vd0X>MZIIYbGttDBoZ7cAamk8e8G zhOyPO;C4aSF7%DFW$hAyQCsjvU|qj=2D-S{hChG6@kl`xx4!w|5Yz z=P*{wF*>aw3OwGwJK7p>$BFK4RaHc9D}!GVutccTzL1*Bd{3(KbG2WseRS@8<$dMB zT%oj3__h40+@EE>C%ps}@aO%H&K2g59ZP@fJ9~!Na-2IxYlm>t^?j^fTv=XPU1nC7 zE?iw^dS?B20)1_h7QQn7^V$oQ!u*jV=?}h} z@IsUlG`s752y)_H-h&ZPhh3+$M&k=q)K`WS?rgW(hV9sE=B}?Kz;e6OTyJg}t+ht8 zJ#zD<^qLS`1X}_S&!=W*-$1YHi!-ZMawx%Z9LUV-E!jCGUFWlSrfj z7$BIuD=fQ+SGU^WF`3onx330nAAHqQpnj`Yt}Xk(Lsy?$xpHl3{o?X1aA4@0qUxgu2i60%+nx0_ydM3HV0Q(+=rvPb zd~Fph?$Dw12VW(cg?0kFtVX{o0ZSWQ+(V~eOHs?$=iz>`9du>e#Mg~!UH5B=6zW(T zT@jKUP@PsATomsA^7?DoVc@7Dx^dIEw>G4^J9Z7&Zx)U^M4QJ~1C7AxF6&NjZOpMx z4XB zp+2JCkIMY@W`mmPtF?!Ex<(h-<70|^9T?DvN$m<0kN3{GS_#UGv>7(~%zbqK#T(ae zt*$J==*7S&{Ei*)dP5gI7L0lR`jwl{FEgI=IL(a9&^LrT$-P}lFNN#-vHV_Xe0``p z<;B6RQej?_(yv_^4MwQ-#vP;CGE5A_nqcNcKZ4iFfi8=xu}9a96)v*pY-4w=-B`nz zF|wSTPqfx+!gz#UJJ4;;mQ5)cn_#HxcDB(g?W;%q_Bp-*N?!o0^kj{;Oj>Gk3>V0}47W4yj>OfHC$DDA|NJ7z;$9DC`V8S@-#c zv7FQqtGvh+^7G3_XoG^w`5NbbEDoN|7UmZh)2}^C`VB{DqVAB&FJSwGh zS9$U4a{2iii!}D#)(Ep}T=4Jwd%rPVn4h0df8Y_f9|-;3nF-cmn4qR%h#IgPHB6b& z?LyXSuWcAzFXHETHOMT^a=5I9X>aVbT5Ew;Calwex6-#=nkXl8WPtgowrR;$kL0|JM1vl%u=GBSJU3IP>~diTZRi zkZcz*;jYXsr}8tOPgOov`t!mM=bxGReE$B*M^fK2w=}1HnG*8+LwVBjYj1y$|sT{PpAwe1#}6HOEF#1JzO1=%i_U z7nJJd#rHpY@bxFN9tfz|{wK3`dOiXJ0fQS1MTQfj7TW&YHSl$qPQ=;7?i%_kXN-Z} zX0^dGAn%SU+1wn?97YxsFX(J_oyl+B0gnR7JWk(E7NR?BZsSbvWEmvjtzDSxoGgKW zxzk&7U>Z5@|k~huTiWW9x{dGJ!1N2 z9OprBh)Y%|{)H=-VdiJ(W^q2H{={bP8|nC)6k79t=&{4dumDYR33lTLa3^52N%!{h`7<$E9Bzx_uIf!%|KM z)^?lQ1{mn%l}7@~HCeugk_{_U<^){xic~S8#N8%5iauI}#BLtP3~p#W?bNVeyT-x= zREu1MOfzcf$Q3y74R82{sYmt!oO4eW8IwiE|2~V1$@BkTrdf`p*@S_FfrNpCfrNpC zfrNpCfrNpCfrNpCfrNoCAp@BI*DCcCy!Gz~YwxPvs6Af&eDxF6@2=jietor8`Gd;8 ztb7oPlb?ivgn@*Cgn@*Cgn@*Cgn@*Cgn@*CgaJAOr)u~r_@%?C%)!XV(gjZBc%ujV zUSJ>6sp`1$f#}Mt#%gZm%D8fkQdtxPxANS$a+Oklh4XgK zohpy9=P1=#PIj?NW9(UKWy!-nQyf<>@2C2y!dR3NwYoSK<%vA0d?=MEQY-UY?X~Vk z`|hdS2zZ8ak18v=z^Ag~%9MLlWLa{h$Q0n*0ZqEPr);oJPr|@|ZwC66NA3qF>irbH@hF_WQh|3`=E~(vDO-N>(0Ad_ zci(EaU|Se$-^5K-OuI3B$47U3QU|^a#4TX4eA_^mqrqiDeDSgBvWFD%a?lqZ`*UCtHrrD=8NsU4>UPaja5 z6zC=W*@IzWP?1Y$=D9*XUzl2TURRN$Pw7Ew_Yat z>N;ny!=oC}>d6W!rFWo&e|0WGfGT(xP}))!1sM9@zli`WOA~-)xp&Wo1h{tp(o!Xt z15Jg#0GIplus1HZ+i;xO9t50QioAb8lR1@IqV@CTQ2RHIEiKKV#pc1w7IIS&K#uit zY)W&S8XYPK8c6tRDJ%zQ!W{Gf__I<80)^4Q9KR!=8HL6K2j`mQi(v_XiP?O%SOkYr z%$3HW%DyDnlL=MUq6ZoQOZxdjlpwisv0Nw@^ZERfM~36f8zM-w8%06H_vAxzT!Stt z=d(Ewq?9ed@H>*@^;DB)n*u0A^q@jY`uSW)0MtzwZ40G*p`0(5o;)%f|K9*2IG&=L zAR>P^8f@Sd5F9Hr&=9-5eayZ8aMP-=NARkJ3n54%mrQA#bKa`4jT>qb`eJoY`6#OUoNf<~N zNEk>MNEk>MNEk>MNEk>MNEk>MNEk>M_%bqZY9^mbA1y6qE_94LZDtiuX^-4TDe;PW zDm|*a)Y{%K_O2{p{-3XYAyxaW+W%C0Pi>`k9R5gt5(W|m5(W|m5(W|m5(W|m5(W|m z5(W|m5(d6X7&w)OBsqO#X{NIG!)FpN%lxU_sPf$FSLU9`=HUsjBTKXUsCz1db&oEU zU+1Z0l!848lK`dkp{3GZ&+b7@Nn3;&fKvMKQgP2G*|4gD`G2;0ELHoK+I`jUgAd71 z!a%}6!a%}6!a%}6!a%}6!a%}6!a%~n*D3?=%+^xrGpVDePNj~VDJ`W^8C-v6hO5iB ztWMKgi-u?a&kO8%mOTqcguoA{!DsK!F1*0q-f21Z=*5S3x@*HvQH$9!D{6|koq@)W z3>!a=jn9x4H{so^?w1r!2{Z$L`h^I$+6{>8JBDc3;?7JhRa$ggETxBQ?svMwJ9b+Y zLN^D0Mz%`cI|+A+zr8OrJbzx0&Wr3>(yB1ClMXdI@8EZ%zK8Yk`?TLPP?r28 z3?vLB3?vLB3?vLB3?vLB417&6(0{xz3z2;P#?lhpZ!LeRZS8cK_7-EcH#c{-nwHUP z!e7lTX4B}w5^MJ?bJ1wEnD$POakiYzU1q!8h4*Qw*mLDzJb)jhb_BH5sTN@!1?>0SWqJL=d(mCjfgdyyY4tP(`z$#{bY1E z+qWHNz2j^dw!^?exkaQo%RJXHtX|WCYaQndP>ft+e|CZDh6BIa+uL-)cq#a10H0(M z50Yhkl9jTSSO;0V-R2z!`x9TdWug`m z#e&{tHVi1~Zo_R*IO7z7(v?u6^&g%gl6@WFte71hj6YIrqyY54WpsNCS>F#S*6pTs z8`Q1Kobfu-+GXxGK|rGZC@wCUM~kLvsvI~(-z5!8w7!}qqP=q@8X;}du{I1a&MspB zIn7OYvCAD0^C;t*Z?`wJ1IuV_j^9(Z(Olm+1O3|V?!dReYIlfngGmz&-5z#5-fnNB z-F28otGUfUb*D$sL=-UaZjONHWdDC*_MfI|%hi8gJy5wb_j_|!;LqeIVIW~3VIW~3 zVIW~3VIW~3VIX1P%f!H!HUA%PQMNEk>M_zGa)wIlO|`NhTb2X=dg z*>d2W>fQF1(OTPT_ndCshw>* z>M~i`^tFLi$s>+lv*c0-R+@UDde5y~xwf?OBJ=F>i_FQUy@(Yr-B?+^a``%5JL%rt zBD1o5X?bP&`o-m2u=WV-MAjeQ?>?)KMGsUTt<*;1kM1i_AFoAA(;MG%us*pu{6=|k zP=BZ}&vEJ345A@JiMEXntRgnIjjdjH^2#FtO_?m;LtBQGy^aZVyGwSYqLEwgHetPU zq=wj61>+dn*5*V14`yE*-O(9ES8nNp$18$1+VP)y?8B}G1q+r>U$jml%2Z2 zFh4(^eob;IBV2VKnjk5@9d6-Ph_U{2VKem9W*RmBGN^BP5%d2FJS9;5i^><~{@>Zp zlz+eUd&SQbzB&JB_S2c~nt2uF### zyud56dR{%xEj-s~KXZHecIR!YJ^t;T=QkDrajV%fmtVU0Om{)#HP{!$+KwzZ zvM2)wDyLbNZOVq#P&wPO9gUM@NfH_Y%R0ah%w6#fTUKPn6fN80RYesn-c&@zhPXiE zWz&GVDr<|J!&$7Un5@}QB-3tK4%ZNQ-gYESlUM;j1bKKn*W1Phvufu(FR$~)(0ByEyby;ZItJ@0(=$9p`LPM5pQFJ831cek;g##_L zMMIHnL4})_9ZqUEmL)5!AS-smG)i4!766}WIC=Ct>GYn3Z z1yeL-Rpd-jR74(hTrxPDWkp*OBz~lqx7ynqpqE!2r%OIf&>6X!KUGk8mR#31UUa@1u|m|*bQ<+f?udcnS+ZuYL+T)DI0 zs1|3+tRspIO;9u$%vsbd*-#8omBEM|Rb>skAxaG}$cAQc3S2dL$52erQju3Q!BS-2 zG(dAz$yPwcWKc8kj!_+IH>%^RS)L?z%ROa2Jk&ZU}qOhb@`dPJw6$}K6GiYp0nB2gyu$$kR-4 zEMk0KVAQ$@K8ICAQ3k6~1lW|R?a>RP@AP*IwbUbnoAbxelVUK_wP2E9lK*QLpSra4 z@+*S2aqZ>1Pdy_ofPt%=2?I_;7HlwXqtReNO$}AzRM=GsV>GxyPB9!%a|axtW=I@3 z0acPs)`GE0G(=XE9ffbem<9dUkSy>Cf+%xNL*#hL$843@_R;D3v3FuQMV1G2oi$I2I>??}W-Sa-*1n3||usPH4atQ-$SarD15A z%G;(yGm@Vs)hY1n7j(Hgv~a<(;Co_019tP zYD42i(*PcLPzVlgg9X>lHNa)tk_Zd7;CLhjd=qDxpx=hAsG9Atnq@1ZM%Z9^%`$9O zupNxSAm9M~lF=neK#v9ErB4S|H`<%qFj+ZdpclaaH8_*BNw3j=51cCpQU9T1=SFrh z-0t6*)QcNdyK%+owAP!OFLAwIXMqK)<{`wg9pFK6Y_nk)pzyqcT-gxh+YkvEpcg^| zq6AKc^w4Z*4i6zG40n#DfbC1r{{|-+nkqJU3kF5ow7}dN90#Pz4w#k(E*gk8Au*5~ zO@aXwtOpPzekAGgW)q&{c*?lb>^k@{f)Z+gC8_;a;g~xlfTTU>7)G#@YH{ZoQM@NF zw|dXL^7L(fhh0!v-c}pD3c(9R(}FC*NDOf`q)9deOAXk?uQb3ZDYDJ-5R$8q5J7|^ z7@BEYjtLNFt62eWb{P#~~>4!mo_VBrhEqpCunWLg@yUJ0IjXKe`U z8zV`tVW9m2?BIuprMn4#L@+=NktAi1ffM(R3~nAdF;)TGb`MjJFdZ7s{9e4!z5Y_e zUU}uI>sKx=J?|{Q=qSn1<&gK8D%`8oFicYvz|YC1qsj10fC+)2p+cHs8m6LvHt>pR zfX^^RR^>!f08N1)U4<@&+jSsn5#jz}05=5)uVuF380ZW|7#p+(PmBk?VM?&4MHM8+ z74??Uft=-;_Qn<%M;HHyV1XLwNCM{nPozGYs{NDNrRpD7KU6(e`DA6M^6=dMI;YS6 z_3Zb}UMT-z`TgaSrC%zwO4Z_z7gq{@UiglJn*ZJWyYi3ael}<3ve}PipU(VA=0lmY zGrvC5op~tz@wA@$Zvgs+{M4T)rqabzre_k#yW4z(5aic9EFNu%Bqr!N3_8nvaEk3%{HCXveRdgdf*YLaiEE^3#!hz=(!2g z32IPeuL1_eOtC~i;zN%oJH?a$UDhA-p@%F}*q`i?!3SYR(hqy+p_6GtN4Zjam13zN zyQsg(LkE2i^lHfG(0HeqDxeGcAs;#$q$1P}G<2#p37r0@haRFLgKAB@q(2Zq_sbqqAu2l6ns`CK-$Um^-MBwb08u`T8D787haMt& zKO-OX9aZ0XPCw|PXX5#H$USJXv-$xadMrP~QAZC>(`!ET5EY@uC=zm1YvNSB>O&8Q zbwTx~p;N7ill6*=J`>MYqgQ8e^x!0Y&O?vq-(iM{c2}Z4>!HW9RgS9foS>Hj=rL@S zqmCXNua`XZc#$6DWHe^DdJ)h|B#w+Xc(7DsVzqj~1&Ey|Ig2Te6BwGSF<0PT`GU3{J!#u(kDu{OO@h}6>ksl3g=$BNTE{7XA$YtFRiYzvphZ#YI0G;O55BY~)D}%A zV2=gup5!`C0F1!naZc59MXF=|KLU@Xim*sZlU(r9|7dv zpo?Dm59q-cV@=E@^YR&1Im7#2P6dxS%K{}5z!ES0C$jsMB-9v{8Hz>%I_IVT*=!si z0~i$Vh$UY7pUuS6NS>Mo>bkHNjM!oBk7Yzw8s;5N%Dt zWAMEA4%+2)O#ex23g|(X8&V-EGgN)&IWPZ5H{%z5pWu|4I;4#C^8c8YN|~qwa84!p zKZ#>vx?jpX9fB)f{vXpnQjQNmaM{cMF@+3p9vlN{9ZH!;LvYE<|KoB_)pSnu^8dJ; zQ&o}Uhxz~ARPFm~7ps3%{XliG^2?RYN^R~Z=2m7uH~SA}rSfl=@0K4feZ2Hi@r%Xp zExxtze->UXF!_I-H}jd?Kg}&?Kb!qP_GIQ0nU^!OGe10YE&ZR<-<}pyzm>YXNB&RF3`&1syY<0!7ae5xFS&(og^ErY$Fbe| z;F^aXW3&Pc$~cZC^}$sSJ*fAgaEc~7Emr_^Rv$bI=)`Rv$j6`t&XJ)EwOFF+gJ*p3 z(@T#a(PJ$s(Fa#N_;BVFT9k+iyAdQ>DX~P-2T!~3aUx>`iPlQeus*o#gAXm5gcc}i z(nl)}!t?szQUKoXK*K9#H27#Ygz%s_%RcxJ*`b@Ez*ELVfQR*^!Bal?>6d^IBsvDf z5>U*GE<6rh0dm5vMFb-VLRCyo(FYei_!v{b2p^qOk%slbk`F!}_f);-M1An22OrNV zP|lq~=>>i84IX@06Zf%Ziy&0JhgGJ**Zbh7pIt$Cs@`*)K6tAOkLg1|b3(IF6uqY` zG?9k&!CQRr)32!j2xX~>l<0%6^Wa0F>x3CZ>pf+$3E@HS&->t~A88SUYF4bQ4>S)x zp1-FoIAO!!?^Pds$ODJEg4VTEf6szhDIR=i><(F3Mu#C-0%j$9@G)X21fiN0 z3wkfP@Ntqugr}Mn3&V-%!N+n6EM?J5(V#>h2p)VW<_nntg?m<`4JWJy!wDaNpEklo z8EJYC4eJBW2OlSlB76QL?HL-@2doc1&S1z=R_pM-Ao@NB@FWF2FyUhY!8nzAnpLqH zMBis!^jI!|#b|~?4PPIeanVD1GI1*u44TqIyY<0o4?R}5QdaAbceXw_<)X*fhyoat z)jCpAAGo``55zMlm8$WoQXk+FFPW`B5X)7vl=U=}U9JysiFb$|lNp*LW>xU>?h{7n?gT-eG|FQ5t6xjSH^S%5-xu43tl>N)>Kh7>?{xI`_%o8)eIVa070>J zY_|R`7d%eL4iFSm$CCOxUGR_&?8}dE0!<~br2dKv9w#CN2+G(7C2D;az=^HQ#+005 z=h$rho(mo)WB~|Dngk_s{jLihimyUeNz)d}1fl}qV*QQ_9%tAA2&$fQLVd>rj}eCg zI91O%zTWe|V_7IIe}QIMy$j%EKB=6K(WCHWIql&eEYUk2dJG4E=+XLuC9?hwANuqY zd5966Rg-r0Z5KTkBfv$BXpJEydfSH{ntlmsP?X$%t+DRk+iGd_MuO2O^6Zg9boTCO&|L7aSEbS^<5J64G%q@Cm_4$CzsW+T|r;>(BpXmiK_1suQxpOm>NmdcZt&- zA9`rYD5OFZtrnx>Lu7{4Z5KTgPv1qVHHn&TdFY{0G^C(3ixjEWBr3Y;L!Uk&g8PSa zCTN_=y5XV6h)oflYE7b~f3pvL`guV_k4|&3MAX-O=pnbYkEtodppG7*pnsEx9?!qi zp2386IsF@b=&{CC+B2Ad&g#00J`=B3Y0qG4@D4k@?xDx?Gqk590bSK!^3Y>Mk>};zZ}*|c8a?3gT#Bv2#;zAU^mwBO96Ciq7xcGz=o9(Z>rYAH z{Zp+8Hg-MlL!W*U9MP#`lQ7!<-^2C)3)Rn5U#lLk{9gl6@lc%b8ZDGV`M|H`0F! z>;HV}Q>h*;$=Cas83qhj$gOuof%#X+Lp%FF| zD@Umef<$)+Dbf3wA$#!t$=|R;qQKLVduW)|`V3?UhwzygX%B)#yErUS^gd?FWBBPuT?C09(@BZm$6R>~ zKmD+aAkj{al<0joTdu}=)C57OdJhY&eK%bO_!#s008iC>SZM9L`EoVRMoN@EI!eY8 zPVc)3b2ZNMAOJ#}sKAExzMC-v{PbQL;i+cDg5J9+b9E-h0EX~Xvx0@zzMC@x{PZ~l z!c)x(7Fzpm(hTIp(j3}CD>N+WeK%_+-)AJb;C;8cwf_aFw< zs#u}k$FzBbK7HJS=v1R(xq2Vd<{>($O&n&ZHpQ~_KBmpC?EaA|l*~~E43)OXDnUuT zk7+ZRDz3(I^>BD1wOzH|$FzBb9^Rr8Bq~~GRN4|N$gb4;m^P2l9rPX3=8^1i1}RuYq{Pb|3~m6P;^nbK@4Ja}B_AU_1Q{vmAt}-OZsuIc#c{&`Pti&! z0Wa^S&Hx|7l>rDPy1|C^zMDG({PeRqNC72jz!JUhCeM{vyE6fV;)tUD{;2xBL!5whkd>MRq$vesweP%>Gw+xRqrvIz2(6J8-Dox zl0(&desum{ckleaT|Q9yiPB2(bH#s9lnehy;g!Oh@;{yb=KKuo|G$*|zq23AE@ply zb2~FP^CL6YVgLWPrMc86Q(a2_ulHBnJBk(QLw`_B4R$K`ZwBC}4tfBdGQ?oRdLN%$ z7-FF{fsLaG018DgEpu-L-dIOB{1AjF{m~L$L{p; z*@cnpp-3cjD>MnICWYBEKDt1%iAp?wK+DaczxjF}pIjKC$8*KBJ<5O%xj8<#FhY-! zfkLK2jR-L}$LAJC=y9BZ0LQRL_XxCG@8e?&BlJ)=?q?DiWT$DQ02`G1Zvk}T=I8Qp z93`ArPBAAe(feQLgAYv*g_8A11^|Sj@lXPz$ax=p3|9jn6qUz@^}gnV4~ZMF>YC(Qy7N^piHdS7wjb8&16Kq#XKmgs%igO4+cz-xpkMujDMU-IDNT7U<$a-Uk5i*tGg z%1AXU1%mk&n=AMV@%+~y8&5Ag-93)x;w7{vd1}+lBaAhLv&epr#13%=H3w_I#47f zx;v|pk261u7}5C=mI%5#sX=7-FLH$w;i%LUF`{Q3NV|2M(;#z@`8a2P0XS9NIj)W~ z8bk0HQ@U)NwvzB>D77DMC<{9cHa@He&=H=k!&cvZoB2Rq8mG;nEW5(9oP1 zr9&xm)(9@waVCRIKgM}15Fz0I(Vh*atZ^P=2p(fT9KoaK8A!8roW&S{$MTJo32V}9 z9p^Acv`jyJgb-9Cf+IWJ8H`*mp7Wy2hGV;|?oMC;`t-Xy;51>%Y&a>=-T4cG9&qcy zUZAK2N7+k;=&J5cU*zI!9YKuf`2{Rdba(b57w0`jh!H(&N7@}e|G%@p_5VLFen(L) z{BGf0g~#$g3+Ml3VgLWr*+0(y-R!B%uVgke)tMigc`p55(tjV$|NG6<4mB*&2ksX7 zgHye$h8NGX>RC9=N()a{`AXn$8Fvf)L5vXs-5vCz!S41z!qZj05;*|q3>@U#=?iPB0530(|ng>MMc6 z#M~|P2dCO#-~$OoBEAyPdv^;xz{es79}%J47aXeOZlNde0khi6i+VDKpRD$kfLXa) z=nqb{$K3})H7g0s%H2XwxDQAl>}eVW;b*IT4Z|TYxP_j?I|qUK0Qx?;p<0y$2b$sz zdKW!lv%$uwvQv#pf+Ll11N{&^ooKYuWuI}1Ns?L&tnmE8UF2jjUL ziE2?29I52)pFcRw)V?QS_}OZ&M1mug-2L+hr&$a2Fv8DP`%CHrcmF&du^Z5t;Fw6$ zneemKK6E%z$=yF6Q{ThSR{PMwn%w>Kae1fey9n0g?w^mTGvTM7eX_&JdG2H9a0u=c z%S~etktaJ4eMc4eN??F>pF0Qm7)~DGDI*{@tPk8B^arNOt$Z?4oB=kh58NH}2d3JC z?t`ZcumBGupu2;fzz38*+!ayd9Dq>V0hZ_kcL)7}sdg`T(uW@}@R#TVcLzPd$B6ty zKD__m2M;5lyMz9~RGEYigc4X{!}`G8L4RPXgUWsIlpzq{;aEX;2R*>Y@Mi!*@d;1@ zX65dn2l%k61iWXoy95xbS;4zM2JQ}e;67g0Qq2mU5g)ia=mCC;tsOq@sb&RFFAUrr z^aS1?-Gm3-$nX)!p_&yuy)bZh&;xvooB`Z1C2qwMec!~FjqzW;9-&j0&B^frJdgR|4C4-t2>)Vi5L$gbc!00^50x`{1W=Mjl8wk@HGq*v_-y!B1mv z9!NNm^OxxTV;+3Sz~E26`O!L%az++(x&*tS9|w4nt<1#~K4fk_;bAxQQ4f6zKkdT^ zjWWIx*bU8i=+n>8;{8*V9`d;U5f?o~bjSp#yobgZpX{*L`Y}K!v&(ZKxQX%7A6oe^ zs1^m8R{yYz9$xVYjb{|259e{dc40U4n_TpG%!D&74_$=a(1$$qpvMoXKaKZrrsYG2 zXA2&6(Wi+Vd>B-H7r~kyanUEbagVUahaMVT{3Z4N!!G(XGYdWpszySt(w_%(GKS1f zl?sjFIe4Bmx=Wx0wuC<9!A}!Z`QRxU5AfjR9}K_;{9-5wid1<3p^PC|qW2$g;p42R zz_Fy^xeM>U;N-Uc{T_Urt_AqeY@H7t_H5qg!H0|}WWclz49_q4;9<|^K@UF8AOg}; z)E-Op{s9*rGcA8e7q?v>yX0J9!^9EZsXv?BnpMDLe9_;`vLo&xZs zhaA0M^5ElX4($j4kRBcZD7x^mf_eaxUPPqFakqkyXSkfZnWKKK~X8OTT- zP9R6`=REkBnnN8<@PvV^4?ac|0*|hSl4u`op!XRMKAvLIP8h(3_5O?xJ{0hUdYa-f z!#TPqJ)SU-_QA&p>p@0J5QQc6ehT18N-_%}TEN|h8lwqM9Zh(t{;CT;&FqEm{;5jO zll}jXXV(4u|9`pCs#NBFbneFNpU!^!EMNXqxmSL$^pm9*;QYVuDxNQV8rJ_0!}I@Z zkpF*w?n3r6+1IkiGrtHR$xp&S!ax)Q{+0hYZ}CuJt6j8(1VHww`MD370Zl(BCu)+0 zeVYKt9>IXW59uj|d)oGDxG&IqcM|~F;TV7qDH08yYF7B_LU$9ubi3?)3{%YtUtQ>K z0s#0aR*HS_RJ~_mIB_=t068Hq5HbTAIaIyJHzT^60H)hz=SnZrc0#jI;@boOyX>Z) zeNh2~Hk?3-Zxg_DTM&KH)BHW0WbWGp0MdsvF?2K0+{?7h&~RU{$H3hL0Pu0TR;HY+ ziL`-Pxtjo{+k)sLho<+?ux}Fpk>2lf!qa#(a%jVetiet@+ypS%B^bwH%9K|lA~&$p z4)*{|zX#EyhVt@4M2DSrxCLN{9?K)hl$RF*x~kR54uFyDAuZg;geGFpLMSMylMMhP z+2aHWGUYHFYbaPfNKPYZv)Am)ENe=q-N?qB7;DVNHAH2YNMvzc$noSykNGo6_S(?6B2r~W$i z{ZWa~)Ys~+UX)`@Sc1=>%xd9#5!kw`7UdY`j^NS0kThGzeIcaZ$}t=*LPTo?X||5L zLdarlITS~SSc(iU5F*;ml9Kv!9{BV@H9|z^s-&cT!vmjwYXd?=hZdxye%%F+*`d)M z5W$7|H5WWaK#CC2VFi}(^{Xy;j8$HMpk#Rn&g#zsI0<%3Q*B8dc~@CwDd8fP$oexL zdK}gPgVLqguI?Ud2(kyakL*j;0V8_QMA=2%J=Ksfmgtu}^cbTWqDKd!q(oo#&|^$$%Zf$`6tP6p@kqmwM#c!_5QE|!v0WXH zG#sK&waa*{?|?yZkJzq`M;eaMW6DnPkJzsF=zl5BG1|xs#hS3hd-T6F)h=2eGZbqA zbisS{zZ7TP8)c{HJCyL=qyGeb+V~dHDf*7>dXN4C`t+#oe45~G$iudS0$R5Ls0Xo&1;5bJ2(SM?m{$Aaee+P7`HNk0& zs%xvU-d_mlRDFlT7!@D-^f?jg3}y7dc6EICf9PkXdX&<$RmxF}q+MO|p~usAsx`q$ zjG_-cG}P^5k_05A9K=XUbiqZBlcysF)tcZOM&3gYso;chMNG>gI#u7{7)H*AKK)_` zqEq!9PGQ6&0ERjf=MZQ_r;Z+Q2%~!jKq=1t4n(I~lOop7g6t$=D#Z!(0Gw(}3SY+~ z0EXZYqx!uJ_}_p#rubjV`HOf@TpdpU7)d^TijELeQ&QME9sod6y;8h5Ec`IL=O1Kk zxc|Si*Yp4Xru+`r|Nk#x{r~?feoyhO@czG73rzlB!}I?cIRAec_Wyq%douHh%*&bC znIE3Hmi|xazn5lHzme)h=lc4<-8)~4b-FLS12o!r6)e#Q?%w$t<~sha-H-JmNc31p zO7wxdcOIml-sK}mwE1EQ%s{$(=ZW+IJq@=O;d>Ay+I~sH`T+ON6ZZhpPw$oyB-(&U zi9W#1^F#PpC(HtTv;2uwl@9+(JKu$3>Mu z*Y3kVBM4RRaX}0B(0lNHrx0$9qB)dF1k$iRz)kdH_~~OQ1fl9ZE@>ZB?+-I&yv*xq*Wta2NduefqQ$F=$#3?bZjliGGL<&ff14LcX6WAx-H8 zTyVlY^dt1?m!Ls*%47m5sSj`qJqZbGu|gbylI|nAS|8vJ`XPF(2uGl#`-l$9S-63I zBzr7#rKJ0a4o5rS{`ryYvCN5*kRv**u)5plt8q4}!P`1%oByE%T$#Il9^j{+#zA*XNC>y19$s;6(_voNKf%* z01u(7yL}$ur=PO`#iXplk`jG@+viDq1LTCWoFG>eawzMt2oIb8aRdDrJ`_xbx`GBz z)q8xs;Co#7SaChbNY#5Do~e1a4?e~~1@M%}7#qg?KU@BTRP}$W?982m56Mr$K*B)6 zK*B)6K*B)6K*B)6z*jT_gJ%xbQbz_iA6euMmzKE2$~V5e-7ayud56 zdR{%xEwo=TE=>fvaH7I-@Va`{lm*3d z8iJ{rmSYH<%1MG|8>-2hnkcEJA@hpC84b&l;m9OOa5MuTCEkGrKSvb}L2@ip(hQ^F zD7I}XvcyRSD{2i<=6G8)hLT?C8m7}~8O)MxY<8QYzn*k9jb`ht)!vjO=?u$7KSd_O z#Dc8dxZ`y08a-=+;ZHx+?ima}##}lEFOXL@dcE!L`E%!5&i~)nx%9LR1aZ7yfYL8e z;VMWyG%fq^zHWsSgi4^IJR_IJBKfcv&tLxS%t|{myN2l# z)yr?w=|Qi3@G1wb_GlEx=3|tACD&&&tB{s-lTB{ zB&HxSW>gfTHM*2Z2Z-G7kiE{O7bYpPNx2}o77C+#@x!Ih)zRW6a8lALBF zC>>bMP$7aWW2qv4qh^542NyX}LOIxs#t;fZz8DmMCxBG!DIPvUF}a&H1kbR6@XZ`l zhtT!7T8LwsQiaRmsD7#%T711~7PEUQ6kDDQjInYHNEUr*#aG|o_Z$bUH@d;jWX;iS zaD2JAt?bp=81c^uULQ^OWoCEuj(gyROo5aa>~|t+p*@H;z(dSILbN#&@fm`w*)6e* ziojSa*lmr=S({8GQ;fh-Y>BTqbiff`CXAAjNu;ClXbopke7lf1adQV% tF`C1Ior#AVEZ username='{new_username}', full_name='{actual_full_name}'") + + db.session.commit() + print(f"\n[MIGRATION] Migrated {migrated} users") + print("Done! Usernames are now properly stored.") + print("Users should edit their profile to set a proper username and full name.") + +if __name__ == '__main__': + app = create_app() + migrate() \ No newline at end of file diff --git a/routes/__pycache__/auth.cpython-313.pyc b/routes/__pycache__/auth.cpython-313.pyc index e98dac6759ef4dc438618fa1dcdfe438534a6db8..d2c6525fd8589411b7bb4fbd7bd75cbddd8d66e6 100644 GIT binary patch delta 135 zcmZ2svD||9GcPX}0}$BFPRg3Hk@p7|YmqXLJ6V9+n9B^vPypg$g~`6$5BO~t+Ah%F zAb3H@cthkB9{bI1 zfq>mYy9-K28x$`HnQX|s!sD>njOQymYmo_1#bh&)6^xdX?~B;7fw)DMla)l@2v~xc cDj>oNM3_vL6SHJA-5eoyorTeSvVrt>0N_X_RsaA1 diff --git a/routes/__pycache__/evaluations.cpython-313.pyc b/routes/__pycache__/evaluations.cpython-313.pyc index 694d793e78f5a66a6507dfea31ef0aab1f26f981..fc2b429e46e7a15f9576284e3f106eac81788491 100644 GIT binary patch delta 52 zcmZ3JvpR?OGcPX}0}%MlPRd%pkylTIm7}ycwP>@Wh$<7W`b8o28=@-LMRhNV>TWI; H+bItKr#%ot delta 53 zcmZ3TvnGf4GcPX}0}%99C1q{g$g3y9#+g={lM}z$K}3~_SL33P#tl)G>!NxWMfElp IiS3jJ0KFFwxc~qF diff --git a/routes/__pycache__/matches.cpython-313.pyc b/routes/__pycache__/matches.cpython-313.pyc index c44c8886b7e333c9172db9fd4f0f233e00356ac5..886bd7864914646ca9ff6cf0ce6fe63a9f795ebc 100644 GIT binary patch delta 153 zcmccL$8@iciT5)vFBbz4Y@C;rWwVj@2tO-FX>n@N=Ii{bOrqu%+bgzLEKppou~6f> zlJO-a;|s2#n+1iefas#8)in|8kE{%0u8bep7-Z!q^D5i1Lxm?VQVtR|HrZ~m-C{=K x{EV3y*X8st$?0Ek4BX7AvQv>c>rmF_qpqu1SpqH!1#T|(7F2?;I&!Z|0szEHHV6O! delta 143 zcmccD$8^7siT5)vFBbz4G&dw=Ic?-U!q3K;R+^I&zxf)!DwC*%<$jL+919eeYb?~b zu4Hma$>f4t*k%DCD?xVai<;KgL~JGpDtp4&3zdUJO-#3YZ1+aOO%;#~P z&*vha&t*Qp$@94t_+xj*Ugr0{&hLMb-~Tdy;N){avD%%rmxX+<3k6;j3cM^7y!kKp z4rPu7j0_A73}56Xe{>U>+^3>D`JeuN>FM$l*E|A|KvR!hc zaGMw^RHrsnxFarQ~OoiM4 delta 365 zcmaDgjq&?5M&8f7yj%=G@M&UP*6NMC7F=wcX{9+i@squ{tQnIxw{dYY^6Tx?yUgc# zozM3opYLTp|H<>X75L+J#$D$3xy~POkw4%vf6(N!K(V@=b(e+wt_uZS6bia56tejb z_YP%_C5#LV4Gdr8Ci9y)PX4REU-r77;zdEl3j#_D^f#z%*W9SNL3)Sd1wOk2Y*#qk zCto)RmAlR>dy!Z60*~B`tQ8{bC09zW;ND<(fy;D54D1Ug5BxyaDJ`4-X|~04?c@00000 diff --git a/routes/__pycache__/tryouts.cpython-313.pyc b/routes/__pycache__/tryouts.cpython-313.pyc index 1515b637e8e07079b2573e7302d1c59e89f4cb19..241e54d7582d469c88330903270f34a79da4270e 100644 GIT binary patch delta 1364 zcmc(fZ%i9?7{~8-K!*rzZKQ*)U3<7y3jw#Nlou`KpIUG&ZLu^dhFe+dy0)-+1=cPK zycvSJA^Am@`DQG{0dr<0mk{IPGP1($i zqUN}yIe~w)9?-I4fR)roWpz|kMn8xarod5D9(3S59yy8A+k2a zC5hoq5u|AXi-og5A`KYDA2`gqG2+@vxK|;g6raRjIsz!e*E&}aO5)qCew4x0u0w{m zpd<*G0Gt8X0MnRtJ$K+8;ubWgQju(oV^55*!;#TraqeBnB940-3TN<|%Z6t0Jy%WV zdyvQiK&XI*xpNSl2h0K92h0P`0;U0zfGL8si2%2^?Zv(}6>hTb!E9S4TI5r0zm{m6 z>rP4Um-RtWAC&YVobH;MoIsuQFBCO_y8ku;8n$rSa)U!`aBMJN*MC)?uM3K7W|PToQ&cbQr?+V$_^)&u|C2Dj^rB%h%*x@E z7*5IIaWOnjI(E>Vw4itcs0*eTKyLbe(L4mxLqDJ>Q;6Ov212l(6nW`>`sbpNOumK4 zQv7mUw%SFj{g(eucs-mq`4o*Fdd5SVkn3AY=gI%0^}SkVi@Z$J7Sr5x|FJTodiKb+ znrd;%_HNPME!#b!-IKTXO8b19_TC(G$$il+8yoY+M$z6ob41wZ!#}+=W;la(3ru!* zM+M{T?$AY}rHp?5&6nrPPy(wx->VkLC&Vq|-#pFeDu38pUy44)uLZt9Io{BhE74wq zV+X(qNZ>;MZLP8)JrJ(|uH#Qb&!RQ{o6wZ1`q6~|ob>^cm>X;*{Zr7;0Y)s8bOg0~o`DYLkL2njyhD5SuoAJSWX_IT}AJhjE6Ce1qMR}U%cdOZp54!vC z`TaTH`}_UQ%{lkXDjHu!`c1vQn4!;9>Un?>R@^Y}tw7a55r{g2qL^?2f+@g7 zz#D)!0j~qb0jB^diny7AJk??%!ImB9iu7X3pLu1jWmnqZQw@H_;7=R+NTTg@Duvqc z9}JU1?thHTMO1D`;f7Q$u5fXc6BSO(aLKf7Y=uk8f#7W20z1d5&L+j#bf@l{1797; z)c6%HxndhzV;C>?;WbPP{-?UB|5tdusK8V@*|}E2lvb#Ev!XZ4w)(Wb{@Vbj24YGe zrUpbMAks0O#%);EydXLVTMMENyq+_6!5qPx3}a69;f-7*`+KSC8QhESDy(;+Q{L50Hrh`bUq)M5+t}8I4rbrlz&TUSn0(S} zhu$hcQBvXgRW}Xi=qkDIX+U#QL)T;Z=zS9QEujU;(zBRXJ`c-{fF?kctom=1YuCgL z@hspY@=5RG=$iCP?`d7-gBN_T)&t;)c+6E4rS90H)@YnqJbNAyK7f@E$#2Id5N+ST zlT3z6Dz(bm<;u+knprX*vKN0!-M0}v?l;MIq4gc=Hk-1|CYRU9H63!P`%ZhNu!sD} zy;J%3St+TOtDlgI8$K(_D&s0LU7R*Gz4W9)eU$>E4gxFxm5+VEfUsikHB diff --git a/routes/__pycache__/users.cpython-313.pyc b/routes/__pycache__/users.cpython-313.pyc index bcaa8dbc7b5505020bf31fefed48cad44d4e2be7..92499804006ade74b615d2a6306e6c9d1e08614c 100644 GIT binary patch delta 2498 zcmaJ@4Qx}_74Gq0oF6|YFFzQ^iA_idF0r9xp#+*zC<&~ELVy4XB#sk5+X?Yco=r@k zK_ux9)#wVnY;RRdTa{{4+KE6PB1}pJ(O5-P)IQhQ(weR+N;OKQwX~fkby~~rxeg?v zXqNoF>vPUM_q*qO=gBvxH2<8^7``_cGVY_Fb0^w5PnL)MnZB*=hVc~N0MWG2(Sd%L<^ zL3coq&sfT!a63If+(9A9VRDy`dc>&P7qKrO-xhV;zZw1Y2wM=gVx*=s)DaYS;_pU; zCWKw&sp7@3o_tVen!||>G*u(aNkjx0UgKi%s-{BFvsSQo-qTr4S z9#>nhD5gx@-f&mQ?O`^Ij8L=KLSa8|^SdLqHbDs5L?ICB5j;-OMLu&lp`93j-yt^wp7WeJl!~B40z1$!QCkeR%2 zL<=6Wxw^yGVE zXr9|$e!jLg=ZghxD zAS^|wL=X^ufslp3if6=C9YTzB))m#v)X|H^8J;O2qHPrdhrr5dz|}GYKe<#_>b&cw zE70?Qgn7_ylAY^{^{|y}-1HlWk*Q6`A)D;mysNS`zO^;MxhFXx&It+5cWB+m2IHZ+ zDSqx@-KXZ_-}OvdtK!zGgn8LvP>t3U-6Y<2rRqId|JU zEtOqWV?Pz#Poow&(RfK$6vT)V2(KZ?2)KFMkc#T{Z0q9?d(piH{PLsjH`FF}0QO{? zJ!5uq@}sAS#uN&&%9L_v&T_Y7(jfVVuY|^=`xUi5L@jm|wO!jY-+~$ws}TASO3*jm z-k@yj`d-KGHKZ0-qx*e?D|aA77DpbV)!QGb$Ygh6jg87@BI8+RJVs0)^dn3lY(xl> zQ;k^#0G38R7+Cl6Qb=g zPf{On?-4w7Sj2WRJkUVvtR1w{nwJg!9(?kZ!NaP;Vb_o=QByr+Vql{%~r{9L5YY;%D<=LR*Xs3|G>r zKR4V&dFPzY)uqHM-+#J7qjAJd4$^eCP<`;&L3!WVSJQZw=#Fq`!@^|YXfcGyy3yU~ zYydCNv?ShIN|ezITG6Yck5Imrce^w?))yD~^_Y#?hsR9RetE21O)1{IWV154u=Gq6 z24u(PY&ov{^5VbPHT0au@g>3a1AW6<6gy2^rwH_{ zKPnaUik~Pb#Q!R5)3aw3GOdfv$>X<+_EoZiZk%(qAti^|@*+pCn!qDnD}xGJtiN5Q z@ADTwy{>BUlf^g6^8#am1ix*P-x=q3PVh}iFnl;oy08%H<-LDDnNEq#y?){zIg{6y zfmhD?(gM?o_@5_|{WpHArEl0Cq=qU`wRK79S}5lol6Iek$x@69Hmp02YyQD)jU|88X?vt0ce*FAnZYKNk8O4 zr z*9e)6?KHh3Wl)sO#tUCq_aK!Lhr}&_9h8)J0lW+O-EmKMf)^+Go;cr=;P*Y3_61)+ f9=K6voZadK-!#&-5YDM|_|HY`9a*>tF6;gW&9%ay delta 2560 zcmai03v63g8RoZR*NJ00xpCZU$BC2FZssnz>no*cm&YJ!2ej!cNlDVixsGpKw|=zO ziQA?nO;fGw#3ou!w>t!51)-tB)TX_#3@L>~+C(G9dMyVWIe^$IEo@R4VyMyt1I~XP zRud3d^5=8E^Pm5G|KptNrTck*x}RtI$Yd(`4E?+~=0AGlmdRq(=MN5t!#+}FyBXeCfqN}l+B3Hiiflf7l*pc9{@{^Zx3 z9?*Bvk=RAvDYt@$oS$-#qKZB1a9Z4pun%EBg-qVjSSTtU#OE&~bR+bTXDS{ecPc8I zRxD}5CHbMaj~^HcB?NKXigoyS2w^({Ps&_11tB{80{zC%%DY_ufa2(ts8Z@tJlhrX z|bUp0j|T*f=jlNDH?HVkE%rh9J4kaRsNS*+u$|C*=>g z+uCC83a1oTDOH=4g3S}5xx5zn)s53SPsT7D7sMzZ5wiJHV^njaW)jmPc93Vcda6h0 zaD?q#wyxyERCM5UrEn?~ABuC=LEKAHTdTIAnK+1`u3eGl!|0^2ayj5iK3i^#ZN=FZLb8`ayLgDa*S02rB1TM@jW~B)j17jug4j|72q0`mC`3?ITX3`kAweQL${QbMS3vTi&a6b_ni0$hY9>uM+JX=yKi}czRz&*$ zdi5O7${Ti87+^oyyXSeD-1qie1%{m2+gr~k5AZ3oKW!dNng>(nBV#+~O_s48_Zj;o z{cju2`PTAT~rK3%` zrTaW>$G=WF<+<)R^pyBUe;M?VANPNWssR3T5R_Z_?`m1q7Z#wyTafFA{5?=kZJdIv zVYAc5oM}I97$J+nYHCw(M9~_es6<1#caN=cCUCkQ;VTH$IJaEOh+Gx^NUw%)T`N9; z)4xD?>r;r5_3l_-r9W$=NZMM)Ukw#)6ZXRYL+FQO_wEJ@2Ox zzH@#TUCfQMj-18l=2r;W&LREdTUl&@j6Ns~4V(;Q3=#gA5D1BJ(N8AEJ8A0l7hH6o zwHIE2WAZOAT+)=M>l%}Fjj8e`#o7G&iD~<^@$Lp?cb~G$r#Sk_@rz$8NpEgVZf;dJ zwN39+%scPe=L`qrqNkg63?|TP7fVrrS|&f?pS?y?r+MxJE%@c7%LlbaHK#_PCWR93 zffCt&b#S#_txr^b`-fc`y&6!Ath;fV#`(P)GY-7jvguL1s^@@3EK3`fsU*?^+dwy5**ySTqD-lb z^6-zoy=sHH*-NymfCEy_W5YmpcBuBGA3AE45V5uN7?CkCoQ^B2`HW9qdMkklmT9 z|H|@Wrj{(els>#QTRuE+KADr+%+z9W#pre=X-~KpAFW-R= ziy4SY!vJ)D>1BYQxg!{eniv5~eg@%PKxNHgG z(^JDr7qwuApma?O97HDXX`vo80})BDgBpgLOeNDZ7{M<^0~n+^;)5sMsUjwtR!2(n?1WL!dMpnzzRpfFY%?o zLP8oTh3%?!#(+1$M!X7KsM&%L$IRB~v#$y=u|O*?xopr!rH|U+0ciSTQi7$@M`uP; z=B~84Cu#1PGapihPfp%s;Ri;V-5xh|Wwo`hl$D!Py9b2q8Mfih3F#RRlozSx!22&( zPj2r>#{match.description}" if match.description else '') @@ -186,11 +186,11 @@ def api_events_for_tryout(tryout_id): team1_players = [] for p in match.participants.filter_by(team_side=1).all(): if p.player: - team1_players.append(p.player.full_name) + team1_players.append(p.player.username) team2_players = [] for p in match.participants.filter_by(team_side=2).all(): if p.player: - team2_players.append(p.player.full_name) + team2_players.append(p.player.username) if team1_players and team2_players: participants_str = f"{', '.join(team1_players)} vs {', '.join(team2_players)}" else: @@ -198,7 +198,7 @@ def api_events_for_tryout(tryout_id): else: player_names = [] for p in match.participants.all(): - player_name = p.player.full_name if p.player else 'Unknown Player' + player_name = p.player.username if p.player else 'Unknown Player' player_names.append(player_name) participants_str = ', '.join(player_names) if player_names else 'No players' @@ -295,7 +295,7 @@ def create_match(tryout_id): teams = Team.query.filter_by(tryout_id=tryout_id).all() registrations = TryoutRegistration.query.filter_by(tryout_id=tryout_id).all() all_players = [User.query.get(r.player_id) for r in registrations if User.query.get(r.player_id)] - all_players = sorted([p for p in all_players if p], key=lambda x: x.full_name) + all_players = sorted([p for p in all_players if p], key=lambda x: x.username) if request.method == 'POST': title = request.form.get('title') @@ -453,7 +453,7 @@ def edit_match(match_id): # Only show players registered for this tryout registrations = TryoutRegistration.query.filter_by(tryout_id=tryout.id).all() all_players = [User.query.get(r.player_id) for r in registrations if r.player_id] - all_players = sorted([p for p in all_players if p], key=lambda x: x.full_name) + all_players = sorted([p for p in all_players if p], key=lambda x: x.username) current_player_ids = [p.player_id for p in match.participants.all()] # Get players grouped by team side for player_vs_player matches team1_player_ids = [p.player_id for p in match.participants.filter_by(team_side=1).all()] diff --git a/routes/teams.py b/routes/teams.py index ebd1ea5..347cabe 100644 --- a/routes/teams.py +++ b/routes/teams.py @@ -34,9 +34,9 @@ def list_teams(): flash('You do not have permission to view teams.', 'danger') return redirect(url_for('main.dashboard')) - coaches = User.query.filter_by(role='coach').order_by(User.full_name).all() - managers = User.query.filter_by(role='manager').order_by(User.full_name).all() - all_players = User.query.filter_by(role='player').order_by(User.full_name).all() + coaches = User.query.filter_by(role='coach').order_by(User.username).all() + managers = User.query.filter_by(role='manager').order_by(User.username).all() + all_players = User.query.filter_by(role='player').order_by(User.username).all() return render_template('pages/teams.html', teams=teams, coaches=coaches, managers=managers, all_players=all_players, can_manage=can_manage) @@ -239,7 +239,7 @@ def add_player(team_id): # Check if player is already on this team existing = TeamPlayer.query.filter_by(player_id=player.id, org_team_id=team.id).first() if existing: - flash(f'{player.full_name} is already on {team.name}.', 'info') + flash(f'{player.username} is already on {team.name}.', 'info') return redirect(url_for('teams.list_teams')) # Add player to the team using TeamPlayer model (allows multiple teams) @@ -250,7 +250,7 @@ def add_player(team_id): ) db.session.add(tp) db.session.commit() - flash(f'{player.full_name} added to {team.name}!', 'success') + flash(f'{player.username} added to {team.name}!', 'success') return redirect(url_for('teams.list_teams')) @@ -275,12 +275,12 @@ def remove_player(team_id, player_id): tp = TeamPlayer.query.filter_by(player_id=player_id, org_team_id=team_id).first() if not tp: - flash(f'{player.full_name} is not on {team.name}.', 'danger') + flash(f'{player.username} is not on {team.name}.', 'danger') return redirect(url_for('teams.list_teams')) db.session.delete(tp) db.session.commit() - flash(f'{player.full_name} removed from {team.name}.', 'success') + flash(f'{player.username} removed from {team.name}.', 'success') return redirect(url_for('teams.list_teams')) @@ -312,7 +312,7 @@ def toggle_player_status(team_id, player_id): 'success': True, 'player_id': player_id, 'new_status': tp.status, - 'player_name': tp.player.full_name + 'player_name': tp.player.username }) @@ -379,7 +379,7 @@ def add_player_note(team_id, player_id): # Verify player belongs to this team tp = TeamPlayer.query.filter_by(player_id=player_id, org_team_id=team_id).first() if not tp: - flash(f'{player.full_name} is not on {team.name}.', 'danger') + flash(f'{player.username} is not on {team.name}.', 'danger') return redirect(url_for('teams.list_teams')) content = request.form.get('content', '').strip() @@ -392,6 +392,6 @@ def add_player_note(team_id, player_id): ) db.session.add(note) db.session.commit() - flash(f'Note added for {player.full_name}!', 'success') + flash(f'Note added for {player.username}!', 'success') return redirect(url_for('teams.list_teams')) \ No newline at end of file diff --git a/routes/tryouts.py b/routes/tryouts.py index c9fa812..e5e0723 100644 --- a/routes/tryouts.py +++ b/routes/tryouts.py @@ -73,8 +73,8 @@ def create_tryout(): return redirect(url_for('tryouts.list_tryouts')) org_teams = OrgTeam.query.order_by(OrgTeam.name).all() - managers = User.query.filter_by(role='manager', is_active_account=True).order_by(User.full_name).all() - coaches = User.query.filter_by(role='coach', is_active_account=True).order_by(User.full_name).all() + managers = User.query.filter_by(role='manager', is_active_account=True).order_by(User.username).all() + coaches = User.query.filter_by(role='coach', is_active_account=True).order_by(User.username).all() if request.method == 'POST': title = request.form.get('title') @@ -265,7 +265,7 @@ def view_tryout(tryout_id): # Only expose all_players to users who can manage players in this tryout all_players = None if can_edit: - all_players = User.query.filter_by(role='player').order_by(User.full_name).all() + all_players = User.query.filter_by(role='player').order_by(User.username).all() # Get matches for this tryout with participant info matches = Match.query.filter_by(tryout_id=tryout_id).order_by(Match.date, Match.start_time).all() @@ -275,12 +275,12 @@ def view_tryout(tryout_id): participants = { 'team1': match.team1.name if match.team1 else 'TBD', 'team2': match.team2.name if match.team2 else 'TBD', - 'team1_players': [{'name': m.player.full_name, 'position': m.position} for m in match.team1.members.all()] if match.team1 else [], - 'team2_players': [{'name': m.player.full_name, 'position': m.position} for m in match.team2.members.all()] if match.team2 else [] + 'team1_players': [{'name': m.player.username, 'position': m.position} for m in match.team1.members.all()] if match.team1 else [], + 'team2_players': [{'name': m.player.username, 'position': m.position} for m in match.team2.members.all()] if match.team2 else [] } elif match.match_type == 'player_vs_player': - team1_players = [{'name': p.player.full_name, 'position': p.position} for p in match.participants.filter_by(team_side=1).all() if p.player] - team2_players = [{'name': p.player.full_name, 'position': p.position} for p in match.participants.filter_by(team_side=2).all() if p.player] + team1_players = [{'name': p.player.username, 'position': p.position} for p in match.participants.filter_by(team_side=1).all() if p.player] + team2_players = [{'name': p.player.username, 'position': p.position} for p in match.participants.filter_by(team_side=2).all() if p.player] participants = { 'team1': 'Team 1', 'team2': 'Team 2', @@ -288,7 +288,7 @@ def view_tryout(tryout_id): 'team2_players': team2_players } else: - participants = [p.player.full_name for p in match.participants.all()] + participants = [p.player.username for p in match.participants.all()] match_data.append({ 'match': match, 'participants': participants @@ -433,7 +433,7 @@ def register_player(tryout_id): existing = TryoutRegistration.query.filter_by(tryout_id=tryout_id, player_id=player.id).first() if existing: - flash(f'{player.full_name} is already registered for this tryout.', 'info') + flash(f'{player.username} is already registered for this tryout.', 'info') return redirect(url_for('tryouts.view_tryout', tryout_id=tryout_id)) if tryout.max_players: @@ -445,7 +445,7 @@ def register_player(tryout_id): registration = TryoutRegistration(tryout_id=tryout_id, player_id=player.id) db.session.add(registration) db.session.commit() - flash(f'{player.full_name} registered for tryout!', 'success') + flash(f'{player.username} registered for tryout!', 'success') return redirect(url_for('tryouts.view_tryout', tryout_id=tryout_id)) diff --git a/routes/users.py b/routes/users.py index 87cf69e..18861b9 100644 --- a/routes/users.py +++ b/routes/users.py @@ -66,7 +66,7 @@ def list_users(): flash('Only the president can manage users.', 'danger') return redirect(url_for('main.dashboard')) - users = User.query.order_by(User.role, User.full_name).all() + users = User.query.order_by(User.role, User.username).all() return render_template('pages/users.html', users=users, roles=ROLES) @@ -124,7 +124,7 @@ def edit_user(user_id): user.password_hash = hash_password(password) db.session.commit() - flash(f'User {user.full_name} updated successfully!', 'success') + flash(f'User {user.username} updated successfully!', 'success') return redirect(url_for('users.list_users')) user_gamertags = {gt.game: {'gamertag': gt.gamertag, 'platform': gt.platform} for gt in user.gamertags} @@ -207,7 +207,7 @@ def delete_user(user_id): db.session.delete(user) db.session.commit() - flash(f'User {user.full_name} has been removed.', 'success') + flash(f'User {user.username} has been removed.', 'success') return redirect(url_for('users.list_users')) @@ -292,6 +292,7 @@ def edit_profile(): Response: Edit form or redirect to profile. """ if request.method == 'POST': + username = request.form.get('username') full_name = request.form.get('full_name') email = request.form.get('email') phone = request.form.get('phone') @@ -301,10 +302,15 @@ def edit_profile(): discord_user_id = request.form.get('discord_user_id', '').strip() league_os_profile = request.form.get('league_os_profile', '').strip() + if username != current_user.username and User.query.filter_by(username=username).first(): + flash('Username already taken.', 'danger') + return render_template('pages/edit_profile.html', user=current_user, esport_games=ESPORT_GAMES, game_platforms=GAME_PLATFORMS, user_gamertags={gt.game: {'gamertag': gt.gamertag, 'platform': gt.platform} for gt in current_user.gamertags}) + if email != current_user.email and User.query.filter_by(email=email).first(): flash('Email already in use.', 'danger') - return render_template('pages/edit_profile.html', user=current_user, esport_games=ESPORT_GAMES, game_platforms=GAME_PLATFORMS) + return render_template('pages/edit_profile.html', user=current_user, esport_games=ESPORT_GAMES, game_platforms=GAME_PLATFORMS, user_gamertags={gt.game: {'gamertag': gt.gamertag, 'platform': gt.platform} for gt in current_user.gamertags}) + current_user.username = username current_user.full_name = full_name current_user.email = email current_user.phone = phone @@ -358,13 +364,13 @@ def get_disponibilities(): if not current_user.can_manage_teams() and not current_user.can_schedule_matches(): return jsonify({'error': 'Unauthorized'}), 403 - players = User.query.filter_by(role='player', is_active_account=True).order_by(User.full_name).all() + players = User.query.filter_by(role='player', is_active_account=True).order_by(User.username).all() result = {} for player in players: disponibilities = list(player.disponibilities) result[player.id] = { - 'full_name': player.full_name, + 'username': player.username, 'disponibilities': [ { 'id': d.id, @@ -671,7 +677,7 @@ def upload_contract(): # Generate unique filename original_filename = secure_filename(file.filename) timestamp = datetime.now().strftime('%Y%m%d_%H%M%S') - stored_filename = f"{secure_filename(player.full_name)}_{timestamp}_{original_filename}" + stored_filename = f"{secure_filename(player.username)}_{timestamp}_{original_filename}" stored_filename = stored_filename.replace(' ', '_') # Save file @@ -691,7 +697,7 @@ def upload_contract(): db.session.add(contract) db.session.commit() - flash(f'Contract uploaded successfully for {player.full_name}!', 'success') + flash(f'Contract uploaded successfully for {player.username}!', 'success') return redirect(url_for('users.list_contracts')) return render_template('pages/upload_contract.html', players=players) @@ -955,13 +961,13 @@ def one_on_one(): # Send Discord notification send_discord_notification( - player_name=current_user.full_name, + player_name=current_user.username, points=points, date_str=date_str, start_time_str=start_time_str, end_time_str=end_time_str, team_name=org_team.name if org_team else None, - coach_name=coach.full_name, + coach_name=coach.username, coach_discord=coach.discord_username, coach_discord_id=coach.discord_user_id, request_id=request_obj.id @@ -1207,7 +1213,7 @@ def manage_personal_notes(): players = [] if org_team: player_ids = [tp.player_id for tp in TeamPlayer.query.filter_by(org_team_id=org_team.id).all()] - players = User.query.filter(User.id.in_(player_ids)).order_by(User.full_name).all() if player_ids else [] + players = User.query.filter(User.id.in_(player_ids)).order_by(User.username).all() if player_ids else [] if request.method == 'POST': player_id = request.form.get('player_id', type=int) @@ -1264,7 +1270,7 @@ def notes_dashboard(): players = [] if org_team: player_ids = [tp.player_id for tp in TeamPlayer.query.filter_by(org_team_id=org_team.id).all()] - players = User.query.filter(User.id.in_(player_ids)).order_by(User.full_name).all() if player_ids else [] + players = User.query.filter(User.id.in_(player_ids)).order_by(User.username).all() if player_ids else [] # Get existing team notes team_notes = [] @@ -1361,9 +1367,9 @@ def add_personal_note(): org_team = OrgTeam.query.filter_by(coach_id=current_user.id).first() if org_team: player_ids = [tp.player_id for tp in TeamPlayer.query.filter_by(org_team_id=org_team.id).all()] - players = User.query.filter(User.id.in_(player_ids)).order_by(User.full_name).all() if player_ids else [] + players = User.query.filter(User.id.in_(player_ids)).order_by(User.username).all() if player_ids else [] elif current_user.role in ['president', 'manager']: - players = User.query.filter_by(role='player').order_by(User.full_name).all() + players = User.query.filter_by(role='player').order_by(User.username).all() # Get available matches and tryouts for context matches = [] @@ -1483,7 +1489,7 @@ def add_note_from_match(match_id): participants = MatchParticipant.query.filter_by(match_id=match_id).all() participant_ids = [p.player_id for p in participants] - players = User.query.filter(User.id.in_(participant_ids)).order_by(User.full_name).all() if participant_ids else [] + players = User.query.filter(User.id.in_(participant_ids)).order_by(User.username).all() if participant_ids else [] # Get team notes for context team_notes = [] @@ -1553,9 +1559,9 @@ def add_note_from_tryout(tryout_id): # If coach, filter to only their team players; otherwise include all if org_team: team_player_ids = [tp.player_id for tp in TeamPlayer.query.filter_by(org_team_id=org_team.id).all()] - players = User.query.filter(User.id.in_(player_ids), User.id.in_(team_player_ids)).order_by(User.full_name).all() + players = User.query.filter(User.id.in_(player_ids), User.id.in_(team_player_ids)).order_by(User.username).all() else: - players = User.query.filter(User.id.in_(player_ids)).order_by(User.full_name).all() + players = User.query.filter(User.id.in_(player_ids)).order_by(User.username).all() # Get team notes for context team_notes = [] diff --git a/templates/layouts/base.html b/templates/layouts/base.html index cfb94bb..b7380b1 100644 --- a/templates/layouts/base.html +++ b/templates/layouts/base.html @@ -18,10 +18,10 @@
- {{ current_user.full_name[:2] | upper }} + {{ current_user.username[:2] | upper }}
diff --git a/templates/layouts/macros.html b/templates/layouts/macros.html index 58b51c7..c37cfea 100644 --- a/templates/layouts/macros.html +++ b/templates/layouts/macros.html @@ -43,8 +43,8 @@ {# User Avatar Macro - renders user avatar with name #} {% macro user_avatar(user, size='sm') %}
-
{{ user.full_name[:2] | upper }}
- {{ user.full_name }} +
{{ user.username[:2] | upper }}
+{{ user.username }}
{% endmacro %} diff --git a/templates/pages/add_note.html b/templates/pages/add_note.html index 859abb9..9c878e9 100644 --- a/templates/pages/add_note.html +++ b/templates/pages/add_note.html @@ -49,7 +49,7 @@ {% for player in players %} {% endfor %} @@ -98,7 +98,7 @@
{% for note in team_notes %}
- {{ note.created_at.strftime('%Y-%m-%d') }} - {{ note.coach.full_name }}: +{{ note.created_at.strftime('%Y-%m-%d') }} - {{ note.coach.username }}:

{{ note.content[:200] }}{% if note.content|length > 200 %}...{% endif %}

{% endfor %} diff --git a/templates/pages/contracts.html b/templates/pages/contracts.html index 56af425..1202bd8 100644 --- a/templates/pages/contracts.html +++ b/templates/pages/contracts.html @@ -33,7 +33,7 @@ {% for contract in contracts %} - {{ contract.player.full_name }} +{{ contract.player.username }} {{ contract.team.name if contract.team else 'N/A' }} {{ contract.original_filename }} diff --git a/templates/pages/dashboard.html b/templates/pages/dashboard.html index 3c4e91b..6ae7e90 100644 --- a/templates/pages/dashboard.html +++ b/templates/pages/dashboard.html @@ -76,7 +76,7 @@ {% for u in stats.recent_users %} - {{ u.full_name }} + {{ u.username }} {{ u.role }} {{ u.created_at.strftime('%m/%d/%Y') }} @@ -251,7 +251,7 @@ {% for e in stats.my_recent_evaluations %} - {{ e.player.full_name }} + {{ e.player.username }} {{ e.tryout.title }} {{ e.overall_score }} {{ e.created_at.strftime('%m/%d/%Y') }} @@ -365,7 +365,7 @@ {% for player, score in stats.top_players %} {{ loop.index }} - {{ player.full_name }} + {{ player.username }} {{ score }} {% endfor %} diff --git a/templates/pages/edit_profile.html b/templates/pages/edit_profile.html index 8e29578..5c95c29 100644 --- a/templates/pages/edit_profile.html +++ b/templates/pages/edit_profile.html @@ -9,16 +9,20 @@
+
+ + +
+
+
-
-
diff --git a/templates/pages/edit_user.html b/templates/pages/edit_user.html index 78f4162..38274d1 100644 --- a/templates/pages/edit_user.html +++ b/templates/pages/edit_user.html @@ -1,5 +1,5 @@ {% extends "layouts/base.html" %} -{% block title %}Edit {{ user.full_name }} - TryoutPro{% endblock %} +{% block title %}Edit {{ user.username }} - TryoutPro{% endblock %} {% block page_title %}Edit User{% endblock %} {% block breadcrumb %}Home / Users / Edit{% endblock %} @@ -11,7 +11,7 @@
- +
diff --git a/templates/pages/evaluate_player.html b/templates/pages/evaluate_player.html index da07645..b5bedfa 100644 --- a/templates/pages/evaluate_player.html +++ b/templates/pages/evaluate_player.html @@ -1,6 +1,6 @@ {% extends "layouts/base.html" %} -{% block title %}Evaluate {{ player.full_name }} - TryoutPro{% endblock %} -{% block page_title %}Evaluate {{ player.full_name }}{% endblock %} +{% block title %}Evaluate {{ player.username }} - TryoutPro{% endblock %} +{% block page_title %}Evaluate {{ player.username }}{% endblock %} {% block breadcrumb %}Home / {{ tryout.title }} / Evaluate{% endblock %} {% block content %} @@ -12,9 +12,9 @@
-
{{ player.full_name[:2] | upper }}
+
{{ player.username[:2] | upper }}
-

{{ player.full_name }}

+

{{ player.username }}

{{ player.email }} | {{ player.phone or 'No phone' }}

@@ -138,7 +138,7 @@ {% if evaluators %}
-

All Evaluations for {{ player.full_name }}

+

All Evaluations for {{ player.username }}

@@ -161,7 +161,7 @@ {% for entry in evaluators %} - + diff --git a/templates/pages/evaluations.html b/templates/pages/evaluations.html index 34b991c..bf9fccf 100644 --- a/templates/pages/evaluations.html +++ b/templates/pages/evaluations.html @@ -29,7 +29,7 @@
-

{{ data.player.full_name[:12] }}

+

{{ data.player.username[:12] }}

Avg: {{ data.avg }} / {{ data.count }} evals

@@ -73,8 +73,8 @@ {% for eval in evaluations %} - - + + diff --git a/templates/pages/match_form.html b/templates/pages/match_form.html index f2f9533..c91a832 100644 --- a/templates/pages/match_form.html +++ b/templates/pages/match_form.html @@ -141,7 +141,7 @@
{{ match.team1.name }}
    {% for member in match.team1.members %} -
  • {{ member.player.full_name if member.player else 'Unknown Player' }}{% if member.position %} {{ member.position }}{% endif %}
  • +
  • {{ member.player.username if member.player else 'Unknown Player' }}{% if member.position %} {{ member.position }}{% endif %}
  • {% else %}
  • No players assigned
  • {% endfor %} @@ -155,7 +155,7 @@
    {{ match.team2.name }}
      {% for member in match.team2.members %} -
    • {{ member.player.full_name if member.player else 'Unknown Player' }}{% if member.position %} {{ member.position }}{% endif %}
    • +
    • {{ member.player.username if member.player else 'Unknown Player' }}{% if member.position %} {{ member.position }}{% endif %}
    • {% else %}
    • No players assigned
    • {% endfor %} @@ -220,7 +220,7 @@ {% for player in all_players %} {% endfor %} @@ -388,7 +388,7 @@ var playerDataById = { player_data: { {%- for p in all_players %} - {{ p.id }}: "{{ p.full_name | escape }}", + {{ p.id }}: "{{ p.username | escape }}", {%- endfor %} } }; diff --git a/templates/pages/notes.html b/templates/pages/notes.html index c9d9c49..4237bff 100644 --- a/templates/pages/notes.html +++ b/templates/pages/notes.html @@ -49,7 +49,7 @@ @@ -144,11 +144,11 @@ {% for note in personal_notes %}
      - {{ note.player.full_name if note.player else 'Unknown Player' }} - + {{ note.player.username if note.player else 'Unknown Player' }} - {{ note.created_at.strftime('%B %d, %Y') if note.created_at else 'Unknown date' }} {{ note.content | nl2br if note.content else '' }} - From: {{ note.coach.full_name if note.coach else 'Unknown Coach' }} + From: {{ note.coach.username if note.coach else 'Unknown Coach' }} {% if note.match_id or note.team_id or note.tryout_id %}
      {% if note.match_id and note.match %} diff --git a/templates/pages/one_on_one.html b/templates/pages/one_on_one.html index 0d094cb..9fdff6e 100644 --- a/templates/pages/one_on_one.html +++ b/templates/pages/one_on_one.html @@ -18,7 +18,7 @@ {% for note in team_notes %}
      - Coach: {{ note.coach.full_name if note.coach else 'Unknown Coach' }} + Coach: {{ note.coach.username if note.coach else 'Unknown Coach' }} {{ note.content | nl2br }}
      @@ -35,7 +35,7 @@

      Personal Notes

      {% if coach %} - From: {{ coach.full_name }} + From: {{ coach.username }} {% endif %}
      @@ -43,7 +43,7 @@ {% for note in personal_notes %}
      - Note from {{ note.coach.full_name if note.coach else 'Unknown Coach' }} + Note from {{ note.coach.username if note.coach else 'Unknown Coach' }} {{ note.content | nl2br }}
      @@ -60,7 +60,7 @@

      Request One on One Session

      {% if coach %} - Coach: {{ coach.full_name }} + Coach: {{ coach.username }} {% endif %}
      diff --git a/templates/pages/personal_notes.html b/templates/pages/personal_notes.html index 35efcd0..70af4f1 100644 --- a/templates/pages/personal_notes.html +++ b/templates/pages/personal_notes.html @@ -20,7 +20,7 @@
      @@ -50,11 +50,11 @@ {% for note in personal_notes %}
      - {{ note.player.full_name if note.player else 'Unknown Player' }} - + {{ note.player.username if note.player else 'Unknown Player' }} - {{ note.created_at.strftime('%B %d, %Y') if note.created_at else 'Unknown date' }} {{ note.content | nl2br if note.content else '' }} - From: {{ note.coach.full_name if note.coach else 'Unknown Coach' }} + From: {{ note.coach.username if note.coach else 'Unknown Coach' }}
      {% endfor %}
      diff --git a/templates/pages/player_personal_notes.html b/templates/pages/player_personal_notes.html index c9a69ae..a55b0b4 100644 --- a/templates/pages/player_personal_notes.html +++ b/templates/pages/player_personal_notes.html @@ -19,7 +19,7 @@
      - Note from {{ note.coach.full_name if note.coach else 'Unknown Coach' }} + Note from {{ note.coach.username if note.coach else 'Unknown Coach' }} {{ note.content | nl2br }}
      @@ -62,7 +62,7 @@ {% for note in team_notes %}
      - Coach: {{ note.coach.full_name if note.coach else 'Unknown Coach' }} + Coach: {{ note.coach.username if note.coach else 'Unknown Coach' }} {{ note.content | nl2br }}
      diff --git a/templates/pages/players_to_evaluate.html b/templates/pages/players_to_evaluate.html index 13e5a98..6b018b0 100644 --- a/templates/pages/players_to_evaluate.html +++ b/templates/pages/players_to_evaluate.html @@ -25,8 +25,8 @@
diff --git a/templates/pages/profile.html b/templates/pages/profile.html index 8a47701..0f73799 100644 --- a/templates/pages/profile.html +++ b/templates/pages/profile.html @@ -22,9 +22,10 @@
-
{{ user.full_name[:2] | upper }}
+
{{ user.username[:2] | upper }}
-

{{ user.full_name }}

+

{{ user.username }}

+ {{ user.full_name }} {{ user.role | capitalize }}

Member since {{ user.created_at.strftime('%B %Y') }}

diff --git a/templates/pages/teams.html b/templates/pages/teams.html index 780a5e0..58bf03f 100644 --- a/templates/pages/teams.html +++ b/templates/pages/teams.html @@ -30,7 +30,7 @@
@@ -39,7 +39,7 @@
@@ -61,9 +61,9 @@
{% if team.coach %} - Coach: {{ team.coach.full_name }} + Coach: {{ team.coach.username }} {% if can_manage %} - +
{% if can_manage_team %} @@ -50,7 +50,7 @@ Edit {% if u.id != current_user.id %} - + @@ -213,8 +213,8 @@
    {% for member in team.members %}
  • -
    {{ member.player.full_name[:2] | upper }}
    - {{ member.player.full_name }} +
    {{ member.player.username[:2] | upper }}
    + {{ member.player.username }} {% if member.position %} {{ member.position }} {% endif %} @@ -231,7 +231,7 @@ {% for p in registered_players %} {% if p.id not in team.members | map(attribute='player') | map(attribute='id') | list %} - + {% endif %} {% endfor %} @@ -429,8 +429,8 @@
{% for eval in evaluations %} - - + +
{{ entry.evaluator.full_name }}{{ entry.evaluator.username }} {{ entry.eval.mecanics_score or '-' }} {{ entry.eval.cohesion_score or '-' }} {{ entry.eval.communication_score or '-' }}
{{ eval.tryout.title if eval.tryout else 'Deleted Tryout' }}{{ eval.player.full_name if eval.player else 'Deleted Player' }}{{ eval.evaluator.full_name if eval.evaluator else 'Deleted Evaluator' }}{{ eval.player.username if eval.player else 'Deleted Player' }}{{ eval.evaluator.username if eval.evaluator else 'Deleted Evaluator' }} {{ eval.mecanics_score or '-' }} {{ eval.cohesion_score or '-' }} {{ eval.communication_score or '-' }}
-
{{ entry.player.full_name[:2] | upper }}
- {{ entry.player.full_name }} +
{{ entry.player.username[:2] | upper }}
+{{ entry.player.username }}
{{ entry.player.email }}
-
{{ entry.player.full_name[:2] | upper }}
- {{ entry.player.full_name }} +
{{ entry.player.username[:2] | upper }}
+ {{ entry.player.username }}
@@ -148,7 +148,7 @@ {{ entry.player.phone or '-' }} - +
-
{{ u.full_name[:2] | upper }}
- {{ u.full_name }} +
{{ u.username[:2] | upper }}
+ {{ u.username }}
{{ u.username }}
-
{{ p.full_name[:2] | upper }}
- {{ p.full_name }} +
{{ p.username[:2] | upper }}
+ {{ p.username }}
@@ -167,7 +167,7 @@ {% if player_eval_status.get(p.id) %}Edit{% else %}Evaluate{% endif %} - +
{{ eval.player.full_name }}{{ eval.evaluator.full_name }}{{ eval.player.username }}{{ eval.evaluator.username }} {{ eval.mecanics_score or '-' }} {{ eval.cohesion_score or '-' }} {{ eval.communication_score or '-' }}