From bb384a8e29f32285fb5cbfa08434c6c8fee977a6 Mon Sep 17 00:00:00 2001 From: nicolasconnault Date: Mon, 16 Jul 2007 19:46:54 +0000 Subject: [PATCH] MDL-10477 Mainly the percentage grade display type --- grade/report/grader/.lib.php.swp | Bin 0 -> 69632 bytes grade/report/grader/lib.php | 80 ++++++++++++++++++---- grade/report/grader/preferences_form.php | 18 ++--- grade/report/grader/settings.php | 20 +++--- grade/report/lib.php | 43 +++++++++--- grade/report/simpletest/testreportlib.php | 31 +++++++++ lang/en_utf8/grades.php | 11 +-- lib/grade/grade_tree.php | 2 +- lib/gradelib.php | 13 ++-- pix/t/grades.gif | Bin 0 -> 114 bytes theme/custom_corners/header.html | 32 ++++----- version.php | 2 +- 12 files changed, 186 insertions(+), 66 deletions(-) create mode 100644 grade/report/grader/.lib.php.swp create mode 100644 grade/report/simpletest/testreportlib.php create mode 100644 pix/t/grades.gif diff --git a/grade/report/grader/.lib.php.swp b/grade/report/grader/.lib.php.swp new file mode 100644 index 0000000000000000000000000000000000000000..a7d4bf4c76d8280ce1f617826086709de535cc70 GIT binary patch literal 69632 zcmeI537q6tRqu-+$|8y^2HE_lX;M8&Pj@CP3CZ-pWTul$oXiX}osCIoYPzeti>a<^ zs;Xxp1eBl%PZVSq1eCD&Si&ZV50IU(sNiz}l|?~)pnxE&Ps02D&b{~lzyE*ztGZ_r zqCUDl{p+gw*Imy&cRA;td+wpLF5h)&a?Zq-3a`6WDyQD`;tTb0-<|b;eXr>~Gt>L` z?ca4^dU*H?&zrow-syE3i|qsT&XLKZM~_Y}x7+j0`s`A@Hb1%8sm<3XJN1=zr{}(O zCYy~z6DvzA!xP^4b%O#M6j%oZ?pk^9*;~$f;K*soJ??(lI>K)R*`UA%1vV(KL4gel zY*1i>0vieKcGUVfG2_5dHgu<4+T&5-+!9-`-9*2-+zMlYrrS{ z_dD`_IhY^;rEw?F1W)zfrB1jS{Hy-}!N(xPYrxCF)4;EQCxNrUy}(_;zoXdr9{4(VKInlam;ndCesBr+CJK>Hfj(rP`W$@9031_LgdZhP2j1Z2Ce{?g9n4nU>uBszeA_- z5%3$}Xv>#bz2 z)|^{ylFd9(=K0#IFSa|!U9GygLMg|k`rP3Jn$0cMT8lnTyVX3dTv|!DSL^f=D|Vx` zXgM!5TD7K6jhyFdtKE7r)!tI0oA6gl4mElS7Bq8*k5llY^<=4bq@MKJ$wH&k?Iq22 zjZ!w#7;sdbakuF2H4WR!-cu19Lk)wjW+uD z)%vQMsn+S#j*o3RKmCPj*P2Ib$0=f~(QDM2jVIKt6c*BvXkoQA*K0ubl}>xE-tEpR zZ&!kpd(N12NuH5BvQzJ^c3R1ycDtDzSe;Xh1pc|O)@ZJF>dBa;oU|7bTB+UXZkkAA z!lJH(iB&H=-{-Qeca7#&@vd0wkTpyKO_q}}V^pY2GY3u$Nl%_}h9kvwX|+eyDx0@; zDeB5>7n`L8PIOgDlp2vn!qY!dSJt)IREhRyXC^ zLkY&OiR$UK<(2cD`P7tErDIR3SxfoUR}R%WtDPooS#`l>V)cl|{8V+qhnQ=xcDnV( zyiatc-dU+F*0bNE^7U5fCB3c>Qr%Pug_`uu8NNsF1IwDvMc?`gf2h{2-xh^Wlu@Fb zV2;GvmmUkhSXY~D*642<470`#&6~0U1Rl*8BVvn{S_hh)cb>JTw2F1*N5Chb^pTC=YCha@@GT5UE-J}aI*DeH?Awzf>y?!}># z83xS;gXw~GD3`f9fGBiysloWd(4*At_g?K#(~oNO?kGi7&(fM(?T99cJvda?=y;@2 zKgtL?c2py$Ba#L|g_!qjmL|pwr6_@LjtSFWt?+@o;kO;_7O__6dhO0ca-iPpGJG=F zGij_e7$>M1BXNfTtG-aDXpBKNGK4X%%Xe4pUZ-An1CWgpmcE9eQR}yqp2_9$P0z^D zAg3^)+_|8kgxg!mfk*A8Kq_cWm4K$T6`RHQqBbo=yCNq3w&s` z!F=W>IGI&O#Y}i*rCeVD2~{ZDLZ`N9bF>ve#haf`nvK?BwML_*akXaSzAvxUGck7P z4lK-Ux89@z?an%AmWE9WmRvk@>F&fOk&sZXc>b{{5;)F^R8|%rz;;X$Io0S%Lm z5f&z7dmuz|OxkE!c4BN-4ORuEtdI>&8i9Ie$(H5bulta^v!o{h_YuGILIp)YPMmlo)c`0FPV`}DgHN3FVgmqhC`b>-O7YK=?C%ijfhv4E?m3!+WSiDJS8r?O29z(C$%a0#PwoGh! zXma*hXPq<2-C% z7zZ~a!+#U}8+Zvg7kmhrd>_~gzJa{`9&iJA1vmn(1P=gr0G~jvmK^>@@O;n%v*3KN z89We-fNvvP|8F4K`zhcWuovtBlD$8RO#OQBGVoF$nfn6p5b$7dd+=At*B=2lf$PD) zQ>TxDcY^1FXMm@JC2$Bl7O37=gN@e)1vV(KL4gelY*64Ok}T|XNH3@$uGQo|J&$IMmCJH_o;8A`(}gq!k)l}orkBqG z6@-)to!VS)wtj4dmCtO02Y!|3f=XXGCY6q@Fvdom{3zwFSM<&Xt!Fhk{q&&5%5*@r z#l=p2(d0bI?4}k*qS?N4dUpTxzPqx|>}>i9CSfr5V+a*Qw8mW>tqhXe6hpMxZ*89HVGH+dwtF(;_>vbdA`y zx;9ZF)`+8pSbr;6c?Xa`{jG#K)D2u2#_GrB>MK1fi>>mVY|+j1k7DZ4%MMKM-@MHN zC|$ZxoT}JO)K1h?T6m*qQn0L>MVysy>ijoRD(i5qI_*ve&v&xWohu3)zrvVM9?h!J zY%Di=amf|GzX<(L6mIld(<0AS8E{5L^jYaGuS0fqJ1!LkieCdusz9Tmn8^fV%e7g8 z8qSRGs@LT!u2_R>fx^LWN2q9YdG;gHLaNFY#SgD6cgChjv#s<`t1qwgj*nUF?k0^? zjqa=o#Nk;?K{wPOFFKJKb)RxIm9FizEH;kRTjPk1wi6Mya2Suh0>gA1Qe_+`1td)c z&zCinIeUlxv_-FDE#XIFGPTk9x{2yY!X84iJ~e_Ket5XaZCfX6+o}`E$knZperjhq z>XW9K#`0p)?aW!yCfcqv7)EcnDWVZ@1?QzOi2kxD*? z;y21=TMtY+3`SGM)JMdKZuewS%G1r;=Gx24?G`$wEPa#!Fk{`@PCp2{~RoVhl2Mb?@RvwIq)WA`X_;(1b>A5UIQ{TcmZ<2$U7XM%1Vc^5)C7uiJ1zyEI_Y1+VgJ*&|xEN^v`}W{_>~nt?{2q7| z(4P0xz^{PE0_}a@AAFa}eieKLd<=XP90&IYZ-EB8z{NoHNNyK61=8(+bC9>F817x1f_3J9w1piFWQNs?8oJ-mw|I;%;q?CFQVE zo^(sS!XmNI^P?gtcNe9!!*>r>nNt+LK3}~i*TV~m=xdZj#6kKc6l*Q+$?=XYCACr+ z$T|5C>*SmDa7~)RZe$1y)FlWy3$Tj@r=HFgETxHXtlp-vu_v zC7>@+0ud8j%rBD%NZ+kGEY)lf$rmdBEgM++KEW+8loqhjnm)g*DF1y8P8n5_ed0xq z^ejb2*()crZNt|ZD%lCHEtD{sjV`WqHg98pahC71wug*K5}%`KFp$JYaWd%i&RsLJ zm+jxJh0tV78CgAqU18Zagef;X^JWUpFe3cen9pWiWoIkTG%BM5hE6P%W+fnvZ88Zd zNYq{s=^bB*Rt_^)?VFxGuw(n~X<4|W37N=J67urxyDytIOOQ}ky~A1R7pbw5ENyH# zYwK2%YodxL*!XlC>5jaw#AwK^s-jn|H0dKxl9C_1J(R`C4TuAoh8|H-q4mo1cK(|S zk^ZOkOg~Yw9MyW#b9O1a>*2b1+-MfBEa8fnt!)u0+c5T7#7=|P)T+JldH-7ZR^?~o z6I=NPu03f^hKXc&cb>Ohvu%7?9I#%sokMn2wQ;89D<8Gj-)xHKkl#!^Jwp-aC5sw7}$B#|dRtilOfBlhfwxDXgb(${U*FxH8XtPErE^D%m7l(3d zfG|FmFKQag+O>CU+DI9gAJs?0@X0XSZY{SNPV@w&f=2PwoQ=VC1T$Ut`zksIuZU^M zz;YzYU(A!wK~J)TrjiiVXFNv26G?ZhiOJYxukt z$!Sx`7B#Q-|6hyzd>9#9^8cBOvNKll=|{#D>~@CD@jzXz`bEpRTl2lzNL z{~N$F!G3TqI0t+I`TrT<6!3K9|0QrI@HKP*p9Y@-e+8Zm&IkX24&Z~}wP3S8qX)PV zya7B9$X;Hy@_#{jRpx)E>>mYh1UG^mU^9?y{GXx+cn)|ZsDSq(|Gx)FFE9f}!0o`h zk^OG~PXm{M2ZB?;E6@Qv9dyAXz!e~SiOWh~YM7vkw8?Grwm|%Wb5=hCholGpq7bl% zGrx8FNmD%WdNuS+mN|Pm^;&DpnIK`+y@^hSt?ry`b{mU@eV~x3-Uo7d9H=k<>gGb% zj6;huS|DS38WkuWW#Z6l7T^R)GumYdT<;!CNwIm$HTk9d3FWT9CtiK*`q1O2MM$=~ zZW!kre`ZP6KrPy2y=AQ_X~RD7OmVY?bR0{ceQlAO&{#FuH5?lmACbYYh=A3)-U{Pd zoP-M}smoE#>Cq34YS#C$8}kFmr)JIvlrBDWiDBst>>ox4lYxl5QXONHY#MdvaIg)XJ1o+$ zh3xDALjLjl;HaS@EWIT}2P!iihV}N?8q8!R2+5cY2-}k@9DCr59oilvxHoral@gaK zd>%}x!M`YO9}U-BWYDg+;wmGQ-@TXfZaBH54L0N8{)LZm@w!V^T5&c~jm{az<~iJQ zF0yw&SGxjAx0LqCO1_fWx4|rxa^s0}lpj$nZ8s9Ql1np*XyEjwrkR|XzEV~?(lB1G zVZ!=oIeV$h!x@Q0TAT`6<(z>n1IC%sJE)M%mOg*LGb6w{m!iXSR&xDp?A9XdToEdX zbR^c7VXwZthAxbilG@?~SBHvbE2EQIAu9GQTqQbkG#1k7(Fi(l98->KztY7qtJQ22 zZgQM<)~Oc8s;#!MYjqP+GNStCEih7Nm2=5v&_X=N&AxA*dFGIXuFBKbSaVD5cDFve z&}lEva(rlY%+aa6!VK;=>vNqq8aqu>912_bxz$BOe??OlL+n@u^1=1P(2|9x3f~!GjpYZOuQfH5|g|q(+ zIV;TU{mZOeJe?Ld?zWhUmp&OD(+=5(q9kGjJsBRyO;2eg;SD9+Ucn*Z@7r1 z*&H@y$$Y!sZB={8@p=!@z0vJejEd2}{*3iw`BVL}X0a4VFQc)w6%3lP6$^qKn-wYV z;tnl9f0|Rt*aF@PdYc?`$NA++7E)K)PRlEg;z*@)PQ1!dx0@|&I;kd=kU{*uPFfOW z$|j!jA}htTTL(Eaxp43POSjL=Ub=Vh&fU{ym1SxTG#fgw#?dZWXvwUVgR_YnrX4@p zL1HrruPEiRSDKsuk#>vRIh2<&@MNVdK|LEx4E>s8F21it5Q`JWx|ArRlKHYx(LFcf z9In?_*h*?FnwyM37B&QB8c&ax#}1`A=+#e>K_Le`?@wTDnkp$b-{-33dQ#LPgSt{0 zSHraLJo4=^D>9YKi54Z#ye8W)Cm3Cu?%q+F@&Y3FoRV;`^H#%nk`+Mv+1ULaC#68{`NKBDf{`a|A}f9 zHw*RJ!~RV_$BRsU*F@Vt%XktfYlKn%qp`DgiQ-1+X!MRtU*Na$4@v)ow}95_@*z~44V(*b`%)!DkKe=kJ3GGY zWhI;4Wt)l`)p3cImQ|FcZH|}Y_{Qu_oizdWZsroEF9)?nHl$}0PB5Cuo}lW^@tg4; zcCEI@90kLDP0W@qSnXJ86PJ^={HbV?Z(~mxHy*j(vlf#mku?X~d@fQ*_j8*PvhE%+ zrJdDLN7vHA7(BR^SZ4dDE3w{b7b#r6WY>xak~L((PT1f_k@fWU!Lt$89TD-=IysutDDJ{U`a> ztSE=@>TfO6tBh55wOCoQyzF_cvj%N^BT`}-Zw{8 zer=jm178&s)IPS_2rUR5E%wHi#u?y{O|6^H#qpSv|L=(i{}SX?$^Y`{|32jV_k!O7 zzXqNHehKJIz&*hY$opg90pR}Nj^Gq4Q3Ty&n z;P&AC$o|1cpZo*djO_m=@M`coKz;#U2p$9O0ltO&{}u2t@KNw4@J1j#fqe1Z5&Rpv zfVY9igVVrG=mA~^4tkxym(T?~4?GzxfS(0F2EL6hK(+)g1y_TE;J)A!=mg#eeiiHl zli&{EJLm$w0{#j7Bls+kzr9`H`{)E-3$6#(f?040kk7sQfiFOJ(f-Avf8nK8E50t= zzxUGQTIZcY8xxIV*SS7w|M8EJ?B8|K#WTs?%ea#cQ;BM9@ELU*Ml6uT>8JyuZfwd28p7t1h%^)%9wAtHFH*Z;Wa#kbV z*zLBLapk3)-AdCDD^0QO-RL2I*+AJ{X}8Rq2wQe|`eU7uqp_JK+QGvt-83!IKv==s zV776rwU;yl^3de``(c2K0~EQ+YaSnGGg~33wAti}2qCo<=701L+DRi_x6snr-}I|3 z>M|;g+fIO5Mj@6hnG(-+`4KDsE#c*daHZo;xv{j{eqcxWh;*$htm64sN%YYJ(+3V< z)#NRpRTFnm3tIwm>7R!hUHs~etr4wnT{pBUZnA>=*GSccJINxs$oU>2vM>RPx#c&e z-Zg7k)tkPD6sr!0FQlG59ur67;!G!1E1sa`%f@w8L)CQ?vhpjdT0hPDpQs#BGJz@9 zC;@qwu#M6hI2GED75y)J-I_&E`a_GM04JB>&gs6sqQvyF)!y*FU@Lj`wseeiQPcmh zQkP|jG?R{VXxK{ntN#!!7uIN{&@DHiG`>mRz5~?1iSbbY9iq3VVi}E85tm zNldMR*p3f5ZT>RvIj_9TYAw&sI#_El*POY0Bbnzt(~kPpO~UEeWN~@IelRh@hm1Y? zB_sJEK29v8vwQl&8Cyj4ExF{om90T(P*`*=CwuoOLpMV+?rC8aXAre#T!vhW`T_*! ztemcAtC4&%ud8uXe>N$alYRW)AN7Re(~119iJN|s+Ja2qoL|F~?_x5gz89%+`_QaR zFPyb$B$4^>anT9w*b_q-&Ou|qf&#^y;d0VjerIh1mj`lol5PTfxNj%7=^ih!GD?SeMuqkQDE5ycY@P+6S$$~jWu zZJJ{DcT`T@yW9(X)K@(nYqJ$G-3G^=E3TWkT`{a4Exg<@Hgr0sJDx1#8C3qI+pI3M zK`zgq>S*ReQwPDkCsSK1`u?6d>9dB-W_)jD@3yYeM$djvPVD8RX}9Ic`p2~_z7XA$ zAhue2_dRurm5AobI!@3n$~7%)-sU)W)^veE9cRD0oLt8&uVSAzS3KR}M}f>ZJf!_p=0cV0w zBg4NLG{IpY-}$;H@Po+jZwIdjuLiFIF9i)C*bK#B-Vtj8bPL7sw&Ab0qCT%Ey%oXO_V2 z)+CO-7|PY)MW?t~Yh|C5YW|y^_&L``AFFUU^uRc228Zn0I6`c5i|TAp$tFl8l#PHc z8FS8KALHTA8o~#Nr_=5%>nKd89^dSjhn2dm(i#(CcGd9Y*gk#YzpK!0IxDQ%l*$zs zPw$^j7AJxngC`yqUlsinzXmVmn0Wm5r){q$i#=P-X$41ZIK->nuaXp9>cez#mAC-< zY}&iNwWJE5(lfU=ve~B)ms(jt*!3D$72TKGu}UFa_)5XUSWo!ui<=6vYzi7d=!ixz zP*b16)VYY3FxVdHx$}OYPwLuri=|J!hAs$MobXmNct{w}Cb`hN`WHi{9E_&#QXOHY z4|CFqcks(1$cYk|&X}4d$RJ1A_P{+8JD%oP9-WFK*BP3trD$~ba-^Cy6L648$JAkd5(~7DlFE%~Vo_6w*P* zO;W*6d|xOY4C;x>U>1+joJy0+c3gDV)DcaTni7E=CsxYRv}gIQsL;u(QW*0|1YULn zPc~q9GGz*~@><>k)w=`{YLwHx@7R0Uo|&)WX19wb>y^)MCi$gl+`VNw(@Ziy(8`HhZ{!oSiT?ZCHUfZJMZVilpLF4Nn|_ zyqu4?LQjgrq=kwS)~pvSNzh}sskNJ*>8{HfR2(Wf!D~n67?B)-=jC}21(oYKu8kCU zz{?jamZu8^FN+xLq8*{saAyl1V_?nCNI6u|M;;8$;8Tu_sg3#WtD! z|5*s7l2f(+-{kG1$o)5h7lG%1-vrM9mw@|&kDv#58@Lf%2bRDh(7k_m2A@YK@Fws^ z@Feh1@DT7dbOiqs{2ur>v{lQzn zOTm@k67X+65ayZ;L+e7;11xM=o9`Dd>qKH!n47%z+=HI7z1|!e~y0P z?LhttUjtS_59|gXK%cM`RKY)>OZY1w{le?PQ@{)u1681Q`?rC5h2h$U(1kRUh4Zcc z0O3J2p-r7u#=BWgNgd)iXHj;HAdMpPscOlYaPR6u@?9F%t24_&YXQnD4$Y%t!kK8Q z17uRo`Lz3rn_p`v>Cq(&9_yXpGoiY*$Gv`R5Oq0w+UC;1h2F@v(_4qSE9Y;W?9Ip8 z0mWX|KrUA%x{{BjMf)fRXeX1@S!p`ec}>07#NDhA@-f76JT+s-ON#zt58Ab zE$obSMTHEn{*R&RlKf$rJIRmeo;0rHq`9ENbTya4Jb-!Lh2=uB_iUKi3iaa>vnJ zpPEidl;*TX+N%C!LrTRRmNh@~6og@9p7ggdJ#i`$NSMa9x9Pl%}Fog5LfjyvTJ zZOfxZ`{=Df!+}ZPW+YSzG&1CD7Gkc@Xzn`<(njtqXJ8!30oEgNLZ9hLLLxALO$kF1 zAxJ)rinSyEBCQk5IzY3V%?TKqu5?lbXSN?#(CtP&)a6vF-PKl*T}US_ux$eAiOX!g z8s0kRQIkZXjL`+s*U(HOV(LKGDB2dt$rvb!N>3+7f z_QFU^>S~5*ovoLnaix+@F?#4)E!~;+-oahGsZsYn>zsv~-*ErL4$j+31CQV%+1MCL z<=!WJ;rl#4GIuz~k9~g9t(2Fx5ji9K>CFo-{l*fxLdMx^JywRlU9zr%11RGFdA4fjPIZ_A#n*;qAf*jZR> zit()VqM_I|cxnxi+v^Pc=|-$6Q(uJ<*$>Fv6X*xKBW=GsV^;_2vRd@jO&c(EiS!jq zb%xxIGmx;$9MUn_k9r+0LQnvCk+Nbia$uEP5h>C%eON1*9p1ImBC^G`;m-#?u*5n@ z%DuE+tQfOIm9rZ((Y)$H);0I~!hoK?PbA%I%`Om9Vf9LX^1UNR*Qy=PiuPgU|L;qp%zSr6ROTaF0I`|H9ynF(_ z5WD~!2J#Jf7w~7u@J|B^;NC#?{(lGF30?(W39bhh1Kt1k1LXCa!A)R4_y%(No52&n zSCGd)4BiCZ2;?tN_Xm6$dHgj%b^up`D?kP4{QpCuaCK*yf9(J{@whr z7&gP2%st#_&iGN+O3j&A`SAKJ8WB~b;CfC!ky3Z{5Pi_Q;=l<%Psfw9TD1^-1*X3N7KeC}Cx4ts`?Yq@r; zvAnt*PL68qGZ!lj-HnZ**%o(uHyfxAKKq=9ol^-lbH)a7vhie}IXNZ60aJSF2Q2o* z%0er0ewn93G|voP^2hPlx#-tY-qovQwQqKJw%9jyhv);h0Q4UNdJp3-v-7l2ZLJeU^S@h+>s62i@|P$ z>)=Y1dX-|D`d%ny)YP^N9SaH3U?zZ>Fyd5PrRimPc(KI<5EH92LS=#CPsk*FrPgs~ zv}(vP<-clyCn0yNe0#W1JCus4)=g?QR-zN5_+K_n(ZuMyojq4>nWPl9zy|6CtBmn+ zEyCwKGlZwvJJ}3%cxNj(I^P=dP^m-na3fSGyr`6u@0V+>RqwJU7SAhL@$#R7T2U9t zySTPuvLzWhzS4MJ6gGLou_=woplM4q>3Cd1IrT(7*YIs{HQMv5&AKT$;LkV{%zgQV zZRe9FGAU%&altJ8sdG)2`bgi!8G-txR2f2!Hiv(cYfqG$JlBd-uvwGy1ZOc7%|C&T zdbj+`x>;AZB4QX+?#V(?qnwJvn10r4Fw>9P5TH^HC|IfH#HH%~4^CUZr|F-RE;N^q zzu~hIKP-MO&u(41y*Mdr4JR;5<>t?DL8M`4jRrO$wsGlXo$Xx2ir2d9sJU)%9=-28d6M(P?)-kg-kcfO8251*D?8-R(=6HqB^%9 zA`&|}+Uei*(6sQSzeu_4MypCpe|;|Jh?JlMhJfK58Ct_ex$q@!2@WjvmWtbvDvjzI zWRG;%^P%%PHigz}Q28APoLuph9uma@EPkZnm1s?&w1!UvD9o!R~0&WLBg-m|~&|duCBFFy?_#Z&$_WuGI{W;)K z;FHMY+E1SYhrp@e{~(L&eEu`QEVv{1Gvx12f+vA(U<%v}9XIrV!e%13lU7aIwvW#B*Pt$|_@fOtq@a%t>FS*ks#7=r%jvmuOWAw}V`jdk z5{HgIdjXl`Qx6zr&g0jJPxPFmeVcfXFD(<4III&o^iU)+cVVkrf=oK&MknyaWTzl=lWKUp@q0C-nBtb1^?cBdcQhS{4 zTWc_7OBn-syN6b%%;y_&_JVD5a4p?GJCQo^IC{`&udq9g38Ec5cTCtX;1HamQxK(S zXF1*3yrUU?Y%!G7acGVzwU)?J8G6`b{aFtf^kQM$t`^Re`(@(cI9iBi)9p61Aa@r> zMJk+R$V+!P2GUferuOO^BdkrEc^}Ao_U@TZbcI1UHQ|`XJyO$b-sYa1K>jX5oV$Bc zZg=PFN00JKc52`lI8MPm=}#e^n5>Qxb?t)WHSWg_G^F{Rt%p0iW?V2yZuLn_i6`u$ zu++Vn=z$*-xQ{d$#kbP+t3~e3F3(Z8Hmf7xo6C~vr5MJ7Q>PW_@{82MYY~;TI_VR9a{El+jd~@zLPNPIx-VLCpqJWDY!?p0mQMol-kDraj&GSd86V1!-LC+y?y0X z>hUclYF{l?+rST@POK^9J2d5r%u<(gV6LG4_7n5q*XMR~U73))cEnb?EYCSiFx#yy z)Pqsex-%R~kTS}9$!?7dGIEzzrJOTF$rE|8^RVTtvj)`QL=sZi_0`LJ&p{2}KgOSE zjwhZg2hS>la*0_u?keY<$Hd&4uXQ+gUZ3saT?r%8*qpWe53 z|IDoW!s(fPySHC8Yd00_o8G@;de6-Ei>3!Hni&LlaLat%xkvH?Arpqb4@;*aG`BE7 zb2EBrUDL9kNbgFI&Giqsv=R?B%~2y96M?{jyXsV)6DNFAAU=NbzQcWOf;U^3?1 zhuKXYu_?wW59M6vTB*5uejS{NYObji&6#}a(;%L6MPo-n*}5$TuG2AFsRhP* z+feX(s;Ti+zgcg7tIM`{*x`w`7?gUvmmtFxvo|?<^k}DzOhDq33N(47Q9o*TOX^x< zlm8!$aQh+2xY+;e{Qt+1``-p`0I~zP2HXwYjQlSffRBN9ffs;hf;MOXodb9*xEuHu z`hc$h=?dNqbROVwpaCugcLH|=pF>yhYOo936}%0dK^u&MAD}Dv7?A%z-5Yo+_&U0R zKL#HMuLVy7SA#Qv?D^jhejmIQ%z=jj*$2D`$ZlUcgI@-_!Fk}};2+Q#ycxU*EP+KZ z1%80u;Emu$p#A=PjL=l^H)2JZo{0K?f1V5x# z=m5p{l73hzh6&$G#x`|CH=O%h1iP!tlZ2BW0yAR{B0Y|P2h4=&(j{b5e0SNJEq=lOr-?8EMdoE8a(K5f&;(yC!PdTz&zADk9_Q6~-s9G}gd;~S z%oDUBVrzNmBM-~tNqu6GRRW@_7gx$Yl}|J(oL8Pu`k`8wP>9_0vB5xg-YJ)V{}kX^HkzMw$tS!wM}OPA&7SwS zbAi!wQHYn1kX4$WvNfPoF(?z2PjNY@zTTw}@gQp6Q4Tzc8>VwLipx(7r|>HeW8+5} zAeTzQ>!SU8FWcu%>uN-5%ops^6viD9&BTsm8+!^B{Sv=!^`pB!!IShi5jJ==HVr)Q z>m9=kb1+kh>zICyQ>Tr}1Ld7f+#=r<`J}W+cYZ61ZYxs98S5#LTejJMd480KLn7QxWD<4Nc^u;r~NR-yd!XsC=7z-;=eEZm+ zh#vPP6xu4j7R4?3m^M-sYgV6-jd&{<2>7XccoHYF(kd@|Y5B1a)!A;T@3sHG8=*A# z|KH2!S0U>k0pCTA|19_nkPW~LxF?XW|8F9@>(0LqfLDQ+gO`C9fLX8;Yz03HZU-vh z9mw~80A2!?K@;2^=&b(}!6U(!knw*PTmc>kzKmS2bNpSf7wiF>!71Pq$o4M-j{{eO zgWxXUGsyYR1KYtnkngVtn}N>e|2_CSAUl8g^}hi847eNkM`U~X_LpD(uOZjJ5!?uN zf>VL)_=C;B^Z9%njDYVT*MA!f^5cK9GJjy3;=2t|xs~ABOVPY?v{Fnmd@s=#grAD< z407n^+^$9F5T)t@J1dx9jTKfiA?dL0uY?E1cbDgeuAoSl|Ngpy{u;R_>sJ*pkx!16 z@!9}pvtD#!g1V(nK0}oNLz&ny@W}}3Wi^ZC^pdij$m~%Rj7wG@{qtF<>V}-2v9D|4 z-00lDwzHu#3bXdM#%(XBGq?vn9Vn-JE;%_dy@aE+4jwM0=h^%}Q%Vmdq0B#868K5W z)p*oG#6bQhuXfQ4RM*@&_ObGrn{6d z9cGAt`H;9PJH_yF?$8^G(qGB^k>1yyi=@B?If z-TU`l@UP%^!PCH#!PQ^~kRIU8$ofwO-$2g)B6u%&J9r6rK6oB@CYT2Qf$V=1crUmC zoDO~)nP0y9?(F6NHz4c32wV@I0%~9s{26lpv%w6w7x;5z|L1@ia4Pr|vi^&K{QsW{ zK90P9Jva|M9NZiHGxGkIf%f`e4xRum2bY0!z|F}09|XS&bbjDEa5lI*_$svgBGBD_ z9|xlC?}C$j#f=@bN8yBEF!{5keh4@!+sJ0)khmuvD)U^Qo-zz+_~0QG<1O1K!x-8b z;^fXxqKe(FBbs;*NoqYz0lC1BW8hff&ehm7(p2F}Y1iLjf#Q!tyW8<>hprOxDwNC_ zb05r^Y1SCl~$!el=lR+}(W{mN~ zO*t5Z(I9dM!fqwq+&o3u!I?%&XJeQ)S--MJiMxV1?^-`|K;@iTS#6SC9AvW!$v#6< zt#`uZ3cwbqO~1Mp%pIA@dGWWCTJ`w}rQ#jKD;at@1|Rifb4|ReC;>gwfg9(bBrAx^ z#OFx$(^@OExfW9XY{hC4$Q)tuS$1rVxrUCW`I}JP**YuHIL{Wb6zAp}6D=`6(n&La z{w4Lp70B=2E7mp6@Ne!G9o5}c+nI8E1D1m4t+ZAPjm1@NPD`)ZwYCeZ6`z|<=p1ra z_mFyvlFE@7mLE13x-ujeHIDF8&7T$F=&&8|<}MU%l(-{7vh}fV_TOJy5;)o_G5BH; zrwZ5Poh=KB3n#f&vgtkc0%OJV|MC&^FiX}6iJ99H^A+aYp=8s!E50`eb?S3_#7v6| zjLlVKuyq8k9V2j=|KiND#--vc4PfX|eMW6eS`eh&@4pi3DyEbWqZ}a)!>Jz ziIDvN3FPT3k*_8H-=DY3koivoKLNgseE(*!6KL=MX5{$qgO7k`1Nr)UF!&a7{Y^kJ z{>#B*z{A0r;0z#t051Y9@DLz>e;)y*9_F>RU1^rbf*oOGIchX{w@5I!T;c>K^ z&4G^aB9419JeCPiPS#gUVr5T;#U!NMOgMEzyu+YWObnGSgDXoRVZA5@qg%rf4_89= zFnZ^jItyg?I6BdG9Ot~KT*AfU?H1aO&5Gh}>5tZMV~6f%xz;(H;Nqxr9N`-m=!o6k z%|^YI>FHFWexYkLDj$`Rb}C=r*jQ`^4UMCVD`0TpGS3CBt!ghh&M|Desi30F;#Ysh z`nCM2ep$0v3Z$3O*h+&xjFhdC)8ytb`(C8Hi#xOc{b^3&YY7j{y-kic;{5U?3#qGY zoX6wZ&nEXN_a&IqLWDS;+*U1hyIFVSEw`0d34!DHb<&b3Wvv{ily+;=Xv!hUg?sm3 zx_xH$(!G0k?w-#4;-DFn&MsV==z}}0s^dpHT|*(o65uW`U-Bk8jIpbDR$)61r;J! zO>th2KRblHgw>3CFP(V>Z(i)rp@yXschN~FW9-UGvkQqeG}M|$Ysb3@gfWvHcmLlU zGWZvOG&7X!)v z-$UO2FnATX2y6zY0?YHZo31u;+MvJ&1vV(KL4gelY*1i>0viFOkUJf zfdFLzRT z%}HDjUt8qH+uXsE=>>A9ALZd7m=`-!f^vsZ19<^~72{u-Z8!_yMz7k%JZ8b1>B$(V zCgYfX-y)(2aWf@L(MzdLd2xQ&`P-5XBz0%*O^VxC9(R(*aU`Ie)`OX_zi({S$$0c- z%Wc$s(thDSUk3|M$(^Gds8F+Oa{jmHl1&#vz54sprefix}grade_items gi, {$CFG->prefix}grade_grades g LEFT JOIN {$CFG->prefix}grade_grades_text gt ON g.id = gt.gradeid @@ -586,11 +588,27 @@ class grade_report_grader extends grade_report { $studentshtml .= '' . fullname($user) . ''; foreach ($this->items as $item) { + // Percentage format if specified by user (check each item for a set preference) + $gradedisplaytype = $this->get_pref('gradedisplaytype', $item->id); + $percentsign = ''; + + if ($gradedisplaytype == GRADE_REPORT_GRADE_DISPLAY_TYPE_PERCENTAGE) { + $percentsign = '%'; + } if (isset($this->finalgrades[$userid][$item->id])) { $gradeval = $this->finalgrades[$userid][$item->id]->finalgrade; + + // Convert the grade to percentage if needed + if ($gradedisplaytype == GRADE_REPORT_GRADE_DISPLAY_TYPE_PERCENTAGE) { + $gradeval = grade_grades::standardise_score($gradeval, + $this->finalgrades[$userid][$item->id]->grademin, + $this->finalgrades[$userid][$item->id]->grademax, + 0, 100); + } + $grade = new grade_grades($this->finalgrades[$userid][$item->id], false); - $grade->feedback = $this->finalgrades[$userid][$item->id]->feedback; + $grade->feedback = stripslashes_safe($this->finalgrades[$userid][$item->id]->feedback); $grade->feedbackformat = $this->finalgrades[$userid][$item->id]->feedbackformat; } else { @@ -654,12 +672,12 @@ class grade_report_grader extends grade_report { // no such scale, throw error? } - } else if ($item->gradetype != GRADE_TYPE_TEXT) { + } else if ($item->gradetype != GRADE_TYPE_TEXT) { // Value type if ($this->get_pref('quickgrading') and $grade->is_editable()) { $studentshtml .= ''; + .$item->id.'" value="'.$this->get_grade_clean($gradeval).'"/>' . $percentsign; } else { - $studentshtml .= $this->get_grade_clean($gradeval); + $studentshtml .= $this->get_grade_clean($gradeval) . $percentsign; } } @@ -677,9 +695,9 @@ class grade_report_grader extends grade_report { // If feedback present, surround grade with feedback tooltip if (!empty($grade->feedback)) { if ($grade->feedbackformat == 1) { - $overlib = "return overlib('$grade->feedback', CAPTION, '$strfeedback');"; - } else { $overlib = "return overlib('" . s(ltrim($grade->feedback)) . "', FULLHTML);"; + } else { + $overlib = "return overlib('" . ($grade->feedback) . "', CAPTION, '$strfeedback');"; } $studentshtml .= ''; @@ -701,7 +719,7 @@ class grade_report_grader extends grade_report { if (is_null($gradeval)) { $studentshtml .= '-'; } else { - $studentshtml .= $this->get_grade_clean($gradeval); + $studentshtml .= $this->get_grade_clean($gradeval). $percentsign; } } if (!empty($grade->feedback)) { @@ -727,6 +745,8 @@ class grade_report_grader extends grade_report { function get_groupavghtml($gpr) { global $CFG; + $averagesdisplaytype = $this->get_pref('averagesdisplaytype'); + $groupavghtml = ''; if ($this->currentgroup && $this->get_pref('showgroups')) { @@ -755,6 +775,14 @@ class grade_report_grader extends grade_report { $groupavghtml = ''.get_string('groupavg', 'grades').''; foreach ($this->items as $item) { + // Determine which display type to use for this average + $gradedisplaytype = $this->get_pref('gradedisplaytype', $item->id); + if ($averagesdisplaytype == GRADE_REPORT_GRADE_DISPLAY_TYPE_INHERIT) { // Inherit specific column or general preference + $displaytype = $gradedisplaytype; + } else { // General preference overrides specific column display type + $displaytype = $averagesdisplaytype; + } + if (empty($groupscount[$itemid]) || !isset($groupsum[$item->id])) { $groupavghtml .= '-'; } else { @@ -778,7 +806,15 @@ class grade_report_grader extends grade_report { $gradehtml = $scales[$scaleval-1]; } else { $gradeval = $this->get_grade_clean($sum/$groupscount[$item->id]); - $gradehtml = $gradeval; + + $percentsign = ''; + + if ($displaytype == GRADE_REPORT_GRADE_DISPLAY_TYPE_PERCENTAGE) { + $percentsign = '%'; + $gradeval = grade_grades::standardise_score($gradeval, $item->grademin, $item->grademax, 0, 100); + } + + $gradehtml = round($gradeval, $this->get_pref('decimalpoints', $item->id)) . $percentsign; } $groupavghtml .= ''.$gradehtml.''; } @@ -795,6 +831,8 @@ class grade_report_grader extends grade_report { function get_gradeavghtml($gpr) { global $CFG; + $averagesdisplaytype = $this->get_pref('averagesdisplaytype'); + $gradeavghtml = ''; if ($this->get_pref('showaverages')) { @@ -820,6 +858,14 @@ class grade_report_grader extends grade_report { $gradeavghtml = ''.get_string('average', 'grades').''; foreach ($this->items as $item) { + // Determine which display type to use for this average + $gradedisplaytype = $this->get_pref('gradedisplaytype', $item->id); + if ($averagesdisplaytype == GRADE_REPORT_GRADE_DISPLAY_TYPE_INHERIT) { // Inherit specific column or general preference + $displaytype = $gradedisplaytype; + } else { // General preference overrides specific column display type + $displaytype = $averagesdisplaytype; + } + if (empty($classcount[$itemid]) || !isset($classsum[$item->id])) { $gradeavghtml .= '-'; } else { @@ -839,8 +885,16 @@ class grade_report_grader extends grade_report { $gradehtml = $scales[$scaleval-1]; } else { $gradeval = $this->get_grade_clean($sum/$classcount[$itemid]); - $gradehtml = $gradeval; + $percentsign = ''; + + if ($displaytype == GRADE_REPORT_GRADE_DISPLAY_TYPE_PERCENTAGE) { + $gradeval = grade_grades::standardise_score($gradeval, $item->grademin, $item->grademax, 0, 100); + $percentsign = '%'; + } + + $gradehtml = round($gradeval, $this->get_pref('decimalpoints', $item->id)) . $percentsign; } + $gradeavghtml .= ''.$gradehtml.''; } } @@ -920,9 +974,9 @@ class grade_report_grader extends grade_report { $overlib = ''; if (!empty($object->feedback)) { if (empty($object->feedbackformat) || $object->feedbackformat != 1) { - $function = "return overlib('$object->feedback', CAPTION, '$strfeedback');"; + $function = "return overlib('" . strip_tags($object->feedback) . "', CAPTION, '$strfeedback');"; } else { - $function = "return overlib('" . s(ltrim($object->feedback)) . "', FULLHTML);"; + $function = "return overlib('" . s(ltrim($object->feedback) . "', FULLHTML);"); } $overlib = 'onmouseover="' . $function . '" onmouseout="return nd();"'; } @@ -1035,7 +1089,7 @@ class grade_report_grader extends grade_report { } // If object is a category, display expand/contract icon - if (get_class($object) == 'grade_category' && $this->get_pref('aggregationview') == GRADER_REPORT_AGGREGATION_VIEW_COMPACT) { + if (get_class($object) == 'grade_category' && $this->get_pref('aggregationview') == GRADE_REPORT_AGGREGATION_VIEW_COMPACT) { $html .= $contract_expand_icon; } } else { // Editing mode is off diff --git a/grade/report/grader/preferences_form.php b/grade/report/grader/preferences_form.php index 0b9b91d4ea..417e366d0a 100644 --- a/grade/report/grader/preferences_form.php +++ b/grade/report/grader/preferences_form.php @@ -29,16 +29,18 @@ class grader_report_preferences_form extends moodleform { 'showranges' => 'advcheckbox', 'quickgrading' => 'advcheckbox', 'quickfeedback' => 'advcheckbox', + 'showuserimage' => 'advcheckbox', 'meanselection' => array(GRADE_AGGREGATE_MEAN_ALL => get_string('meanall', 'grades'), GRADE_AGGREGATE_MEAN_GRADED => get_string('meangraded', 'grades')), - 'aggregationposition' => array(GRADER_REPORT_AGGREGATION_POSITION_LEFT => get_string('left', 'grades'), - GRADER_REPORT_AGGREGATION_POSITION_RIGHT => get_string('right', 'grades')), - 'aggregationview' => array(GRADER_REPORT_AGGREGATION_VIEW_FULL => get_string('full', 'grades'), - GRADER_REPORT_AGGREGATION_VIEW_COMPACT => get_string('compact', 'grades')), - 'gradedisplaytype' => array(GRADER_REPORT_GRADE_DISPLAY_TYPE_RAW => get_string('raw', 'grades'), - GRADER_REPORT_GRADE_DISPLAY_TYPE_PERCENTAGE => get_string('percentage', 'grades')), - 'averagesdisplaytype' => array(GRADER_REPORT_GRADE_DISPLAY_TYPE_RAW => get_string('raw', 'grades'), - GRADER_REPORT_GRADE_DISPLAY_TYPE_PERCENTAGE => get_string('percentage', 'grades')), + 'aggregationposition' => array(GRADE_REPORT_AGGREGATION_POSITION_LEFT => get_string('left', 'grades'), + GRADE_REPORT_AGGREGATION_POSITION_RIGHT => get_string('right', 'grades')), + 'aggregationview' => array(GRADE_REPORT_AGGREGATION_VIEW_FULL => get_string('full', 'grades'), + GRADE_REPORT_AGGREGATION_VIEW_COMPACT => get_string('compact', 'grades')), + 'gradedisplaytype' => array(GRADE_REPORT_GRADE_DISPLAY_TYPE_RAW => get_string('raw', 'grades'), + GRADE_REPORT_GRADE_DISPLAY_TYPE_PERCENTAGE => get_string('percentage', 'grades')), + 'averagesdisplaytype' => array(GRADE_REPORT_GRADE_DISPLAY_TYPE_INHERIT => get_string('inherit', 'grades'), + GRADE_REPORT_GRADE_DISPLAY_TYPE_RAW => get_string('raw', 'grades'), + GRADE_REPORT_GRADE_DISPLAY_TYPE_PERCENTAGE => get_string('percentage', 'grades')), 'decimalpoints' => array(0, 1, 2, 3, 4, 5), 'studentsperpage' => 'text'); diff --git a/grade/report/grader/settings.php b/grade/report/grader/settings.php index 2b72478faa..b954c15aa4 100644 --- a/grade/report/grader/settings.php +++ b/grade/report/grader/settings.php @@ -4,13 +4,13 @@ require_once($CFG->libdir.'/gradelib.php'); /// Add settings for this module to the $settings object (it's already defined) $settings->add(new admin_setting_configselect('grade_report_aggregationposition', get_string('aggregationposition', 'grades'), get_string('configaggregationposition', 'grades'), false, - array(GRADER_REPORT_AGGREGATION_POSITION_LEFT => get_string('left', 'grades'), - GRADER_REPORT_AGGREGATION_POSITION_RIGHT => get_string('right', 'grades')))); + array(GRADE_REPORT_AGGREGATION_POSITION_LEFT => get_string('left', 'grades'), + GRADE_REPORT_AGGREGATION_POSITION_RIGHT => get_string('right', 'grades')))); $settings->add(new admin_setting_configselect('grade_report_aggregationview', get_string('aggregationview', 'grades'), get_string('configaggregationview', 'grades'), false, - array(GRADER_REPORT_AGGREGATION_VIEW_FULL => get_string('full', 'grades'), - GRADER_REPORT_AGGREGATION_VIEW_COMPACT => get_string('compact', 'grades')))); + array(GRADE_REPORT_AGGREGATION_VIEW_FULL => get_string('full', 'grades'), + GRADE_REPORT_AGGREGATION_VIEW_COMPACT => get_string('compact', 'grades')))); $settings->add(new admin_setting_configcheckbox('grade_report_bulkcheckboxes', get_string('bulkcheckboxes', 'grades'), get_string('configbulkcheckboxes', 'grades'), 0)); @@ -20,13 +20,14 @@ $settings->add(new admin_setting_configcheckbox('grade_report_enableajax', get_s $settings->add(new admin_setting_configselect('grade_report_gradedisplaytype', get_string('gradedisplaytype', 'grades'), get_string('configgradedisplaytype', 'grades'), false, - array(GRADER_REPORT_GRADE_DISPLAY_TYPE_RAW => get_string('raw', 'grades'), - GRADER_REPORT_GRADE_DISPLAY_TYPE_PERCENTAGE => get_string('percentage', 'grades')))); + array(GRADE_REPORT_GRADE_DISPLAY_TYPE_RAW => get_string('raw', 'grades'), + GRADE_REPORT_GRADE_DISPLAY_TYPE_PERCENTAGE => get_string('percentage', 'grades')))); $settings->add(new admin_setting_configselect('grade_report_averagesdisplaytype', get_string('averagesdisplaytype', 'grades'), get_string('configaveragesdisplaytype', 'grades'), false, - array(GRADER_REPORT_GRADE_DISPLAY_TYPE_RAW => get_string('raw', 'grades'), - GRADER_REPORT_GRADE_DISPLAY_TYPE_PERCENTAGE => get_string('percentage', 'grades')))); + array(GRADE_REPORT_GRADE_DISPLAY_TYPE_INHERIT => get_string('inherit', 'grades'), + GRADE_REPORT_GRADE_DISPLAY_TYPE_RAW => get_string('raw', 'grades'), + GRADE_REPORT_GRADE_DISPLAY_TYPE_PERCENTAGE => get_string('percentage', 'grades')))); $settings->add(new admin_setting_configselect('grade_report_meanselection', get_string('meanselection', 'grades'), get_string('configmeanselection', 'grades'), false, @@ -57,6 +58,9 @@ $settings->add(new admin_setting_configcheckbox('grade_report_quickgrading', get $settings->add(new admin_setting_configcheckbox('grade_report_quickfeedback', get_string('quickfeedback', 'grades'), get_string('configquickfeedback', 'grades'), 1)); +$settings->add(new admin_setting_configcheckbox('grade_report_showuserimage', get_string('showuserimage', 'grades'), + get_string('configshowuserimage', 'grades'), 1)); + $settings->add(new admin_setting_configtext('grade_report_studentsperpage', get_string('studentsperpage', 'grades'), get_string('configstudentsperpage', 'grades'), 20)); diff --git a/grade/report/lib.php b/grade/report/lib.php index 38e54d00f1..31cc011022 100755 --- a/grade/report/lib.php +++ b/grade/report/lib.php @@ -92,28 +92,37 @@ class grade_report { * the saved value is returned. If the preference is not set at the User level, the $CFG equivalent * is given (site default). * @param string $pref The name of the preference (do not include the grade_report_ prefix) + * @param int $itemid An optional itemid to check for a more fine-grained preference * @return mixed The value of the preference */ - function get_pref($pref) { + function get_pref($pref, $itemid=null) { global $CFG; - if (empty($this->user_prefs[$pref])) { + if (empty($this->user_prefs[$pref.$itemid])) { $fullprefname = 'grade_report_' . $pref; - $this->user_prefs[$pref] = get_user_preferences($fullprefname, $CFG->$fullprefname); + if (!empty($itemid)) { + $value = get_user_preferences($fullprefname . $itemid, $this->get_pref($pref)); + } else { + $value = get_user_preferences($fullprefname, $CFG->$fullprefname); + } + $this->user_prefs[$pref.$itemid] = $value; } - return $this->user_prefs[$pref]; + return $this->user_prefs[$pref.$itemid]; } + /** * Uses set_user_preferences() to update the value of a user preference. * Also updates the object's corresponding variable. * @param string $pref_name The name of the preference. * @param mixed $pref_value The value of the preference. + * @param int $itemid An optional itemid to which the preference will be assigned * @return bool Success or failure. * TODO print visual feedback */ - function set_user_pref($pref, $pref_value) { - if ($result = set_user_preferences(array($pref => $pref_value))) { - $this->$pref = $pref_value; + function set_pref($pref, $pref_value, $itemid=null) { + $fullprefname = 'grade_report_' . $pref; + if ($result = set_user_preferences(array($fullprefname.$itemid => $pref_value))) { + $this->user_prefs[$pref.$itemid] = $pref_value; } return $result; } @@ -197,7 +206,7 @@ class grade_report { $gradeval = ''; } else { // decimal points as specified by user - $decimals = get_user_preferences('grade_report_decimalpoints', $CFG->grade_report_decimalpoints); + $decimals = $this->get_pref('decimalpoints'); $gradeval = number_format($gradeval, $decimals, $this->get_lang_string('decpoint', 'langconfig'), $this->get_lang_string('thousandsep', 'langconfig')); } @@ -248,6 +257,22 @@ class grade_report { return $this->lang_strings[$strcode]; } - + /** + * Computes then returns the percentage value of the grade value within the given range. + * @param float $gradeval + * @param float $grademin + * @param float $grademx + * @return float $percentage + */ + function grade_to_percentage($gradeval, $grademin, $grademax) { + if ($grademin >= $grademax) { + debugging("The minimum grade ($grademin) was higher than or equal to the maximum grade ($grademax)!!! Cannot proceed with computation."); + } + $offset_value = $gradeval - $grademin; + $offset_max = $grademax - $grademin; + $factor = 100 / $offset_max; + $percentage = $offset_value * $factor; + return $percentage; + } } ?> diff --git a/grade/report/simpletest/testreportlib.php b/grade/report/simpletest/testreportlib.php new file mode 100644 index 0000000000..23946cf23f --- /dev/null +++ b/grade/report/simpletest/testreportlib.php @@ -0,0 +1,31 @@ +dirroot.'/grade/report/lib.php'); + +/** + * @TODO create a set of mock objects to simulate the database operations. We don't want to connect to any real sql server. + */ +class gradereportlib_test extends UnitTestCase { + var $courseid = 1; + var $context = null; + var $report = null; + + function setUp() { + $this->report = new grade_report($this->courseid, $this->context); + } + +} + +?> diff --git a/lang/en_utf8/grades.php b/lang/en_utf8/grades.php index 9616de54c2..44f3a24e50 100644 --- a/lang/en_utf8/grades.php +++ b/lang/en_utf8/grades.php @@ -32,7 +32,7 @@ $string['choosecategory'] = 'Select Category'; $string['compact'] = 'Compact'; $string['configaggregationposition'] = 'The position of the aggregation column in the grader report table, in reference to the raw grades.'; $string['configaggregationview'] = 'The way aggregations are displayed: either alongside the raw grades, or in a compact form in which only one type is shown in the table at once: the raw grades OR the aggregated grades.'; -$string['configaveragesdisplaytype'] = 'Column averages can be shown as raw grades or as percentages (in reference to the minimum and maximum grades).'; +$string['configaveragesdisplaytype'] = 'Specifies how to display the averages for each column in the grader report. The default and recommended value is Inherit, which first checks the display type of each column, and if such is not set explicitly, defaults to the more general Grade Display Type. If Raw or Percentage are selected, they ignore the individual settings for each column, and use exclusively the selected type.'; $string['configbulkcheckboxes'] = 'Checkboxes near each grade for Bulk grade operations.'; $string['configdecimalpoints'] = 'The number of decimal points to display for each grade. This can be overriden per grading item.'; $string['configenableajax'] = 'Adds a layer of AJAX functionality to the grader report, simplifying and speeding up common operations. Depends on Javascript being switched on at the user\'s browser level.'; @@ -47,6 +47,7 @@ $string['configshowgroups'] = 'Show group averages and means in the grader repor $string['configshowlocks'] = 'Whether to show a lock/unlock icon near each grade.'; $string['configshowfeedback'] = 'Whether to show a feedback icon (for adding/editing) near each grade.'; $string['configshowranges'] = 'Display a row showing the range of possible for each grading item in the grader report.'; +$string['configshowuserimage'] = 'Whether to show the user\'s profile image next to the name in the grader report.'; $string['configstudentsperpage'] = 'The number of students to display per page in the grader report.'; $string['contract'] = 'Contract Category'; $string['createcategory'] = 'Create Category'; @@ -138,6 +139,7 @@ $string['importpreview'] = 'Import preview'; $string['importsuccess'] = 'Grade import success'; $string['importxml'] = 'Import XML'; $string['incorrectcourseid'] = 'Course ID was incorrect'; +$string['inherit'] = 'Inherit'; $string['item'] = 'Item'; $string['iteminfo'] = 'Item info'; $string['itemname'] = 'Item name'; @@ -212,14 +214,15 @@ $string['setting'] = 'Setting'; $string['settings'] = 'Settings'; $string['setweights'] = 'Set Weights'; $string['showallstudents'] = 'Show All Students'; +$string['showaverages'] = 'Show column averages'; $string['showcalculations'] = 'Show calculations'; $string['showeyecons'] = 'Show show/hide icons'; -$string['showaverages'] = 'Show column averages'; +$string['showfeedback'] = 'Show feedback'; $string['showgroups'] = 'Show groups'; +$string['showhiddenitems'] = 'Show Hidden Items'; $string['showlocks'] = 'Show locks'; -$string['showfeedback'] = 'Show feedback'; $string['showranges'] = 'Show ranges'; -$string['showhiddenitems'] = 'Show Hidden Items'; +$string['showuserimage'] = 'Show user profile images'; $string['sort'] = 'sort'; $string['sortasc'] = 'Sort in ascending order'; $string['sortdesc'] = 'Sort in descending order'; diff --git a/lib/grade/grade_tree.php b/lib/grade/grade_tree.php index 60f8bf34ab..1a1e9a1372 100644 --- a/lib/grade/grade_tree.php +++ b/lib/grade/grade_tree.php @@ -60,7 +60,7 @@ class grade_tree { * @param boolean $aggregation_view Either full view (0) or compact view (1) */ function grade_tree($courseid, $fillers=true, $category_grade_last=false, - $aggregation_view=GRADER_REPORT_AGGREGATION_VIEW_FULL) { + $aggregation_view=GRADE_REPORT_AGGREGATION_VIEW_FULL) { global $USER; $this->courseid = $courseid; diff --git a/lib/gradelib.php b/lib/gradelib.php index d6191d8595..6707eefa34 100644 --- a/lib/gradelib.php +++ b/lib/gradelib.php @@ -69,12 +69,13 @@ define('GRADE_EDIT_DIR', $CFG->dirroot . '/grade/edit'); define('GRADE_EDIT_URL', $CFG->wwwroot . '/grade/edit'); // Grader reports -define('GRADER_REPORT_AGGREGATION_POSITION_LEFT', 0); -define('GRADER_REPORT_AGGREGATION_POSITION_RIGHT', 1); -define('GRADER_REPORT_AGGREGATION_VIEW_FULL', 0); -define('GRADER_REPORT_AGGREGATION_VIEW_COMPACT', 1); -define('GRADER_REPORT_GRADE_DISPLAY_TYPE_RAW', 0); -define('GRADER_REPORT_GRADE_DISPLAY_TYPE_PERCENTAGE', 1); +define('GRADE_REPORT_AGGREGATION_POSITION_LEFT', 0); +define('GRADE_REPORT_AGGREGATION_POSITION_RIGHT', 1); +define('GRADE_REPORT_AGGREGATION_VIEW_FULL', 0); +define('GRADE_REPORT_AGGREGATION_VIEW_COMPACT', 1); +define('GRADE_REPORT_GRADE_DISPLAY_TYPE_RAW', 0); +define('GRADE_REPORT_GRADE_DISPLAY_TYPE_PERCENTAGE', 1); +define('GRADE_REPORT_GRADE_DISPLAY_TYPE_INHERIT', 2); // Inherit the value set for a particular grade_item (grade_report_gradedisplaytype{$itemid}) require_once($CFG->libdir . '/grade/grade_category.php'); require_once($CFG->libdir . '/grade/grade_item.php'); diff --git a/pix/t/grades.gif b/pix/t/grades.gif new file mode 100644 index 0000000000000000000000000000000000000000..e32235153cdd6b27e4a2ca41beaff7e37a92a248 GIT binary patch literal 114 zcmZ?wbhEHbLV0FMhC)b2s)D;-W$n5TGGbr0TLnTOTg~hyMQ`5wj3UYIC HGFSruIzA}; literal 0 HcmV?d00001 diff --git a/theme/custom_corners/header.html b/theme/custom_corners/header.html index dfa792b226..f479b70860 100644 --- a/theme/custom_corners/header.html +++ b/theme/custom_corners/header.html @@ -5,45 +5,45 @@ <?php echo $title ?> - + javascript"); ?> - + dirroot.'/lib/custom_corners_lib.php'); ?> - + type == 'admin') && (strstr($bodytags, ' nocoursepage'))) { $bodytags = str_replace(' nocoursepage', '', $bodytags); } - + // list of pages using the layout-table to be able to view sideblocks $excludelist = array('mod-chat-view', 'mod-data-view', 'mod-quiz-view', 'my-index'); - if ((in_array($PAGE->type, $excludelist)) && + if ((in_array($PAGE->type, $excludelist)) && (strstr($bodytags, ' nocoursepage'))) { $bodytags = str_replace(' nocoursepage', '', $bodytags); } - + // add 'nocoursepage' to the list of CLASSes on the admin-roles pages preg_match('/id="([^"]*)"/i', $bodytags, $ids); if (($ids[1] == 'admin-roles-assign') || ($ids[1] == 'admin-roles-override')) { // exclude roles called from the admin area (courseid 1) - // include user roles for the Moodle user settings called + // include user roles for the Moodle user settings called // from the start page if (($COURSE->id > 1) || ($_GET['contextid'] == 30)) { preg_match('/class="([^"]*)"/i', $bodytags, $classes); $classlist = explode (' ', $classes[1]); if (!in_array('nocoursepage', $classlist)) { array_push($classlist, 'nocoursepage'); - $bodytags = str_replace($classes[0], + $bodytags = str_replace($classes[0], 'class="'.implode(' ', $classlist).'"', $bodytags); } } @@ -57,13 +57,13 @@ echo " onload=\"setfocus()\""; }; ?>> - - + +
- -
@@ -71,7 +71,7 @@
-