From 5e909014f896bb758fc16223bcfee7d06e718fcb Mon Sep 17 00:00:00 2001 From: cedrick2711 Date: Wed, 22 Jul 2026 22:19:58 -0400 Subject: [PATCH] changement de l'affichage des tryouts et des matchs --- __pycache__/app.cpython-313.pyc | Bin 7111 -> 7171 bytes app.py | 4 +- instance/team_tryouts.db | Bin 167936 -> 172032 bytes routes/__pycache__/auth.cpython-313.pyc | Bin 7214 -> 7208 bytes .../__pycache__/evaluations.cpython-313.pyc | Bin 11156 -> 13688 bytes routes/__pycache__/tryouts.cpython-313.pyc | Bin 27151 -> 26952 bytes routes/auth.py | 2 +- routes/evaluations.py | 65 ++- routes/tryouts.py | 80 ++-- static/css/style.css | 144 +++++++ templates/pages/evaluations.html | 57 ++- templates/pages/profile.html | 22 +- templates/pages/tryouts.html | 139 ++++--- templates/pages/view_tryout.html | 386 +++++++++--------- 14 files changed, 573 insertions(+), 326 deletions(-) diff --git a/__pycache__/app.cpython-313.pyc b/__pycache__/app.cpython-313.pyc index fad2d4931c145cc99304cf210a9249d327b7800f..f62c93dd08c96215dd0869e8ddf8c452d3a79a1f 100644 GIT binary patch delta 253 zcmX?Z-fY45nU|M~0SFiu#AQi}OyrYbWSOYm!Du^igWBW?to#$N3s0WF$tllc<-x#E zBoQMTWDHV`3SuNS8!@h8QrAhgiU}=FEh>(2PE9GwjB&|NF3nBND=CgCNlnbvEh(zZ zF9mWo-({Z8&6+6A$iOhUjNf$fS$-Z~y{zJt)SS$+BE7uSlF6(2?Ijg5N=gcft@QPi zQ}R$`H^1V~V`K_o-5ez-&B-V=xlF2+smOXVo3sH}3D8|YQyGe@Cp$>{N=QzUoMF2{ b{j#9ZbwP`Zf)w>ly1#K@2+8;2xDCpVXb%TYy-M!I$g4P1d4JHllmsl)5a5At+6-fXM001T7 BI>!J2 diff --git a/app.py b/app.py index 29b0c62..6d029a9 100644 --- a/app.py +++ b/app.py @@ -88,7 +88,7 @@ def create_app(): response.headers['X-Content-Type-Options'] = 'nosniff' response.headers['X-Frame-Options'] = 'DENY' response.headers['X-XSS-Protection'] = '1; mode=block' - response.headers['Content-Security-Policy'] = "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline' https://cdnjs.cloudflare.com; font-src 'self' https://cdnjs.cloudflare.com; img-src 'self' data:; connect-src 'self'; frame-ancestors 'none';" + response.headers['Content-Security-Policy'] = "default-src 'self'; script-src 'self' 'unsafe-inline' https://cdn.jsdelivr.net; style-src 'self' 'unsafe-inline' https://cdnjs.cloudflare.com https://cdn.jsdelivr.net; font-src 'self' https://cdnjs.cloudflare.com; img-src 'self' data:; connect-src 'self'; frame-ancestors 'none';" response.headers['Strict-Transport-Security'] = 'max-age=31536000; includeSubDomains' return response @@ -133,5 +133,5 @@ def create_app(): if __name__ == '__main__': app = create_app() # Debug mode should only be enabled via environment variable for security - debug_mode = os.environ.get('FLASK_DEBUG', 'false').lower() == 'true' + debug_mode = os.getenv('FLASK_DEBUG', 'false').lower() == 'true' app.run(debug=debug_mode, host='0.0.0.0', port=5000) \ No newline at end of file diff --git a/instance/team_tryouts.db b/instance/team_tryouts.db index 0fa567a3117882cda6df54a4b30a5275be6183b1..e42e0f7dfdace535c0401b1b2f8ce74487fd89a3 100644 GIT binary patch literal 172032 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 D=GeCY literal 167936 zcmeFa378vKejf-lZgc}6b+sglA~;PBMTtk28?)x|lkUN~crj z>h)CW^u<&vbrS!^uc!YxFO29#8*R?YCTj&pf$MSX^34f6FKOW^>(f?wRY`X20Fp?D^hSFWkDceCJaA z&hq)Im+HQP`ZMKH+pb@^e&^EVOSkIRZ``S0fA#9sQ}uGG-`(kK_g5IDTkGbI(`A(o zZ&eD5Cr_r|UvY)na=N|Frn$bd+37pI;HO$Zv|!mT((PWq)iJF#mT*>Qv+r#7>vt}F z?9ThILC_;d(%5_5LSD2lZ8c+ z_on5uNbUuFv%lT*DiFAn^sTD}F8zVqhb>)%lHR#;?UD~X^zAFRu3THb^?Lo~ORv|T zY1=N|3pZ|Ex^nqCefNx~7boktF1>K+)}`wgF5Rwg_n?81*N@vHaCN7uT1>ntJ0um4MQZzuZNq`tAO@ug$~lWIH{p+ukCp_h?=9 zYl$3cSlfjEBC-Rjv)-{>&*5vYQG@j&n{mT@du2p-Z{k3x-K?$ybkgR@w}DFfW_Q); zuS_`hX}tf(`)u`Tos9M%Y`>b!N)hCa?FjY&p4zI9iD#_#8Y z&FZ^qm$vmZHj=K1BtD)3bj~(Spm?j(YrASO@fXkp;=;7a;p~Cs3pcLczH@6C0iwRW z*?wyqE@R~RCxX>qy?*89tC#9i%R5z{ltJh(+d%zTev_VjKWQR$KEL?#@pP)aX*+NC z-dab5UNN`(9rv?q&XX2f;r(s4FuYwVEXs2F{VU@TK%v9DXSUbPW*abV7?&GPg5Q+` zZ5?&RE^WSRe6r1*l}>BrzT@1DR0%YBx4+VFBMOkO479hiX){VDCK77%?Je>Jdr}3z z{Y-8kU^RaCH*6FOi@KhE|EA08SZVBbZ>zJ}p70v|Z7INP^fkM1JN^M9Z~4POu6GAa zc0VuQCFT3qV z2D3tey4yEbd%;h+Knn)Tc4&Y%Snhpq72=^LST?qgWEvcC%r_ zy8|y^j72?Fr>bWfcwEY4|EqHO#TzGC?0dDj%&zdk&-qV%JY85^TuguC6J9&G^!Mgw zSVw$ec994*U^iNrGPBpa-|5;bYi4hnXY+yB*7iC&PX26e#yXu1L@TdZ zW*cs;v+2(sU9Q``6?Amk_Yfs5tFw*%(D@rTu3lQc?leI`({q59&s;_VUq1u<`zgYe^rC%t1vGDczC$m4F`Hs1l zF&gld{Tg1b)KZ6sH=j6h`fzDkKVE6PIf_{d`XM`8{pUqNRkY`|=lNq-R_*(5*wYeTC!^Ef@mtHVC#--^CHJ7LQAzo$|c8?r2)=6GHfI6*nhsiy_5F7VHb>hl73M%5Hv z=5KYZyH3A;)z#orFLb*7P2`&+&}&Nq?rg2!-|9Vo_UuT>JH0cjt7k`5pB+`V;Z{9- zd11ul(n&CR^JwL@F_ZEPlh*y$-{x00UwXZB?e%NdH*OwN6jir5N8?mZ7937!nVi%z zHBmI37B4kLwWaVaTahK66CD9;n7qxYBCp9r9DXEJrCGyxDBorr6Xi zTN7GZ)3zjyS0z)Bc}+6~$Ce#Umid+-HXVI*JJ&nrTK$f>v)<`$;_VEJ5}U;fD&Eo`>s+ss=CRUmMoi^#S6OaD4MOQP*mPAMGN0G zMP0Q7D57Jlnr2Iq&M9K6$!ivVCqcI@D7IAKFTW=qvM+g5nnhElg| zo--A})LQs4Cy&^?-Pu}$US4&ap8IZwPLW9`cjKPZy>IrdH8A;66YXJc_D6VEmqb|P zE)t5i<$`4vLr+DLt8H_me!knezqyWgGyDlG{v>^Q%Xu5j zuc8mt^K6>n&M(1ph`Z27H8rWq;f0dVoR_EOEX>gN_M2?Ws!S6+}rc&Dal3Z^YVb4*L+ZOb-c)0SZKCdXNh z1z#y@Iy6(a1<7_a%V|kYi_;X7YuOfv*EtEQ?1&Cn~O{2NhzB_uD9Kv<^Kis%_|pIU%#xr_|{FedH2O* zh)I&dE1caD70uyn6^1H9Qx!0USR~>9jtcFDH$sUO|D+u4lpfcG|(^DmoM`Ay};H@LU1L-!=p;uSzk zHat{|YjS2wkR{xo)-(keDWbHl^G&NMH!YR39n*yW({#bqTTMlfHQs@NBZX;6rYx>C_n>b9|NP@&Ut6Vz(xcE%mhzTh6l3&2KbQ<%vt{HCsqq5zHiAaCE(C z+sJfPSruiZU;-#3pDs1wg+y5t6vcw7m>jY(s04g?%M^K2QkqR%2q&cY7`U_6+1T=Q zpdY~iGdY8j&3KK$yBRmQ9a=g&wu|wo%B)^of5pCe;qsN%n^Ifo-MnTWlVsSi!;5^= zRwcwNL~=N0wTWcQ7LiVAoQBp`1mp-XY+e*B_*qSANdoeIZzCvSCRma* zcyDe*fZOdM$1sMSRg1gUYxb45-csJUD4AUE#ojR_%%UV{xNnE@X#vuq8-$)t6IN(R z4&o|rT5!+`{#Zz)5Kc5?NS4$>N(7$>&O`(x4n(Of6DTccSqu3PdQ6TY!L_z{lUK%)UZX_&we~t?EWHhUh+u%7B8kIHx|TXJym{orL%{#=pQ@Dc|AVz>Q?;M0{c!CEYTs3R zw)U;H&(wBm>$R2It=grUR{Q1JKd=2p?Jtv#B(H>lgn@*Cgn@*Cgn@*Cgn@*Cgn@*C zgn@*CuXF|~nIq}R&^>o>A#-^0Nk8EGpw)aI)T-};Qt^F|7knS2dEW=I?E4^;d>{B? zIrBt%Gr5{elv@*UA{MffuqUHfCT zKVSPlYFhPYtKVKbUj4q>KdJuL+RN2{U;B@>17GRwo7`W*K*B)6K*B)6K*B)6K*B)6 zK*B)6K*GT90|Sp`_;kBxHl6i#-@3hn4`-f3rxr8a)3tmD4rWfI@i^P`n;Ko^^w&(^ zRnqBxgtS^S8f&P z;?ZiJz-cq=KYPDRC~1gpQ}Gz{VUZ!UcFoWNcEA*uUCGi@|P>$Sg|T!TX|yPH*k6KN*G8O zNEk>MNEk>MNEk>MNEk>MNErA7z`&8kd@B6}pE`K4(>LqFq!(%0SS7w<78c#6Hderc<1edrNfb^OG^0~hceJuY@} zyT3EN$m-ayT=>w#xaRaysuq3(3cc3*YqYnE)jReOt~q-=RhxP6%)4m4vwrL#)%M)M zs{ipmx2J2Zo87xBCZ76x<-*|uxa#o9RCV(3mG6ps=6bzG#m^nAOdj?1Kf}Ay+I;20 zi7Ku*@!X@8z^w-^8{Pe>3NAc*;?Tm(qg>PHSXa8rtIc+=)9N2vz}2Tuq!z+F_%613 zPtB8fCsOkh>AmMUS4j9WN|%lwocFce^a5(P!zKFt@q^{b?RgJ0y7#tJMDg*H2g`m6 zrckv+2WWZ|viM z`_UWgsJUVU2R5oM`0N-)#g%1dv|_kJRr}G}=WF-zCV3?c zBn%`BBn%`BBn%`BBn%`BBn%`BBn%`BBn-?lAY}_F9_QOF2j=nXre)f5QM;02cV0o$ zp3M|ehtsLj@?=UrAAPNeO(Kua6;cn=wHIy+ImTr&r$}iCLYD;v!Ct+a+2~&hg2d7M zf425RsoF2reyH{z3 z{O8P{$VhYlWbW;`C)0mB{dG7t@N*vwH^#HYR670KbIZ%cJg+~`aro~H=f3b!^nHvR z<&bewSL7)WnpVk=jc0u5To9e#6S|orbH(PyaG8@k3q z7j)ypK6Eu8JFo2xJ@Q~8Vn$Gn;~sjB4kYw9qp&yh$U}czbj3I}MTf9{^pFZM??3WD z9T#0TmZs>C-LH}1TZuT9$i;{}nZ+%Uj1NuGLqvyeg(*8z-v!Y)>O)rpvh%@4W}-)) zCgRF27&$K39H=drNhm>T-xMmNV zqWkBW`p#>{VIO)d-rcjfW)8U;)oVQELk}9~9(5-Agiseg`p)ylq7OY*t8#38 z=Zwdu=<&Q*^ucq~s+?*(Izm3TugMPMsl+8@Dx2>PQWoW zl9P;weCV+vAIH>4PBacq(c|emj`CvhE*J-<=t3wx5(8nDiNVx&jx%aL^f+-9hl(-k zMM6BJWk*c=_tfVr;n0G$pepNr8t?F2`)5>057`Q67p9wO~8RR(Eq=Y`L)cqX5_hlI=3@- zDE))!m2^7wc>?_aUef`9T$Wb?4i6vweY;2wRU8r=Z7wPu%Q_tZ$YnyB5Xvl==+XA# z);k>laMAt3hTIAhJ=$OhU7HR706j=W$U2$m(H2AK>U03WMGvIT!OEEE(I!La@^kYXhg?!3h zQWd&+rm7?OP~U$H9#rj6T})b{lPtH|26g?%;ISOL%5v{dXydcZMmU#MkrBW@DtFgwC)fs(0G+&t~E{c3?1!iRzv9{9SZE z@8QZK!v-)IL5b>}_WZN4QVn1*t;yf>2YOJ!_vFLqu=HqMr4oaB{_YGC&|^3;U@)wS zN(}1ykI?60%FfVtpsNP;{U_)_;|!@k^Zpr07|<1iI{#zzu#)U0)c^*=nouGe)cc>v zzW?z{6&MU_qIwPL{!e5N2^$)MiPU#sFszA6-2T5Cv12&`KroDnO5Fax2OhB0Jxb27 zC4i6m|0D2t%Far`Bz@ffAA`s6zJOpv4wPta|KF3`PfO@VSgOwG|3i^5xZw5wvvINk zKrrpd-~Z3f_^UvNl_@#XjQst7tm6+v>+rBWL(jEnRYceP#IyALf3fOp&lc$NL#gFzrq?&SeW%N~mRID{`7v~5?m^JJqU+D*#?T9M zyF&A#C_Rhq09-NVcfXd?W$qL<0Z5l{hvf%J!HJS|659ZzOSr+(ZbD!LNYPJXD**S> z;;xr!s_H)fU#$K8RPDEGzft>DoC5eSYd>52aeR@y5(W|m5(W|m5(W|m5(W|m5(W|m z5(W|m5(W|m{y;HM$fncjTBhj!t!4`D-^yIx{kt%ibN|lIW%Jo|DP7LEe@b&Xd@2=b z{y$UYQnfqPzm7l2D`6mEAYmY3AYmY3AYmY3AYmY3AYmY3AYs5|V35r$q)xwn_~_v! zbUMB5>+5&AJDu%*@AeOW@A?mauhnmNHtSoR?QVVj#1DV(Tifj|r*1p-$)0qRzmpky zUc0neUvIB&I_=Gst!`(v>-2iH3?7n-cqX3bRb3uDIaf(74Kk;X9zINRV1v7f2zR<| zbG=t@b-MNbnp1C?>+AKNv+h{^dfzcO&eUIQudda5ciZ@W-MQzi*SiiR>^kq4f(fMovD~E zVV<15tuAoufZuYk)}ejRfz)QNvw5bz3`w^-J$%{O?A7l(>$u1{6WGgd%G5+sKa-4u z2=HhWNB#fQfke3z1`-Am1`-Am1`-Am1`-Am1`-Am1`-Am1`-Cok{NL4|0}0bwM_LO z{v@x2frNpCfrNpCfrNpCfrNpCfrNpCfrJ4tFlf>qa_Ql#%gdSk@~X4hcc*LXn~q~+ zUbfS{d!~NP#KduLyX(~ZojM*`x9-v#O!ao_-OjqxtDBp4z2DvL^+#XQl=Oz#cY0^) zuK}Qrd2{z-tJ~@I*35RdzO`;z&IVORKi%p&r_J^TRlI>~&COMSo~hpfOx;>@Hrl;@ zccn}UbmV3)IX+06Tx6#4fueUdy?XA(BZui^k?fy=EyJxOCXX;lr?e@L4y=`JbyK7>Z zfaTDS>4y4UoJQw#dnEgox#PmNT4(ClowxgLo%kOn%dPDm{bIx10tK6Wa5`qxwDFTO z(RVECa`gUs8cLMGJJ?{ql>SsLl+Chw`mHymrt+-zI8T?pGl+c=xnjw>)}3*89j_4}vM#QhFFfCF6RPV=9s z-$J8rG##vB=(w%DO+bC8Zmm0JcYTC{$NP82O9SpXjOG@3F?zR14JAUQ_FJiH>YY^O z@6~>y_PK@UE1xb87Ye0gg`dp*dg0r$$J0NSdIy)JQlEKpp|H5Ll>U}a^v&kFdX zw_R>}zPHs2w=ON;xm3TieE#aCy04)AOu5vy>sPMdxpeu`t@`yFck09I)xzS@qv`io zT|hE~mCX(;VfwBXfSZ0Ffp-1Xt5;9e%cV|tb;Z3fRNJK7>X_Er3bPQ)KVWEgE`98d zE2H--vIECnfiYaf{oT28?GjbCy=6yz{mQK?*OqU+UVr)0>-A^a_DQ<*g&VgnUAcUn zzI(s{D{V(vIy7F{8pM~tj@OdCu!cUZsbbla=#O>=#v)n0ct%?&IITE2DR z#pPSi2(o-KKzpy>!Lpn^Tu4wWTV{XF!@_>UAuL*6#K0oSd(-k+B=-Wi0yrN}Sk7%% zS7Tj;3EX~2QO4k*Zy%&59{Y?YryBiwHExf<)w}D|_Ljf70zdR?)~8;A?H@Xn{>D>08@y86*ET5v=~|^(!}D zy;Oh3yN^?zQ-;tpj@-K}K={;h!Ywtahp^a=zkE`i&o91wJe_K9+Rod(w~#?OE9Q2; z<9;56w^7x-72e-w3&Y!`!lEpv-@h^r0Tk@aduDsxY*HfDhH<$8F!)_L(AH5`>|)Q8 zxD;t2wz;#?X{}Js7+LP_Pqfl+BMMMZ4YaqjX){VDCK77%nBjPG1A!))He&hYuu&{5 z>U#S9n=Y&4R=3-|t%1k98$xmus(4tB-xA` znFz$7DC|Y1vhMK*6FHkZj31Ow@`e23r6Vkl<8i*idvA-w7qf-MlPA;fzwEXf8O#a= z>Tcg$?FB#O0xcLU+oc)Z3mLk^VA&z26RNKvl4et)T zfH4;JRGq4xY2a}wll`yCzeBE!vAuFYZ>UoJfoVi8!Hp2qlAEEd! zp!{W$Rw|NPj6V4)@`+B59$%o|h^( zTM-DMmpwW6;7eWg>1EKPFVdi1vi_e~NL~p82?GfO2?GfO2?GfO2?GfO2?GfO2?GfO zU)c;$|G$*_kyPae7Cu_iOLK*v&3||Hg}Hy9`jPyf&j0B@EcgEYkwteb@*8(XBlH*y z>ChCjJ3G4-`1E98R4iDw%kY>tjy)MQ4op={MsOL0AIPc#tP%>WT%b{@h#C0NtgLT} zjjoFteDcp6dw0heq9hFe^^^PEj=ZT#>LCZYx|r!N_{JH89X<(Pcs9&wi|yuakC79p*S z7RHShijChd29(Ty)oz+bV6m+912srj+R%~!He(OA#^G}hyE8)X%N}JeSG~t(NQ!TV zyU*fG^!Ur4IrV$4{|4$?J}EzxU%ax!nqTp)VO-&TA0GY8lLsHX9`ca@;l7{mrj(Ot z7U>|o){iV5*U<4#WC#2UR;1E`)ZPkBcLhR>)md|TSTGe;vavB*d>UEoPNX@TJ!kfp z_mFvE6&9@ko-L#qwe}V*7M?A`Z2bBT*2~V8V9iChzv5sea@0-GGHIlJGdG6?xn1l7 zHZFMK>WyW0T^TK+#xJJRfD^M`={ln_gbx2Avhj+eiFSv)^gh;~%+4uKmBX7<_SF3p zEdn1c#5^@wRqM8~J7M_cS%`-m@W5>U?pHC!PvEpy4vf|zjk2xrjdYz=TAn^yH5~Qb z!vS-Ny5hf)-Har2Xt8OiO=s7nQNRnX`uyOd?t>Zyi+wNE3X7tc{wCh_@t71}f$h>C z+RYA&sL=tM`RZVR--ru#q1O{B((z0>1d)Z4H6y-IOC;_oEem+BKzSm$XikHAf@p5WEfF6 zubMEt$IE@32Yxa6ew2-sPg4KCR{40U_H(sASNlZmYOP-Vjq2a8etY%J>PM;vDqpPp z^~xVXaq>zSNEk>MNEk>MNEk>MNEk>MNEk>MNEq0Sf#+&;82s|#ROVphgXw~x>blv- zGsozCK3APwe1LJWqzIFXpRKqTA4+9v(HHZYCT(_BdTX8g&n--VtBh;$aQp=Lx%tV( zmFSB(95C-)T%KIKz_?hFr}tNyTs+UbSo4sJlZ(sDi`B`+rwi`IM^l*+`{L;k&vW?+ zc9D6xJi&f8=U#j$H5Yx0ysnA*nCR2lu^e;JcgX9qpiSj?HdDa11JI7>TjX_45GP`s znscu`nu@+dUQ>8sihMHdUVSJPeS^Hpi4*0>L4VV=FOe26)xK2u-O9TQ|8=21|Eu$M z`CpbBr7x6j7Js^^7QV0W;ryS?FXp~E`#ah7%)iQ9pZhy=Li+RRM^f+aW&nFD8&nQI z3_F>=3Lig;EjB9Ia;}sumkQbPxu;w1>vm@ygD@DEq0y6ir!_jpp*Pu%fzErd%#AG^ zyuTUZn&UT2pK7M=>ra|H4%E$nN`Zn5@oRPL|7PVs`+fLP%P#$#3=kwH) z9I|t0O|eicWk_=l?~k25*m?BcCnOI)C_fsOhcvmA&6WzeT)9xn@7J&%pvfHD>2QPj zN5aA!hA_oku9Sx^m-5APhxg}nZewZ-vuo?D2H`Yz$zcBBNNKVqSa>-@E_t6m=Yi5N zT@I(d_t3+Ll+#z?#-q#2HE2z~n9t`*rE^b>w0OK-k<+C|JIzfCI}Y7O0)!2Px;V9` z=bX8YIgjX@78HTuf~jPXI~bDS+7cwlWebHuK3^PGh)Wfz#x7t0BQ|JPg6IW#kd1B3L?i zbQGK(%+T3oMiaqsm?h$Sm2myg)k+@0x{QOF%O8ZU^0LZk8Y&s&7s3*tX(|*E3&>x} zxrvi~FaxlbU0VXxG2AOkg!ksda)5~iq%1ggI$y{YJ^-ubIg!y6R5HkwLlThHE+DBy z%%ONZNmOQ)bk=R`P6Q`1;vVGS2f0#|9NBESkfRJPckc1APJX%GgXaW>Q->VfAXki# z1BqL46oU)ro*0GSFPjez`>jQr2uh%#g^(QN#mf0&F<&m_VWsEl`|#(xHH@HZQnXul zOWw=Xgqe=iza~QrT5a|`awW3 zn}zz7i^XDLU-3M;8bwp0H4vTi!-vcG|I^ifm#Y0%?LXCix%RJWKU@2;+TW}FjoSBP zJ;0x-eOv9bwNKUFsl8QOtF6>tt-V}ZuBo-twWZnFb9)021E!{c`gxu+)YvWLd+=5tR@-esQ{ zzboe+pS;U1j^CAXk4@fXA059d<{p{6%RXGp(Y!@1|IqkN?%?=M_Q2>(HD4RQ$yP^i zD*4LzO?F}QW+6X6euE(q7jPk48oim%VVaYwDAUlp`v$XVqc_>y=uIh~9lyz8I*G0+ zW#HApTz(`3Br~hEGtj_|5Ezs za`6FA#{yW^sQ;g>E~RSUTzjbcU3inc5(W|m5(W|m5(W|m5(W|m5(W|m5(W|m{(EKM z6WLlSeL8jYx#v5oIT3Uk}( zP_-j|QLS75^p~L6&uNHp?`HQ@EjQ=R|JUlN+RxYiTJ4Y5)@v`|L-I-(NEk>MNEk>M zNEk>MNEk>MNEk>MNEk>M`0tE?WA0%A>C|#|es0b59ANtIF)FxFz>| zfD*2X+{It#MPA~Ua4GLypz_)hjsr-iQz>jpA1xGi-{hBY3c%>1$m0lf zp3`)R`u~Ob?@84zRsRCc`@6UB3kz59F?l5nBn%`BBn%`BBn%`BBn%`BBn+mRj?vgK`ejkrcGq|6=B8aYdw1(NDW$&VtZ&utuQ{9Jt@O`C^(i!6TMjyV(zpzS8;w<>rDN%PWLX| z%Z_{fD$cB_o6Yt*#C3Z0Z8~?o-fwTKuXlU11>jFxqCo~1?F%-70K3L!+or-5w&=;Y4;dn$+{kW*pIGY zW_+-ib;Z(MvF3AhCQ7~Eso(dL(c9?Ub?U2KXVbKuIws03SDG{RSGp$7oVV~@*EtP} ziA!qF9;j|P_|w_iViP7~-FI{YqeLAnW_*&BvZH2nx@~j4zG~u-7BnB~>7YI8ce*4`Zy6CCBoqGIaji; zayctzM`sd@6`Lr4{;!+8e%+nl4=L8&wsjZk)~la}(Tp3@+Ns}fLqJ#kNnDyTXNbnD za`Z0#I!dI0mUcz^#8@>|?(e2* zpQ~N0{&Mx3s?Sz_ys}w2u<*Yve02W*o&V1HuPy&#`P1cRN(vtUmgFB;@?yF_cZ<;!N249cMSiY!9RMo;KTUmzn-pR{hQ#- z;hN-?Fpw~iFpw}1X25u%h}`hG=a!fAS%C{ILBql}|4OmQpsy-AOQybpcXC3#Hr z=)9HCRbzRI9+R2qT%FJr+7iz{3QB2vRPv9eT+4x!?`mQT8nds5E7NJYV*Z9zb z%S%HmFq!DlN0Sk{Xne$n9 z&P0ajyxw@;1K)iCDob)c`V=k#*Bbg1Jh*l@R2LJRsqDPk(5B$QCAu?)6>)Ga$rs&S zq7tQ{0=zilJeKq2nTEv64P^=*QV${IEE$qB?TD8evIoBVLS`oCOf%xehBO5ahKW7; z7oKTFJl_zf;IZ5bPDzZ~JdGNZGX#LU;WU?v7w{N|`~scR4L*SGxA;90!#K2;&^3ee zp~tc##sCkYtH#*?x<6P$cK@xg*yWgp#3{xZ51rB&KRQ0{37u(4oNS!-p@*`fkYzD6 zgK>%>F(VqMrs$z&+$%FoTjB)cxd6JKiamNqj%iFBPyPQ2RtZ#pyYgEL|Ihpv%m1eI z3&k%MzCQnC_UAL-G50bpAoz-Y4KG(}sl&sYPnXM z@G^g^W8HQ7^{bA#y6v2Lq0{Yew)@Tq^xBeuJ6r4bw|dW?J&U1ZT+->CSzSFl;^^$C zx(&DL;mZpnCYMfv$(u(juZ@|MXPC6^zy3DAy7|)UoolaOyS{Prn4+k<%{dyU!bv!s z&@wrxWon{mIxSvmifT*YTec!gILFozz=p}&oGS8~OvK?wqG-_p-ij`Zma0n}R??Ww zmTihn-Lf^Ir8R9!(s)%e1)0}0Q*dnA(PWu#31ZXHN4ImmW3JWjm^yU~u2*p1$4hwlQieoVtZk?`G$I{dW6p{Bu?v0>87QD7>@_pHwYI1tGxjYv)I7 z9woh$k5^tDvnkE6**V|2+|^gxx3-n_b^e{^F-PXqrXnJ9F;(5BoSyq`hR(?B#HEwFanI@Ar^yU3`B4*e zn4A3(-qj@$7P$+BqsrDDXZY3SF@vO!>QRqDafZPi{=9Sf=AAeA7bHz1YSj&A9;s7gG~IZ$9+EAg7CDkBE3w(*?Z`EKX_<~rWZ z@D~|0h(AeR-g4ds^O#Ptd!9`b-1#MV4sjRysHP@WIlNHvne+10oP`y<0*%h!+bHXNT~%97dQbW3Tq9Gt=n4N_E5bL=LkgI8XVM0lsBXbPq+L32z? z^~+}0YMTz;&hQr*7DxPzydh?&JQ62bNT8ROXbxo;5~;dXx8hHwiU-{A za!7;{4vrk+Z;tJlpP}&`MeOk1?)ldC&7IY?opso;gNY%o#XA<))Ko!&<~fccHo=pG zBi5y+V#D5SQ4w^QBOaHO(3{dY$yQBGu`LcX zIW&Rd=v=GCb68zyBW5*Q_>n4zBN{h5UHeUQbNok8&#i`nOJq9j@~BN%J5`@?ko6f4 zd8!_aMRlJS7}qXohybdDGqrUMx`ZgXODl|jGuSEAQcnzTE-sNLrDUdOVg7EG{}nG>5ZQ7^)0SRlpQtk%a#{DzqEk5W&jUbVo2b z)sa=xh6CUcuWgHy6~$B#m@L`0;bsxk;a%ZVBu<3;)HSooHzlj(GzCR7VI~r$EmaNa z0S`lioXhJlzXFso}*c+t!`%;+|g1INvq4hI(RQXy7!Z$esu3v$F$ZWJm9?z z<^0R$Ren=>@eS^+>(D*Pw0P=QOEx@Ii)(UbOTY}B>S#?pI`GnsU=pIomN! z_&-e-Ouf}q1X<%97&uaxmSpOpqBtB>wdDvZf|D&Ph&{TDc|F9arcRL=DUsG}nT~)! z)Y3Iq&I=@LeRWSg`~R(F45% zuBFO0{9jY$RfW@n977`s6v8-BQ=#L!DZ)p?6_YjS zaNsfpN2`T~Q#l3UuVpn`NLvxiBwcWHy=mLXbTLCO%1FTkP)0soYQhVNm`_y{3#wvr z$i|=&@Zl{}#x{1FI>LTdQ)l(y_?tUW0DLTcCc8xX{!=q79u$uv)V+mWs69sG)_ZnD*|!^ z7&cCSx8P?rsU-=>`;oh#i=e|hSfHbcOkQdUyxOuj6D(81BZGwrI1_ zQQ>hM*o7mECB3xK#yXCR=Dl{$p|=r~FcU0E8oY#8uw3;Gh-!v5-h1oM_09EUAT* z2tE;h*Dcv4}ja3r55rb^q3q)f@^K@$mvms!du9~H010sE{8I%Ca;Voy+(=l zYnZ`D#?srshX@APDUvwM;EDSq!<$D=OjLlT-P<-+dCWxSi`LE#fA^JF)?a+>o!iQ- z<}nT#ux-mQe`M6nrp8MaWj2b0d`Gb*(bnM%b#z$Jn6L@Bds9}LR!c^XqG~GnKBc8A zEwgE=YD+{UFdZFnrD@BO!#T1k+KA&w$4y=3U?V(?46$9r?KicS)AB^UZFbRTd8xCu z3FGL|hX@wfi4I5o|HG;GQ?>W1zgK;?^1GFH7yj!)fBskJ?ef1YH%eb9-7NleQ7wF5 z;lueqn_tX*bM|+#>zRL*xjy%I=7jX;(~sb%U-oNIIs7mN-KMX?$B!;AXDZopu9Pj8 z3fc0xr(5ppHu{@(-EQ|NGokFPcNgv7n=GE7MI08Q%mgflM zS;!U3xpFC2$d}I@LB5ICUgg<+*G8%|GKM2XLw8`Xa41roY&nxJW%K!R@!X;Bpx2-J z;KYdxsIEBbp!{T5oI_w|K9|dsa`}9rR6h6QkJIZX_A1V98)Xs$k+IDcMj0$T5f+A; zYCfAQ;9$&5IafUQmGk*?kA2YWMEV+69AQv-EG!P$Ikcu&D3&s$IfwVh&K~SMvUB3f!w<@j zhUFnmE@iW&LM~S>l=AyEtOsZ^V`_kOoEywP5*Fq#gem57B^>QqEai*m4)4$D?7FKg z>SRnMxFv)6ha;uQmSExK47uce`kV(!!*n^E`rbniV@KQRt8nAd<>eZ*CST0wbEVR` zr$$Sb)!ZlgWSQ81lN`z zK`vV;6!Q6E8HzG$o6({~r;BB^$WpMM@|SXM;$$Dp0IX%#mOyn3_lgqXz4@>l zU}6C&OQ}@M7jlIUz-lp+$!H2H8RW_#3CL;}kW?b(P&}R_DqptMqBcg{qmn_c6eUMC zTQ1}%gUg+Je5{k5j{P9_wR?kbj3rAV+=`SKo&}-;EHA5=zl--7R@9AC?0eicUunrixrYckb!E`U+ND zp=zQ7n_Kd3E-V0?RXJNM!BVsES9>>AhO?qtqJ0IG$nR!D^|1xm4}* zwHK=Yq59eC*~%9x+m*)`{?@|REu`naXZ~{eSIVC)pDF!Rsatxa_}7XbEBtohI}2Zv z|JV6p{#foua%;JA_Ah0xXZ~~MPh_OIe=_&>+>`0Qo&Gv38~EIpJuu(`7|%}DKNRyZ zRw~Jusf+eSZi#VniY^Gjg(hNX8A`+=E5e8lfmFg9&-l2>OYZ5r)h!1`LYs4TSW7N+rF`k~Hhm>T-xS~A)V-Szf zHRG@kJr?ioT%2;6Q&0Q%tR)}8tHx74^!+beCJd&&^NMlEhaSrlFjl#`^%_t5(D%PU zmoS*t#EZrg9(tUI00^CFO}t<{?n93!J5%3z-dOaZ$7)r^fD_#nXFN7VkLSgrC!R?o zv0C)eDSF6lg^Y{k#TaW*30*NB@zCdDqDK!Q5V~wUJVlR}6EJdKLYIt(eCV+vAIH>4 ztVKOIMUSx-l_X^PcdSJ{Fhv(a>5&)+v&>dy>O037H6MB?Jqi&O9X&9q$fy@3jVjRH z$0LfdLK9|onc!NZG6fHb8VZ9f$ywP9s%0X;wcn z9*Vl$C{MxT1P+mwLNLI^M#%$@Wu;h|#{?G|MS!~xb`(SYYNiPo^05>h%Q71U4?LbK zVwDYx7Os(>g2zdcL@oMB9h`!v>5ZHR9?QF6Aqh)zO>Ja7@K{{}tOsL)D~*f?9$J(i zO0t;{Oe50d#@rMaWNE@l&1Lz0wGTz1AyAR~d#|ibA)?w`2;FdH#33N9o%+J{M zgIy~@MEel8r11??@cpO!1QFeERKhnt;Rg@&aD%C0q+$UAOSGa?&aJlb4!~XSHy^T& zP`1T_kfMEvTWw><4<3*__&g^QJlcm4xYl@k3LZq8Y2OHYBZz1p;+8b-Pr>&e&Ilsf zhqxt;dmeZU??({PK7>l7#F1Gedr-3_K>&{27`5~*LZ7+9wUn&bcTDOdX23qdiWW+Q1%?zsKAI$ z_1$`nj)zVIbo*8rpfg&PN{me(dJLW61w2p9xGP0BHm2zDcvl$y3-xNodH~(;z-FFY zjPfzSVE7o6sK#9nJv-yFg3Z9Xe}HyS)EDT2@pV)5cwUT^`vRReK0ZZ{lPlrTGq%2ShA~BtXHBf^ zm+CbdQ}lSP%2?3=JCju74Ig@F#wFyC85YUPe}S$TuTRlK<}=gC(UFgp00Uh%J~l;< z=Vw?MFwmvOYe087|ov(he`swP4%0H^ytyC8N%EHb0-2!Y>v+RXCRa2l*BjasBz+mF%x%za@Jr^AnlPOl|J_0hPS|duG5GQdiUMupP|D zaG&&0e{?{1ON=3PHplQWd_RFi$6R+e0b}TOHxK4xj4BgIbPDTMYz)2rrVAhFRfXJj zlra-XbPnrQYz(~)=fPYI2TdT+j>s)BhF*{JV4Ou81QP9v+!ABxbva$>1D-D2M~nzB z08yj6ZB(KgL$A+yFdJj=nn0rSShr$h=yf_>c)#=^Gl)zz352Qls%i|qUgyC$ODhPT zsrMME7<%1K!0$iG5Ij@wF;p@1`kjE^f0j@1OubhHW9W4}!F_P}6CeFe!Q`H)m@01! zy`CrF_n+rOdd6r4-4|yJy{@NAPQWRIxMDa3#&CsOu`%@eo(D7WxW^OFtcszSUgs0= zVKdzm_l)5Xl3p=}UhnfD^~?Qj8ER>!j7+^(WMk-cKM&&MrT{#+3N!_a0;b+$$YSXA zKLH%xRt-;^Fl1+p zTDbK#hSUiip@-b=9s?|6)Pm5}#_*1Z9xsGQOdpR?i{WjcyIqC@`8YnF$Mc!dW{eVe z$y-zSIC&*N7+#VpHikC?@cxDkwFFB>EOd!%a;lh~|9>`hZ`A+)rRry@&s2W2vR*ciU- zgAd{DC3pdZk@8T*#_**nd`SO8EzMGT#-n;F;9+f7Jos3hM1U}j8C#MMU!20nb482? zLLj|>F7D+ie4Jz%AWXf-mgmD4eDE>)L4ap;aj9Zsc*zGJBdG!i)2y)R`S9WtK29zU zc&1rl*Yn{8AACsBLzxQ08#A5?p{9l2pP$0Rhxx<6j024t903T^tnlE*aM^>8)ky?A zGe!z9D{sg71Jp?jNFVYM400HcZV)*zD{ssB192vA0m9mz93?QTubGk)&#V}ahPV|Q z!;ehiuFGj|}K+B2R&A#`-2#VLBMSj925 zoEn4-thO2!i?B)ilY@*et3>JLyr}{1?-C(Z3%*o5b_Mr z-Qk5=K8C_8I@ae#!cz(2>xlroUu#1BA0|k2cg?Ms`v2MTFQ%$LSlM1Ui#N$DVIW~3 zVIW~3VIW~3VIW~3Vc-un1H+dNy8C=TagxVY@BGQi$0rAHa5MXSzj^hI4d=xdB$Qme z?_B-ZF&wUeO}kAEyZ+m%jSm|3D#w8uoJPCVV|#YZaRdpcxZvy;jk6>iT!bSJnt~(h zj;YXDF^<{9W*a!bL%^vWii}fWu=6=KLszkLK9A!QS~!77#=h=HC4j# z9Hwk@+~@?3D?PL6tgoB(WgAeH0%w?QqBJOsc z&ZIh%>K=CN^JF z9LoknxKEs>s#zMolT13QyhW!&I5?$A!9h5tBgwpMVXHD5)8BRrTkPYQ6TvibXhKWD z=4#k!9sO1fd;BYC8(TJIr)g`p+G?uUEnSgCrKt)y#fWQ;xV&a!qxAZVIGKKf-p!C0 zIj!iDC|;oB?6K+i#qIvislZVsF6fI(JiqICByNRk02yAYjaWQ#0xaGU|yqG@w{ zOXZr9C^cmbe{jAb?NhI}BrvQrv3aL0YOR)NfiTV#aXJ}Jx@hqx6b5A?u93wSeu*vY zZAZij1}08I8L_y0&#b?;hI7Kqd$Z^2L=IAnD4ac4CwwjpkY8JpWrg46U>8(+pDG`o ztB!bFB5hQcyc5UN86IEk^zP|*#qIw3&F&>d-aN+RJRBO6z~L4u9lxexf&s_sD5~U0 z8jd3Y0hj}BHU-gvs>1Z`W($Y!z^X;ZL5H1(F3ZrzmfFO@S&CxIoNn4U6+y&_1vmf> zB~Yc7rQ#460p{-r*giqVIXey=7@>^M$hy>DGdJrO*3B-?V8h!Pb&MR6ak&({vvvH3 zJ-L7vmT*$dZihU%by-v^_5ahgZVLY;uY`ewfrNpCfrNpCfrNpCfrNpCfrNpCfrNpC zfe(yt z&t1&^+w5nuCo=yq)6SIV{^H!#^#7Iqqv^A$pGv(INtrS5mP;&T!%wE{VI_%zvC+r@ zCXGroW8f{90Q~+J2oXr+n2QUq8iNl{R%5vEfhBRF+M+lo_~>;oZpFsnxCbBSVM+pF ztRC^En!?9;aDm{X7nZpt#^6If_|U51J#rsy2?Wm@gQFh& zT%2`0I3GT81m4vg&KP)m<1f&LJN|V%VXmSzN6{n4rU8$Nje)m0{=!_Wrp0ogNH;<7 z(EF#SXp#gk*=tKMZtt&Eq^hQW*$?p_SZ`A_^*FFAeMlsv?L#G=+!O1Pm%%Tf{R31j6t( zRIxEQIE9a~RF>cw)KiHuI535e6G#BU2;x*?3~C;HoK0RxdWJKj5@S#ez{la9;cWmf z7=wxre*ar_kn{|9gAxSsg(-Zzre$o^;Z|%6<~?|NJkU?ho)+T@Dr2h-z+-38L3s)v zCr1DX!=F)!F(~=q!*&$7nP|rX5T;pStByg@gQsW60!|^6@GzVLYjaUl46`as;p2o7 zfH3tQTXhWbKKOV|%Lw9Bv4O)ECmu7-6L6#-OtZrNqJ!)dKAz8EZ7_<8k-TPn@Ua{+ zW3LX}7j_sO%z5y!l2?E*^&VS{4$?mO{qF@rGBWiZdyEcJQ}}p3hp}CUTe0z;4?PrH zLq^81D#mslgf5Tz|GmlnfA3e1SAL|jS}87k@4`#-|8f4a^QX%{S?-h%l>RFE|No`< z?M1!t^My|qj^zJt-pXfle>V3*_TOc{DSI;WqnW#zg}J{xcRl@|(tj+?r@oNtMfU$w zDP!;rlRK)$dH5fzepor7#_Q14PfX$C_-Md0I$Bh*F?h#=kMo2$Nzc$#DlrB-Q}{S3 zEkGE$N+rhNZ6AC{efHv`0m4XqsKglD_rb?VY5~IV(I|nBzUPAvCCPgkI|2y9M^nYd zz}vd8O52D9qI>Xh_vrWt5QdMYij9G{bzwEmGuEUzjMRrpjDfdxA>d;;3M_hJj9*ZR zG4Qr7tj2l98q%{;ew4sRds`P)=i+oj0m9UKO8LF53jrTXFZj-o}9TEgYlA(i&E}4|KILSev59 z$k~9wv?v7w468tQ2S=)LvT>j@I=Lv38w1+3aEu-!V*>^=jwn)NKzkOB(BpKofX)mf zir5&?mW5;4gT^0HA(k&-<;tiRnZCDUVTE?64fL`?jxAE*K@5X-3n$XYNG$=vG%IXlGN6qMNAR&ujR8DU z@3D=^fOamNz{iuGk-1XE#(=gi9K**mE5qtz1B7W-I7oNk?Os@kv$ruQU`=RK$*BK7-v955)nNbsSLgreJXiigxnF*)^aG_g zioa9*GsSZc+W&uV`~P{<=-4wM*tMFm?Wh5M?2Nz&11Q0k4Bj+)EgvUe1_;9(sKgk0 z)98SY(G3L%!yKr@7<$v_fDeWAP;HSBURN1AK4KzQ#BNsJGakHiq6bx+{Gk zc?;bPt7#cwfGReI-ZVOzHb#U82-B=Y>}KUnqt|F{O+fm+3?2cVX;!rNqBo6Ri?hu- zsUOp#nR+i^+i99icLy12ab|{edNPvXj0EhMMRVz6^jOp|c3y;9 z^4KwprqV~~@ob9KV*xsL%%Yj}F?z^Mm2B^i9ooP`#c8H^S z^f7uYXU6KTKz8hyMbqeG^jH}PW79=yRqPN)v*=^=c)T;i2#+1&XcB#d4oB%vZ$gCu%TOF$RPtKmS5;L0&FH9xI(3?Pq^fBB4Kp06kN|1bb6X=jWMwbB~ z3|~ei#?YHUcj5iq&(s!`nE`~6bW@2j@Mh34-yBDCc-HDqz+>#?U09Wy9aM910xUon z?hGXud->!PKI~#bRu-+8m=kB16)GO}|39CqeZKZW^*>ZUTRmI(LS?)1_`=^@Fy?=E z{=4SSmw&1JnesEGA1$qys>Saw-YWcN;ZGK{{J+S5GGEXAaITdrW&cw4M&{Qt-?|2;DF2Ud)~_qQ{2ZdJXSc2cQS32q_{{ z!f2~^>ovSF8W%lamBGrG=+Q<`=(6Dr(d6c0wraG^6S`!0BQ!vd$9r^#fY3$58=!H~ z1Iz>~V=@zM@q{iI-uO%|){#`eh&Fga=M8Uo#^pVrk-@Q1mh6nhH-yeLXmrNSsB`fY zlCks#;8^WVV>4s${Rbg}VA_(VHfUsK3?AemG@s9;g=tDyjZNb+9xVZV*_$P?&aA{e z$qgEnakIKOlSV`fQ`I%8L1Qvw@Stk%(SI=(+_=>?XhdcV9?P*a7OW6BZ+PP|**Ifi zs?0I^0aU^p-f#@i_n%7xgV7Ig>ovU57+3aykp?S^)<&Q+f)bS&-e63Y0%`y~sQOHF zh9Lo6HN3GH7k%H#4h)7RQHkLV#Q=T(<5a{uBW$2VHoTFTY@CM&37ug}RIlMZ)sT&| zK#S0$J4kN5hWAi|i|*$=JWd{&t^l18l&D_Ad!`{9E7br7BPdac;XTp-^q_*{qhCRz zHB!=9DIS#=-V+T#kKx3C!LTMOF}w#FvT@cftH5CBJ4#f;d!7O4LE{XmKa&|o5=QkJ z-s23}Sg8gu7}kUm+3=obfb9F9jUZ+i)%bm0dU-kATL`9Cv%uKbJT_sbtH{ln6m zrG?`66<;a*df|U6DEWVue<%M`?uT+;pPS2mPxgh(zt4P2=FHqr&-LdP(|;E@seTAzQOb}t1Cv}amLL65gi(+TCH(w(sJb(Ek_X1k%3Co#!U}A zWF8@wB6W@+q7~Y$w(-goeE)V%5YYb*IAc*L&;8xqX?t#ZyN(Aues6gOC zRS!I#Dzc`hQ7vb@3~+ats}yGhSJtt=ZloeniE6wwMUNpn zVMHsVTd#2?fF4K(_uv5uBU&5XdW{#S=%JJ2 zH7@wj_wT_7BRW%YON{eA^!>Xq!eCkxo+erL(Bt%R37u(8cs%{w6g@^%BJ^k{MkSK* zwNvyMVF?(F=dTH!Grneu9%Ckl(3v`;=*CB;=rQ_QgwE6%Jly@&9(tVTrwE;?GkCW9 ztET8N;vS(hbq3E~Kkq}2Y>N!;}Sa41LI*2Wr`lAVsHMP@hA!E#bej<6g^(#lbP0pr>-R*`u@jsNJ6GH z$!bFcx|_F`;)N#0BiB@|(h#QL`=3lF2xh(^%ME@C9%{o-jAa;%%rqrgY;XW~`-*XC zVOo+bG|u|L17^BM$(gDy^NlkecsyN{nA#%g#%X}N*>5q<+7Vfi7@Z|5QH)bQ^cYPF z42Hf?iSe8dJ%%>^f1RB%ZW}QWMJ-E~PLH;REAA#Ktu>(oI?SD6#IG~gq+ z_7QS{lxcE=lt#+@&*e^548O5EHGxNpJHwejyBvWb42C0v{=a?s{{NR(uP>i2KkfhQ zANKEezjohtZ@1sKpSSyq$BPe}--x?4)A`5M^Xh)}?(FB;?aMFvlTjV# zhk}a@%TqL7Y-n#AM{uEs`ncc&^+7_~`<5q8Muj}!BgK3|+OC!-PDYJ9;;UqP&eu-B zx1&~`I2l#)h+l40gtUD*k0hf`F8Dwug+xcx^YchDD&-NsJpCr59k}vHGS|u-GqtJi znWG2^X=iF2!G#_d%UvX8Af%nD<%yHITJA!927y;@g^827T+XXM*__iT-%R+pM&(xg zGgWiF418?wm0Ml2*Bu3OP8+&Foq~&3W{>}f?Tv!j>C>&L51>|P2VHzxk>~A=g1OL_ zM;X$k(X*2t1+&vn)?OVyYVGa#o9FF~g1OMEl1(Ki6kU20d)-km5A;BW&lO6CLT%qD zm6)?S(5tO$55s!yOFVeb^oW$nvf*^nW<>4?se6wGDqm4R2TE9_m=hd3`9J5Vqe zdL($G@sm27kMJf6W~Wara^@+fTA5(&uy+dPvhShLEvir48H5iP%!f##k4C`i8WTp) z=EW5=@YREyA%Tb&X8|Wp=8_rsz=H)u#8!?Zqh`)&6Yv461VqGEjwGXM9`K=irGSXw ziV<8Ar*1CzfaJ&Ct9wkGI2o1mh!2D);KhN!iIY(~|J$6Yc>XVBHR@zsz3^F#z%Z$v z$JJLCNvj{zJa7P!hRNm#uAdK~FX(}nhRNm#E}##gmTJID!(?*=SI`+hJ<(>xSl~qz k{n^Pv?7{_n!COyD0oC=+C;|)+E1&zk7#&F7>>k zQn&mS+lt4s;!4S=#_!VUZWJr`N^ieZVl50f)g6z=+L03k$3B(M84X6at+OnXg`@Q# zbX^-3OQAuzLqnoJ)u(@jsJecoR;PTlnaVL{Mkno}CHD;`oSxWYm3vOjr6Kq`OMd;J zMxOl^MsuQ=-e)7?EN!u2ah)Du^WrHzIh7>Mphh9zngIPxSSMtz_9smFU delta 593 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 delta 2546 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 V8I0uwuFs2U{rPT|9hm(!`!7^x+>-zR delta 3134 zcmaJ@drX_x756p%Y-5{8`~U~yM+lENU>k#Zgk-dog=7K3!|?(k<+Ec9CBqM{Z9*C) zkYGf zi1w5G^SS4qbG~!#d3^W1TjZ(Rr1-0%BAtRgrnBRx>;p^1a{}px9|#wfIsvwYs-Qvr ze1UR614~vre5Srbe#og%i8}iy%>knMz^jNW2JUd?kwT3yuTYGs;4_U4{#R;(6B<4I zdAkYTJ!~!wXaj{_WedTVDHJUPj;J36TKH^9}}b0f=EIF~TlG{|WWv^h`QRC3PwtPG?e50TZJt<_axmAgMFyNIY@crKDC|Y7=xy zOh?19l#(r-PU=LiVP-m&7FV619gKy-sms}0hEj6)Bct_F!_y5b#+sb5=B3G(W7lFU zwQafDwx3tL`|$hif#uqx%f{e}aXe=nzb!^r#8Wx()QXtMiHT)#cG*Z*jB`2T+_G^# zd#@;?Ci@|5wi7Qbny0*U4||cTkan>@`Vc}lf*0Z22nP_V5n365-7-WDLDJ%e&mDrn z!&s6k9*#w+4{liMnNi8&CC#8KtF1nSN*nD;+KF&FDyGtO)i@k2>l98f!S?K>GMk3D z;Z57$Rcl%Jg?*&`0W|Xg$=)KLVUVGB~5JmRMo#0`FQ+#@|Mzl$(} z(9FQ4r+rAv9&WN@8O3cm2i(wcxaO=CLTo3N{jGDSQn^^lnyU@|+NIC>cFpTxM@b=! zG*!Yqw}tco@$6*TTIjBXPLG;Vv#f=xJSOb`36ux75BIHY^=;nDYkjd=YIz@WW`kZ4Yfhn%m|Trop9vphoZ^7!Zcw z#dgm^5=jw(cXQ!nW@bj@EsYf~>0;q@~f2CORc$yG`|;-yO24ZaTUYp(?`%CGJq2?)Po(P=n#a zT64&!{;;!-;oVYms8xM;cOAozTO6T%*$Z877Z5A#JFu?0&PO~D=y6x@+LEV`k`G~8 zkM3RX@sN{{>!Axcs$8b8FMv&HZDr!L7=f1puM9sfaSBO7B$0`ysXT{{;TAT8OOR7U zFCq5@R4~A=4*G zbrP4YaDA|wAL+X3Z`|4;l;3o?Yv(E%CZ{R;R41tDZ}d|w%6_x&tH+D&Xvh!yE2#7% zNDg_0R~Z@4zBKftK>h)~V?Tk$h>Bl7SfyCxIMzyqMxbS+vk*giw9Yx5g1bG{8u}a> zd>&pNvF+eRvwiEh@SqoDXZZ-=-zh#%)N}=Me~vuZFwr z>%;Ak!!1R>cvr~9B{zX;T^O&S$iPRV|Pt5;32iZv|o~Yc(b7rR8K{v9;5%|S~k9*!Bfk9;Q4%voOe%>R+ zQ@B-3+I&p>b+ahRuNpi_+`&um=0v^l2HUxr{d8iP1o7TU@iIn32sk0>RRnA~inU5H zb#w^<^{5@ef#75yY4^tx6PcN4Cw+%43Hzm*plC`gt0bf3s{)0x6rt=36|TS7pS?Ks GYw~|SEZJfJ diff --git a/routes/auth.py b/routes/auth.py index b34381a..b2f2efa 100644 --- a/routes/auth.py +++ b/routes/auth.py @@ -21,7 +21,7 @@ def is_safe_url(url): """ if not url: return False - parsed = url_parse(url) + parsed = urlparse(url) # Allow relative URLs (no netloc) or same-origin URLs return not parsed.netloc or parsed.netloc == request.host diff --git a/routes/evaluations.py b/routes/evaluations.py index d11ed3a..83f74c0 100644 --- a/routes/evaluations.py +++ b/routes/evaluations.py @@ -6,8 +6,9 @@ This module handles player evaluation creation, management, and viewing. from flask import Blueprint, render_template, redirect, url_for, flash, request from flask_login import login_required, current_user from extensions import db -from models import User, Tryout, Evaluation, TryoutRegistration, GAME_POSITIONS +from models import User, Tryout, Evaluation, TryoutRegistration, GAME_POSITIONS, OrgTeam from sqlalchemy import func +from sqlalchemy.orm import aliased evaluations_bp = Blueprint('evaluations', __name__, url_prefix='/evaluations') @@ -41,13 +42,55 @@ def list_evaluations(): Evaluators (coach/manager): Their given evaluations. Players: Their received evaluations. + Supports sorting by any column header via 'sort' and 'order' query parameters. + Returns: Response: Rendered evaluations list template. """ user = current_user + # Get sort parameters + sort_column = request.args.get('sort', 'created_at') + sort_order = request.args.get('order', 'desc') + + # Validate sort_order + if sort_order not in ('asc', 'desc'): + sort_order = 'desc' + + # Map sort columns to SQLAlchemy expressions using aliased User models for relationship sorting + player_alias = aliased(User, name='eval_player') + evaluator_alias = aliased(User, name='eval_evaluator') + + sort_map = { + 'tryout': Tryout.title, + 'player': player_alias.full_name, + 'evaluator': evaluator_alias.full_name, + 'mecanics_score': Evaluation.mecanics_score, + 'cohesion_score': Evaluation.cohesion_score, + 'communication_score': Evaluation.communication_score, + 'gamesense_score': Evaluation.gamesense_score, + 'versatility_score': Evaluation.versatility_score, + 'discipline_score': Evaluation.discipline_score, + 'analysis_score': Evaluation.analysis_score, + 'sport_ethics_score': Evaluation.sport_ethics_score, + 'mental_score': Evaluation.mental_score, + 'overall_score': Evaluation.overall_score, + 'position_recommendation': Evaluation.position_recommendation, + 'created_at': Evaluation.created_at, + } + + sort_expr = sort_map.get(sort_column, Evaluation.created_at) + if sort_order == 'asc': + sort_expr = sort_expr.asc() + else: + sort_expr = sort_expr.desc() + if user.role == 'president': - evaluations = Evaluation.query.order_by(Evaluation.created_at.desc()).all() + evaluations = Evaluation.query \ + .outerjoin(Tryout, Evaluation.tryout_id == Tryout.id) \ + .outerjoin(player_alias, Evaluation.player_id == player_alias.id) \ + .outerjoin(evaluator_alias, Evaluation.evaluator_id == evaluator_alias.id) \ + .order_by(sort_expr).all() avg_scores = db.session.query( Evaluation.player_id, func.count(Evaluation.id).label('eval_count'), @@ -60,13 +103,23 @@ def list_evaluations(): player_scores[p.id] = {'player': p, 'count': row.eval_count, 'avg': round(row.avg_score, 1) if row.avg_score else 0} elif user.can_evaluate(): - evaluations = Evaluation.query.filter_by(evaluator_id=user.id).order_by(Evaluation.created_at.desc()).all() + evaluations = Evaluation.query \ + .outerjoin(Tryout, Evaluation.tryout_id == Tryout.id) \ + .outerjoin(player_alias, Evaluation.player_id == player_alias.id) \ + .outerjoin(evaluator_alias, Evaluation.evaluator_id == evaluator_alias.id) \ + .filter(Evaluation.evaluator_id == user.id) \ + .order_by(sort_expr).all() player_scores = {} else: - evaluations = Evaluation.query.filter_by(player_id=user.id).order_by(Evaluation.created_at.desc()).all() + evaluations = Evaluation.query \ + .outerjoin(Tryout, Evaluation.tryout_id == Tryout.id) \ + .outerjoin(player_alias, Evaluation.player_id == player_alias.id) \ + .outerjoin(evaluator_alias, Evaluation.evaluator_id == evaluator_alias.id) \ + .filter(Evaluation.player_id == user.id) \ + .order_by(sort_expr).all() player_scores = {} - return render_template('pages/evaluations.html', evaluations=evaluations, player_scores=player_scores) + return render_template('pages/evaluations.html', evaluations=evaluations, player_scores=player_scores, sort_column=sort_column, sort_order=sort_order) @evaluations_bp.route('//', methods=['GET', 'POST']) @@ -219,4 +272,4 @@ def players_to_evaluate(tryout_id): ).first() players.append({'player': p, 'evaluated': existing is not None, 'registration': reg}) - return render_template('pages/players_to_evaluate.html', tryout=tryout, players=players) \ No newline at end of file + return render_template('pages/players_to_evaluate.html', tryout=tryout, players=players) diff --git a/routes/tryouts.py b/routes/tryouts.py index 76dc584..9bbc819 100644 --- a/routes/tryouts.py +++ b/routes/tryouts.py @@ -14,7 +14,7 @@ tryouts_bp = Blueprint('tryouts', __name__, url_prefix='/tryouts') def can_manage(): """Check if current user can manage tryouts. - + Returns: bool: True if user is president or manager. """ @@ -25,13 +25,13 @@ def can_manage(): @login_required def list_tryouts(): """List all tryouts visible to the current user. - + Shows tryouts filtered by user's role: - President: All tryouts - Manager: Only their created tryouts - Coach: Tryouts targeting their org team - - Player: Upcoming and in-progress tryouts - + - Player: Only tryouts they are registered for or participating in + Returns: Response: Rendered tryouts list template. """ @@ -47,7 +47,9 @@ def list_tryouts(): else: tryouts = [] elif current_user.role == 'player': - tryouts = Tryout.query.filter(Tryout.status.in_(['upcoming', 'in_progress'])).order_by(Tryout.date.desc()).all() + # Players only see tryouts they are registered for or participating in matches + from routes.matches import get_visible_tryouts_for_user + tryouts = get_visible_tryouts_for_user() else: tryouts = Tryout.query.order_by(Tryout.date.desc()).all() return render_template('pages/tryouts.html', tryouts=tryouts, now=datetime.utcnow()) @@ -57,12 +59,12 @@ def list_tryouts(): @login_required def create_tryout(): """Create a new tryout event. - + GET: Render the tryout creation form. POST: Create a tryout with the submitted details. - + Requires president or manager role. - + Returns: Response: Create form or redirect to the new tryout. """ @@ -110,15 +112,15 @@ def create_tryout(): @login_required def edit_tryout(tryout_id): """Edit an existing tryout event. - + GET: Render the tryout edit form with current data. POST: Update the tryout with submitted changes. - + Permission based on can_manage_this_tryout check. - + Args: tryout_id: The ID of the tryout to edit. - + Returns: Response: Edit form or redirect to tryout view. """ @@ -164,18 +166,18 @@ def edit_tryout(tryout_id): @login_required def view_tryout(tryout_id): """View a specific tryout with all details. - + Displays tryout information, registered players, evaluations, teams, matches, and evaluation status information. - + Args: tryout_id: The ID of the tryout to view. - + Returns: Response: Rendered tryout detail template. """ tryout = Tryout.query.get_or_404(tryout_id) - + # Check if user has permission to view this tryout can_view = False if current_user.role == 'president': @@ -197,11 +199,11 @@ def view_tryout(tryout_id): can_view = is_registered or player_in_match elif current_user.role == 'scout': can_view = True - + if not can_view: flash('You do not have permission to view this tryout.', 'danger') return redirect(url_for('tryouts.list_tryouts')) - + registrations = TryoutRegistration.query.filter_by(tryout_id=tryout_id).all() registered_players = [User.query.get(r.player_id) for r in registrations if r.player_id] evaluations = Evaluation.query.filter_by(tryout_id=tryout_id).all() @@ -235,7 +237,7 @@ def view_tryout(tryout_id): # Determine if current user can edit this tryout can_edit = current_user.can_manage_this_tryout(tryout) - + # Determine if current user can view the calendar (managers/coaches can always see it) # Players need to be registered or participating in a match can_view_calendar = can_edit @@ -245,16 +247,16 @@ def view_tryout(tryout_id): MatchParticipant.player_id == current_user.id, Match.tryout_id == tryout_id ).first() is not None - + can_view_calendar = is_registered or player_in_match # 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() - + # Get matches for this tryout with participant info - matches = Match.query.filter_by(tryout_id=tryout_id).order_by(Match.date).all() + matches = Match.query.filter_by(tryout_id=tryout_id).order_by(Match.date, Match.start_time).all() match_data = [] for match in matches: if match.match_type == 'team_vs_team': @@ -279,7 +281,7 @@ def view_tryout(tryout_id): 'match': match, 'participants': participants }) - + return render_template('pages/view_tryout.html', tryout=tryout, registered_players=registered_players, @@ -301,13 +303,13 @@ def view_tryout(tryout_id): @login_required def register_for_tryout(tryout_id): """Register a player for a tryout. - + Allows players to register for tryouts. Validates that the tryout is accepting registrations and not at capacity. - + Args: tryout_id: The ID of the tryout to register for. - + Returns: Response: Redirect to tryout view with status message. """ @@ -342,12 +344,12 @@ def register_for_tryout(tryout_id): @login_required def update_status(tryout_id): """Update the status of a tryout. - + Changes tryout status between upcoming, in_progress, and completed. - + Args: tryout_id: The ID of the tryout to update. - + Returns: Response: Redirect to tryout view. """ @@ -367,11 +369,11 @@ def update_status(tryout_id): @login_required def update_registration_status(tryout_id, player_id): """Update the attendance status of a tryout registration. - + Args: tryout_id: The ID of the tryout. player_id: The ID of the player whose status to update. - + Returns: Response: Redirect to tryout view. """ @@ -393,12 +395,12 @@ def update_registration_status(tryout_id, player_id): @login_required def register_player(tryout_id): """Manually register a player for a tryout (by managers/coaches). - + Allows authorized users to register players on their behalf. - + Args: tryout_id: The ID of the tryout. - + Returns: Response: Redirect to tryout view with status message. """ @@ -439,10 +441,10 @@ def register_player(tryout_id): @login_required def create_team(tryout_id): """Create a tryout-specific team. - + Args: tryout_id: The ID of the tryout to create the team for. - + Returns: Response: Redirect to tryout view with status message. """ @@ -464,11 +466,11 @@ def create_team(tryout_id): @login_required def add_to_team(tryout_id, team_id): """Add a player to a tryout team. - + Args: tryout_id: The ID of the tryout. team_id: The ID of the team to add the player to. - + Returns: Response: Redirect to tryout view with status message. """ @@ -490,4 +492,4 @@ def add_to_team(tryout_id, team_id): db.session.commit() flash('Player added to team!', 'success') - return redirect(url_for('tryouts.view_tryout', tryout_id=tryout_id)) \ No newline at end of file + return redirect(url_for('tryouts.view_tryout', tryout_id=tryout_id)) diff --git a/static/css/style.css b/static/css/style.css index 61ddc4c..91a51ab 100644 --- a/static/css/style.css +++ b/static/css/style.css @@ -1749,3 +1749,147 @@ a:hover { color: var(--primary-dark); } transform: translateY(-50%); margin: 0; } + +/* ===== Tryouts Grid (Card-based Layout) ===== */ +.tryouts-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(400px, 1fr)); + gap: 20px; + margin-bottom: 20px; +} + +.tryout-card { + transition: transform 0.2s ease, box-shadow 0.2s ease; + border: 1px solid var(--border-color, #e0e0e0); +} + +.tryout-card:hover { + transform: translateY(-2px); + box-shadow: var(--shadow-md); +} + +.tryout-card .card-header { + display: flex; + justify-content: space-between; + align-items: center; + gap: 12px; +} + +.tryout-title { + font-size: 1.1rem; + font-weight: 600; + margin: 0; + flex: 1; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.tryout-info-grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 12px; +} + +.info-item { + display: flex; + align-items: center; + gap: 8px; + font-size: 0.85rem; +} + +.info-icon { + width: 16px; + text-align: center; + color: var(--text-muted, #888); + flex-shrink: 0; +} + +.info-label { + font-weight: 600; + color: var(--text-secondary, #555); + min-width: 50px; +} + +.info-value { + color: var(--text-primary, #333); + flex: 1; + text-align: right; +} + +.tryout-description { + font-size: 0.85rem; + color: var(--text-secondary, #555); + line-height: 1.4; +} + +.tryout-description p { + margin: 0; +} + +.tryout-card .card-footer { + display: flex; + gap: 8px; + padding: 12px 16px; + background: var(--bg-secondary, #f8f9fa); + border-top: 1px solid var(--border-color, #e0e0e0); +} + +/* ===== Full-width Schedule Card ===== */ +.tryout-schedule-card { + width: 100%; +} + +/* ===== Dark mode adjustments ===== */ +[data-theme="dark"] .tryout-card { + border-color: var(--border-color, #333); +} + +[data-theme="dark"] .tryout-card .card-footer { + background: var(--bg-secondary, #2a2a2a); + border-top-color: var(--border-color, #333); +} + +[data-theme="dark"] .info-label { + color: var(--text-secondary, #aaa); +} + + + + + +/* Sortable Table Headers */ +.sort-link { + display: inline-flex; + align-items: center; + gap: 4px; + color: var(--gray-500); + font-weight: 600; + text-decoration: none; + transition: var(--transition); +} + +.sort-link:hover { + color: var(--gray-800); +} + +.sort-link .fas { + font-size: 0.75rem; +} + +.sort-inactive { + opacity: 0.3; + font-size: 0.75rem; +} + +.sort-link:hover .sort-inactive { + opacity: 0.5; +} + +[data-theme="dark"] .sort-link { + color: var(--text-secondary); +} + +[data-theme="dark"] .sort-link:hover { + color: var(--text-primary); +} diff --git a/templates/pages/evaluations.html b/templates/pages/evaluations.html index d033399..34b991c 100644 --- a/templates/pages/evaluations.html +++ b/templates/pages/evaluations.html @@ -4,6 +4,23 @@ {% block breadcrumb %}Home / Evaluations{% endblock %} {% block content %} +{% set sort_column = sort_column | default('created_at') %} +{% set sort_order = sort_order | default('desc') %} + +{% macro sort_link(column, label) %} + + {% set new_order = 'asc' if (sort_column == column and sort_order == 'desc') else 'desc' %} + + {{ label }} + {% if sort_column == column %} + + {% else %} + + {% endif %} + + +{% endmacro %} + {% if current_user.role == 'president' and player_scores %}
{% for pid, data in player_scores.items() %} @@ -22,7 +39,7 @@
-

+

{% if current_user.role == 'player' %} My Evaluations {% else %} @@ -35,29 +52,29 @@ - - - - - - - - - - - - - - - + {{ sort_link('tryout', 'Tryout') }} + {{ sort_link('player', 'Player') }} + {{ sort_link('evaluator', 'Evaluator') }} + {{ sort_link('mecanics_score', 'Mecanics') }} + {{ sort_link('cohesion_score', 'Cohesion') }} + {{ sort_link('communication_score', 'Communication') }} + {{ sort_link('gamesense_score', 'Gamesense') }} + {{ sort_link('versatility_score', 'Versatility') }} + {{ sort_link('discipline_score', 'Discipline') }} + {{ sort_link('analysis_score', 'Analysis') }} + {{ sort_link('sport_ethics_score', 'Sport Ethics') }} + {{ sort_link('mental_score', 'Mental') }} + {{ sort_link('overall_score', 'Overall') }} + {{ sort_link('position_recommendation', 'Position') }} + {{ sort_link('created_at', 'Date') }} {% for eval in evaluations %} - - - + + + @@ -86,4 +103,4 @@ -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/templates/pages/profile.html b/templates/pages/profile.html index f344ef0..c3a941c 100644 --- a/templates/pages/profile.html +++ b/templates/pages/profile.html @@ -77,22 +77,28 @@
- TRN (Tracker Network) + Games & TRN - {% if user.gamertags %} + {% set games_list = user.get_games_list() %} + {% if games_list %}
- {% for gamertag in user.gamertags %} + {% for game in games_list %} + {% set gt = user.gamertags | selectattr('game', 'equalto', game) | first %} {% endfor %}
{% else %} - Not connected + Not specified {% endif %}
diff --git a/templates/pages/tryouts.html b/templates/pages/tryouts.html index 087302d..bd49dde 100644 --- a/templates/pages/tryouts.html +++ b/templates/pages/tryouts.html @@ -12,64 +12,87 @@ {% endblock %} {% block content %} -
-
-
-
TryoutPlayerEvaluatorMecanicsCohesionCommunicationGamesenseVersatilityDisciplineAnalysisSport EthicsMentalOverallPositionDate
{{ eval.tryout.title }}{{ eval.player.full_name }}{{ eval.evaluator.full_name }}{{ 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.mecanics_score or '-' }} {{ eval.cohesion_score or '-' }} {{ eval.communication_score or '-' }}
- - - - - - - - - - - - - - {% for tryout in tryouts %} - - - - - - - - - - - {% else %} - - - - {% endfor %} - -
TitleTarget TeamDateLocationStatusPlayersEvaluationsActions
{{ tryout.title }}{{ tryout.target_org_team.name if tryout.target_org_team else '-' }}{{ tryout.date.strftime('%b %d, %Y') }}{{ tryout.location or 'TBD' }} - - {{ tryout.status | replace('_', ' ') | title }} - - {{ tryout.registrations.count() }}{{ tryout.evaluations.count() }} - - View - - {% if current_user.can_evaluate() %} - - Evaluate - - {% endif %} -
-
- -

No tryouts found

- {% if current_user.can_manage_tryouts() %} -

Get started by creating a new tryout.

- Create Tryout - {% endif %} -
-
+
+ {% for tryout in tryouts %} +
+
+

{{ tryout.title }}

+ {{ tryout.status | replace('_', ' ') | title }} +
+
+
+
+ + Game + {{ tryout.game }} +
+
+ + Date + {{ tryout.date.strftime('%b %d, %Y') }} +
+
+ + Location + {{ tryout.location or 'TBD' }} +
+
+ + Players + {{ tryout.registrations.count() }} +
+ {% if current_user.can_evaluate() %} +
+ + Evaluations + {{ tryout.evaluations.count() }} +
+ {% endif %} + {% if tryout.target_org_team %} +
+ + Target Team + {{ tryout.target_org_team.name }} +
+ {% endif %} + {% if tryout.max_players %} +
+ + Max Players + {{ tryout.max_players }} +
+ {% endif %} +
+ {% if tryout.description %} +
+

{{ tryout.description | truncate(120) }}

+
+ {% endif %} +
+
+ {% else %} +
+
+
+ +

No tryouts found

+ {% if current_user.can_manage_tryouts() %} +

Get started by creating a new tryout.

+ Create Tryout + {% endif %} +
+
+
+ {% endfor %}
-{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/templates/pages/view_tryout.html b/templates/pages/view_tryout.html index 4ca00c4..282d175 100644 --- a/templates/pages/view_tryout.html +++ b/templates/pages/view_tryout.html @@ -246,204 +246,206 @@ {% endfor %}

+
- {% if can_view_calendar %} -
-
-

Schedule

- {% if can_edit %} - - {% endif %} -
-
- {% if matches %} - -
- {% else %} - -
- -

No matches scheduled yet. Check back later!

-
- {% endif %} - - {% if matches %} - -
- - - - - - - - - - {% if can_edit %} - - {% endif %} - - - - {% for item in match_data %} - {% set m = item.match %} - {% set participants = item.participants %} - - - - - - - - {% if can_edit %} - - {% endif %} - - {% endfor %} - -
MatchTypeDateParticipantsTimeStatusActions
{{ m.title }} - - {% if m.match_type == 'team_vs_team' %} - Team vs Team - {% elif m.match_type == 'player_vs_player' %} - Player vs Player - {% else %} - Player Scrim - {% endif %} - - {{ m.date.strftime('%m/%d/%Y') }} - {% if m.match_type == 'team_vs_team' %} -
-
- {{ m.team1.name if m.team1 else 'Team 1' }} - {% if participants.team1_players %} -
    - {% for pl in participants.team1_players %} -
  • {{ pl.name }}{% if pl.position %} {{ pl.position }}{% endif %}
  • - {% endfor %} -
- {% endif %} -
-
vs
-
- {{ m.team2.name if m.team2 else 'Team 2' }} - {% if participants.team2_players %} -
    - {% for pl in participants.team2_players %} -
  • {{ pl.name }}{% if pl.position %} {{ pl.position }}{% endif %}
  • - {% endfor %} -
- {% endif %} -
-
- {% elif m.match_type == 'player_vs_player' %} -
-
- Team 1 - {% if participants.team1_players %} -
    - {% for pl in participants.team1_players %} -
  • {{ pl.name }}{% if pl.position %} {{ pl.position }}{% endif %}
  • - {% endfor %} -
- {% endif %} -
-
vs
-
- Team 2 - {% if participants.team2_players %} -
    - {% for pl in participants.team2_players %} -
  • {{ pl.name }}{% if pl.position %} {{ pl.position }}{% endif %}
  • - {% endfor %} -
- {% endif %} -
-
- {% else %} - {{ participants | join(', ') }} - {% endif %} -
- {% if m.start_time and m.end_time %} - {{ m.start_time.strftime('%H:%M') }} - {{ m.end_time.strftime('%H:%M') }} - {% else %} - TBD - {% endif %} - - {{ m.status }} - - - Edit - - - Note - -
-
- {% endif %} + {% if can_view_calendar %} +
+
+

Schedule

+ {% if can_edit %} + + {% endif %}
- {% endif %} - -
-
-

Evaluation Summary

+
+ {% if matches %} + +
+ + + + + + + + + + {% if can_edit %} + + {% endif %} + + + + {% for item in match_data %} + {% set m = item.match %} + {% set participants = item.participants %} + + + + + + + + {% if can_edit %} + + {% endif %} + + {% endfor %} + +
MatchTypeDateParticipantsTimeStatusActions
{{ m.title }} + + {% if m.match_type == 'team_vs_team' %} + Team vs Team + {% elif m.match_type == 'player_vs_player' %} + Player vs Player + {% else %} + Player Scrim + {% endif %} + + {{ m.date.strftime('%m/%d/%Y') }} + {% if m.match_type == 'team_vs_team' %} +
+
+ {{ m.team1.name if m.team1 else 'Team 1' }} + {% if participants.team1_players %} +
    + {% for pl in participants.team1_players %} +
  • {{ pl.name }}{% if pl.position %} {{ pl.position }}{% endif %}
  • + {% endfor %} +
+ {% endif %} +
+
vs
+
+ {{ m.team2.name if m.team2 else 'Team 2' }} + {% if participants.team2_players %} +
    + {% for pl in participants.team2_players %} +
  • {{ pl.name }}{% if pl.position %} {{ pl.position }}{% endif %}
  • + {% endfor %} +
+ {% endif %} +
+
+ {% elif m.match_type == 'player_vs_player' %} +
+
+ Team 1 + {% if participants.team1_players %} +
    + {% for pl in participants.team1_players %} +
  • {{ pl.name }}{% if pl.position %} {{ pl.position }}{% endif %}
  • + {% endfor %} +
+ {% endif %} +
+
vs
+
+ Team 2 + {% if participants.team2_players %} +
    + {% for pl in participants.team2_players %} +
  • {{ pl.name }}{% if pl.position %} {{ pl.position }}{% endif %}
  • + {% endfor %} +
+ {% endif %} +
+
+ {% else %} + {{ participants | join(', ') }} + {% endif %} +
+ {% if m.start_time and m.end_time %} + {{ m.start_time.strftime('%H:%M') }} - {{ m.end_time.strftime('%H:%M') }} + {% else %} + TBD + {% endif %} + + {{ m.status }} + + + Edit + + + Note + +
-
-
- - - - - - - - - - - - - - - - - - - - {% for eval in evaluations %} - - - - - - - - - - - - - - - - {% else %} - - - - {% endfor %} - -
PlayerEvaluatorMecanicsCohesionCommunicationGamesenseVersatilityDisciplineAnalysisSport EthicsMentalOverallRecommendation
{{ eval.player.full_name }}{{ eval.evaluator.full_name }}{{ eval.mecanics_score or '-' }}{{ eval.cohesion_score or '-' }}{{ eval.communication_score or '-' }}{{ eval.gamesense_score or '-' }}{{ eval.versatility_score or '-' }}{{ eval.discipline_score or '-' }}{{ eval.analysis_score or '-' }}{{ eval.sport_ethics_score or '-' }}{{ eval.mental_score or '-' }}{{ eval.overall_score or '-' }}{{ eval.position_recommendation or '-' }}
No evaluations yet.
-
+ {% endif %} + + {% if matches %} + +
+ {% else %} + +
+ +

No matches scheduled yet. Check back later!

+
+ {% endif %} +
+
+ {% endif %} + + {% if current_user.can_evaluate() %} +
+
+

Evaluation Summary

+
+
+
+ + + + + + + + + + + + + + + + + + + + {% for eval in evaluations %} + + + + + + + + + + + + + + + + {% else %} + + + + {% endfor %} + +
PlayerEvaluatorMecanicsCohesionCommunicationGamesenseVersatilityDisciplineAnalysisSport EthicsMentalOverallRecommendation
{{ eval.player.full_name }}{{ eval.evaluator.full_name }}{{ eval.mecanics_score or '-' }}{{ eval.cohesion_score or '-' }}{{ eval.communication_score or '-' }}{{ eval.gamesense_score or '-' }}{{ eval.versatility_score or '-' }}{{ eval.discipline_score or '-' }}{{ eval.analysis_score or '-' }}{{ eval.sport_ethics_score or '-' }}{{ eval.mental_score or '-' }}{{ eval.overall_score or '-' }}{{ eval.position_recommendation or '-' }}
No evaluations yet.
+ {% endif %}
-{% endblock %} \ No newline at end of file +{% endblock %}