From c5970d25423508a6dea98f5a9216cae126a22709 Mon Sep 17 00:00:00 2001 From: Tom Price Date: Wed, 23 Dec 2015 01:06:18 +0000 Subject: [PATCH] A first view that shows a user their current training status. --- PyRIGS/urls.py | 3 +- db.sqlite3 | Bin 82944 -> 105472 bytes training/models.py | 24 +++++-- .../templates/training/profile_detail.html | 63 ++++++++++++++++++ training/templatetags/__init__.py | 1 + training/templatetags/training_extras.py | 14 ++++ training/urls.py | 8 +++ training/views.py | 14 +++- 8 files changed, 120 insertions(+), 7 deletions(-) create mode 100644 training/templates/training/profile_detail.html create mode 100644 training/templatetags/__init__.py create mode 100644 training/templatetags/training_extras.py create mode 100644 training/urls.py diff --git a/PyRIGS/urls.py b/PyRIGS/urls.py index 9821ae20..8dae92d6 100644 --- a/PyRIGS/urls.py +++ b/PyRIGS/urls.py @@ -12,7 +12,8 @@ urlpatterns = patterns('', # url(r'^blog/', include('blog.urls')), url(r'^', include('RIGS.urls')), - url('^user/register/$', RegistrationView.as_view(form_class=RIGS.forms.ProfileRegistrationFormUniqueEmail), + url('^training/', include('training.urls', namespace='training')), + url('^user/register/$', RegistrationView.as_view(form_class=RIGS.forms.ProfileRegistrationFormUniqueEmail), name="registration_register"), url('^user/', include('django.contrib.auth.urls')), url('^user/', include('registration.backends.default.urls')), diff --git a/db.sqlite3 b/db.sqlite3 index d0e8fed8d67a99e4d84aaca79726634d5103571e..ac9ebe55c9de9bf88e09f96bed255041f3492268 100644 GIT binary patch literal 105472 zcmeHw3v^q@b>N#fAVEl?zN8>ok_AzsB$y)kKKL`TO-YnQS)zWFEXsCa5CBO~_)q{y zkyPCFQBIuAwoNyiWYeBD?e=6(n|70?ZJK6#c2Cn}>$FWayUFG>N!zqdn{^x4`Sp`@ zk8^hS&dmGF10D#9mbLmkNEklM+&lNqee<7t?_4~8I#xYFXGSP@8VbS z%lMP{ck##YNAR!UUjm@_-BPQm@q9KjohnY2lIc>hnk`n7)rA?SsFtG_h6YE60;7XR zP7ejT9FV#K2fK2au0Rg*naq|0BWFhgBbQE}4xGC%d}i>%Sm3FlvB2P^(X+!Nkk^@^ zkWtK_4G%|et(hx9a zoM2FVN%-ybVI<^=ne2S!dLG_SGBsN*(cejjA|{i??2V+{D5VwT{%!ca>Q_~?GSE=Mm#iU#l;RW_QLoKcTF||<^PNj1ya_c#<)!);D z#%MWp@l~?dXS2n0w&o|cm9Hl8AgKh005hnKA+Nu`A1$SL*%fk=q^K(V2=~fTuM!I= zQX(8pC~}_~g;pddHuAWkI$T9^!c}5Xh)-?}o#5$g&WFr|)DvBI;#D!AC zLy5H&Mch~E)M#kjar%!^Cn?*W4Q zd59#i;}9M|&;vkqElwtlhjKPuDrdy)2XVAM5#}ldaq9srqjGi*S_K*G;VDNRd>y^G z7wLm#DpSZ6llju*+MRv)37?UY=evXt*(&z8SszHgL zL2li$ANQb|$;V0jQDJ+1CK!KoV;Am5WS~pVluHx2d{*2Vz-k*GlbkGe?|0(_w{yhFe z{3-mO@yGE;@vq_!;t$~W<9Fkqz;DMtju&wi7x5Gx$Is%+_#8fkkKxC03@i8$-j4(L z5!`{-<2EdcKNP<&eph@|{D$}!;#b5kik}l-7C$NeuJ|$WBjT@!za;*g_&)Kc#dnG? zia#pOi)H9%CdB8(tH6-^xo;)Vf)Uz!l7=T}c$|ctLo_@_!=ohZI6}ig8a_$FEl<$! zaT*>b;pVr{aDavh5^jpqFh;{D2{%S)7^Y!}gd0>EDm0WyxL%@RKMnh6*h|9pLp1E6 z;bSCR7o_1q8Xh3w+Wj=_rr|ys?j_-xE*kEkVSt9aN$7i&hP!CElZ0(MX!r;Xx6^PN z3B7(AZlz%-4LeBKx`l?DX}F1o8%fx*frjg8*iJ&vIvTE};TjTR9}U}R=p~`pN<&zO z!?VYOeF&34#MtL+hg!B(+$-R3;jiL9#vg`O{t~`{Q_!jhp*`=$>%`Zg{r&;8*Z0G^ z;Cb;F0K1=uNdmjKdW2o7F+v-E^Ds!|**N@2CjbPE1miDD+tvYT-A0`8mkf71w?Im- z5o7!{#{G`XF!1j%ClUI<-nj{4cbT!q%wq3GkI=1_vy-_B@etmcX*(jd-+K|_uNjVLw+*1p;MC0 zBK+J#ep>r3n~+EF@1j#Ln0djpqr5=I|E=Oa0jszj2gD!Zaq;hACGZY>9v{Kq#-D|` zz(-)r{&n$Z@Xv@h#gw>D9D0~4zgt$=Nb>Ab&8fc8P`UQMb%$qHunvH=|IY26UEOtQ zq#bqa^6cuZOEKF2mQK&^9oD2=Z~vROdUo%!VvY8{X`iQCh3IA5|Hh4;&K-0%Z?u0i zLT~@;H+wpFQwX#Dx7(u#-|NGiGS} z_nK&W`)}>=?An29+JDPVPxoHLwfPG7?4gX9?H_OPbnc-`9jpC|n>_wqK3n@IvYj1Y8L`G!ke>*M(LA4ik=|-RPs@QE?vs7XB>(eFJUtA3lt39i~SfORXL+IX!Yb zo4fnRBTh$laFk{p$0^~k?ZnQ0o>!X+sQFwL&ImKG=~T@XvgTo5@XjA5LCt#N4IGqd z8{548J$sOLjlLMVl||=!*3%mM>64Yv^w`Nsu6EJIxRcNTJH`yEzE=N-E|&JaTO4ivDgK zu(|?gN9t0E;Pn|4RWKlLE~ss9_xhiTBW=K9gS`$b+e%W(#?^Q#G-1^RUaT7&m};B{ z$6Fl`VbQD%LG97?jJKiXc#Ek~bzF|JL-x8HH?D{`BaddhSu&x*Te{fc^`AI_UhJmL znk;aQz4PR3C0pi&v~1!wdm~>KR&PJIr{bZ{vzs?op0w3c?{ItPxN&IlW1X%3!ih#L zo@cO5$VqwG_y2ozOW;aiH4<>g|J6v%#c?I@U`W6n z{~wI^=$68jz-lDmw*S>g&Bbvg@L)*5ZT}C(dvr_TN?vnrgjIDPMKW}7m$Ro$C`w;gjm0C<6MI{P-2;QBi2~&lltfCpiM$+1%3;aD z_8T%#B4C>x>VgcqZ5hY_P@LebTfWKN=S{z-2MN1vafTQawTwA zB;dCHyCPo@q?urE5_J3Ez>=JP$a8F9WZU6V=YjK%!C2&_H zK-T{rp(+Sf)QA3F`~*IZR`2I;Y5!(sCS0kv{$gA5WJ7*Qi*ED!$4(&a8EVC5+oZ2G z5`&HCl$0G;CzgfUWw&Wt7S_y>nYJwpOYFTk)2yJD*v>cypLpP$cUfF>3w>FrM{kdF zX4tn<&Mk+#)UfeXm)GCjjh3Fa-j431g0iSTZ*j1^)00+ZXa{wnTur8`4(8Qh>PGyF zLP|EBE2Q$K-8CfWzBL=zbO)D)&UyX8AbN4gDvas1gBHj9B{>wxOk7ow%DKs|z<8-- zW4Jt9tdGoO9bt>5YPQl9sAlJ@)EPCDmvXd1YeWjm*&@e^0&^mnl~QcSQp3_=JP$a8F8rwEwlj9s&G&XF&V!lj1e;7vtn~?l8)i`)`Ph90pem&X;3^MEO(;@dNR{K!kUUx{1kRPg&3T|}^whbo zKyN_qlM{i#DqP-^$z}q>;A^y$nN1VltbvQntEqT&3agz18VH6MB zDYBbH!hNxr6bi@h3`MFZek9i~}oV>F|+3 z)u}+LmWtfX?n#l5e|XzN*?6j>Te-Z|lVt0+y=>lOqWwOw`|^z=7O% zJG48-JXDAdnT8UI+839jF}O-(HPy581SVOZcgz~So<{_;2c>J@m=sH>vA$R&6p2Z-r8C>rM6O(^Ch0XsfqY7T zq;F8afTYsbO6LD-@$U(6_s`exKjZJl{)|Lpw9n0Jp{f3lW>dZ!N^D3zw7_!-hII?XRZX^ObNLA ze{ZIA-Mn21+}jc$>wi)FvVbo^;C@^QJQxyqtGH3n4hU`S?d@&8K`4`dX8c-aLP=Jp zQc5_oPXX&VY2Vn9BRAU$Ez1F9Z#Q($!esS4bM)bk6yblIw8#*KUY;x zD#g*`xzzm0i*wgf7Rv`h4n^c4zX7g`>k4 zhDxPkVQg$)sv0_Rb@udA^O>{h!LiujaQf`klhJT|@bt{kl`BW1$47GINc_YlWh!kW z4~C9XLXN=>2iH$!$~?OG_; zXH(=d%7yy-(y2;Lg=q2A>*~OLpxLq`%BrsiO)U8hI#pzcB(LD9%n8QoclUDW0blfD_tYykl zygro4UcH-h{nh~fiUOKJly&9GJcQvDe+Uw z^#Mf{ZlBmx^H!4SctjabtK$~o4l16dfh&3=a5c8LS8>}KTX$P}(Hl*BV57dWu3P^V z*IsxlYdq}c7+N3n3%B^^0}hQx2U}I+ac(rJLTR?>+-DiwuS{)Dhvwd3AzPg)L31*@ zSh#TJ(&^K|$_rk9v>R!DtA*(0N>0cV;Y>Ud<>kOy$xwjrvufeF9*Y+dyH}WAy8!Jq zvC@&&Heg2F_5X5xotx%L;K7yvng1ifKD`-FZl2Y2=nMn0eE?#$ePS`rpNjZRTgi*2AXKX;7i4(Wz$$g>1G~ z*`7sEkVS7vW68#tQ#Y(Rz`)I(R5PGKPP66oRH~9q>Z<~CfaG!-hxAOcRJ7~6 z11Eu|li2iBHhm3{bH(KN!V2(p^9_FF&ZSp{$1e+4kO2?QQHKkYDk~~D1LQF2{h})% zOyM}ZbSaRch9zz#@>oN12CNggx{4N@)OIqOUTbd0 z*p|a;CNw_Itw(zr(llV5Xck!249;k~7^UsClrot}C=*GAtRD4HLrMm$6D7WOk~$Tf z)*fXf+iOXtVxh2-PO)h#EpKl_k_N03Nvq}ubJ}i3Y;7&E2{jdpNh&AF{)WU1SSMm; zV+k%jq6OHVP}&-m_~KJh@)04O;^^R!(?fx-x^%s5)r}Q_a~Fos3|<%uG`~kN%-y31 zo&U^KsR-kN(L7~xdnN0aQ<+Q|`g;2=jl=jgTZFxwBn%8}!DCzGlhLJ+%H=HrN;sr1 zSIGF^BD^37FQ94hJ>s9^5^ev)OI{~@d*OQszCG}L48Dy&t7-pQPJ`{by?fEE?bfSd z)r1P2JvwdC**eF2>P0k^^wNH<8!A0qq6$-h@qCt*uw0tR<+JQI$%;di>`)gCi$rEp zxvJV|WU;c@+sifzP@URG<@4lJ}AB>eq3A>9~axv7tnjr z80r#U5q?!D3JRUH=F{H9rWT=dV35pCBuNe@Ip@YwEGa3f%G3>bH^p+F8kGS$v606O z)!{0V6Rr}ALVRKakE_~nm81j~6ppw`Oa^Dr>v>#-!yL=#%jBxO_d5rBD)#b{qr*xZ$WAmP4(8+ix%$g005MR54dc5rqavZbRTMJd$YP zDe^T)Qe~(G4JfMcN~8e~;2t(8D#-%q*yME|CFD|b*wb?&93hrtNqYE;&NryX0W$p>^te(P64(=ci5Lwt$nGPT=H5L^n?uD z5Gga;vm%1BpUm(A(Q^+*wce&G2FB9arX7}uYJDrlw4HVjEUnl2=?T@XNvi_V4xLs% z`t*oH<)aC!s(N-g)Sgf^-uJ6cm9yF83_VCm&B5j!*)pns{|-BWjyr~q6%5{1&|LpN zj(5Yze++#U6;O_!E1)xE)9S?mDlki(2V92XmtT5f-0Sb@K|d9?#L0HVlf~=}DpTvH zv60Jft6HgVf^-{dxj9G;+LwF&SF9%8^FMvVU+;SKYDv`R_({eJj^TK4E*CaeSOLCm zi<{72?i>%2*}T-YCF^*g%J*eKtNrs$-hFl@;7Z`3kbpVjdRxBc_d zaGzZXJX{hW`+x5F-^2CJ-O{=eFeKoP|Ar*ozpexxJ_)$v|HJpr-4eSJFeG5KfAlQ+ zviNE7hv*9Wijmg%?@K4nvva@N+gFkf=YCG6-f!gGPs?3fiF*bovUW4>+p`-m491SPYY+u?(HMXlB7vX(&36=)e(1$Ae#Hq{lQY>pDFGpDq-0CxVj7XPt; ze~5p8{{eps{~dS${tNt7{3ZO~A=>@85^yDOUr4}%eP}HS){wwQf;JL(Nzh7y77}K(zuXx;_y2rZ1#-Sm#o%1GWF?+9K->@IjmaQFY+4$76l!z%$Y z{(FSWf^b>%h(C=xgx7TcU%#<3ncz<`{r~(7o=4!!1B?M~U9aAHOq0C+-d^-}FEtFv zOv6oIrDQ5o0JlwGW>fonhu!9)HhERH0mLo_T%s`VSx)vZrSWNSi$pcC`HPtK=yG<3 zcbFvEO?vdqC-Nz{3AzGTSLb01C@@>BXf2Z{K=3Uosh@nbZx>; z`%I-a*~DYMC~A`leZDZH^g&I~6voRQXI`>k3@WEGq1xP(CcGGUjd?L77}Tb;Fbu#d zTDrm4UY=K-Iv>^ISciFt)m7t}nIsthWI69WU`cD+0i?EwmL*nAvgvOnW#$Cd0t_ce z{eNu$=YROW;&Bij}t~7U}S9NVOXXmOEcAqV-8_ejYf{{f*j5mIe?+4l>;@TN)}S{$$YjrS)Fps z1PU0JPws?Fo;ET8n`4>@SalR~l?v&Zh-p}poRk>cUMHR00mhvt26-_ODS~_pr8!f) ztOp^PI`O20!9Tq!J<=lhy9a4Myu5v=(kF%CK0Yb29ZF$Xdn=aBELfc?abk7tU``CU zN;D$J65DuO%j!BT!OeL|1e@(Vk?hp znO=t_RZ_vuH{@vT4d%>HrbH))D_f@5VMzuXVKBXRuu7Ku!q6wFp+pCdYnfgXTnS|5 zY_=U%;fg{vv4zKta^(f<n#2P1b^_y0Q?&AYJwzm-wCoBRKMM)L0L|8HZ&-lYA14;GNvinsXS5-`^Oza@b7 z&$pmP?}qPY`1ZrM7rwj?pf33Beq0H-61ZO_;KP1Iw!jpz4f}oc{=XI|3&!6gB}(Jh z@%Qofut$6a?g0CMSP_qio6vXAXV5R87tkfti+sX2g-;7VFDwcp&LVgWc6?B8xD9*| z*?h7cO%($W7vO!O?13E~w71tgm&@MJJ*W{d@-uLbI#jFdgN+R z6qH*Hek>@1Asr4}Boa7-BMZ)8iNyrK9U|J>(@J@=fGAUXPT=$qa%#~jR^Su?whlQF z=rQ}j!6AXuDROW+MLi|}&J2NK3!%sX5sLcHe(+m}F zPPzs`C(k1U!9yYH33~_+HPD0)9<&P_62eQtIy2O5HOB`1-32}f35-tPgwZL}-#fhk zv-xFkx;f` z2`C|N#T*0|fxe!w&H@~ff#Pv_fnxxo0yOR*_yz<>ojebz6E`8dz$u`wyPuG@z@Xut zKL){w1i_hYB7_Kk6GGt}{wDq?en0+kJcFOZr*H`Gz@qqF@z2DU!8715i0>3{h!f%k z@C|xM>_o4lucJRgzk_}W{Ur1b)97h*97WJxxcKz{3V$zrN%$|qhlFm{ZNF6nai#vvB17tf6D+2TP5P&>gl;~t}+>-ZeVWtu@2&F4U( z57HdgnK_WS0~!g$fRyF*~VzxURQ@ z3d7ddZlUF@=~_3lNFy`WCvKvA@SWyH3RcreZeWo*uHL(?r?`Cg*S^hzWaQA@tz!u~ zKG#vL?ew4?RNH;6p+&OwR6Z7^=RmufHu}n~e#lE-TYb;d%HnlYtD9({g{tXIJRKfi z57J+;(b6%EWEnu?-T~jUl%KVFrnJ8ABm4g?!Y>N&|L?>d;xppk;1A%Rg~+C#rR`c` zNQ*3YQ-i}PX;OBGY+dTtqEvU_MRw&Xy*GlE`pu_6M^uX-{rMLAS#C}0s?Krs3gmFk zZ&>R%))lsE@R8+73%o%j6n;z$vvy-_B z>08MmEdN7y`Nu~&rF-p_qZ#DP zd{w}IjX#Y)h~I`M@CkenlPLG&O5g#Kz@vB&v2$>xS5X7tj9yX`iqsbh#o|%bSDP#) z!qJ2h?u)_kc}Q+^NRA}rSf2#S3Zb~SJ~r$* z{tpSlknqdmW$_yr{Q9o+1D6>+?)4v)QBoUd^;ga`8Y!CfkV&~2#QIx3+F^Q$+uK|8 zK70;lmZSsM|CV7oV~ZH9?WJqdSJf@osSH|Ov6%$x8@O@WvNB zhH%=bXN|A{buNW-2r1$;EC8Rm*)@^N<};P9MBrvu8kV(_rSby&kYUP67UH1NR~QHP z`iX#I#(*Xp{O-D--!>aKlB(p=fsZP6vg-vvWqOT( z1`|9Q+h;rwGF<>MbB$1W;W@caNd#7$d534|28Lq!I$yj#i;(P4s#0NwY*S{Elp-w* zQB(wyaQy&m+&QJt+khc~c_at635Rg4gq{;M6;A|evuO}*%fu*ll9roE+RE4lYA{j9 zH;W)|fxIUJjHAB1#NnP`a_NF0bNPkmMoWdjxpFR@4RpcTQ&*rj09T$Q0)y2mTz?FD z)5EaoRm#j#&F#QNw%OTYzereZvXUQ*DpR5|D*QaHP-A)~X@-*kZL)3O4%Dwi2 zihNG>M(3XDgOUnA%NTknCXmrisH*-o@U@N6ptS!k((;KN^X zu>Xey_v1>ymB4)`0b<<0Qu}|_{@*L$e}>)vui-D?KfwP9e;EIJ{NDSn*e=7a1Re|t zti?NEJAWcIo3Hw~=Qi%y%RRSp&n?`uhkM4{v$zKDfKw)#KU@FL3BnwDzZevM8z0A? z5}s}@#-&HKV_v^3BmE{NYo%f=FY054^~KBR;2XoHx3bq~zp52Inan2P+!6jXxF$=# z5UcdS3c;8C>MKXm{5ljKg$x40}tOt!P0kAExth&fW(L;1^MZdeczPQPBB%Te2 zQ=$5#CmO910hBHM4BXmfq5(i;X%h`uv>s;+1#1@322Rp2v8!k3NK=Lk+~pWD1Wtr= zqKRV7h^sGF81I{<+;!-+Ym?;!t zr*E>da7T%&@xD+zq(-Eht(5q+P+?*b%EYISn<4iX1L zIoJx8qwp0%F0bdiD%~`>2OIY&&|(IN2JW$MCSTz zv|N&l<>KUc_Imye5{D~a^cj<|L-b(e+rrxa=g9c~ef(YgD*gs||NRQg06w=2 zB{#{HfGdG}P6DJ^`)CKyMmqp6?EqS72hc)001xc|FzoockA0^PG#b$+3CzoxVnY_#fz{v2ijlba$$1f+RWT| zc|lH1U60HzsF`R!w&){3&33Qb2vDvwh*9ZyQ>}o)NB_N6QE|h zmEvA}#@B3Dk<9#iC8{PL1Gj$adRz+ZaY$C;2{}ac;6Vw0T|Kq}M<+4xz9)kpytNL=;e;%K27g2et7{yR>5-EX zSEZ<8=>K!9@h4J-{=YrhJTo%%|G8xTRL9W&=aac}7eoKwo@}0s82bNwGIw@i=>OLw z8>b7L{(sH>za;Da|2)EV0sj9w>JxXPE`;CIYB-<`xBAZp8`%nEn5SUlOw+Iy)PJ9P zt9Huk9|$6C5APk;fX-yYp@~#Pv1js>{lM3rm^5(MVXr-roW}C!r$MctJq6xrpFm4F zdd_Pq*%}Xq+NJTE=>mgtvXL-qKmBb8w<=`@gNUI`-NZAosZ&ZcV@*ATFy~x0cyaOZ5 z0HacxErMn?1Iwj~PN|hyFgXPUi4r(|=5h16$*C&5!-nW4K%*RHN;g2?qY-tM+6Z?F z)PO);B-tpPialH7JKE3`XlnmQ^nbR2I}e!g|0Z| zEnXKdiv8kR^eXx^dLPQ6Bj64E?}V3y4+wL@`G#|Zy%IP)>F!@oJyGbcK8PC=+Kz^c za8G7BTiM@Fy`rqweHL(FdIi&C_V+P3-DLp>rwdw-3G@Qo-X7k)h~Z*Ihv+#35WUel zcO#sK73vTnKzxw&^e|xFQv!)6z&c?Ixce~xJ|Np&lNi)3upUsg0tV{5mDDjn>~(q$ zGGLwo5?{vviR?Z=8L)dcu`@uxcJBwUJw2SW69PkD%MiF9saCqW0ie6r=KQ3VyRLl< zhG(pnshxWPX7>ThJ&KK&-CdLo&RL4d#^r2rHe2c1LrK`2r*LdgPbppCX&zWzqq9Nd zI5z0-o#09y*s$EI7;Mng1K=bc1=Sj7D?FW4H9-8Y8~|VN1kfPG+^z7$bih5}?;ZSE z@lIJxiaJOyIC4k*@p>;U1dzUov*pQDF;}6M{}tk`9jOCO&RaM}dCx5pcxxvZI*($11L))EW%O0_nka%tkdSyByn@V#OX9zS{ea&S|A+Vu z@n7&7yax~9OVDHd7=91_5ZDZS4*wa(&U8#AW#u?=o}gALoyg0VJUh)#itC?_s~IHTS0Wdg9g#onhdzb;zJvJ`Mn32B7EZ01%<< zZesZ}D~BlU@HUy5ve+1lHFILIaay#^1YI|^Pta0q*0J@-0T!tv>ydAH#Dl_U3&AyN zvau6$n3j5ro=I)$<1AIrtv2-uTT7r-msFM~8#kTC&5icuojixEA|EC5{|;eL0Ii>o zqkdKh5&0(j`gqsYRNJLWdAVaBPjU;iiAsb51lYr72HM$>D z=mg%z6v-t11ON{VZE5iSoY*qzMf`DwTEm)=?8KgtrXB{=@Dq;Jt&U9tY5!XQDJXBY zS6q%my(;e?U~oELdMw9|9ur6a+}<9(y%@B0h=Xx}=utQ66b&OGj-(NFFvcKtnnpB7 z)QIYe0%Uiut&tmK4VWh)05ka1Mw71P?2FsgVX06Tt<->?{6v^#V6tO@a2c>v#|+{j z$Y5ZoQCDX%Y-McF-md~`P~M<3uXmlC%=DQ33WL*m|B9@`+VLy-30 z20MWG7H$>)m23aw+W!nTJE4AqhA8|wRWxCqa=G?DciaBQJpXGEK5w>v;qzesci(=N z2G+Nnd9h`%nOe)p^rSpCeQNrQG7Kh+V~b}B!^+jsF?nq9{Ed<6k?Av|L(0hFpgIC( zjAs^)=dKop=dXg<;&47bmAP`EbVa?qc=gJuiPVYXi>af-k>Tkx>PX>2VQg`7VQl)6 zG^Sh%jg5|l&MZ#e7+Jgoc}+n+N2bpd;Q7S)`KzO8`OMSjbEl7COBIgKUR7eVV@iBBbMn;8ST0QIpDq}17Zy)nljp9UxLi43 zI6j?HF3(;)I$Wva6KI{y4bKl3r5dwK{`~#sx)x&d*-Vq?&b5F3bpPgBO1znd&>bYs z=?>gnLy0%jJi3F#In9KdK1#fqM$;W6&gngn@gHIE|M}{D+vr`!T?x1nXexmYB|yf1xBWkaFWxP(D*=!IY5y2$0@B0};|%QokLqGsI;frX z`lC^FtK_WtNp`@Ey>s*2gG63!qU%XuY)YO>cbL{4&Wdu7gSkIONBZjUe=anfi zcxm+P@CXRv%+Sav_-G=C&RV(m6|<8?aMEiO*esS!eYo}}65|9S+0>u7A!Jk92C80J zfhQ?1p(~cpXp;k{{FtKna=8+I zX*$!&4Qku8%U=I*6lsT@*`~E)JRDO&cRgO0Gf7P~VbqpG0}crcVa*ULc_Z}x4-x-> z`u}k|L{|c?1Re?r&?|s37JOv=&$a&~`~r?jAUf$`d4=+`S!D3Z#iqnYsrygs`!UX5Iu@@n0v zzy|y>WA=b{kuiI5S;4;PZO1NH;{pd@)olM{{x9NRBlbVP29NH?m4GXOds71aaPcon z`os$>z7U7p|9ir>?1d-v{0|L)!V>nx5AQfJLJs5dWXd$;Yla9(b+!RY5LpUgWc6rP8oM{hhG-7g^>}8|a%kMZX}dKo(9Cv~T#IAgl=Mb&VYsWbpam|>T0vLg zj<1U^iwSN#7z=Z<9*69V*T>kRGm6_4jCsQ=%YzopiP2z?j{o2+NPGtba3K(U)9`&B zzQ$T$44$vRSAaR#^ImBClPhfdf|kDqIM?pLyzTjwbrrWeZ_^HFQ-r&vA8Vy|G`$VE zcYD!G*DU{AO>V@}r|nR==)G#Iz2mEOX|@I40D{}qN)0ZJt8MCVRaWi2XnKpWQjDf# zyY9^DG-!`ipG|{kTP8-^HLh19*Vb7X+dvH_>bTPzC$LMf4KR-S@>hJ-h#s!AqxY%Z z&aHNxEu{UoLUR|N7JnIEL?1(IZEc^d|IPMK`heT|XxR+3urh1^Z)hpB!uD@0sG6?Z z3}Nf?IAO>uvDfp4wkpO} z_Ihr2$g^&tq;-ky|9zkO|GllY?Et6A}3k)ZuZzt*iiclRdMZyVLJ)Lq>>dzRbm zOD2oi8^+YL<}{0@rS-X&)3%?rIY&Wtc7it&wYzIAl*va?#eAdCu@f3Kh&1?`Mo+QE_galCp z32ZPTd_EE_KxZJ}Kf*tWpMnSX<4WLRl)#fGLAz$~%rd^_I5#|W(ho|D0cs$iyR>@p z1j|8p%45KAHUuOG-9e9$YRe&U9C8>q(a2k!;kw5WH#`Km;D<|h9b~|;^Aji5Sqhu~ z|0B8o^B*6^*Y1|tmB2$L0j~#<-G9;Jf%yU*|AmVJ9v44|9)pKB{?SG~RFz{XoNJ)U zp(}SPU^MO9Z+utXSP~d36b@Wd-D@o(d>S$bGk?Dbe9s zx`C;V(2Lhy9U<~!i1N+y5@#b!mm%}j>IPwLK%|mi+I1cwdAd?6K6A5cBA3l)D!|80 z)1VE0)Ym5~Mz2rHs>3$XcCytWC=Xn+lL#!EVTY*gK$Ls!1r_<0;XYZ^8LV~DK?G>p z?3wLEUS9SF0xx~wwKnf9r2UIX6hsYzhw`)Z);89zZ$9|#nluJFGt80}Onw>r^Sahq zm$iOu(iHAc<8E7etM{Q1KT-3$x5V!y?H`FZ1^DlNTnXGw3EUFF`gDV@^KITYv*Tsk uU~~*MHHh`ju2y}xL9|Vo*H~8@dcUL(wGIPqphnlqT0EKC-h17z@BabVv8KQP delta 1244 zcmZ`&UrbwN6u;-3ue5{P(iXZ~hhfrzI-sGo4mSQXaE;042E+L8p_XxhJE85`$|UZA z3okQ7Be`>z88q4UVCK{??pzn+Vzvi)S%M^H)0t?TVW1|;!$L?v=67r7gNZl!emURo zp7Z<8Ip23iujY-Ow7gs5dPNX~PQG#<;AC}(lm2^Tp>@GdpArAFe=@Nxe=Lt#rBDdQ zL)!M+W7@0d9amQkW*_ zeY#FHG(!sB!as=_F7IWuNEH+U?GhBVxr-jBDu}+G9*895P{S;3h>G^X5xCUZu!7Msiv z8fUh?w$sgc%```obch>*z+gl>E52u3Y~2Lyf-h;5wEtRuo&}s4)(yyvyc3&YgI%@Q zj4e0UC4=3R!B7?_P`f`bLA@a^|4iD9Smd;DEu>YBLMN@$YQ`CWd*tQY=K>rKc#$K} zB1hp6EgFuMJLEmMm4P2@(ca!jJlP+ODXDCs-r4(%8LS&w{(>MZKnU+rLJuauuQhGh z^s{!@rhn()(B}Z3*b}Vf%080 zE3-et3u)(TFJCRZzg75u3I$_+wZkekG{E>VT@^vHL?SWyxDJI-#In}MB9sv)wVBbn z({`Ae?Y6K2SQB6k-=cO>x%@IP)vkv1X*+Ds@Zz5Y{a7_zyAl9qdrHD;0jseIyRaWm z;3@nBzr=aGi)-YfN@}D|>f!`t{9{zVQdr66_C^Q6!y>2#59(D(E^R-%L!Sb-nl8cf5RFaTZ92$kRg-quTc zpandA#SC_W`^W%)#&RS#91Si8JHTyTd5)>~FsK4ouRJKH<$q^q&p&J~_~AtDb~C5| zml^$#s?#qtLz#Zkgrm(+>dBs3n3GFHM~38BI;6KYgQq@wcA*)a zxN<}eWaAyV_#9cImo>moMOp8HTuyx4W9f3et_kKJv-1{;uq4orbcNob!+h=*@KYS; T4XwjMSTfq2bC6kTgGcahj!Rh# diff --git a/training/models.py b/training/models.py index e89f7449..e3416c75 100644 --- a/training/models.py +++ b/training/models.py @@ -3,6 +3,7 @@ from django.conf import settings from django.utils.encoding import python_2_unicode_compatible import reversion + # Create your models here. @@ -32,19 +33,34 @@ class TrainingItem(models.Model): @python_2_unicode_compatible @reversion.register class TrainingRecord(models.Model): - trainee = models.ForeignKey(settings.AUTH_USER_MODEL) + trainee = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='trainingrecords') training_item = models.ForeignKey(TrainingItem) started_date = models.DateField(blank=True, null=True) - started_trainer = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='trainingrecords_started', blank=True, null=True) + started_trainer = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='trainingrecords_started', blank=True, + null=True) started_notes = models.TextField(blank=True, null=True) completed_date = models.DateField(blank=True, null=True) - completed_trainer = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='trainingrecords_completed', blank=True, null=True) + completed_trainer = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='trainingrecords_completed', + blank=True, null=True) completed_notes = models.TextField(blank=True, null=True) assessed_date = models.DateField(blank=True, null=True) - assessed_trainer = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='trainingrecords_assessed', blank=True, null=True) + assessed_trainer = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='trainingrecords_assessed', blank=True, + null=True) assessed_notes = models.TextField(blank=True, null=True) + @property + def started(self): + return self.started_date and self.started_trainer + + @property + def complete(self): + return self.completed_date and self.completed_trainer + + @property + def assessed(self): + return self.assessed_date and self.assessed_trainer + def __str__(self): return "{0} - {1}".format(self.trainee, self.training_item) diff --git a/training/templates/training/profile_detail.html b/training/templates/training/profile_detail.html new file mode 100644 index 00000000..be120a88 --- /dev/null +++ b/training/templates/training/profile_detail.html @@ -0,0 +1,63 @@ +{% extends 'base.html' %} +{% load training_extras %} + +{% block title %}{{ profile }} Training{% endblock %} + +{% block content %} +

Training Profile for {{ profile }}

+ + {% for category in categories %} +
+
+

{{ category }}

+ + + + + + + + + + + {% for item in category.trainingitem_set.all %} + {% with record=item|item_record:request.user %} + + + + + + + {% endwith %} + {% endfor %} + +
ItemStartedCompleteAssessed
{{ record.training_item }} + {{ record.started_date|default_if_none:"No" }} {{ record.started_trainer|default_if_none:"" }} + {% if record.started_notes %} +
{{ record.started_notes }}
+ {% endif %} +
+ {{ record.completed_date|default_if_none:"No" }} {{ record.completed_trainer|default_if_none:"" }} + {% if record.completed_notes %} +
{{ record.completed_notes }}
+ {% endif %} +
+ {{ record.assessed_date|default_if_none:"No" }} {{ record.assessed_trainer|default_if_none:"" }} + {% if record.assessed_notes %} +
{{ record.assessed_notes }}
+ {% endif %} +
+
+
+ {% endfor %} +{% endblock %} \ No newline at end of file diff --git a/training/templatetags/__init__.py b/training/templatetags/__init__.py new file mode 100644 index 00000000..111f1a7c --- /dev/null +++ b/training/templatetags/__init__.py @@ -0,0 +1 @@ +__author__ = 'Tom Price' diff --git a/training/templatetags/training_extras.py b/training/templatetags/training_extras.py new file mode 100644 index 00000000..e0ac14fa --- /dev/null +++ b/training/templatetags/training_extras.py @@ -0,0 +1,14 @@ +from django import template + +from training import models + +__author__ = 'Tom Price' + +register = template.Library() + + +@register.filter +def item_record(item, user): + if item in user.trainingitem_set.all(): + return user.trainingrecords.get(training_item=item) + return models.TrainingRecord(training_item=item) diff --git a/training/urls.py b/training/urls.py new file mode 100644 index 00000000..ab8dc6e2 --- /dev/null +++ b/training/urls.py @@ -0,0 +1,8 @@ +__author__ = 'Tom Price' + +from django.conf.urls import patterns, url +from training import views + +urlpatterns = patterns('', + url(r'user/(?P\d+)/$', views.UserTrainingRecordView.as_view()) +) diff --git a/training/views.py b/training/views.py index 7c7aafea..35cb6bdb 100644 --- a/training/views.py +++ b/training/views.py @@ -1,9 +1,19 @@ +from django.conf import settings +from django.contrib.auth import get_user_model +from django.db.models import Q from django.shortcuts import render from django.views import generic from training import models + # Create your views here. -class TrainingRecordDetailView(generic.DetailView): - model = models.TrainingRecord +class UserTrainingRecordView(generic.DetailView): + model = get_user_model() + template_name = 'training/profile_detail.html' + + def get_context_data(self, **kwargs): + context = super(UserTrainingRecordView, self).get_context_data(**kwargs) + context['categories'] = models.TrainingCategory.objects.all() + return context