--- loncom/homework/grades.pm 2007/06/25 22:23:27 1.399.2.2 +++ loncom/homework/grades.pm 2007/06/15 22:16:13 1.409 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # The LON-CAPA Grading handler # -# $Id: grades.pm,v 1.399.2.2 2007/06/25 22:23:27 albertel Exp $ +# $Id: grades.pm,v 1.409 2007/06/15 22:16:13 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -41,7 +41,6 @@ use Apache::Constants qw(:common); use Apache::lonlocal; use Apache::lonenc; use String::Similarity; -use lib '/home/httpd/lib/perl'; use LONCAPA; use POSIX qw(floor); @@ -94,7 +93,6 @@ sub get_symb { return (); } } - &Apache::lonenc::check_decrypt(\$symb); return ($symb); } @@ -181,7 +179,7 @@ sub showResourceInfo { if (exists($partsseen{$partID})) { $result.="<td> </td>"; } else { - $result.="<td><input type='checkbox' name='vPart' value='$partID' checked='on' /></td>"; + $result.="<td><input type='checkbox' name='vPart' value='$partID' checked='checked' /></td>"; } $partsseen{$partID}=1; } @@ -494,7 +492,7 @@ sub jscriptNform { ' }'."\n". '</script>'."\n"; $jscript.= '<form action="/adm/grades" method="post" name="onestudent">'."\n". - '<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n". + '<input type="hidden" name="symb" value="'.$symb.'" />'."\n". '<input type="hidden" name="saveState" value="'.$env{'form.saveState'}.'" />'."\n". '<input type="hidden" name="probTitle" value="'.$env{'form.probTitle'}.'" />'."\n". '<input type="hidden" name="Status" value="'.$env{'form.Status'}.'" />'."\n". @@ -709,16 +707,16 @@ LISTJAVASCRIPT &commonJSfunctions($request); $request->print($result); - my $checkhdgrade = ($env{'form.handgrade'} eq 'yes' && scalar(@$partlist) > 1 ) ? 'checked' : ''; - my $checklastsub = $checkhdgrade eq '' ? 'checked' : ''; + my $checkhdgrade = ($env{'form.handgrade'} eq 'yes' && scalar(@$partlist) > 1 ) ? 'checked="checked"' : ''; + my $checklastsub = $checkhdgrade eq '' ? 'checked="checked"' : ''; my $gradeTable='<form action="/adm/grades" method="post" name="gradesub">'. "\n".$table. - ' <b>View Problem Text: </b><label><input type="radio" name="vProb" value="no" checked="on" /> no </label>'."\n". + ' <b>View Problem Text: </b><label><input type="radio" name="vProb" value="no" checked="checked" /> no </label>'."\n". '<label><input type="radio" name="vProb" value="yes" /> one student </label>'."\n". '<label><input type="radio" name="vProb" value="all" /> all students </label><br />'."\n". ' <b>View Answer: </b><label><input type="radio" name="vAns" value="no" /> no </label>'."\n". '<label><input type="radio" name="vAns" value="yes" /> one student </label>'."\n". - '<label><input type="radio" name="vAns" value="all" checked="on" /> all students </label><br />'."\n". + '<label><input type="radio" name="vAns" value="all" checked="checked" /> all students </label><br />'."\n". ' <b>Submissions: </b>'."\n"; if ($env{'form.handgrade'} eq 'yes' && scalar(@$partlist) > 1) { $gradeTable.='<label><input type="radio" name="lastSub" value="hdgrade" '.$checkhdgrade.' /> essay part only </label>'."\n"; @@ -744,7 +742,7 @@ LISTJAVASCRIPT '<input type="hidden" name="showgrading" value="'.$env{'form.showgrading'}.'" /><br />'."\n". '<input type="hidden" name="saveState" value="'.$env{'form.saveState'}.'" />'."\n". '<input type="hidden" name="probTitle" value="'.$env{'form.probTitle'}.'" />'."\n". - '<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n". + '<input type="hidden" name="symb" value="'.$symb.'" />'."\n". '<input type="hidden" name="saveStatusOld" value="'.$saveStatus.'" />'."\n"; if (exists($env{'form.gradingMenu'}) && exists($env{'form.Status'})) { @@ -764,7 +762,7 @@ LISTJAVASCRIPT 'onClick="javascript:checkSelect(this.form.stuinfo);" '."\n". 'value="Next->" /> <br />'."\n"; $gradeTable.=&check_buttons(); - $gradeTable.='<label><input type="checkbox" name="checkPlag" checked="on" />Check For Plagiarism</label>'; + $gradeTable.='<label><input type="checkbox" name="checkPlag" checked="checked" />Check For Plagiarism</label>'; my ($classlist, undef, $fullname) = &getclasslist($getsec,'1'); $gradeTable.='<table border="0"><tr><td bgcolor="#777777">'. '<table border="0"><tr bgcolor="#e6ffff">'; @@ -1502,7 +1500,7 @@ sub gradeBox { $result.= '<td><span style="white-space: nowrap;"><label><input type="radio" name="RADVAL'.$counter.'_'.$partid.'" '. 'onclick="javascript:writeBox(this.form,\''.$counter.'_'.$partid.'\','. $thisweight.')" value="'.$thisweight.'" '. - ($score eq $thisweight ? 'checked':'').' /> '.$thisweight."</label></span></td>\n"; + ($score eq $thisweight ? 'checked="checked"':'').' /> '.$thisweight."</label></span></td>\n"; $result.=(($ctr+1)%10 == 0 ? '</tr><tr>' : ''); $thisweight += $increment; $ctr++; @@ -1520,9 +1518,9 @@ sub gradeBox { 'onChange="javascript:clearRadBox(this.form,\''.$counter.'_'.$partid.'\')" >'."\n"; if ($$record{'resource.'.$partid.'.solved'} eq 'excused') { $result.='<option></option>'. - '<option selected="on">excused</option>'; + '<option selected="selected">excused</option>'; } else { - $result.='<option selected="on"></option>'. + $result.='<option selected="selected"></option>'. '<option>excused</option>'; } $result.='<option>reset status</option></select>'."\n"; @@ -1753,7 +1751,7 @@ sub submission { '<input type="hidden" name="refresh" value="off" />'."\n". '<input type="hidden" name="studentNo" value="" />'."\n". '<input type="hidden" name="gradeOpt" value="" />'."\n". - '<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n". + '<input type="hidden" name="symb" value="'.$symb.'" />'."\n". '<input type="hidden" name="showgrading" value="'.$env{'form.showgrading'}.'" />'."\n". '<input type="hidden" name="vProb" value="'.$env{'form.vProb'}.'" />'."\n". '<input type="hidden" name="vAns" value="'.$env{'form.vAns'}.'" />'."\n". @@ -2083,7 +2081,7 @@ KEYWORDS '<option>3</option><option>5</option>'. '<option>7</option><option>10</option></select>'."\n"; my $nsel = ($env{'form.NTSTU'} ne '' ? $env{'form.NTSTU'} : '1'); - $ntstu =~ s/<option>$nsel</<option selected="on">$nsel</; + $ntstu =~ s/<option>$nsel</<option selected="selected">$nsel</; $endform.=$ntstu.'student(s) '; $endform.='<input type="button" value="Previous" '. 'onClick="javascript:checksubmit(this.form,\'Previous\');" TARGET=_self> '."\n". @@ -2170,10 +2168,18 @@ sub processHandGrade { } my $includemsg = $env{'form.includemsg'.$ctr}; my ($subject,$message,$msgstatus) = ('','',''); - my $restitle = &Apache::lonnet::gettitle($symb); - my ($feedurl,$showsymb) = - &get_feedurl_and_symb($symb,$uname,$udom); - my $messagetail; + my $restitle = &Apache::lonnet::gettitle($symb); + my $encrypturl=&Apache::lonnet::EXT('resource.0.encrypturl', + $symb,$udom,$uname); + my ($feedurl,$baseurl,$showsymb,$messagetail); + $feedurl = &Apache::lonnet::clutter($url); + if ($encrypturl =~ /^yes$/i) { + $baseurl = &Apache::lonenc::encrypted($feedurl,1); + $showsymb = &Apache::lonenc::encrypted($symb,1); + } else { + $baseurl = $feedurl; + $showsymb = $symb; + } if ($includemsg =~ /savemsg|newmsg\Q$ctr\E/) { $subject = $env{'form.msgsub'} if ($includemsg =~ /msgsub/); unless ($subject=~/\w/) { $subject=&mt('Grading Feedback'); } @@ -2186,12 +2192,12 @@ sub processHandGrade { if ($env{'form.withgrades'.$ctr}) { $message.="\n\nPoint".($pts > 1 ? 's':'').' awarded = '.$pts.' out of '.$wgt; $messagetail = " for <a href=\"". - $feedurl."?symb=$showsymb\">$env{'form.probTitle'}</a>"; + $baseurl."?symb=$showsymb\">$env{'form.probTitle'}</a>"; } $msgstatus = &Apache::lonmsg::user_normal_msg($uname,$udom,$subject, $message.$messagetail, - undef,$feedurl,undef, + undef,$baseurl,undef, undef,undef,$showsymb, $restitle); $request->print('<br />'.&mt('Sending message to [_1]:[_2]',$uname,$udom).': '. @@ -2208,16 +2214,26 @@ sub processHandGrade { if ($errorflag eq 'not_allowed') { $request->print("<span class=\"LC_error\">".&mt('Not allowed to modify grades for [_1]',"$collaborator:$udom")."</span>"); next; - } elsif ($message ne '') { - my ($baseurl,$showsymb) = - &get_feedurl_and_symb($symb,$collaborator, - $udom); - if ($env{'form.withgrades'.$ctr}) { - $messagetail = " for <a href=\"". + } else { + if ($message ne '') { + $encrypturl= + &Apache::lonnet::EXT('resource.0.encrypturl', + $symb,$udom,$collaborator); + if ($encrypturl =~ /^yes$/i) { + $baseurl = &Apache::lonenc::encrypted($feedurl,1); + $showsymb = &Apache::lonenc::encrypted($symb,1); + } else { + $baseurl = $feedurl; + $showsymb = $symb; + } + if ($env{'form.withgrades'.$ctr}) { + $messagetail = " for <a href=\"". $baseurl."?symb=$showsymb\">$env{'form.probTitle'}</a>"; + + } + $msgstatus = + &Apache::lonmsg::user_normal_msg($collaborator,$udom,$subject,$message.$messagetail,undef,$baseurl,undef,undef,undef,$showsymb,$restitle); } - $msgstatus = - &Apache::lonmsg::user_normal_msg($collaborator,$udom,$subject,$message.$messagetail,undef,$baseurl,undef,undef,undef,$showsymb,$restitle); } } } @@ -2548,7 +2564,7 @@ sub handback_files { $newflg.'_'.$part_resp.'_returndoc'.$file_counter, $save_file_name); if ($result !~ m|^/uploaded/|) { - $request->print('<span class="LC_error">An errror occured ('.$result. + $request->print('<span class="LC_error">An error occurred ('.$result. ') while trying to upload '.$newflg.'_'.$part_resp.'_returndoc'.$file_counter.'</span><br />'); } else { # mark the file as read only @@ -2571,31 +2587,28 @@ sub handback_files { $message .= "<strong>".&Apache::lonnet::gettitle($symb)."</strong><br />"; $message .= ' The returned file(s) are named: '. $file_msg; $message .= " and can be found in your portfolio space."; - my ($feedurl,$showsymb) = - &get_feedurl_and_symb($symb,$domain,$stuname); + my $url = (&Apache::lonnet::decode_symb($symb))[2]; + my $feedurl = &Apache::lonnet::clutter($url); + my $encrypturl=&Apache::lonnet::EXT('resource.0.encrypturl', + $symb,$domain,$stuname); + my ($baseurl,$showsymb); + if ($encrypturl =~ /^yes$/i) { + $baseurl = &Apache::lonenc::encrypted($feedurl,1); + $showsymb = &Apache::lonenc::encrypted($symb,1); + } else { + $baseurl = $feedurl; + $showsymb = $symb; + } my $restitle = &Apache::lonnet::gettitle($symb); my $msgstatus = &Apache::lonmsg::user_normal_msg($stuname,$domain,$subject. ' (File Returned) ['.$restitle.']',$message,undef, - $feedurl,undef,undef,undef,$showsymb,$restitle); + $baseurl,undef,undef,undef,$showsymb,$restitle); } } return; } -sub get_feedurl_and_symb { - my ($symb,$uname,$udom) = @_; - my (undef,undef,$url) = &Apache::lonnet::decode_symb($symb); - $url = &Apache::lonnet::clutter($url); - my $encrypturl=&Apache::lonnet::EXT('resource.0.encrypturl', - $symb,$udom,$uname); - if ($encrypturl =~ /^yes$/i) { - &Apache::lonenc::encrypted(\$url,1); - &Apache::lonenc::encrypted(\$symb,1); - } - return ($url,$symb); -} - sub get_submitted_files { my ($udom,$uname,$partid,$respid,$record) = @_; my @files; @@ -2956,7 +2969,7 @@ sub viewgrades { #beginning of class grading form $result.= '<form action="/adm/grades" method="post" name="classgrade">'."\n". - '<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n". + '<input type="hidden" name="symb" value="'.$symb.'" />'."\n". '<input type="hidden" name="command" value="editgrades" />'."\n". '<input type="hidden" name="section" value="'.$env{'form.section'}.'" />'."\n". '<input type="hidden" name="saveState" value="'.$env{'form.saveState'}.'" />'."\n". @@ -3014,7 +3027,7 @@ sub viewgrades { $result.= '</td><td><select name="SELVAL_'.$partid.'"'. 'onChange="javascript:writeRadText(\''.$partid.'\','. $weight{$partid}.')"> '. - '<option selected="on"> </option>'. + '<option selected="selected"> </option>'. '<option>excused</option>'. '<option>reset status</option></select></td>'. '<td><label><input type="checkbox" name="FORCE_'.$partid.'" /> Override "Correct"</label></td></tr>'."\n"; @@ -3132,8 +3145,8 @@ sub viewstudentgrade { $result.=' <select name="'. 'GD_'.$student.'_'.$part.'_solved" '. 'onChange="javascript:changeOneScore(\''.$part.'\',\''.$student.'\')" >'."\n"; - $result.= (($status eq 'excused') ? '<option> </option><option selected="on">excused</option>' - : '<option selected="on"> </option><option>excused</option>')."\n"; + $result.= (($status eq 'excused') ? '<option> </option><option selected="selected">excused</option>' + : '<option selected="selected"> </option><option>excused</option>')."\n"; $result.='<option>reset status</option>'; $result.="</select> </td>\n"; } else { @@ -3458,7 +3471,6 @@ sub csvuploadmap_header { my ($result) = &showResourceInfo($symb,$env{'form.probTitle'}); my $checked=(($env{'form.noFirstLine'})?' checked="checked"':''); my $ignore=&mt('Ignore First Line'); - $symb = &Apache::lonenc::check_encrypt($symb); $request->print(<<ENDPICK); <form method="post" enctype="multipart/form-data" action="/adm/grades" name="gradesupload"> <h3><span class="LC_info">Uploading Class Grades</span></h3> @@ -3553,7 +3565,6 @@ sub upcsvScores_form { my $upload=&mt("Upload Scores"); my $upfile_select=&Apache::loncommon::upfile_select_html(); my $ignore=&mt('Ignore First Line'); - $symb = &Apache::lonenc::check_encrypt($symb); $result.=<<ENDUPFORM; <form method="post" enctype="multipart/form-data" action="/adm/grades" name="gradesupload"> <input type="hidden" name="symb" value="$symb" /> @@ -3836,7 +3847,7 @@ LISTJAVASCRIPT foreach (@$titles) { my ($minder,$showtitle) = ($_ =~ /(\d+)\.(.*)/); $result.='<option value="'.$ctr.'" '. - ($$symbx{$_} =~ /$curpage$/ ? 'selected="on"' : ''). + ($$symbx{$_} =~ /$curpage$/ ? 'selected="selected"' : ''). '>'.$showtitle.'</option>'."\n"; $ctr++; } @@ -3851,18 +3862,18 @@ LISTJAVASCRIPT $result.='<input type="hidden" name="page" />'."\n". '<input type="hidden" name="title" />'."\n"; - $result.=' <b>View Problems Text: </b><label><input type="radio" name="vProb" value="no" checked="on" /> no </label>'."\n". + $result.=' <b>View Problems Text: </b><label><input type="radio" name="vProb" value="no" checked="checked" /> no </label>'."\n". '<label><input type="radio" name="vProb" value="yes" /> yes </label>'."<br />\n"; $result.=' <b>Submission Details: </b>'. '<label><input type="radio" name="lastSub" value="none" /> none</label>'."\n". - '<label><input type="radio" name="lastSub" value="datesub" checked /> by dates and submissions</label>'."\n". + '<label><input type="radio" name="lastSub" value="datesub" checked="checked" /> by dates and submissions</label>'."\n". '<label><input type="radio" name="lastSub" value="all" /> all details</label>'."\n"; $result.='<input type="hidden" name="section" value="'.$getsec.'" />'."\n". '<input type="hidden" name="Status" value="'.$env{'form.Status'}.'" />'."\n". '<input type="hidden" name="command" value="displayPage" />'."\n". - '<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n". + '<input type="hidden" name="symb" value="'.$symb.'" />'."\n". '<input type="hidden" name="saveState" value="'.$env{'form.saveState'}.'" />'."<br />\n"; $result.=' <b>'.&mt('Use CODE:').' </b>'. @@ -3986,7 +3997,7 @@ sub displayPage { '<input type="hidden" name="student" value="'.$env{'form.student'}.'" />'."\n". '<input type="hidden" name="page" value="'.$pageTitle.'" />'."\n". '<input type="hidden" name="title" value="'.$env{'form.title'}.'" />'."\n". - '<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n". + '<input type="hidden" name="symb" value="'.$symb.'" />'."\n". '<input type="hidden" name="overRideScore" value="no" />'."\n". '<input type="hidden" name="saveState" value="'.$env{'form.saveState'}.'" />'."\n"; @@ -4358,7 +4369,7 @@ sub updateGradeByPage { sub defaultFormData { my ($symb)=@_; return ' - <input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n". + <input type="hidden" name="symb" value="'.$symb.'" />'."\n". '<input type="hidden" name="saveState" value="'.$env{'form.saveState'}.'" />'."\n". '<input type="hidden" name="probTitle" value="'.$env{'form.probTitle'}.'" />'."\n"; } @@ -4372,7 +4383,7 @@ sub getSequenceDropDown { foreach (@$titles) { my ($minder,$showtitle) = ($_ =~ /(\d+)\.(.*)/); $result.='<option value="'.$$symbx{$_}.'" '. - ($$symbx{$_} =~ /$curpage$/ ? 'selected="on"' : ''). + ($$symbx{$_} =~ /$curpage$/ ? 'selected="selected"' : ''). '>'.$showtitle.'</option>'."\n"; $ctr++; } @@ -4400,7 +4411,7 @@ sub scantron_uploads { my $result= '<select name="scantron_selectfile">'; $result.="<option></option>"; foreach my $filename (sort(&scantron_filenames())) { - $result.="<option".($filename eq $file2grade ? ' selected="on"':'').">$filename</option>\n"; + $result.="<option".($filename eq $file2grade ? ' selected="selected"':'').">$filename</option>\n"; } $result.="</select>"; return $result; @@ -4951,7 +4962,7 @@ sub remember_current_skipped { sub check_for_error { my ($r,$result)=@_; if ($result ne 'ok' && $result ne 'not_found' ) { - $r->print("An error occured ($result) when trying to Remove the existing corrections."); + $r->print("An error occurred ($result) when trying to Remove the existing corrections."); } } @@ -5413,7 +5424,7 @@ sub scantron_get_correction { if ($closest > 0) { foreach my $testcode (@{$closest}) { my $checked=''; - if (!$i) { $checked=' checked="on" '; } + if (!$i) { $checked=' checked="checked" '; } $r->print("<label><input type='radio' name='scantron_CODE_resolution' value='use_closest_$i' $checked /> Use the similar CODE <b><tt>".$testcode."</tt></b> instead.</label><input type='hidden' name='scantron_CODE_closest_$i' value='$testcode' />"); $r->print("\n<br />"); $i++; @@ -5421,7 +5432,7 @@ sub scantron_get_correction { } } if ($$scan_record{'scantron.CODE'}=~/\S/ ) { - my $checked; if (!$i) { $checked=' checked="on" '; } + my $checked; if (!$i) { $checked=' checked="checked" '; } $r->print("<label><input type='radio' name='scantron_CODE_resolution' value='use_unfound' $checked /> Use the CODE <b><tt>".$$scan_record{'scantron.CODE'}."</tt></b> that is was on the paper, ignoring the error.</label>"); $r->print("\n<br />"); } @@ -5927,7 +5938,7 @@ DOWNLOAD sub show_grading_menu_form { my ($symb)=@_; my $result.='<br /><form action="/adm/grades" method="post">'."\n". - '<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n". + '<input type="hidden" name="symb" value="'.$symb.'" />'."\n". '<input type="hidden" name="saveState" value="'.$env{'form.saveState'}.'" />'."\n". '<input type="hidden" name="command" value="gradingmenu" />'."\n". '<input type="submit" name="submit" value="Grading Menu" />'."\n". @@ -6002,7 +6013,7 @@ GRADINGMENUJS my $saveStatus = ($$savedState{'saveStatus'} eq '' ? 'Active' : $$savedState{'saveStatus'}); $result.='<form action="/adm/grades" method="post" name="gradingMenu">'."\n". - '<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n". + '<input type="hidden" name="symb" value="'.$symb.'" />'."\n". '<input type="hidden" name="handgrade" value="'.$hdgrade.'" />'."\n". '<input type="hidden" name="probTitle" value="'.$probTitle.'" />'."\n". '<input type="hidden" name="command" value="" />'."\n". @@ -6021,38 +6032,38 @@ GRADINGMENUJS if (ref($sections)) { foreach (sort (@$sections)) { $result.='<option value="'.$_.'" '. - ($saveSec eq $_ ? 'selected="on"':'').'>'.$_.'</option>'."\n"; + ($saveSec eq $_ ? 'selected="selected"':'').'>'.$_.'</option>'."\n"; } } - $result.= '<option value="all" '.($saveSec eq 'all' ? 'selected="on"' : ''). '>all</option></select> '; + $result.= '<option value="all" '.($saveSec eq 'all' ? 'selected="selected"' : ''). '>all</option></select> '; - $result.=&mt('Student Status').':</b>'.&Apache::lonhtmlcommon::StatusOptions($saveStatus,undef,1,undef); + $result.=&mt('Student Status').':'.&Apache::lonhtmlcommon::StatusOptions($saveStatus,undef,1,undef); $result.='</td></tr>'; $result.='<tr bgcolor="#ffffe6"valign="top"><td><label>'. '<input type="radio" name="radioChoice" value="submission" '. - ($saveCmd eq 'submission' ? 'checked' : '').' /> '.'<b>'.&mt('Current Resource').':</b> '.&mt('For one or more students'). + ($saveCmd eq 'submission' ? 'checked="checked"' : '').' /> '.'<b>'.&mt('Current Resource').':</b> '.&mt('For one or more students'). '</label> <select name="submitonly">'. '<option value="yes" '. - ($saveSub eq 'yes' ? 'selected="on"' : '').' />'.&mt('with submissions').'</option>'. + ($saveSub eq 'yes' ? 'selected="selected"' : '').'>'.&mt('with submissions').'</option>'. '<option value="queued" '. - ($saveSub eq 'queued' ? 'selected="on"' : '').' />'.&mt('in grading queue').'</option>'. + ($saveSub eq 'queued' ? 'selected="selected"' : '').'>'.&mt('in grading queue').'</option>'. '<option value="graded" '. - ($saveSub eq 'graded' ? 'selected="on"' : '').' />'.&mt('with ungraded submissions').'</option>'. + ($saveSub eq 'graded' ? 'selected="selected"' : '').'>'.&mt('with ungraded submissions').'</option>'. '<option value="incorrect" '. - ($saveSub eq 'incorrect' ? 'selected="on"' : '').' />'.&mt('with incorrect submissions').'</option>'. + ($saveSub eq 'incorrect' ? 'selected="selected"' : '').'>'.&mt('with incorrect submissions').'</option>'. '<option value="all" '. - ($saveSub eq 'all' ? 'selected="on"' : '').' />'.&mt('with any status').'</option></select></td></tr>'."\n"; + ($saveSub eq 'all' ? 'selected="selected"' : '').'>'.&mt('with any status').'</option></select></td></tr>'."\n"; $result.='<tr bgcolor="#ffffe6"valign="top"><td>'. '<label><input type="radio" name="radioChoice" value="viewgrades" '. - ($saveCmd eq 'viewgrades' ? 'checked' : '').' /> '. + ($saveCmd eq 'viewgrades' ? 'checked="checked"' : '').' /> '. '<b>Current Resource:</b> For all students in selected section or course</label></td></tr>'."\n"; $result.='<tr bgcolor="#ffffe6" valign="top"><td>'. '<label><input type="radio" name="radioChoice" value="pickStudentPage" '. - ($saveCmd eq 'pickStudentPage' ? 'checked' : '').' /> '. + ($saveCmd eq 'pickStudentPage' ? 'checked="checked"' : '').' /> '. 'The <b>complete</b> set/page/sequence: For one student</label></td></tr>'."\n"; $result.='<tr bgcolor="#ffffe6"><td><br />'. @@ -6066,6 +6077,10 @@ GRADINGMENUJS '<input type="button" onClick="javascript:checkChoice(this.form,\'3\',\'csvform\');" value="'.&mt('Upload').'" />'. ' '.&mt('scores from file').' </td></tr>'."\n"; + $result.='<tr bgcolor="#ffffe6"><td>'. + '<input type="button" onClick="javascript:checkChoice(this.form,\'6\',\'processclicker\');" value="'.&mt('Process').'" />'. + ' '.&mt('clicker file').' </td></tr>'."\n"; + $result.='<tr bgcolor="#ffffe6"valign="top"><td colspan="2">'. '<input type="button" onClick="javascript:checkChoice(this.form,\'4\',\'scantron_selectphase\');'. '" value="'.&mt('Grade').'" /> scantron forms</td></tr>'."\n"; @@ -6085,9 +6100,9 @@ GRADINGMENUJS '<input type="button" onClick="javascript:this.form.command.value=\'codelist\';this.form.action=\'/adm/pickcode\';this.form.submit();'. '" value="'.&mt('View').'" /> saved CODEs.</td></tr>'."\n"; - $result.='</form></td></tr></table>'."\n". + $result.='</table>'."\n". '</td></tr></table>'."\n". - '</td></tr></table>'."\n"; + '</td></tr></table></form>'."\n"; return $result; } @@ -6113,6 +6128,238 @@ sub init_perm { } } +sub gather_clicker_ids { + my %clicker_ids; + + my $classlist = &Apache::loncoursedata::get_classlist(); + + # Set up a couple variables. + my $username_idx = &Apache::loncoursedata::CL_SNAME(); + my $domain_idx = &Apache::loncoursedata::CL_SDOM(); + + foreach my $student (keys(%$classlist)) { + + my $username = $classlist->{$student}->[$username_idx]; + my $domain = $classlist->{$student}->[$domain_idx]; + my $clickers = + (&Apache::lonnet::userenvironment($domain,$username,'clickers'))[1]; + foreach my $id (split(/\,/,$clickers)) { + $id=~s/^0+//; + if (exists($clicker_ids{$id})) { + $clicker_ids{$id}.=','.$username.':'.$domain; + } else { + $clicker_ids{$id}=$username.':'.$domain; + } + } + } + return %clicker_ids; +} + +sub gather_adv_clicker_ids { + my %clicker_ids; + my $cnum=$env{'course.'.$env{'request.course.id'}.'.num'}; + my $cdom=$env{'course.'.$env{'request.course.id'}.'.domain'}; + my %coursepersonnel=&Apache::lonnet::get_course_adv_roles($cdom.'/'.$cnum); + foreach my $element (sort(keys(%coursepersonnel))) { + foreach my $person (split(/\,/,$coursepersonnel{$element})) { + my ($puname,$pudom)=split(/\:/,$person); + my $clickers = + (&Apache::lonnet::userenvironment($pudom,$puname,'clickers'))[1]; + foreach my $id (split(/\,/,$clickers)) { + $id=~s/^0+//; + if (exists($clicker_ids{$id})) { + $clicker_ids{$id}.=','.$puname.':'.$pudom; + } else { + $clicker_ids{$id}=$puname.':'.$pudom; + } + } + } + } + return %clicker_ids; +} + +sub process_clicker { + my ($r)=@_; + my ($symb)=&get_symb($r); + if (!$symb) {return '';} + my $result=&checkforfile_js(); + $env{'form.probTitle'} = &Apache::lonnet::gettitle($symb); + my ($table) = &showResourceInfo($symb,$env{'form.probTitle'}); + $result.=$table; + $result.='<br /><table width="100%" border="0"><tr><td bgcolor="#777777">'."\n"; + $result.='<table width="100%" border="0"><tr bgcolor="#e6ffff"><td>'."\n"; + $result.=' <b>'.&mt('Specify a file containing the clicker information for this resource'). + '.</b></td></tr>'."\n"; + $result.='<tr bgcolor=#ffffe6><td>'."\n"; + my $upload=&mt("Upload File"); + my $type=&mt("Type"); + my $attendance=&mt("Award points just for participation"); + my $personnel=&mt("Correctness determined from response by course personnel"); + my $specific=&mt("Correctness determined from response with clicker ID"); + my $pcorrect=&mt("Percentage points for correct solution"); + my $pincorrect=&mt("Percentage points for incorrect solution"); + my $selectform=&Apache::loncommon::select_form('iclicker','upfiletype', + ('iclicker' => 'i>clicker')); + + $result.=<<ENDUPFORM; +<script type="text/javascript"> +function sanitycheck() { +// Accept only integer percentages + document.forms.gradesupload.pcorrect.value=Math.round(document.forms.gradesupload.pcorrect.value); + document.forms.gradesupload.pincorrect.value=Math.round(document.forms.gradesupload.pincorrect.value); +// Find out grading choice + for (i=0; i<document.forms.gradesupload.gradingmechanism.length; i++) { + if (document.forms.gradesupload.gradingmechanism[i].checked) { + gradingchoice=document.forms.gradesupload.gradingmechanism[i].value; + } + } +// By default, new choice equals user selection + newgradingchoice=gradingchoice; +// Not good to give more points for false answers than correct ones + if (Math.round(document.forms.gradesupload.pcorrect.value)<Math.round(document.forms.gradesupload.pincorrect.value)) { + document.forms.gradesupload.pcorrect.value=document.forms.gradesupload.pincorrect.value; + } +// If new choice is attendance only, and old choice was correctness-based, restore defaults + if ((gradingchoice=='attendance') && (document.forms.gradesupload.waschecked.value!='attendance')) { + document.forms.gradesupload.pcorrect.value=100; + document.forms.gradesupload.pincorrect.value=100; + } +// If the values are different, cannot be attendance only + if ((Math.round(document.forms.gradesupload.pcorrect.value)!=Math.round(document.forms.gradesupload.pincorrect.value)) && + (gradingchoice=='attendance')) { + newgradingchoice='personnel'; + } +// Change grading choice to new one + for (i=0; i<document.forms.gradesupload.gradingmechanism.length; i++) { + if (document.forms.gradesupload.gradingmechanism[i].value==newgradingchoice) { + document.forms.gradesupload.gradingmechanism[i].checked=true; + } else { + document.forms.gradesupload.gradingmechanism[i].checked=false; + } + } +// Remember the old state + document.forms.gradesupload.waschecked.value=newgradingchoice; +} +</script> +<form method="post" enctype="multipart/form-data" action="/adm/grades" name="gradesupload"> +<input type="hidden" name="symb" value="$symb" /> +<input type="hidden" name="command" value="processclickerfile" /> +<input type="hidden" name="probTitle" value="$env{'form.probTitle'}" /> +<input type="hidden" name="saveState" value="$env{'form.saveState'}" /> +<input type="file" name="upfile" size="50" /> +<br /><label>$type: $selectform</label> +<br /><label>$attendance: <input type="radio" name="gradingmechanism" value="attendance" checked="checked" onClick="sanitycheck()" /></label> +<br /><label>$personnel: <input type="radio" name="gradingmechanism" value="personnel" onClick="sanitycheck()" /></label> +<br /><label>$specific: <input type="radio" name="gradingmechanism" value="specific" onClick="sanitycheck()" /></label> +<input type="text" name="specificid" size="15" /> +<input type="hidden" name="waschecked" value="attendance" /> +<br /><label>$pcorrect: <input type="text" name="pcorrect" size="4" value="100" onChange="sanitycheck()" /></label> +<br /><label>$pincorrect: <input type="text" name="pincorrect" size="4" value="100" onChange="sanitycheck()" /></label> +<br /><input type="button" onClick="javascript:checkUpload(this.form);" value="$upload" /> +</form> +ENDUPFORM + $result.='</td></tr></table>'."\n". + '</td></tr></table><br /><br />'."\n"; + $result.=&show_grading_menu_form($symb); + return $result; +} + +sub process_clicker_file { + my ($r)=@_; + my ($symb)=&get_symb($r); + if (!$symb) {return '';} + my ($result) = &showResourceInfo($symb,$env{'form.probTitle'}); + if (($env{'form.gradingmechanism'} eq 'specific') && ($env{'form.specificid'}!~/\w/)) { + $result.='<span class="LC_error">'.&mt('You need to specify a clicker ID for the correct answer').'</span>'; + return $result.&show_grading_menu_form($symb); + } + my %clicker_ids=&gather_clicker_ids(); + my %correct_ids; + if ($env{'form.gradingmechanism'} eq 'personnel') { + %correct_ids=&gather_adv_clicker_ids(); + } + if ($env{'form.gradingmechanism'} eq 'specific') { + my $correct_id=$env{'form.specificid'}; + $correct_id=~tr/a-z/A-Z/; + $correct_id=~s/\s//gs; + $correct_id=~s/^0+//; + $correct_ids{$correct_id}='specified'; + } + if ($env{'form.gradingmechanism'} eq 'attendance') { + $result.=&mt('Score based on attendance only'); + } else { + my $number=0; + $result.='<h3>'.&mt('Correctness determined by the following IDs').'</h3>'; + foreach my $id (sort(keys(%correct_ids))) { + $result.='<tt>'.$id.'</tt> - '; + if ($correct_ids{$id} eq 'specified') { + $result.=&mt('specified'); + } else { + my ($uname,$udom)=split(/\:/,$correct_ids{$id}); + $result.=&Apache::loncommon::plainname($uname,$udom); + } + $result.='<br />'; + $number++; + } + if ($number==0) { + $result.='<span class="LC_error">'.&mt('No IDs found to determine correct answer').'</span>'; + return $result.&show_grading_menu_form($symb); + } + } + if (length($env{'form.upfile'}) < 2) { + $result.=&mt('[_1] Error: [_2] The file you attempted to upload, [_3] contained no information. Please check that you entered the correct filename.', + '<span class="LC_error">', + '</span>', + '<span class="LC_filename">'.&HTML::Entities::encode($env{'form.upfile.filename'},'<>&"').'</span>'); + return $result.&show_grading_menu_form($symb); + } + my %responses; + my @questiontitles; + my $errormsg=''; + my $number=0; + if ($env{'form.upfiletype'} eq 'iclicker') { + ($errormsg,$number)=&iclicker_eval(\@questiontitles,\%responses); + } + $result.='<br />'.&mt('Found [_1] questions',$number).'<br />'; + foreach my $id (keys(%responses)) { + $result.='<br />'.$id.' - '.$responses{$id}; + } + return $result.&show_grading_menu_form($symb); +} + +sub iclicker_eval { + my ($questiontitles,$responses)=@_; + my $number=0; + my $errormsg=''; + foreach my $line (split(/[\n\r]/,$env{'form.upfile'})) { + chomp($line); + foreach my $quoted ($line=~/\,\s*\"([^\"]*)\"\s*\,/g) { + my $replace=$quoted; + $replace=~s/\,//g; + &Apache::lonnet::logthis($quoted.' - '.$replace.'<br />'); + $line=~s/\,\s*\"\Q$quoted\E\"\s*\,/,$replace,/gs; + } + my @entries=split(/\,/,$line); + if ($entries[0] eq 'Question') { + for (my $i=3;$i<$#entries;$i+=6) { + $$questiontitles[$number]=$entries[$i]; + $number++; + } + } + if ($entries[0]=~/^\#/) { + my $id=$entries[0]; + my @idresponses; + $id=~s/^[\#0]+//; + for (my $i=0;$i<$number;$i++) { + my $idx=3+$i*6; + push(@idresponses,$entries[$idx]); + } + $$responses{$id}=join(',',@idresponses); + } + } + return ($errormsg,$number); +} + sub handler { my $request=$_[0]; @@ -6180,6 +6427,10 @@ sub handler { $request->print(&editgrades($request)); } elsif ($command eq 'verify' && $perm{'vgr'}) { $request->print(&verifyreceipt($request)); + } elsif ($command eq 'processclicker' && $perm{'mgr'}) { + $request->print(&process_clicker($request)); + } elsif ($command eq 'processclickerfile' && $perm{'mgr'}) { + $request->print(&process_clicker_file($request)); } elsif ($command eq 'csvform' && $perm{'mgr'}) { $request->print(&upcsvScores_form($request)); } elsif ($command eq 'csvupload' && $perm{'mgr'}) {