From 8d283b9c24ce5e670dd02a39451c40427c1ac236 Mon Sep 17 00:00:00 2001
From: Gero Lueckemeyer <gero.lueckemeyer@hft-stuttgart.de>
Date: Wed, 8 Nov 2023 23:16:11 +0100
Subject: [PATCH] added competency explanations

---
 dta.zip                              | Bin 19157 -> 19339 bytes
 dta/lang/en/assignsubmission_dta.php |  50 ++++++++++++++++++---------
 dta/utils/view.php                   |  25 +++++++++++---
 3 files changed, 54 insertions(+), 21 deletions(-)

diff --git a/dta.zip b/dta.zip
index ab0c893d2e51d8616d3cd6dae3d04b24be444f01..b35770daf7870b735d46f7150169198a2a38df19 100644
GIT binary patch
delta 5240
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

delta 5063
zcmV;&6FBUPmjTt40kFUY4rpm+SJ{$&BajFH0Mi|l&IK!fS!vG`ArSuVub8~?gBoqU
z@2lP>UU^$JMomL^*%oDC1FW_FdS`$=TDIOA6BA$9hvAtMm|nkCt*RsAG0axNLLnpv
z{J&zxfiB>w);Z3cf|YaC)$zFW<B>MYF|NUX4T9Dh&cW)!t(oChVWVrvm;%FdVVx0+
z+9AvVQ~6kb8z^-yiVaGjxmxAifLn2J+>{n~_JfDdUcy7JxM31r)C(yxcp@^cEC+@h
zX~wR24hxdwS3DpN)4%~o8U-^av^oh~;CBO`xUo2fb8(MG;7QPigdAgzm>bX)tvil%
zHz1komW~p|Tm6uVP+savR~-L9VW{0&NC^uLwdF;BEl<*71jFmcvq#Tg&S3KF4ZNNl
z9!{Rk-dsblTWS2tKk*<+l$8`H88tFYxeXHc+uuLD`v{jz?mT|-c=iVA!-L1OXZNR5
zc<}rXCh%f%ID35e<&()Fym)!|;`#Lc2w=)N2}J?lGH&7hg9gmGV?x?S<u~Y3i|k|$
zEB1+hqiZuRJ|Q;-nXWe9cN+;|Qmds`Gnx=-JuX0LcM>epyB<Sry<U%&s`jxa!*V;m
zIXZG=eB#6rH~~|%xmsExi@TSVR$MtaVAhJIvh|`AmfSVZ9XmLQE>z2!Ejb);b%4uB
z!tIJ>A88I?XqAVAoe45Pi<FkUaN}hqM=Mu<%Aop-C-CVUIwZsmiWwh4#T%21jvTd~
z`rCs_)=QxjEBV2DxB&<EboP-O@dYh9<JKVtCQH)l*uB~0_`$VyB`U!dlIMQeptx&(
z%X<Q?y~M2MGDkKGPQGmMJ$3!JKmxad?hBe$6=GQ%pGKtA7g3!e!y(Da=np(|9kEn@
z=6uCv6$IZ88CX|RGYT1t3nXRyXGdj+cEV^=q&4~yh{wyr$53gZyeXXa(Pen0t#I0G
zd=Q0fjoU_wM9<GR4AH;Dn`%$9zi^nh2EWP82woBwl-{vv%NNUYL8>z;H#8toB^8BQ
z3AAf|$_cau5%g@25%mhyltS_22=;=1)>x-}pcb6x3u1>lX|HCJYC(+MSjS5{+GA47
z9qnXy{pB!PwmtPj0(#ErIl~_U!M4x{C*20(uO|RgI8L67DoYuvgww6hhn$VGpO_T+
z&pF(a!q^s>cWTayMp*8X2+JmAwpMYxsuxs$$$fsUsTF492;TVUadnPqX17Uy^R0Nr
zzXcVVoKuZwA)HLM621;vUM^%4L;Q1vafN&JnA47#tBrR!!<{&t2^$K~Pa?;a(Kw=r
zw*P6f1cIHfgLMu<A-Id?Mh$z(Pe!nFTW1-!wy0w;K{wHNcY&usjao)f9QF}Zfra#;
zH|NG^(_niaz<=nks?|rO*BF+64l89?5R{1@z<=nki2UXxmZM6UXjn~K=5j+WCI_@A
zZ)hKQ+rr9{nN3_D2L10&J0|CXGBRLhGy#5Mh?EIhbY#Hn(2oad%-k^Oe^1rA+s$kt
z<JmRuPLCJyG<$|K+eQ|y2YZRb4%0<LAA_e)iXmUrjj_YuX^70-riwy;9)uZ~;mi=y
zaAvjI#vb~)J{q$MmDB<D1PAb}E*IQvTTQl*yIR(z8USIoL_1;HBqh?J@tk2<<3Ae1
zj3(L)DtQ(CFxqxl2;UO(D=uz_*LHvliNz>@?$DnJppbeUErNgHh015H(K10wtz+dq
z<QO1cqXdLi)<#ly=}$I)!08h+0r83%K?OWPbS_0#rl0YK&D!!7BO9k+8t2j#0*jF;
zT4O(s!xTuN+eK|KN1nnkx3hU|*|Nz59P^yw=_O9?!PA9r7e2)~Hb_~Dg=tI0lQ7sL
z9jo}9RU%$`KBI05i^k-|<2`swH~c2<{B1uIZj->+!cu^ep96M((oHlm+SQ71FBbT&
z`i$2Ynbn~L??mnyFKKTu?@%}!&}l>`$a5Z<hIRrx?}2G#C%_8<m_~Pkyy%fhj3>BD
z9+yUX0=(>j`(r*`aiv|6#(auCbK1kx$WM{MU;BbT#Rre=3H}t`x-AX-6x_Nl4gD0{
zxG#<S6dN4)jo{yZ3HA+LxbS`F1AKpNo)ao$4yHy)3Bl<VvQdr%Xa0hpX=CWU(5?!P
zc#O38!ne)!%i=jh8#a&LrJx5p8W$^QIU26~Jqm5`G*?O#yN61NL#X|`E(eMWyG!a9
zIZ;LqStStp3>;VaYw@!7S5z-E3+EBgV!AD^Vw>Yn7>P1}zelLHDHVf<9iwY-=OX*3
zY52O*<00sAfXym;X$(6F|MD*oG*38Y_xdQbx(MPeivRsAJFI2D$n8@+;Qv(oP_^t)
z3A;4?y=<km#ZiUJE8G`%p`r=6C>%~<$mOmNY3I%Flj~RLpJ&;u{3leKqhXjPP#QFl
z$VW1><R%n<1Kh;dkUyOTBz%z2KiR!I)piO3|13ghEY!oUj`|8~<J%bp^HYIxj;&XG
z(hF@uj>Ie8-(gJB6QliiRO6Yx$Fhxo@l_?cKXS>-|D6)?uCb$pudK}E)I{wx;_(*#
zzv~pPL_L)<!^1VjfB9*7y=&8;(7GrDJ{A-m5)HP0-NRR!bd&hjc+Cto-1_$|rRS)+
z@9)jm;d6Y|v`r~0|Nb|VcYB-N?+*O0BTDbIo=I$M#_>FoxNi*gPr0Q+(WkPY2DQo`
zX=-a|M}5!uf<=Ayw%Ow<Y_~ljj<~SpKwEBU+BMq#roOu0(QEsSofSGt^z+0#ljO|M
zfSZ?pHqx0um=FCo&{;<Mz_CZO*$X)T`SbBaj^ze_?Mmf@`9V1shUCOHULr`f4L(}C
zBTuW=5g3rl7TiR4Px2CbuT2lTb2rslR?Fz(`=Jd@-PLCPS_0kbT$9L?80y0ItzB~b
zB`$A&z2k{kpCEKOS9~3RLGl-bkcVj`#>P(|)NSf*i8|#5<9B#TpJoJ(u`L&l;TJmm
zMjPSLIVk8Wv+NFMC=TMfW>+8$$nPr(004|blVLX-e~;2Y5dYuA?=Ut#KoNYzm~f(=
z=j#&X3~(A_3|Yzojiqhc?IAwCyED5jeFDoJoaaNMKzC>6w==UdyR+LzPrQkD`BI|+
zy@?gT$g(-$r^kE&?g-wx?hv2chKUefv(cE!-*wj?H;_pFi~A6@&p8C{NX(een=p4n
zFqs2Be;-<b@U1~8u$utp3>&TwQ+H^M=EQ;?hR%@tASN6H_oo30mp@*$kKq+}xX)~O
z7Y=O8gg2JSoqz*FnDiu=@F5H&BT4d-P;?av{N*BNCM?&f0k^Q-hZF7x_#5s=LSl|J
zaDB<8!UTc$!S#r+iiqc6Gm+5NOGdvKB*L*Af5~{_dK|wXI~?K6vTYb}2m?L}?V6;<
z-tghD_xk9#2m9@h@L|8x*>Cqg?qP2+aj})3aK+1-dbWkEaa2BY#2mpZ053WRuaRc|
z+2NbR-bWk*ygcl+Uv#_h@~8v*@NU1;J3Kgkv)_St$DMaa-4}I$F6YFRIIPm~NZJY2
ze>miVS$2?&`y(1RK!o-XChUZxkxg!$AU+1B>&@5OPjX?l>x|`CBSj*#!x1>Hs6l`b
zA4PsQo6YKDCzOt7EBc`E7|~q5WZEnU;Jw9X-Ec6q0y59BK&<ecngRcypl80zhV~ql
zudHLcW6P|OpR*}Pvwg$IG+5383(ag!f0#4obxDrnaRLDcM{nO9wO_P*{r3Lb7tjKO
zp{%hJETr~_f*E@Yp*L@;FK`paQUihqz({F0w}NmwW&RxJ)zpr<CEcG&SO`;qk}>6u
zu!gB0WnB{>*fse9!UfakC>@3S+(YR!(u9N0Md&*~&g+abfEwzHC+&tEn81%wf9RMr
zD;9%_hC+lDBv5}OqN{22wOm^ou4<|_BM^z@BI~{6!khq3V^&X|UyTH#DV`6c#hcAB
z7aas-i>_*W>ATbCNH$;ruVmq55mfh5jA<xjU}G<b<AB*_NPz(LYnmMWjucP>i(D2%
z*cZp0VZ4(Fa4gc|u8$5h^(-VKf30!fcl{tejEEI+BB4)=1PU>(#N)jEI1+GxAx%`O
z&}zXQxPBdy4k<w|NKU$E6}~IJO9cBAC@U#xQ8UJ>m`x)kN)0k<siGg<y>q7q_aLpv
zpE>otiabU-Sv{}tdJ9$wuY=Jr_DYB<dgCWetyE<-tDYyt!6rzcV&F$we}nY&TGfbo
zB!8O9q($85t9|9~6$2eb1pQ>t28BO+)NE#>j+Fgq;6EmYX)n=H!sCJuBw#drsGb3w
z>eW{+tphpb7@9t=2|A)G#~L;E<%B#n%u>5W7VDEbxZsXy@fC_F^=~qLn!Mb^QIIAK
z{h4p!Ql!}&S|=5Wss;w8f1V`$MZwRA=i<+mIVsBRm;g^OiT?hKq?dIR=zk&UJm(|J
zAytjgIws~Ex#Hmgt)sz1{n0X4QZo^+vT2Pt4@l7i&O(9fY`Gf41*I2?^l%WR%_p1<
zX%f#C3<5;*$&i8!Xg!wx)uXPjW!H{7Gd}O-*=R8+kgC|4qb=i@e<q5ibcW;xicoeq
zR;@Soidl9EMOU?EC`RaCq0g64yi~0jid0aPF>wj$K`z4H$XmP{`Iyu}##&QPxk&C=
zy_Jm&f>BPH7`1G$Qf!ySr`jru8=tG|gz~8;=KWaoCft<&LFpiT<V50X%Y9Xw7qua~
zs1K2)2nX(PUZ&i_f3x*IPLm&<T*FA&#AXPDmwA+3B)EdveI%YP%`rLZt63#&15o**
zNMG=&rh5s|ryEl7H$Efv%67`9__tmXG)f$xzQzd?QP~lmdXl1oPqh-PrFFb^Zjvlz
z%~fmc+P3Xh+}doi@Pi*eG}fi*72-KK%wlZ_+z$Bp@2O(Ne`O>+f(MBbcA$vmi7i5w
z)k+z_hYxlMFv`_yaP1I4G}z?;Ql4|+Vos#JV0*D9A8JN&gR!G9L*AAbbq>)X(%L4`
zVLO70zIKtFOTSWZb~nrCh;wnc-;kKJ;_-hU+^hn0cK3_KoQv1#)XBDE>Qk(Owj=oB
z`&jYu0H2l>e+c~*j&};rTf0pwLAHABUsxHbf;;|S(TH_=1@@&i^`i6*i|mU+dv&)v
zQS0y9vi#pnY_hQX7d8`;PbnK}Ax`vJE!2NYX=F=Mbc4F0UQ!-Zg~8&XOC%v*DBT|p
zL6#i>&qCz+ec&;ZiunUBW}G|mIlHWt%TpGIj#=W;e`-$9s*)xOD5+_7QCz;9d77G{
zei2vaq-m4d>)%qzEzy23!AO|a7xLm?J=-1fim_+Zw2tF4klYix$YSg9RGn8cTzr$h
zTe)iCC8)2hJH!QVq_j+#FJh@#CZIY$l0D;Jw{8{l3X!$SczjYcah*D=wwC(P=#SIz
zP~G)ee{`PXB_%wbGDV0Y=O9n30(nVG_DfF0<g}C(&l<2H-5o-Ah%Qe>Q#7BfDsn(q
zTE-n?G1eTMHlHo-Aki5dBo3wy#_D>Jd+lmq)s)tl+GRUsjQ^1>m(1;D5j-z<V<aQn
zW#WX{6=nHqBYpr%<yE=(q6AgG{4(TfO%cmff7VFSJ^ij4%ae}=_%kIp-Q>Ah(o-p8
z`$<nLu_cp@CQ*DpZx?wjdl;?cZ2M?Z!T+DoHaMCjhmg{+#R+YDFOy6-!@CQW{BA42
z*o%{75jb-mr&!`8U_TJ*PMeUd>%|?z6)WgdQzgMsMYby@ZqhM7A!)2<4B;Dv?}D_0
ze+f6gz-(fflf?xKx;#NSiIf>-HyhPD1e=e<?Sbo)DVb^F7xZB2EFlEy+FyyruKKqh
z%Qo5z?`DH_16EyuNVYCTJa>1EC%Ryvi|5|1@kG}*bn)EZHJ-wqkg`dlv*yq&8Rg1G
z%dQ;Yl>NfSyzk&GY0Wza62vCy{p^Uze^e1t0=gd1wgF^o&6fBB^d-IU_iGD9oK;)f
zhDX}bQ_S`jsJ~-wQ*aA)ZxWq@-k-;@P~NEQQs`}?8InM(foWG3QJY+q4lK;^F1|D}
zp}dc;FpaoRTUjx|SDlhNLJepqL@Nl3f;w)aP(-kDU2sL^;VtbiRaZ^j<Daq{e*t|l
z_cocCYrSN<h)H!3(jEfU1GL?p<wY_UF8Tx4`6JBLkx=y@?b={Cw~riquI8(aSFLNb
z)(@wSx?t@Fasq=Ti(GSh+bw>F53o8C@_14&-6GMriElfc4sdTr=VaMOnFFCs{OJ_-
z$=PU~ZxP78<8J6wT8_0F@LA33f8(P^+x4^sn`8;E;V8=WQm&FbyztI~F#kATQL6n@
zy(NxLk*6dNF0hw)?k0=Q3*aKLPW93KCigi1rAHue+bw)%Uf@+?fkRSlmgY^yP*Mk9
zv^|e#K5LF>cjhmvmv*^;MSWE*ODI@SoR9@fhkq67Hac2~UeF_dF4>G|JXduSVJk}Q
z{<2bge7vA}HnYQnmJdGjl6MNF1bS1@#UeQF+3578aG284d<!%7m}=RJoRT8_dM5t&
z3$yk?-2@J3X=Yd1l71tQ2mk=n9h2ckL<VwZj8>`;ld(u1lSxM&2#5{<0AzGwFO$(n
z6O)2RLIEa|#YbTQ9g`<WTmeRtgh*)u<|UKwNMHeylTb-t0@o^&u}NA2|0<JzD;JX_
zN=^d6Fq1$r7?X@jFd*W(W>+8$$nPr(004|b000sIBme*a00000AOHXW<u;StN+1SK
ds4&m}5R<V;9+MzT9sxj;KTAdi;X?ob001I<rQ`qr

diff --git a/dta/lang/en/assignsubmission_dta.php b/dta/lang/en/assignsubmission_dta.php
index d80eaa8..2b8d945 100644
--- a/dta/lang/en/assignsubmission_dta.php
+++ b/dta/lang/en/assignsubmission_dta.php
@@ -73,22 +73,22 @@ $string["comp_simple"] = "Simplicity";
 $string["comp_abstraction"] = "Abstraction";
 
 // Competencies for index calculation.
-$string["comp1"] = $string["comp_statement"];
-$string["comp2"] = $string["comp_block"];
-$string["comp3"] = $string["comp_flow"];
-$string["comp4"] = $string["comp_loop"];
-$string["comp5"] = $string["comp_const"];
-$string["comp6"] = $string["comp_var"];
-$string["comp7"] = $string["comp_type"];
-$string["comp8"] = $string["comp_datastructure"];
-$string["comp9"] = $string["comp_interface"];
-$string["comp10"] = $string["comp_unit"];
-$string["comp11"] = $string["comp_proc_usage"];
-$string["comp12"] = $string["comp_proc_sign"];
-$string["comp13"] = $string["comp_library"];
-$string["comp14"] = $string["comp_ext_api"];
-$string["comp15"] = $string["comp_simple"];
-$string["comp16"] = $string["comp_abstraction"];
+$string["comp0"] = $string["comp_statement"];
+$string["comp1"] = $string["comp_block"];
+$string["comp2"] = $string["comp_flow"];
+$string["comp3"] = $string["comp_loop"];
+$string["comp4"] = $string["comp_const"];
+$string["comp5"] = $string["comp_var"];
+$string["comp6"] = $string["comp_type"];
+$string["comp7"] = $string["comp_datastructure"];
+$string["comp8"] = $string["comp_interface"];
+$string["comp9"] = $string["comp_unit"];
+$string["comp10"] = $string["comp_proc_usage"];
+$string["comp11"] = $string["comp_proc_sign"];
+$string["comp12"] = $string["comp_library"];
+$string["comp13"] = $string["comp_ext_api"];
+$string["comp14"] = $string["comp_simple"];
+$string["comp15"] = $string["comp_abstraction"];
 
 // Competency explanations.
 $string["comp_statement_expl"] = "formulate a syntactically correct statement that contributes to the solution of the given problem.";
@@ -108,6 +108,24 @@ $string["comp_ext_api_expl"] = "use standardized existing external collections o
 $string["comp_simple_expl"] = "create a simple solution of the given problem.";
 $string["comp_abstraction_expl"] = "create a sufficiently abstract solution for the given problem.";
 
+// Competency explanations for index calculations.
+$string["comp_expl0"] = $string["comp_statement_expl"];
+$string["comp_expl1"] = $string["comp_block_expl"];
+$string["comp_expl2"] = $string["comp_flow_expl"];
+$string["comp_expl3"] = $string["comp_loop_expl"];
+$string["comp_expl4"] = $string["comp_const_expl"];
+$string["comp_expl5"] = $string["comp_var_expl"];
+$string["comp_expl6"] = $string["comp_type_expl"];
+$string["comp_expl7"] = $string["comp_datastructure_expl"];
+$string["comp_expl8"] = $string["comp_interface_expl"];
+$string["comp_expl9"] = $string["comp_unit_expl"];
+$string["comp_expl10"] = $string["comp_proc_usage_expl"];
+$string["comp_expl11"] = $string["comp_proc_sign_expl"];
+$string["comp_expl12"] = $string["comp_library_expl"];
+$string["comp_expl13"] = $string["comp_ext_api_expl"];
+$string["comp_expl14"] = $string["comp_simple_expl"];
+$string["comp_expl15"] = $string["comp_abstraction_expl"];
+
 // Warnings.
 $string["no_testfile_warning"] = "Submission type is \"Dockerized Testing Agent\" but no configuration file uploaded";
 
diff --git a/dta/utils/view.php b/dta/utils/view.php
index bddc748..98af5c3 100644
--- a/dta/utils/view.php
+++ b/dta/utils/view.php
@@ -46,17 +46,30 @@ class ViewSubmissionUtils {
         $html .= ($summary->compilationErrorCount() == 0 && $summary->unknownCount() == 0)
             ? $summary->resultCount() . " (" . $successrate . "%)"
                 : "?";
-        $html .= get_string("tests_successful", self::COMPONENT_NAME) . "<br>";
+        $html .= get_string("tests_successful", self::COMPONENT_NAME) . "<br />";
 
         if ($summary->compilationErrorCount() > 0) {
-            $html .= $summary->compilationErrorCount() . get_string("compilation_errors", self::COMPONENT_NAME) . "<br>";
+            $html .= $summary->compilationErrorCount() . get_string("compilation_errors", self::COMPONENT_NAME) . "<br />";
         }
 
         if ($summary->unknownCount() > 0) {
-            $html .= $summary->unknownCount() . get_string("unknown_state", self::COMPONENT_NAME) . "<br>";
+            $html .= $summary->unknownCount() . get_string("unknown_state", self::COMPONENT_NAME) . "<br />";
         }
 
-        $html .= get_string("success_competencies", self::COMPONENT_NAME) . $summary->successfultestcompetencies . "<br>";
+        $showncompetencies = explode(";", $summary->successfultestcompetencies);
+        $overallcompetencies = explode(";", $summary->overalltestcompetencies);
+        
+        $tmp = "";
+        for ($index=0, $size=count($showncompetencies); $index<$size; $index++) {
+            $shown=$showncompetencies[$index];
+            $comp=$overallcompetencies[$index];
+            // If the competency was actually assessed by the assignment and tests, add a summary entry.
+            if($shown!="0") {
+                $tmp .= get_string("comp" . $index, self::COMPONENT_NAME) . " " . 100*floatval($shown)/floatval($comp) . "% " . "<br />";
+            }
+        }
+        
+        $html .= get_string("success_competencies", self::COMPONENT_NAME) . $tmp . "<br />";
 
         return html_writer::div($html, "dtaSubmissionSummary");
     }
@@ -199,6 +212,7 @@ class ViewSubmissionUtils {
         // Add empty div for spacing between summary and compentency table.
         $html .= html_writer::empty_tag("div", ["class" => "dtaSpacer"]);
         
+        // Competency assessment table.
         $body = "";
         $tmp = "";
         $tmp .= html_writer::tag("th", get_string("competencies", self::COMPONENT_NAME), ["class" => "dtaTableHeader"]);
@@ -218,8 +232,9 @@ class ViewSubmissionUtils {
                 $resultrowattributes = $tablerowattributes;
                 $tmp = "";
                 $tmp .= html_writer::tag("td", get_string("comp" . $index, self::COMPONENT_NAME), $resultrowattributes);                
-                $tmp .= html_writer::tag("td", floatval($shown)/floatval ($comp) . "% " .
+                $tmp .= html_writer::tag("td", 100*floatval($shown)/floatval($comp) . "% " .
                     "(" . $shown . " / " . $comp . ")", $resultrowattributes);
+                $tmp .= html_writer::tag("td", get_string("comp_expl" . $index, self::COMPONENT_NAME), $resultrowattributes);    
                 
                 $body .= html_writer::tag("tr", $tmp, $resultrowattributes);
             }
-- 
GitLab