From 195f3ce312a4ec4c833f160d14c6f2cccfb95a4e Mon Sep 17 00:00:00 2001 From: cedrick2711 Date: Wed, 15 Jul 2026 21:27:18 -0400 Subject: [PATCH] =?UTF-8?q?Ajout=20d'une=20cat=C3=A9gorie=20jeux=20dans=20?= =?UTF-8?q?le=20tryouts,=20chacun=20des=20jeux=20offre=20des=20r=C3=B4les?= =?UTF-8?q?=20diff=C3=A9rents=20pour=20les=20membres=20d'=C3=A9quipes.=20R?= =?UTF-8?q?emodelage=20du=20code=20un=20peu=20et=20ajout=20de=20docu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __pycache__/extensions.cpython-313.pyc | Bin 889 -> 1301 bytes __pycache__/models.cpython-313.pyc | Bin 25576 -> 34605 bytes __pycache__/seed.cpython-313.pyc | Bin 18740 -> 20376 bytes app.py | 22 + extensions.py | 25 +- instance/team_tryouts.db | Bin 135168 -> 139264 bytes models.py | 375 +++++++++++++++--- routes/__pycache__/auth.cpython-313.pyc | Bin 5522 -> 6488 bytes .../__pycache__/evaluations.cpython-313.pyc | Bin 8637 -> 11012 bytes routes/__pycache__/main.cpython-313.pyc | Bin 9665 -> 9651 bytes routes/__pycache__/matches.cpython-313.pyc | Bin 26519 -> 28184 bytes routes/__pycache__/teams.cpython-313.pyc | Bin 9828 -> 11432 bytes routes/__pycache__/tryouts.cpython-313.pyc | Bin 22616 -> 25719 bytes routes/__pycache__/users.cpython-313.pyc | Bin 31445 -> 34137 bytes routes/auth.py | 37 ++ routes/evaluations.py | 98 ++++- routes/main.py | 37 +- routes/matches.py | 101 ++++- routes/teams.py | 71 +++- routes/tryouts.py | 138 ++++++- routes/users.py | 264 +++++++++--- seed.py | 139 ++++--- static/js/main.js | 99 ++++- templates/layouts/macros.html | 141 +++++++ templates/pages/create_tryout.html | 19 +- templates/pages/edit_tryout.html | 19 +- templates/pages/evaluate_player.html | 107 +++-- templates/pages/evaluations.html | 30 +- templates/pages/view_tryout.html | 48 ++- 29 files changed, 1501 insertions(+), 269 deletions(-) create mode 100644 templates/layouts/macros.html diff --git a/__pycache__/extensions.cpython-313.pyc b/__pycache__/extensions.cpython-313.pyc index 461034483e11ce161d12136b421d5113bb90ee6e..c654ac2b999397effc7aa3b1266bcf86b31d7e04 100644 GIT binary patch delta 635 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 delta 8627 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 S;WK3V#Mu+S=Ag+A>wf^q6DZXH diff --git a/__pycache__/seed.cpython-313.pyc b/__pycache__/seed.cpython-313.pyc index 96b06258987ef43c51823ee00720122a5a3845e3..512ba58780567e80719c0dfeb8b91e50595e5648 100644 GIT binary patch delta 6637 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 delta 5437 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 diff --git a/app.py b/app.py index 051882c..b48276e 100644 --- a/app.py +++ b/app.py @@ -1,9 +1,30 @@ +"""Team Tryouts Application - Flask Application Factory. + +This module provides the application factory for creating and configuring +the Flask application instance. +""" + import os from flask import Flask from extensions import db, login_manager, csrf, hash_password, check_password from sqlalchemy import text + def create_app(): + """Create and configure the Flask application. + + Initializes Flask with: + - Secret key for session security + - SQLite database configuration + - CSRF protection + - Login manager + - All route blueprints + + Handles database initialization and seeding with sample data if empty. + + Returns: + Flask: Configured Flask application instance. + """ app = Flask(__name__) app.config['SECRET_KEY'] = os.environ.get('SECRET_KEY', 'team-tryouts-secret-key-change-in-production') app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///team_tryouts.db' @@ -51,6 +72,7 @@ def create_app(): return app + if __name__ == '__main__': app = create_app() app.run(debug=True, host='0.0.0.0', port=5000) \ No newline at end of file diff --git a/extensions.py b/extensions.py index 1d000ff..4c1083d 100644 --- a/extensions.py +++ b/extensions.py @@ -3,14 +3,37 @@ from flask_login import LoginManager from flask_wtf.csrf import CSRFProtect from werkzeug.security import generate_password_hash, check_password_hash + +# Database and extension initialization db = SQLAlchemy() login_manager = LoginManager() login_manager.login_view = 'auth.login' login_manager.login_message_category = 'info' csrf = CSRFProtect() + def hash_password(password): + """ + Hash a plain text password using werkzeug's security functions. + + Args: + password (str): The plain text password to hash. + + Returns: + str: The hashed password string. + """ return generate_password_hash(password) + def check_password(password_hash, password): - return check_password_hash(password_hash, password) \ No newline at end of file + """ + Verify a password against its hash. + + Args: + password_hash (str): The stored password hash. + password (str): The plain text password to verify. + + Returns: + bool: True if the password matches the hash, False otherwise. + """ + return check_password_hash(password_hash, password) diff --git a/instance/team_tryouts.db b/instance/team_tryouts.db index 07fe449e98b8541d0f4a561b6285a91a169c30d4..a80efdc135cd7c11a523f8b36262775f2013201c 100644 GIT binary patch literal 139264 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

e)FhBA5s;*Xda)X?DZzYhM*K1#!{7Uu9mA@!| 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 Xd5+z81mJghID+^ifKcLYQu6--C&mG})cn3+r8X zW|t&I!tIH2gcTAOq)138cT4;oATAX*ZX9iuiW3rVXOr4#!yLxzd2il)-}}Dz-Q~w? z<`cuv5v)t*C!hU1`>naqo5l!zk0=s|Vye}#r3uZ-h>VpLS!+T}SUHii@*+=?c&0vS z6-2?(g>FrWDQj9xtMhE#uuNfEMNza$qNL6y>ND1?n6>7_96?R(BBHrwnda%_Mn=px z=Nl^t4ix`o7)!K3bvjkk==6q0jS5;Jmw?I# zs`ePF=jsELo7eAbk_Pu3cpO-z?<8D0tNQJ23c)e9JS}Al?j-z~Clxzjn%wOW*N2J? z?zp1I?GS<^Hr!EnB?$xKFxlPUoek1qp!cP7j{JL@lLXL(I_;O)q@|?56i)VB(erSA?sn83tVJ_pP zc*U&ss%&edO(J5~V~5cGvogM*%y>AZw(o{*a(#t%0|Cu$u@1D+1D~BLwL)GQ32)=L~(8l2*b3F+y-S)l16GR{i1A8m)Dtmy_TWydU+^ZZiCST%w9}v`d z2MXzt@7{~J&t>Y6E|YRU5Du{ezkb&hozqEZ@N)%hjLplrGO8H^;XXC97=P5?EAHdc z)kMFWpwNkaaUuU!e|hGS*1P}1EwCs|qq4Xi2?6$1egwi>9%ll43FcShD*<#e*6G}) z&QZ1-wPjp;l0n+qAo&`+k599{JlZ+FakQOeT^nj|;}3C?wmwjwgRh?D9sZ6NALHUs T)A8jbqm*owVHW<18i4r^&IQU3 delta 618 zcmZ{fziU%b6vxlG_vPiim%blKpUn>q38K^zA+$7L2XWHjh9=TWI+ToJq2q~Si$l|? zb+iwmW5&*X(8-~Hg5qEYK?hgig|>8Y@ZN`^74-~ovI}mxwivktu(8t>#GyQ34%Ip%Suph28^bM(PPXdsZw58KzGPlI!R0UeUD>U;* z!xisd@t5Qyn*pn;T3u{ zz4fsgn{GV{PZ)NhwPMeex^PFiA)K4h`{FE?qaVfN8!JlEzYPwQOE@Bag>H0Gs=xe( z)^2sDy0jGAgCX_!36 a3AgnL%ctm%8OMeu0_`eeL#5PI7yJToqHu`- diff --git a/routes/__pycache__/evaluations.cpython-313.pyc b/routes/__pycache__/evaluations.cpython-313.pyc index a12e75b56ddf692248555edc7a5800891da653d1..817648e74026f9d1afbf3425f54bb6b31cf72015 100644 GIT binary patch delta 4191 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 NYR=AQ2BK?={x59gjt&3- delta 2319 zcma)7U2Gf07M|I)vsrunzm5~<$8Higah=xrZ5#SWNn5~aLdmirC9NVi*%;G}ZDyUe zL2%2%eFzc{vF1v7xJE=u1Vuy@C|s$!S4g?il`awzN=T$cD`XHtMIaD~S_vuyVrFfZ zz!M|Qx95B_bI#eb=j{A__`^Q?J)6w}$oTQ%@C%*3oIUuM1p7e@A{b*36Jrq@Ga*yV zjLfkLR1xD47X%WJnEuKbkNB7cSqz=+x5fk{7_ups@%n&d?svyL$P)yYU?Y$!E{PH+ zRp#=wHogZ^j{scaB}?vq5rg4lx&)ferwyAV|!mT%%8x!;`9I zMrLJ`?2u}D&CSG8kj#{85`_JO__jX={rG|Z%yTEmfnovEOrj$MbgPz8l!;Qg+Tw|% zn#|6WR7X}Be?FCbaat)6_N)@0x}HW?%X&PUO=hPj6#R8<7`y5MHY?iW1ixNiZw*sd zXDFP-Gj*-DDk6rN(l&g%?gR<$ySl)+kkNVQAl=DPpx+qL9ze9f(LMsYg*4Du8jW?g zcN-mrf^^A2;Shxu{B(T-jNnXtEuO2dxw*$VU8b#!_7l+A_{4->F`k~9N@h`r(nd;5 zL<+n2yaUZKqP2-)1az~JEuAanN#`GCNUtpCMz1Vq1;H~o(-49EINwlRO`F~5=05=H z!fOp)SDY+1lc`ChlWA+?Osj}3f#u^)-@K3$ww%FrXKI=gIH6=w%Fg;3#<)5}e_ z63cC?S*o`bPCmZe_a47I_|Y>|597=Gg6#Hz4*XzW*dqqykbAJLy>vHgNnGOD(PN&^%wP%!F`E7l)%U8~!W zl1OS<6wi{|M?(rBb(V0b6GvM8kuIuxO7V?l(__lDxH=urDkw=-G&+AKP^ze(IC@nM zhW+?PIP@&yiK1I4)wp(bOid?}DMT;(;tgm~Ze*1dz4A1pZS;z%^n{{n#kMm#(s%*- zqPj(UQH`tP&nr_i$c29hhaRO@6{1CL#PJS5)G;!mtvpUFO{>aDM8kt*YVQ-+VIhQ{ zgOM#TvJOV@#RK&>zkrS{=v{~2xhos6W*a(o86Ug~@3DY!Qt~s-vqt xAMIa_u0ih_95RmdL)iZChy-^`l-PNW*>k9U19ljD-SG17=7r8(6D5q;e*;RgHI@JX diff --git a/routes/__pycache__/main.cpython-313.pyc b/routes/__pycache__/main.cpython-313.pyc index 00814b32b92edc40a28a7015a414f55490bb5208..2e711ad62d94f880829056ab93114214522e0448 100644 GIT binary patch delta 2121 zcmah~-ESL35WhX!@ke6Uj_vp(cCvP3(l#GzN>foMq)l5A#crC$j_F4tnX7LTyRz@x zy-U)xv}utLIi78SQ1cJSDoP-L*$)1~; zotfWn=Wh1CPOc;!&+K*^$F5%g`OCli?>hXWe=zGlm*yy!Mrl5Y5!#%0Qus*1Lp{3Lkn|>6Xp63!lfHzH`VxNX z$J`7b<SX47UcSCDn~=L<>ho^eR;-`ZrTah4h+xP z_dBk=JuVa^EDB2gk}OaWQ+Zw`3Z9iIR`Uc;5ut>q=o0fPSSXi^g`A)kWU1F?o5~jy zT$084BEe-UFBC+Ur{$EiioH7}7Ybw%FBa51D_$f$N}1#evxOX1R8~q+3pu6Nw$gz* z(ekwqQ$#FKl2ciztl~`SG*)F?l;>E*vM@*Lunbv4B9cm%a9J)$>NewDB=KUNNLZ5b zHl)5g%(Ax#i>zRZsPj}(;x-(^7^jF*mL-M6nYKmc1qN`MkD!wv@yDD_)^x?g#4YZ( zX0FKt5BbBq)VxyVZx{^biHj>&8oGGof#HTutGAQIjW$el!<7b~wIzO@Sx9&n?lvXi zmdyx*);7COi%I)4C>`kJAkq|pJJu0HFx|ScYCVZi0IrxPVYcy}HKZ3aPTT|36gKd} zk1RNe!tjA1Vqid9R-Yq+x?$3itWhwxX<5@Dc;pGew|io~gUo#4l5Eq5plS)Deu$Xd z=m-orW9Sf!IYMy5*~)C>4Z)v|7Wl^5h2mNyqv&B;Jt7W*D~#G<*%e{l2d=O+UWb6{ z9uGWm^_j8c$kQ~uUXB(>Sn=VWJ0{%1mLrwU5BC@d*hEX>Xl%HI856NE1b3K6j^ z>2oo!5ZbBe#Y^OU| zl+3Y%g4XDC?+&k#oiFF)l2)iBsJT3;GfwB&ei*o1?qRt(MpkPe+bb4wR94uHZGMaY z?sMRUV?cXgEO+NgsiedTsibzOY2DMG1Utsyec$bND-u=+!OVJWU^O=I)xhHz`%SFJGOMx7TI}2%(_=?u)e?ox zP^W!r4QJNzg;jiE4NpT)_@MpbT6B6nnq7@%*P_D8<#2=#B=~0>cOc0>XL5qC>QeJe z!bk1HAmX=Hh9l4Up)sC|yoNR_?ZwSs2e|_yX!HB&Ma9q9eb?v}_ZlAsyy8A%#pM-y zY?T48c*u5Ue_O?z&5Cj^n+2(3WkA~w4QL{$iB={mmciN=Ylz-truO|*t}(G;KnPWN z12R6hacC65RIDSp(ZKQ6cfz;Bca$~cuJRVt^~}KWo()agXsIv0xrRbNpgmPSk5Ce6 O5l&5nt47_SgZ~X`%2x0I delta 1663 zcmZ`(ZA=?=7{C8rU#`~|y1r2Q26smZjBN&RxUEAFHW_Pyjvig-%IGf8Afzkf+A$fM zxP6g*#3!1V7!?y;whtQZj9>f!iOFK3uIIU&X%=VV5@Y-V&SmmR|5sLLj9zljJ-_Gq z{h#0SJa=s|x*oMXuv!@cUo~GOXYSOl*y@h_fzj)PKnN&GM396cq(nw2iHhhXT|_VG zSuICK4H2VcjL;HY!Bo@~VI-#F>!Rj}MOrx%+*^VAs4L=@+!fytt&P-5wGofxVTm!s z6M}K9u9MUnAPC7j=8bm(Vw`@u6K%%?laJ`!b_vN}%{MXC{FqTNKVkgM3`|*eT8kf{ zW`u^}0>z;Tc#G<>X_Mw1*t|mAH#^~1YA^YLtH|jtQ4}4UFRmJQk#N@7VsbTO&Jkm5 z09K72lRJC@BP3ph%T5lunL%rYA^R&hQfiBp+$eqvV2lI$w~)!t`t|U$)>#W?syuvp5J3 zy)C+ZSQ>cWB5H@XeTy~?mZ@weSEllr0=(yMX)xp`#H=Wlt=pwCQf4wO7Rvg1RuI}YKak`9}lF6oHo55Shc-=5OkUTn$~E`a&50FQb=3Wz)Aany$Id<(7p z2!A)g{lJZ;Q0uk9)j>5BmP6sS)>0^33Js|tK@JH@D6y}0TTr+~tk3t78wBwj*-I|#muF?V{w}=3 zUP;|$TUEAAX4_OYEVJRY(Ob#&WQh%z*ddiYF0;qKONweTD<`vRa!yXpDapLT7F70v z%w8xhUR2mixHi|P&4w+WjXSIff&gbj! z>c26&U+mG{_PVEax*ztqr%lW~k9*q24DSrW@lX-X1Je|AFJY$k7o0zf%?5=Kx<~ZG z;ik~h9})d(@N#fDuOR0piO{YG6hXQ+G;hN|kfuuVqJje7qnb@JjZhS647+B6o4QIs I^5Lp~0og>X%>V!Z diff --git a/routes/__pycache__/matches.cpython-313.pyc b/routes/__pycache__/matches.cpython-313.pyc index f836925b500ff2ed28bb661602cca6756fa45555..e12dd0ff14c8dc533b0226b501505deffa113a5d 100644 GIT binary patch delta 2939 zcma)8TWlLe6y5RKPO`Q0ZsIzxX$npAa$BGeTS}oMEv-YEG!9kMrU{$%INo;cwPx21 zE(jO#3y5}wK>QVi_&|tCmJojk3H6ttAn_1FMF_r-aM}t!DhhXI*LGZ)mi^dxX7Aj4 z?z!jQ$=hF{cYZ{TxBY%efal4k)92mit~3Uw_qzn)Eg>dQA%V0XAb zveEChQDY4wTrwJN+J|fh;I6rb<@Q($MD8!yH?_vvV(q(Kv8`bjoanID&{okwHPBi0 zEl|VTBPBn>+rSHQyaa1lJ{s$SxI0Vs*2unwJOu2iVLGtVJJ@&W-6`2rlGsp^B%amO z^a`eW)+7c_=oF{qw7kOh427zxl)M7_aykzCa0Y&_s%BD6W0U6Kj1iKgxuj~~ln$N< zPJ*QdMqx$PNIEW4d{HH<#)y3yE0oBls;5V|$BZWD2*vV6S=HoaRa4DeNGdG42tuz| zUy28!k~B-qEKM5`3B$9j>skcQ(JaAg0%r|43z0LF7;2oPO%?>86FPzwT~?AK7_u=G zKpB#(yJ7^5Tl?M9%}r24qXS--g*!gM7qBe%Ts}PuXu+SEB)AGXHj?@(V?)-oQqG&{ zfc&d4&JrV|rwtOpwnq}L_%lfgQZ`9Qy403oyzVZAvidzk{s05kYy)d9%zHlcqE9X4 z+nMKOIhxh9afj4OPzMqw7lD9Hbt-MJV&RNTO;u4da@xdd8fpxsgd$YD*z{JQM`P0` zuuQ3(!+HX@lu$ZOp+>uWuetm?7+woH{jyMOFMQE>&xdX>yw-1Boq0(*Ojn$`*-}|j z<4`={_xJ?!%9yr4U{l8{#4JGud?8-$|01>;-F@IVS7uTwIR~(RcL7*~ffe1n>K)eN zSZCqm-rJH#J_{{vy*GFW0M8JbQVj!`!AX@+nJUSg&CDpCDTyqC4_Ac1VUFS{TXqpV zoz`+JF_qd%hvGYJ;#iI|T`~#t-od6!A#tWIGtW=y6n+vp<(SX#2H9kvB)I`fFeNLh zVG;`dS;z9GwVM-ya|<=?xQH?RSA(wRRRd2Ee6lY~Xbv13SXn zH(VZ6SRWcf&A&1-&+^LO2@3V?g)Ji!evjP1xI7si1umaCGFR#VUTHo&%I(ikr$W-q zbPTM<*-Rilrbl}85Xwb_6GW)&09 zW#Wtp8}EHQC@@)JVpQ?K4a;qHuF_Yw2LR4OJh+)S=7;8dDP&y^_ZIG+@QD5wS>_%O z@1$<4_srvkr)F<@^RG`3ja2IR0H8H+#`)O?Bb|k0Y7~UuN7!gGWit!c5HSpxtf1FD z^FRB4VoBA<}_56|e-)ab+n z*Ou(mpJ9VR!VrSdv15^`sjBbQL*c%wfNPO~F2QYu`x`c6kN^h)mL=GaOv+5}~fL-S(oJt&0n;vct93 z-Ro!%H%)Ce-CK0Cb^Wd9#X)qic-p#==ncX@A{S8E+fh_>^PS?1Xx&TnytIgrB9=do z!)Lxzd>SA+_}5y8uAjPoYz?)np)nq{4IQtzJXCbE^{tV;sHd1jn~oh^M`3Q?h{EL% MkqtL2X+JRdFP4sG@Bjb+ delta 1231 zcmZvaUrZE79LMK3yLQj zLvvCm5e!bdG&gl?9_q2Rl&;de)N9Y>w5s{&_4%d_TPo?W7N%h>LL*uots`g*nvw1p zi|S6@)g#e*-5o_VHda4;kgYmv*bn>Mu`#z^6-C{mK|V@f8ZSY6yxs6V$4RvU*=Unj zx?{~8@K*qc9^h4*N`|dLy;`qn$9kv-^BuJnb~KmSUH@al71)*%n}~2%*mkX}K8x-d6i$dk-$mds=dWFAbl zf$uj#owa>lIBU%L_CXaFlkDN4BrYCiznqVo>wTuAz7iPOHe*jn*nIfW$smN8s)ung zWrL0pMN&`jhtDg@cGbvejWggMG;&74Aer|kOtGKOKT~fD?tAVkx?_>i56wTn=#X*o z5%XscvwPVj`zzZr=plS~hK<5Joz3^!>cmvOK;|aMrCesgpyc>qo_sSoM>3Qb_&PI{ z%UsCuS%DNLMVOi~%x>d0s6UB%Kk~ruD`c)u+{ZA$mZt{T^u=51x=5ZbHB&!50(*rzhuUNA?%e6iD{K2sm2(Cb%UDXT6|Fi73WT9WjQ_x^t ZfE`^PSc4v$cR)|MMDK>oC2i(6_YN4ZBjx}A diff --git a/routes/__pycache__/teams.cpython-313.pyc b/routes/__pycache__/teams.cpython-313.pyc index 3fba8f7d37b0b5273ecf7f346565c932ab894002..9457852ef21199c3f7cf5cfd6d5a57073879b773 100644 GIT binary patch delta 2599 zcmb`HO>7%Q6vubGUVp4V@@dB{#Y{q@(vPI7(n?LJ3MHYao6@v)DjH#7ZM+kETYEQ} zU8mR*a)ATaq7f2sAwnEDa0nQ2qN+F`6(mF}RDr6Ns)!R(B}YMUsDya4>o|rwg$nkt z-tqir-h03Kzxnz2hjY=jNJJLkxg9-o_Hy#gXyWXrND$r<(gGFIDD9a>iidg>k&23! zdKHOEijVpfKlNiiFHQ%PAPp)qm7TG7I;4bY*!h;GBTAG;l`h(ag^XuNNc%F~X@5E} zF4CS%PimO02Kt7B2Ou7QGQqUGRXE@dTEDcfr3|IRdr>+v?g3@AgR;M+>}peXcTmP! z%APi5ZwF<(rR-}{_IFSYtSf7=Hf6knGLawHnW$D~XkIn+s%q<|fo-Cea7i`PJSh>w z#?&m^#2S_5*@AB2lBt!81Q%38D-sJ&rcO^`bCFPIt%Vm%ip|z;gU#(M4060!R4asH z)w1-w!MBD@>o?KoVy(J%T(@kj7K?3*TWgneOP`0Bwu$Wm!MQS}Jg>4vC}cHhs<{GW zViAH(qgde@eLV`%oN`9-Nhh|Ohn0hh+yy+MO=@ZhQhDAfnKpB!#L_jMqqDKA1DR7u zPBof@N!vxZ8J(0sEDLoGoG zv)m2*6E9G+#LpM%~=lI*om0i9sKgl?B-%{DV+eC&Rj=QHGa&_ zZd~Vp+nmz>18HQ=EMv{YhH2vhGkT@~)+ar8BBwa4Q5V+M`f~4k9^_|F$F8FQ8|;a( z-SH=Cq3Rz~q)50+jEm(@ia6iUH3fxv&EzhkCo$x0Ncm$ zuOdqv+bwuOzingJ!h7qV4QNtL?FEuYG!6QxdAWf%HlcQGVO;~as9J44Lx!Rptpxi)}0x6UR= zH}0wj8023QpyUJx{?HUQg}|;44T67u8+teLB`5Kd>z@QC!7e2S*pH8YAaA+h&t^3< zm(8-*w|`W75i|fyu=c^bAtHoUJtFe{E(_=+`d*m1E$qJ~Y`HDqJE8uIFT7n?Ie0B} z=t7|36Fl-8$ybvXJ>Q|eA5hn-X8^r|)#%{}+`pK`>BHgO8AdSOg=0F^%hW%~}! delta 992 zcmZ`%&1(}u6rb6TWV4$|VzNoLv8>xRP?I*+wpJP}Ena%qNQzmkjSZfpMhha-gCJ__ zMG+6SJVf!*dh_5RkdxvcP(4*dltQT$!9y=w>P-b_VpCUW2KLSV_F;WD3&_S4+X5AAk&3oNC0nMl?V~=6^FqOID^#%qG|<3e zLA5oiHQuE{&?c1FAsVt!1$QDxu7n+*r8s zX|#n=b+kV01oHy(k)>LE`r!PKM;1OHUT+Z}@%RpbgqwS|^9OKi%}_!aqffAQLOYOj`s-I*v+O@n#O5r%ZUK55RAI ziwtwev8H1?zAP}uL*pa7j;c8Dw~5M|RNz;YRnY>^mov5^&mz%krS)_@TdJP*941Gab;Cc}5;^@7HEB^MaX9 z!ksh$Bl`p!@GARq{sN;}I-2WZ)fF+un`q(_n%G1qHc;CpvbHpR@%+py zf&1oNb5Zz!W1n$&M+oEFcvnP1gcseFICeXcpf+TImGPC~1#=DeHpFeXe_xw(B?ble zB<%DUdcwoxU5P>WIGDZ0^_Yh^s4}SplZ_RoD diff --git a/routes/__pycache__/tryouts.cpython-313.pyc b/routes/__pycache__/tryouts.cpython-313.pyc index c8536fd252f36ebe89231dd8b5a34e5e525c7e5e..3087a178bce00d23550f78aab8b5a28dd9cea428 100644 GIT binary patch delta 8032 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 delta 5142 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 diff --git a/routes/__pycache__/users.cpython-313.pyc b/routes/__pycache__/users.cpython-313.pyc index 39bc54f4e0dea41a2a4533f270b014a0b604e765..b9cca18573621df9e24ad19a275b17c2f046157e 100644 GIT binary patch delta 11150 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 delta 8382 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 diff --git a/routes/auth.py b/routes/auth.py index 110fcf1..2e66085 100644 --- a/routes/auth.py +++ b/routes/auth.py @@ -1,3 +1,8 @@ +"""Authentication routes for user login, logout, and registration. + +This module handles user authentication including login, logout, and new user registration. +""" + from flask import Blueprint, render_template, redirect, url_for, flash, request from flask_login import login_user, logout_user, login_required, current_user from extensions import db, hash_password, check_password @@ -5,8 +10,20 @@ from models import User, ESPORT_GAMES auth_bp = Blueprint('auth', __name__, url_prefix='/auth') + @auth_bp.route('/login', methods=['GET', 'POST']) def login(): + """Handle user login authentication. + + GET: Render the login form. + POST: Authenticate user credentials and log them in. + + Redirects authenticated users to dashboard. Validates credentials and checks + account status before login. + + Returns: + Response: Login form or redirect to dashboard/next page. + """ if current_user.is_authenticated: return redirect(url_for('main.dashboard')) @@ -28,8 +45,20 @@ def login(): return render_template('pages/login.html') + @auth_bp.route('/register', methods=['GET', 'POST']) def register(): + """Handle new player registration. + + GET: Render the registration form with E-Sports games list. + POST: Create a new player account with provided details. + + Only players can register through this form. Validates username/email + uniqueness and password confirmation. + + Returns: + Response: Registration form or redirect to login. + """ if current_user.is_authenticated: return redirect(url_for('main.dashboard')) @@ -80,9 +109,17 @@ def register(): return render_template('pages/register.html', esport_games=ESPORT_GAMES) + @auth_bp.route('/logout') @login_required def logout(): + """Log out the current user. + + Clears the user session and redirects to the login page. + + Returns: + Response: Redirect to login page with logout message. + """ logout_user() flash('You have been logged out.', 'info') return redirect(url_for('auth.login')) \ No newline at end of file diff --git a/routes/evaluations.py b/routes/evaluations.py index 5f5ad28..d887fdc 100644 --- a/routes/evaluations.py +++ b/routes/evaluations.py @@ -1,4 +1,9 @@ -from flask import Blueprint, render_template, redirect, url_for, flash, request, jsonify +"""Evaluation routes for assessing player performance during tryouts. + +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 @@ -6,9 +11,19 @@ from sqlalchemy import func evaluations_bp = Blueprint('evaluations', __name__, url_prefix='/evaluations') + @evaluations_bp.route('') @login_required def list_evaluations(): + """List all evaluations accessible to the current user. + + President: All evaluations with player score summaries. + Evaluators (coach/manager): Their given evaluations. + Players: Their received evaluations. + + Returns: + Response: Rendered evaluations list template. + """ user = current_user if user.role == 'president': @@ -33,9 +48,22 @@ def list_evaluations(): return render_template('pages/evaluations.html', evaluations=evaluations, player_scores=player_scores) + @evaluations_bp.route('//', methods=['GET', 'POST']) @login_required def evaluate_player(tryout_id, player_id): + """Evaluate a specific player in a tryout. + + GET: Render the evaluation form with any existing evaluation. + POST: Create or update the evaluation for the player. + + Args: + tryout_id: The ID of the tryout. + player_id: The ID of the player to evaluate. + + Returns: + Response: Evaluation form or redirect to tryout view. + """ if not current_user.can_evaluate(): flash('You do not have permission to evaluate players.', 'danger') return redirect(url_for('main.dashboard')) @@ -54,29 +82,41 @@ def evaluate_player(tryout_id, player_id): ).first() if request.method == 'POST': - speed = request.form.get('speed_score') - agility = request.form.get('agility_score') - technique = request.form.get('technique_score') - teamwork = request.form.get('teamwork_score') - attitude = request.form.get('attitude_score') + mecanics = request.form.get('mecanics_score') + cohesion = request.form.get('cohesion_score') + communication = request.form.get('communication_score') + gamesense = request.form.get('gamesense_score') + versatility = request.form.get('versatility_score') + discipline = request.form.get('discipline_score') + analysis = request.form.get('analysis_score') + sport_ethics = request.form.get('sport_ethics_score') + mental = request.form.get('mental_score') comments = request.form.get('comments') position = request.form.get('position_recommendation') scores = [] - if speed: scores.append(int(speed)) - if agility: scores.append(int(agility)) - if technique: scores.append(int(technique)) - if teamwork: scores.append(int(teamwork)) - if attitude: scores.append(int(attitude)) + if mecanics: scores.append(int(mecanics)) + if cohesion: scores.append(int(cohesion)) + if communication: scores.append(int(communication)) + if gamesense: scores.append(int(gamesense)) + if versatility: scores.append(int(versatility)) + if discipline: scores.append(int(discipline)) + if analysis: scores.append(int(analysis)) + if sport_ethics: scores.append(int(sport_ethics)) + if mental: scores.append(int(mental)) overall = sum(scores) / len(scores) if scores else None if existing_eval: - existing_eval.speed_score = int(speed) if speed else None - existing_eval.agility_score = int(agility) if agility else None - existing_eval.technique_score = int(technique) if technique else None - existing_eval.teamwork_score = int(teamwork) if teamwork else None - existing_eval.attitude_score = int(attitude) if attitude else None + existing_eval.mecanics_score = int(mecanics) if mecanics else None + existing_eval.cohesion_score = int(cohesion) if cohesion else None + existing_eval.communication_score = int(communication) if communication else None + existing_eval.gamesense_score = int(gamesense) if gamesense else None + existing_eval.versatility_score = int(versatility) if versatility else None + existing_eval.discipline_score = int(discipline) if discipline else None + existing_eval.analysis_score = int(analysis) if analysis else None + existing_eval.sport_ethics_score = int(sport_ethics) if sport_ethics else None + existing_eval.mental_score = int(mental) if mental else None existing_eval.overall_score = overall existing_eval.comments = comments existing_eval.position_recommendation = position @@ -86,11 +126,15 @@ def evaluate_player(tryout_id, player_id): tryout_id=tryout_id, player_id=player_id, evaluator_id=current_user.id, - speed_score=int(speed) if speed else None, - agility_score=int(agility) if agility else None, - technique_score=int(technique) if technique else None, - teamwork_score=int(teamwork) if teamwork else None, - attitude_score=int(attitude) if attitude else None, + mecanics_score=int(mecanics) if mecanics else None, + cohesion_score=int(cohesion) if cohesion else None, + communication_score=int(communication) if communication else None, + gamesense_score=int(gamesense) if gamesense else None, + versatility_score=int(versatility) if versatility else None, + discipline_score=int(discipline) if discipline else None, + analysis_score=int(analysis) if analysis else None, + sport_ethics_score=int(sport_ethics) if sport_ethics else None, + mental_score=int(mental) if mental else None, overall_score=overall, comments=comments, position_recommendation=position @@ -112,9 +156,21 @@ def evaluate_player(tryout_id, player_id): existing_eval=existing_eval, evaluators=evaluators) + @evaluations_bp.route('//players') @login_required def players_to_evaluate(tryout_id): + """List players that need evaluation in a specific tryout. + + Shows all registered players and marks which ones have already been evaluated + by the current user. + + Args: + tryout_id: The ID of the tryout. + + Returns: + Response: Rendered players-to-evaluate template. + """ if not current_user.can_evaluate(): flash('Permission denied.', 'danger') return redirect(url_for('main.dashboard')) diff --git a/routes/main.py b/routes/main.py index 7258134..aa53cc5 100644 --- a/routes/main.py +++ b/routes/main.py @@ -1,3 +1,8 @@ +"""Main dashboard routes for the Team Tryouts application. + +This module provides the main dashboard view with role-specific statistics. +""" + from flask import Blueprint, render_template, redirect, url_for, flash from flask_login import login_required, current_user from extensions import db @@ -7,13 +12,34 @@ from datetime import datetime, date main_bp = Blueprint('main', __name__) + @main_bp.route('/') def index(): + """Redirect root URL to login page. + + This is the entry point for the application when no specific route is provided. + + Returns: + Response: Redirect to login page. + """ return redirect(url_for('auth.login')) + @main_bp.route('/dashboard') @login_required def dashboard(): + """Render the main dashboard with role-specific statistics. + + Displays different statistics based on the user's role: + - President: Overview of all users, tryouts, and evaluations + - Manager: Their created tryouts and evaluations + - Coach: Their evaluations and pending evaluations + - Player: Their registrations, evaluations, and upcoming matches + - Scout: Top-rated players across all tryouts + + Returns: + Response: Rendered dashboard template with user stats. + """ user = current_user stats = {} @@ -23,9 +49,9 @@ def dashboard(): stats['total_tryouts'] = Tryout.query.count() stats['total_evaluations'] = Evaluation.query.count() stats['active_tryouts'] = Tryout.query.filter_by(status='in_progress').count() - stats['upcoming_tryouts'] = Tryout.query.filter_by(status='upcoming').count() - stats['recent_users'] = User.query.order_by(User.created_at.desc()).limit(5).all() - stats['recent_tryouts'] = Tryout.query.order_by(Tryout.created_at.desc()).limit(5).all() + stats['completed_tryouts'] = Tryout.query.filter_by(status='completed').count() + stats['recent_users'] = User.query.order_by(User.created_at.desc()).limit(10).all() + stats['recent_tryouts'] = Tryout.query.order_by(Tryout.created_at.desc()).limit(10).all() elif user.role == 'manager': stats['total_tryouts'] = Tryout.query.filter_by(created_by=user.id).count() @@ -40,14 +66,11 @@ def dashboard(): registered_player_ids = [r.player_id for r in registrations] evaluated_player_ids = [e.player_id for e in Evaluation.query.filter_by(evaluator_id=user.id).all()] stats['pending_evaluations'] = len(set(registered_player_ids) - set(evaluated_player_ids)) - stats['my_recent_evaluations'] = Evaluation.query.filter_by(evaluator_id=user.id).order_by(Evaluation.created_at.desc()).limit(5).all() + stats['my_recent_evaluations'] = Evaluation.query.filter_by(evaluator_id=user.id).order_by(Evaluation.created_at.desc()).limit(10).all() elif user.role == 'player': stats['my_tryouts'] = TryoutRegistration.query.filter_by(player_id=user.id).count() - stats['my_evaluations'] = Evaluation.query.filter_by(player_id=user.id).count() - stats['average_score'] = db.session.query(func.avg(Evaluation.overall_score)).filter_by(player_id=user.id).scalar() or 0 stats['my_registrations'] = TryoutRegistration.query.filter_by(player_id=user.id).order_by(TryoutRegistration.registered_at.desc()).limit(5).all() - stats['my_eval_list'] = Evaluation.query.filter_by(player_id=user.id).order_by(Evaluation.created_at.desc()).limit(5).all() # Get next match for each tryout the player is in today = date.today() diff --git a/routes/matches.py b/routes/matches.py index 79434a2..407de22 100644 --- a/routes/matches.py +++ b/routes/matches.py @@ -1,3 +1,8 @@ +"""Match scheduling routes for managing scrimmages and matches within tryouts. + +This module handles calendar views, match creation, and player availability. +""" + from flask import Blueprint, render_template, redirect, url_for, flash, request, jsonify from flask_login import login_required, current_user from extensions import db @@ -8,21 +13,35 @@ matches_bp = Blueprint('matches', __name__, url_prefix='/matches') def can_schedule_match(): - """Check if user can schedule matches (coaches and above).""" + """Check if user can schedule matches (coaches and above). + + Returns: + bool: True if user is president, manager, coach, or scout. + """ return current_user.role in ['president', 'manager', 'coach', 'scout'] @matches_bp.route('/calendar') @login_required def calendar(): - """Calendar view showing tryouts and matches.""" + """Render the calendar view showing all tryouts and matches. + + Returns: + Response: Rendered calendar template. + """ return render_template('pages/calendar.html') @matches_bp.route('/api/events') @login_required def api_events(): - """API endpoint returning calendar events.""" + """API endpoint returning calendar events for FullCalendar. + + Returns tryout events and match events with participant information. + + Returns: + Response: JSON array of calendar events. + """ events = [] # Get tryouts based on user permissions @@ -96,7 +115,14 @@ def api_events(): @matches_bp.route('/api/events/') @login_required def api_events_for_tryout(tryout_id): - """API endpoint returning calendar events for a specific tryout.""" + """API endpoint returning calendar events for a specific tryout. + + Args: + tryout_id: The ID of the tryout to get events for. + + Returns: + Response: JSON array of calendar events for the tryout. + """ tryout = Tryout.query.get_or_404(tryout_id) # Check if user can view this tryout @@ -201,7 +227,18 @@ def api_events_for_tryout(tryout_id): def get_visible_tryouts_for_user(): - """Get tryouts that the current user can see based on their role.""" + """Get tryouts that the current user can see based on their role. + + Permission hierarchy: + - President: All tryouts + - Manager: Only their created tryouts + - Coach: Tryouts targeting their org team + - Player: Tryouts they're registered for or matches they're in + - Scout: All tryouts + + Returns: + list: Query result of Tryout objects. + """ if current_user.role == 'president': return Tryout.query.order_by(Tryout.date).all() elif current_user.role == 'manager': @@ -236,7 +273,17 @@ def get_visible_tryouts_for_user(): @matches_bp.route('/create/', methods=['GET', 'POST']) @login_required def create_match(tryout_id): - """Create a new match/scrimmage within a tryout.""" + """Create a new match/scrimmage within a tryout. + + GET: Render the match creation form. + POST: Create a match with submitted details. + + Args: + tryout_id: The ID of the tryout to create the match for. + + Returns: + Response: Create form or redirect to tryout view. + """ tryout = Tryout.query.get_or_404(tryout_id) # Check if user can manage this tryout (president, manager, or coach) @@ -332,7 +379,17 @@ def create_match(tryout_id): @matches_bp.route('//edit', methods=['GET', 'POST']) @login_required def edit_match(match_id): - """Edit an existing match.""" + """Edit an existing match. + + GET: Render the match edit form. + POST: Update match with submitted changes. + + Args: + match_id: The ID of the match to edit. + + Returns: + Response: Edit form or redirect to tryout view. + """ match = Match.query.get_or_404(match_id) tryout = match.tryout @@ -421,7 +478,14 @@ def edit_match(match_id): @matches_bp.route('//delete', methods=['POST']) @login_required def delete_match(match_id): - """Delete a match.""" + """Delete a match. + + Args: + match_id: The ID of the match to delete. + + Returns: + Response: Redirect to tryout view with status message. + """ match = Match.query.get_or_404(match_id) tryout = match.tryout @@ -438,12 +502,15 @@ def delete_match(match_id): def get_players_available_at_time(date_str, time_str): """Get list of player IDs available at a specific date and time. + Checks player disponibility records to find who is available + during the specified time block. + Args: - date_str: Date in YYYY-MM-DD format - time_str: Time in HH:MM format + date_str: Date in YYYY-MM-DD format. + time_str: Time in HH:MM format. Returns: - List of player IDs who are available at that time + list: List of available player IDs. """ try: date_obj = datetime.strptime(date_str, '%Y-%m-%d').date() @@ -487,9 +554,17 @@ def get_players_available_at_time(date_str, time_str): @matches_bp.route('/api/available_players//

+

{{ title }}

+ {% if actions %} +
{{ actions }}
+ {% endif %} +
+{% endmacro %} + +{# Stat Card Macro - renders statistics card #} +{% macro stat_card(value, label, icon_class, bg_class) %} +
+
+ +
+
+

{{ value }}

+

{{ label }}

+
+
+{% endmacro %} + +{# Badge Macro - renders status/role badges with appropriate styling #} +{% macro badge(text, type='default') %} +{{ text }} +{% endmacro %} + +{# User Avatar Macro - renders user avatar with name #} +{% macro user_avatar(user, size='sm') %} +
+
{{ user.full_name[:2] | upper }}
+ {{ user.full_name }} +
+{% endmacro %} + +{# Form Field Macro - renders labeled form input #} +{% macro form_field(label, type, name, value='', placeholder='', required=false, extra_classes='') %} +
+ + +
+{% endmacro %} + +{# Form Row Macro - renders a row of form fields #} +{% macro form_row(fields) %} +
+ {% for field in fields %} +
+ + {% if field.type == 'select' %} + + {% else %} + + {% endif %} +
+ {% endfor %} +
+{% endmacro %} + +{# Table Macro - renders a table with headers and optional empty state #} +{% macro table(headers, rows, empty_message='No records found') %} +
+ + + + {% for header in headers %} + + {% endfor %} + + + + {% if rows %} + {{ rows }} + {% else %} + + + + {% endif %} + +
{{ header }}
+
+ +

{{ empty_message }}

+
+
+
+{% endmacro %} + +{# Modal Macro - renders a modal dialog #} +{% macro modal(id, title, content, footer_buttons=None) %} + +{% endmacro %} + +{# Detail Item Macro - renders a key-value pair in detail view #} +{% macro detail_item(label, value) %} +
+ {{ label }} + {{ value }} +
+{% endmacro %} + +{# Action Button Macro - renders a button link #} +{% macro action_button(url, text, icon, style='outline', size='sm') %} +
+ {% if icon %}{% endif %} + {{ text }} + +{% endmacro %} \ No newline at end of file diff --git a/templates/pages/create_tryout.html b/templates/pages/create_tryout.html index 5cd2047..7a89be5 100644 --- a/templates/pages/create_tryout.html +++ b/templates/pages/create_tryout.html @@ -16,19 +16,30 @@
- - + +
- - + +
+
+ + +
+
+
+ +
- - + +
+
+ + +
+
+
- {{ existing_eval.speed_score or 5 }} + + {{ existing_eval.mecanics_score or 5 }}
- +
- - {{ existing_eval.agility_score or 5 }} + + {{ existing_eval.cohesion_score or 5 }}
- +
- - {{ existing_eval.technique_score or 5 }} + + {{ existing_eval.communication_score or 5 }}
- +
- - {{ existing_eval.teamwork_score or 5 }} + + {{ existing_eval.gamesense_score or 5 }}
- +
- - {{ existing_eval.attitude_score or 5 }} + + {{ existing_eval.versatility_score or 5 }}
+ +
+ + {{ existing_eval.discipline_score or 5 }} +
+
+
+ +
+
+ +
+ + {{ existing_eval.analysis_score or 5 }} +
+
+
+ +
+ + {{ existing_eval.sport_ethics_score or 5 }} +
+
+
+ +
+ + {{ existing_eval.mental_score or 5 }} +
+
+
+ + {% set positions = GAME_POSITIONS.get(tryout.game, []) %} +
+
- + {% if positions %} + + {% else %} + + {% endif %}
@@ -96,17 +140,34 @@
- + + + + + + + + + + + + + + {% for entry in evaluators %} - - - - - + + + + + + + + + diff --git a/templates/pages/evaluations.html b/templates/pages/evaluations.html index ceffad4..d033399 100644 --- a/templates/pages/evaluations.html +++ b/templates/pages/evaluations.html @@ -38,11 +38,15 @@ - - - - - + + + + + + + + + @@ -54,18 +58,22 @@ - - - - - + + + + + + + + + {% else %} - - - - - - + + + + + + + + + @@ -392,17 +410,21 @@ - - - - - + + + + + + + + + {% else %} - + {% endfor %} @@ -412,7 +434,7 @@ -
EvaluatorSpeedAgilityTechniqueTeamworkAttitudeOverallPosition
EvaluatorMecanicsCohesionCommunicationGamesenseVersatilityDisciplineAnalysisSport EthicsMentalOverallPosition
{{ entry.evaluator.full_name }}{{ entry.eval.speed_score or '-' }}{{ entry.eval.agility_score or '-' }}{{ entry.eval.technique_score or '-' }}{{ entry.eval.teamwork_score or '-' }}{{ entry.eval.attitude_score or '-' }}{{ entry.eval.mecanics_score or '-' }}{{ entry.eval.cohesion_score or '-' }}{{ entry.eval.communication_score or '-' }}{{ entry.eval.gamesense_score or '-' }}{{ entry.eval.versatility_score or '-' }}{{ entry.eval.discipline_score or '-' }}{{ entry.eval.analysis_score or '-' }}{{ entry.eval.sport_ethics_score or '-' }}{{ entry.eval.mental_score or '-' }} {{ entry.eval.overall_score or '-' }} {{ entry.eval.position_recommendation or '-' }}
Tryout Player EvaluatorSpeedAgilityTechniqueTeamworkAttitudeMecanicsCohesionCommunicationGamesenseVersatilityDisciplineAnalysisSport EthicsMental Overall Position Date{{ eval.tryout.title }} {{ eval.player.full_name }} {{ eval.evaluator.full_name }}{{ eval.speed_score or '-' }}{{ eval.agility_score or '-' }}{{ eval.technique_score or '-' }}{{ eval.teamwork_score or '-' }}{{ eval.attitude_score or '-' }}{{ 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 'N/A' }} {{ eval.created_at.strftime('%m/%d/%Y') }}
+

No evaluations yet

diff --git a/templates/pages/view_tryout.html b/templates/pages/view_tryout.html index 845359b..e1a124b 100644 --- a/templates/pages/view_tryout.html +++ b/templates/pages/view_tryout.html @@ -32,7 +32,11 @@
-
+
+
+ Game + {{ tryout.game }} +
Date {{ tryout.date.strftime('%A, %B %d, %Y') }} @@ -209,6 +213,7 @@ {% endfor %} {% if can_edit and registered_players %} + {% set positions = game_positions.get(tryout.game, []) %}
+ {% if positions %} + + {% else %} + {% endif %}
{% endif %} @@ -378,11 +392,15 @@
Player EvaluatorSpeedAgilityTechniqueTeamworkAttitudeMecanicsCohesionCommunicationGamesenseVersatilityDisciplineAnalysisSport EthicsMental Overall Recommendation
{{ eval.player.full_name }} {{ eval.evaluator.full_name }}{{ eval.speed_score or '-' }}{{ eval.agility_score or '-' }}{{ eval.technique_score or '-' }}{{ eval.teamwork_score or '-' }}{{ eval.attitude_score or '-' }}{{ 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.No evaluations yet.