--- loncom/homework/grades.pm 2006/03/28 17:54:44 1.343 +++ loncom/homework/grades.pm 2006/04/11 20:51:46 1.351 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # The LON-CAPA Grading handler # -# $Id: grades.pm,v 1.343 2006/03/28 17:54:44 banghart Exp $ +# $Id: grades.pm,v 1.351 2006/04/11 20:51:46 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -722,7 +722,14 @@ LISTJAVASCRIPT $gradeTable.='<label><input type="radio" name="lastSub" value="lastonly" '.$checklastsub.' /> last submission only </label>'."\n". '<label><input type="radio" name="lastSub" value="last" /> last submission & parts info </label>'."\n". '<label><input type="radio" name="lastSub" value="datesub" /> by dates and submissions </label>'."\n". - '<label><input type="radio" name="lastSub" value="all" /> all details</label>'."\n". + '<label><input type="radio" name="lastSub" value="all" /> all details</label><br />'."\n". + ' <b>Grading Increments:</b> <select name="increment">'. + '<option value="1">Whole Points</option>'. + '<option value=".5">Half Points</option>'. + '<option value=".25">Quarter Points</option>'. + '<option value=".1">Tenths of a Point</option>'. + '</select>'. + '<input type="hidden" name="section" value="'.$getsec.'" />'."\n". '<input type="hidden" name="submitonly" value="'.$submitonly.'" />'."\n". '<input type="hidden" name="handgrade" value="'.$env{'form.handgrade'}.'" /><br />'."\n". @@ -1135,6 +1142,81 @@ sub sub_page_kw_js { my $request = shift; my $iconpath = $request->dir_config('lonIconsURL'); &commonJSfunctions($request); + + my $inner_js_msg_central=<<INNERJS; + <script text="text/javascript"> + function checkInput() { + opener.document.SCORE.msgsub.value = opener.checkEntities(document.msgcenter.msgsub.value); + var nmsg = opener.document.SCORE.savemsgN.value; + var usrctr = document.msgcenter.usrctr.value; + var newval = opener.document.SCORE["newmsg"+usrctr]; + newval.value = opener.checkEntities(document.msgcenter.newmsg.value); + + var msgchk = ""; + if (document.msgcenter.subchk.checked) { + msgchk = "msgsub,"; + } + var includemsg = 0; + for (var i=1; i<=nmsg; i++) { + var opnmsg = opener.document.SCORE["savemsg"+i]; + var frmmsg = document.msgcenter["msg"+i]; + opnmsg.value = opener.checkEntities(frmmsg.value); + var showflg = opener.document.SCORE["shownOnce"+i]; + showflg.value = "1"; + var chkbox = document.msgcenter["msgn"+i]; + if (chkbox.checked) { + msgchk += "savemsg"+i+","; + includemsg = 1; + } + } + if (document.msgcenter.newmsgchk.checked) { + msgchk += "newmsg"+usrctr; + includemsg = 1; + } + imgformname = opener.document.SCORE["mailicon"+usrctr]; + imgformname.src = "$iconpath/"+((includemsg) ? "mailto.gif" : "mailbkgrd.gif"); + var includemsg = opener.document.SCORE["includemsg"+usrctr]; + includemsg.value = msgchk; + + self.close() + + } + </script> +INNERJS + + my $inner_js_highlight_central=<<INNERJS; + <script type="text/javascript"> + function updateChoice(flag) { + opener.document.SCORE.kwclr.value = opener.radioSelection(document.hlCenter.kwdclr); + opener.document.SCORE.kwsize.value = opener.radioSelection(document.hlCenter.kwdsize); + opener.document.SCORE.kwstyle.value = opener.radioSelection(document.hlCenter.kwdstyle); + opener.document.SCORE.refresh.value = "on"; + if (opener.document.SCORE.keywords.value!=""){ + opener.document.SCORE.submit(); + } + self.close() + } +</script> +INNERJS + + my $start_page_msg_central = + &Apache::loncommon::start_page('Message Central',$inner_js_msg_central, + {'js_ready' => 1, + 'only_body' => 1, + 'bgcolor' =>'#FFFFFF',}); + my $end_page_msg_central = + &Apache::loncommon::end_page({'js_ready' => 1}); + + + my $start_page_highlight_central = + &Apache::loncommon::start_page('Highlight Central', + $inner_js_highlight_central, + {'js_ready' => 1, + 'only_body' => 1, + 'bgcolor' =>'#FFFFFF',}); + my $end_page_highlight_central = + &Apache::loncommon::end_page({'js_ready' => 1}); + my $docopen=&Apache::lonhtmlcommon::javascript_docopen(); $docopen=~s/^document\.//; $request->print(<<SUBJAVASCRIPT); @@ -1250,51 +1332,7 @@ sub sub_page_kw_js { pWin.focus(); pDoc = pWin.document; pDoc.$docopen; - pDoc.write("<html><head>"); - pDoc.write("<title>Message Central</title>"); - - pDoc.write("<script language=javascript>"); - pDoc.write("function checkInput() {"); - pDoc.write(" opener.document.SCORE.msgsub.value = opener.checkEntities(document.msgcenter.msgsub.value);"); - pDoc.write(" var nmsg = opener.document.SCORE.savemsgN.value;"); - pDoc.write(" var usrctr = document.msgcenter.usrctr.value;"); - pDoc.write(" var newval = opener.document.SCORE[\\"newmsg\\"+usrctr];"); - pDoc.write(" newval.value = opener.checkEntities(document.msgcenter.newmsg.value);"); - - pDoc.write(" var msgchk = \\"\\";"); - pDoc.write(" if (document.msgcenter.subchk.checked) {"); - pDoc.write(" msgchk = \\"msgsub,\\";"); - pDoc.write(" }"); - pDoc.write(" var includemsg = 0;"); - pDoc.write(" for (var i=1; i<=nmsg; i++) {"); - pDoc.write(" var opnmsg = opener.document.SCORE[\\"savemsg\\"+i];"); - pDoc.write(" var frmmsg = document.msgcenter[\\"msg\\"+i];"); - pDoc.write(" opnmsg.value = opener.checkEntities(frmmsg.value);"); - pDoc.write(" var showflg = opener.document.SCORE[\\"shownOnce\\"+i];"); - pDoc.write(" showflg.value = \\"1\\";"); - pDoc.write(" var chkbox = document.msgcenter[\\"msgn\\"+i];"); - pDoc.write(" if (chkbox.checked) {"); - pDoc.write(" msgchk += \\"savemsg\\"+i+\\",\\";"); - pDoc.write(" includemsg = 1;"); - pDoc.write(" }"); - pDoc.write(" }"); - pDoc.write(" if (document.msgcenter.newmsgchk.checked) {"); - pDoc.write(" msgchk += \\"newmsg\\"+usrctr;"); - pDoc.write(" includemsg = 1;"); - pDoc.write(" }"); - pDoc.write(" imgformname = opener.document.SCORE[\\"mailicon\\"+usrctr];"); - pDoc.write(" imgformname.src = \\"$iconpath/\\"+((includemsg) ? \\"mailto.gif\\" : \\"mailbkgrd.gif\\");"); - pDoc.write(" var includemsg = opener.document.SCORE[\\"includemsg\\"+usrctr];"); - pDoc.write(" includemsg.value = msgchk;"); - - pDoc.write(" self.close()"); - - pDoc.write("}"); - - pDoc.write("<"); - pDoc.write("/script>"); - - pDoc.write("</head><body bgcolor=white>"); + pDoc.write('$start_page_msg_central'); pDoc.write("<form action=\\"inactive\\" name=\\"msgcenter\\">"); pDoc.write("<input value=\\""+usrctr+"\\" name=\\"usrctr\\" type=\\"hidden\\">"); @@ -1335,7 +1373,7 @@ sub sub_page_kw_js { pDoc.write("<input type=\\"button\\" value=\\"Save\\" onClick=\\"javascript:checkInput()\\"> "); pDoc.write("<input type=\\"button\\" value=\\"Cancel\\" onClick=\\"self.close()\\"><br /><br />"); pDoc.write("</form>"); - pDoc.write("</body></html>"); + pDoc.write('$end_page_msg_central'); pDoc.close(); } @@ -1381,26 +1419,7 @@ sub sub_page_kw_js { hwdWin.focus(); var hDoc = hwdWin.document; hDoc.$docopen; - hDoc.write("<html><head>"); - hDoc.write("<title>Highlight Central</title>"); - - hDoc.write("<script language=javascript>"); - hDoc.write("function updateChoice(flag) {"); - hDoc.write(" opener.document.SCORE.kwclr.value = opener.radioSelection(document.hlCenter.kwdclr);"); - hDoc.write(" opener.document.SCORE.kwsize.value = opener.radioSelection(document.hlCenter.kwdsize);"); - hDoc.write(" opener.document.SCORE.kwstyle.value = opener.radioSelection(document.hlCenter.kwdstyle);"); - hDoc.write(" opener.document.SCORE.refresh.value = \\"on\\";"); - hDoc.write(" if (opener.document.SCORE.keywords.value!=\\"\\"){"); - hDoc.write(" opener.document.SCORE.submit();"); - hDoc.write(" }"); - hDoc.write(" self.close()"); - hDoc.write("}"); - - hDoc.write("<"); - hDoc.write("/script>"); - - hDoc.write("</head><body bgcolor=white>"); - + hDoc.write('$start_page_highlight_central'); hDoc.write("<form action=\\"inactive\\" name=\\"hlCenter\\">"); hDoc.write("<font color=\\"green\\" size=+1> Keyword Highlight Options</font><br /><br />"); @@ -1428,7 +1447,7 @@ sub sub_page_kw_js { hDoc.write("<input type=\\"button\\" value=\\"Save\\" onClick=\\"javascript:updateChoice(1)\\"> "); hDoc.write("<input type=\\"button\\" value=\\"Cancel\\" onClick=\\"self.close()\\"><br /><br />"); hDoc.write("</form>"); - hDoc.write("</body></html>"); + hDoc.write('$end_page_highlight_central'); hDoc.close(); } @@ -1436,6 +1455,15 @@ sub sub_page_kw_js { SUBJAVASCRIPT } +sub get_increment { + my $increment = $env{'form.increment'}; + if ($increment != 1 && $increment != .5 && $increment != .25 && + $increment != .1) { + $increment = 1; + } + return $increment; +} + #--- displays the grading box, used in essay type problem and grading by page/sequence sub gradeBox { my ($request,$symb,$uname,$udom,$counter,$partid,$record) = @_; @@ -1458,13 +1486,16 @@ sub gradeBox { $result.='<table border="0"><tr><td>'. '<b>Part: </b>'.$display_part.' <b>Points: </b></td><td>'."\n"; my $ctr = 0; + my $thisweight = 0; + my $increment = &get_increment(); $result.='<table border="0"><tr>'."\n"; # display radio buttons in a nice table 10 across - while ($ctr<=$wgt) { + while ($thisweight<=$wgt) { $result.= '<td><nobr><label><input type="radio" name="RADVAL'.$counter.'_'.$partid.'" '. 'onclick="javascript:writeBox(this.form,\''.$counter.'_'.$partid.'\','. - $ctr.')" value="'.$ctr.'" '. - ($score eq $ctr ? 'checked':'').' /> '.$ctr."</label></nobr></td>\n"; + $thisweight.')" value="'.$thisweight.'" '. + ($score eq $thisweight ? 'checked':'').' /> '.$thisweight."</label></nobr></td>\n"; $result.=(($ctr+1)%10 == 0 ? '</tr><tr>' : ''); + $thisweight += $increment; $ctr++; } $result.='</tr></table>'; @@ -1517,7 +1548,10 @@ sub handback_box { next if (!@$files); my $file_counter = 1; foreach my $file (@$files) { - my ($file_disp) = ($file =~ m|.+/(.+)$|); + my ($file_path, $file_disp) = ($file =~ m|(.+/)(.+)$|); + my ($name,$version,$ext) = &file_name_version_ext($file_disp); + $file_disp = "$name.$ext"; + $file = $file_path.$file_disp; $result.=&mt('Return commented version of [_1] to student.', '<span class="filename">'.$file_disp.'</span>'); $result.='<input type="file" name="'.$prefix.'returndoc'.$file_counter.'" />'."\n"; @@ -1931,8 +1965,8 @@ KEYWORDS '<input type="hidden" name="newmsg'.$counter.'" value="" />'."\n"; $result.=' <a href="javascript:msgCenter(document.SCORE,'.$counter. ',\''.$msgfor.'\')"; TARGET=_self>'. - &mt('Compose message to student').(scalar(@col_fullnames) >= 1 ? 's' : '').'</a> ('. - &mt('incl. grades').' <input type="checkbox" name="withgrades'.$counter.'" />)'. + &mt('Compose message to student').(scalar(@col_fullnames) >= 1 ? 's' : '').'</a><label> ('. + &mt('incl. grades').' <input type="checkbox" name="withgrades'.$counter.'" /></label>)'. '<img src="'.$request->dir_config('lonIconsURL'). '/mailbkgrd.gif" width="14" height="10" name="mailicon'.$counter.'" />'."\n". '<br /> ('. @@ -1992,6 +2026,8 @@ KEYWORDS '<input type="button" value="Next" '. 'onClick="javascript:checksubmit(this.form,\'Next\');" TARGET=_self> '; $endform.='(Next and Previous (student) do not save the scores.)'."\n" ; + $endform.="<input type='hidden' value='".&get_increment(). + "' name='increment' />"; $endform.='</td><tr></table></form>'; $endform.=&show_grading_menu_form($symb); $request->print($endform); @@ -2326,6 +2362,7 @@ sub saveHandGrade { my $partial= $pts/$wgt; if ($partial eq $record{'resource.'.$new_part.'.awarded'}) { #do not update score for part if not changed. + &handback_files($request,$symb,$stuname,$domain,$newflg,$new_part,\%newrecord); next; } else { push @parts_graded, $new_part; @@ -2362,12 +2399,10 @@ sub saveHandGrade { my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; - if (scalar(keys(%newrecord)) > 0) { - if (scalar(@version_parts)) { + if (%newrecord) { + if (@version_parts) { my @changed_keys = &version_portfiles(\%record, \@parts_graded, $env{'request.course.id'}, $symb, $domain, $stuname, \@version_parts); - foreach my $key(@changed_keys) { - $newrecord{$key} = $record{$key}; - } + @newrecord{@changed_keys} = @record{@changed_keys}; } &Apache::lonnet::cstore(\%newrecord,$symb, $env{'request.course.id'},$domain,$stuname); @@ -3512,6 +3547,7 @@ sub csvuploadassign { my ($request)= @_; my ($symb)=&get_symb($request); if (!$symb) {return '';} + my $error_msg = ''; &Apache::loncommon::load_tmp_file($request); my @gradedata = &Apache::loncommon::upfile_record_sep(); if ($env{'form.noFirstLine'}) { shift(@gradedata); } @@ -3564,12 +3600,20 @@ sub csvuploadassign { my $part=$1; my $wgt =&Apache::lonnet::EXT('resource.'.$part.'.weight', $symb,$domain,$username); - $entries{$fields{$dest}}=~s/\s//g; - my $pcr=$entries{$fields{$dest}} / $wgt; - my $award='correct_by_override'; - $grades{"resource.$part.awarded"}=$pcr; - $grades{"resource.$part.solved"}=$award; - $points{$part}=1; + if ($wgt) { + $entries{$fields{$dest}}=~s/\s//g; + my $pcr=$entries{$fields{$dest}} / $wgt; + my $award='correct_by_override'; + $grades{"resource.$part.awarded"}=$pcr; + $grades{"resource.$part.solved"}=$award; + $points{$part}=1; + } else { + $error_msg = "<br />" . + &mt("Some point values were assigned" + ." for problems with a weight " + ."of zero. These values were " + ."ignored."); + } } else { if ($dest=~/stores_(.*)_awarded/) { if ($points{$1}) {next;} } if ($dest=~/stores_(.*)_solved/) { if ($points{$1}) {next;} } @@ -3609,7 +3653,7 @@ sub csvuploadassign { } $request->print("<br />\n"); $request->print(&show_grading_menu_form($symb)); - return ''; + return $error_msg; } #------------- end of section for handling csv file upload --------- #