--- loncom/homework/grades.pm 2010/01/15 17:12:18 1.589 +++ loncom/homework/grades.pm 2010/02/28 23:31:42 1.596 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # The LON-CAPA Grading handler # -# $Id: grades.pm,v 1.589 2010/01/15 17:12:18 bisitz Exp $ +# $Id: grades.pm,v 1.596 2010/02/28 23:31:42 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -160,6 +160,10 @@ sub response_type { return; } my $res = $navmap->getBySymb($symb); + unless (ref($res)) { + $$response_error = 1; + return; + } my $partlist = $res->parts(); my %vPart = map { $_ => 1 } (&Apache::loncommon::get_env_multiple('form.vPart')); @@ -944,10 +948,18 @@ LISTJAVASCRIPT my $saveStatus = $stu_status eq '' ? 'Active' : $stu_status; $env{'form.Status'} = $saveStatus; $submission_options.= - '<label><input type="radio" name="lastSub" value="lastonly" '.$checklastsub.' /> '.&mt('last submission only').' </label>'."\n". - '<label><input type="radio" name="lastSub" value="last" /> '.&mt('last submission & parts info').' </label>'."\n". - '<label><input type="radio" name="lastSub" value="datesub" /> '.&mt('by dates and submissions').' </label>'."\n". - '<label><input type="radio" name="lastSub" value="all" /> '.&mt('all details').'</label>'; + '<span class="LC_nobreak">'. + '<label><input type="radio" name="lastSub" value="lastonly" '.$checklastsub.' /> '. + &mt('last submission only').' </label></span>'."\n". + '<span class="LC_nobreak">'. + '<label><input type="radio" name="lastSub" value="last" /> '. + &mt('last submission & parts info').' </label></span>'."\n". + '<span class="LC_nobreak">'. + '<label><input type="radio" name="lastSub" value="datesub" /> '. + &mt('by dates and submissions').'</label></span>'."\n". + '<span class="LC_nobreak">'. + '<label><input type="radio" name="lastSub" value="all" /> '. + &mt('all details').'</label></span>'; $gradeTable .= &Apache::lonhtmlcommon::row_title(&mt('Submissions')) .$submission_options .&Apache::lonhtmlcommon::row_closure(); @@ -2079,12 +2091,31 @@ KEYWORDS } # This is where output for one specific student would start - my $add_class = ($counter%2) ? 'LC_grade_show_user_odd_row' : ''; - $request->print("\n\n". - '<div class="LC_grade_show_user '.$add_class.'">'. - '<div class="LC_grade_user_name">'.&nameUserString(undef,$env{'form.fullname'},$uname,$udom).'</div>'. - '<div class="LC_grade_show_user_body">'."\n"); + my $add_class = ($counter%2) ? ' LC_grade_show_user_odd_row' : ''; + $request->print( + "\n\n" + .'<div class="LC_grade_show_user'.$add_class.'">' + .'<h2>'.&nameUserString(undef,$env{'form.fullname'},$uname,$udom).'</h2>' + ."\n" + ); + # Show additional functions if allowed + if ($perm{'vgr'}) { + $request->print( + &Apache::loncommon::track_student_link( + &mt('View recent activity'), + $uname,$udom,'check') + .' ' + ); + } + if ($perm{'opa'}) { + $request->print( + &Apache::loncommon::pprmlink( + &mt('Set/Change parameters'), + $uname,$udom,$symb,'check')); + } + + # Show Problem if ($env{'form.vProb'} eq 'all' or $env{'form.vAns'} eq 'all') { my $mode; if ($env{'form.vProb'} eq 'all' && $env{'form.vAns'} eq 'all') { @@ -2108,10 +2139,9 @@ KEYWORDS # Display student info $request->print(($counter == 0 ? '' : '<br />')); - my $result='<div class="LC_grade_submissions">'; - - $result.='<div class="LC_Box">' - .'<h3 class="LC_hcell">'.&mt('Submissions').'</h3>'; + + my $result='<div class="LC_Box">' + .'<h3 class="LC_hcell">'.&mt('Submissions').'</h3>'; $result.='<input type="hidden" name="name'.$counter. '" value="'.$env{'form.fullname'}.'" />'."\n"; if ($env{'form.handgrade'} eq 'no') { @@ -2145,7 +2175,9 @@ KEYWORDS if ($$timestamp eq '') { $lastsubonly.='<div class="LC_grade_submissions_body">'.$$string[0].'</div>'; } else { - $lastsubonly = '<div class="LC_grade_submissions_body"> <b>Date Submitted:</b> '.$$timestamp."\n"; + $lastsubonly = + '<div class="LC_grade_submissions_body">' + .'<b>'.&mt('Date Submitted:').'</b> '.$$timestamp."\n"; my %seenparts; my @part_response_id = &flatten_responseType($responseType); @@ -2180,7 +2212,7 @@ KEYWORDS foreach my $submission (@$string) { my ($partid,$respid) = ($submission =~ /^resource\.([^\.]*)\.([^\.]*)\.submission/); if (join('_',@{$part}) ne ($partid.'_'.$respid)) { next; } - my ($ressub,$subval) = split(/:/,$submission,2); + my ($ressub,$hide,$subval) = split(/:/,$submission,3); # Similarity check my $similar=''; if($env{'form.checkPlag'}){ @@ -2192,16 +2224,21 @@ KEYWORDS &Apache::lonnet::coursedescription($ocrsid, {'one_time' => 1}); - $similar="<hr /><h3><span class=\"LC_warning\">". - &mt('Essay is [_1]% similar to an essay by [_2] in course [_3] (course id [_4]:[_5])', - $osim, - &Apache::loncommon::plainname($oname,$odom).' ('.$oname.':'.$odom.')', - $old_course_desc{'description'}, - $old_course_desc{'num'}, - $old_course_desc{'domain'}). - '</span></h3><blockquote><i>'. - &keywords_highlight($oessay). - '</i></blockquote><hr />'; + if ($hide) { + $similar='<hr /><span class="LC_warning">'.&mt("Essay was found to be similar to another essay submitted for this assignment.").'<br />'. + &mt('As the current submission is for an anonymous survey, no other details are available.').'</span><hr />'; + } else { + $similar="<hr /><h3><span class=\"LC_warning\">". + &mt('Essay is [_1]% similar to an essay by [_2] in course [_3] (course id [_4]:[_5])', + $osim, + &Apache::loncommon::plainname($oname,$odom).' ('.$oname.':'.$odom.')', + $old_course_desc{'description'}, + $old_course_desc{'num'}, + $old_course_desc{'domain'}). + '</span></h3><blockquote><i>'. + &keywords_highlight($oessay). + '</i></blockquote><hr />'; + } } } my $order=&get_order($partid,$respid,$symb,$uname,$udom); @@ -2216,18 +2253,24 @@ KEYWORDS '</b></span> '; my $files=&get_submitted_files($udom,$uname,$partid,$respid,\%record); if (@$files) { - $lastsubonly.='<br /><span class="LC_warning">'.&mt('Like all files provided by users, this file may contain viruses').'</span><br />'; - my $file_counter = 0; - foreach my $file (@$files) { - $file_counter++; - &Apache::lonnet::allowuploaded('/adm/grades',$file); - $lastsubonly.='<br /><a href="'.$file.'?rawmode=1" target="lonGRDs"><img src="'.&Apache::loncommon::icon($file).'" border="0" /> '.$file.'</a>'; - } + if ($hide) { + $lastsubonly.='<br />'.&mt('[quant,_1,file] uploaded to this anonymous survey',scalar(@{$files})); + } else { + $lastsubonly.='<br /><span class="LC_warning">'.&mt('Like all files provided by users, this file may contain viruses').'</span><br />'; + foreach my $file (@$files) { + &Apache::lonnet::allowuploaded('/adm/grades',$file); + $lastsubonly.='<br /><a href="'.$file.'?rawmode=1" target="lonGRDs"><img src="'.&Apache::loncommon::icon($file).'" border="0" /> '.$file.'</a>'; + } + } $lastsubonly.='<br />'; } - $lastsubonly.='<b>'.&mt('Submitted Answer:').' </b>'. - &cleanRecord($subval,$responsetype,$symb,$partid, - $respid,\%record,$order,undef,$uname,$udom); + if ($hide) { + $lastsubonly.='<b>'.&mt('Anonymous Survey').'</b>'; + } else { + $lastsubonly.='<b>'.&mt('Submitted Answer:').' </b>'. + &cleanRecord($subval,$responsetype,$symb,$partid, + $respid,\%record,$order,undef,$uname,$udom); + } if ($similar) {$lastsubonly.="<br /><br />$similar\n";} $lastsubonly.='</div>'; } @@ -2299,7 +2342,7 @@ KEYWORDS '<div class="LC_Box">' .'<h3 class="LC_hcell">'.&mt('Assign Grades').'</h3>' ); - $request->print(&gradeBox_start()); # <div class="LC_grade_assign_body"> + $request->print(&gradeBox_start()); foreach my $part_response_id (@part_response_id) { my ($partid,$respid) = @{ $part_response_id }; my $part_resp = join('_',@{ $part_response_id }); @@ -2315,16 +2358,6 @@ KEYWORDS $request->print('</div>'); $request->print('<div class="LC_grade_info_links">'); - if ($perm{'vgr'}) { - $request->print( - &Apache::loncommon::track_student_link(&mt('View recent activity'), - $uname,$udom,'check')); - } - if ($perm{'opa'}) { - $request->print( - &Apache::loncommon::pprmlink(&mt('Set/Change parameters'), - $uname,$udom,$symb,'check')); - } $request->print('</div>'); $result='<input type="hidden" name="partlist'.$counter. @@ -2341,13 +2374,12 @@ KEYWORDS # Done with printing info for one student - $request->print('</div>');#LC_grade_show_user_body $request->print('</div>');#LC_grade_show_user # print end of form if ($counter == $total) { - my $endform='<table border="0"><tr><td>'."\n"; + my $endform='<br /><hr /><table border="0"><tr><td>'."\n"; $endform.='<input type="button" value="'.&mt('Save & Next').'" '. 'onclick="javascript:checksubmit(this.form,\'Save & Next\','. $total.','.scalar(@partlist).');" target="_self" /> '."\n"; @@ -2362,7 +2394,9 @@ KEYWORDS 'onclick="javascript:checksubmit(this.form,\'Previous\');" target="_self" /> '."\n". '<input type="button" value="'.&mt('Next').'" '. 'onclick="javascript:checksubmit(this.form,\'Next\');" target="_self" /> '; - $endform.=&mt('(Next and Previous (student) do not save the scores.)')."\n" ; + $endform.='<span class="LC_warning">'. + &mt('(Next and Previous (student) do not save the scores.)'). + '</span>'."\n" ; $endform.="<input type='hidden' value='".&get_increment(). "' name='increment' />"; $endform.='</td></tr></table></form>'; @@ -2431,7 +2465,7 @@ sub check_collaborators { #--- Retrieve the last submission for all the parts sub get_last_submission { my ($returnhash)=@_; - my (@string,$timestamp); + my (@string,$timestamp,%lasthidden); if ($$returnhash{'version'}) { my %lasthash=(); my ($version); @@ -2443,13 +2477,39 @@ sub get_last_submission { &Apache::lonlocal::locallocaltime($$returnhash{$version.':timestamp'}); } } + my %typeparts; + my $showsurv = + &Apache::lonnet::allowed('vas',$env{'request.course.id'}); + foreach my $key (sort(keys(%lasthash))) { + if ($key =~ /\.type$/) { + if (($lasthash{$key} eq 'anonsurvey') || + ($lasthash{$key} eq 'anonsurveycred')) { + my ($ign,@parts) = split(/\./,$key); + pop(@parts); + unless ($showsurv) { + my $id = join(',',@parts); + $typeparts{$ign.'.'.$id} = $lasthash{$key}; + } + delete($lasthash{$key}); + } + } + } + my @hidden = keys(%typeparts); foreach my $key (keys(%lasthash)) { next if ($key !~ /\.submission$/); - + my $hide; + if (@hidden) { + foreach my $id (@hidden) { + if ($key =~ /^\Q$id\E/) { + $hide = 1; + last; + } + } + } my ($partid,$foo) = split(/submission$/,$key); my $draft = $lasthash{$partid.'awarddetail'} eq 'DRAFT' ? '<span class="LC_warning">Draft Copy</span> ' : ''; - push(@string, join(':', $key, $draft.$lasthash{$key})); + push(@string, join(':', $key, $hide, $draft.$lasthash{$key})); } } if (!@string) { @@ -3538,6 +3598,7 @@ sub editgrades { 'incorrect'=>'incorrect_by_override', 'excused' =>'excused', 'ungraded' =>'ungraded_attempted', + 'credited' =>'credit_attempted', 'nothing' => '', ); my ($classlist,undef,$fullname) = &getclasslist($env{'form.section'},'0'); @@ -4429,7 +4490,9 @@ sub displayPage { my $checkIcon = '<img alt="'.&mt('Check Mark'). '" src="'.&Apache::loncommon::lonhttpdurl($request->dir_config('lonIconsURL').'/check.gif').'" height="16" border="0" />'; - $studentTable.=' '.&mt('<b>Note:</b> Problems graded correct by the computer are marked with a [_1] symbol.',$checkIcon)."\n". + $studentTable.=' <span class="LC_info">'. + &mt('Problems graded correct by the computer are marked with a [_1] symbol.',$checkIcon). + '</span>'."\n". &Apache::loncommon::start_data_table(). &Apache::loncommon::start_data_table_header_row(). '<th align="center"> Prob. </th>'. @@ -4565,16 +4628,20 @@ sub displaySubByDates { my @versionKeys = split(/\:/,$$record{$version.':keys'}); my @displaySub = (); foreach my $partid (@{$parts}) { + my $hidden; + if (($$record{$version.':resource.'.$partid.'.type'} eq 'anonsurvey') || + ($$record{$version.':resource.'.$partid.'.type'} eq 'anonsurveycred')) { + $hidden = 1; + } my @matchKey = ($isTask ? sort(grep /^resource\.\d+\.\Q$partid\E\.award$/,@versionKeys) : sort(grep /^resource\.\Q$partid\E\..*?\.submission$/,@versionKeys)); - # next if ($$record{"$version:resource.$partid.solved"} eq ''); my $display_part=&get_display_part($partid,$symb); foreach my $matchKey (@matchKey) { if (exists($$record{$version.':'.$matchKey}) && $$record{$version.':'.$matchKey} ne '') { - + my ($responseId)= ($isTask ? ($matchKey=~ /^resource\.(.*?)\.\Q$partid\E\.award$/) : ($matchKey=~ /^resource\.\Q$partid\E\.(.*?)\.submission$/)); $displaySub[0].='<span class="LC_nobreak"'; @@ -4583,23 +4650,27 @@ sub displaySubByDates { .'('.&mt('Part ID: [_1]',$responseId).')' .'</span>' .' <b>'; - if ($$record{"$where.$partid.tries"} eq '') { - $displaySub[0].=&mt('Trial not counted'); - } else { - $displaySub[0].=&mt('Trial: [_1]', + if ($hidden) { + $displaySub[0].= &mt('Anonymous Survey').'</b>'; + } else { + if ($$record{"$where.$partid.tries"} eq '') { + $displaySub[0].=&mt('Trial not counted'); + } else { + $displaySub[0].=&mt('Trial: [_1]', $$record{"$where.$partid.tries"}); - } - my $responseType=($isTask ? 'Task' + } + my $responseType=($isTask ? 'Task' : $responseType->{$partid}->{$responseId}); - if (!exists($orders{$partid})) { $orders{$partid}={}; } - if (!exists($orders{$partid}->{$responseId})) { - $orders{$partid}->{$responseId}= - &get_order($partid,$responseId,$symb,$uname,$udom, - $no_increment); - } - $displaySub[0].='</b></span>'; # /nobreak - $displaySub[0].=' '. - &cleanRecord($$record{$version.':'.$matchKey},$responseType,$symb,$partid,$responseId,$record,$orders{$partid}->{$responseId},"$version:",$uname,$udom).'<br />'; + if (!exists($orders{$partid})) { $orders{$partid}={}; } + if (!exists($orders{$partid}->{$responseId})) { + $orders{$partid}->{$responseId}= + &get_order($partid,$responseId,$symb,$uname,$udom, + $no_increment); + } + $displaySub[0].='</b></span>'; # /nobreak + $displaySub[0].=' '. + &cleanRecord($$record{$version.':'.$matchKey},$responseType,$symb,$partid,$responseId,$record,$orders{$partid}->{$responseId},"$version:",$uname,$udom).'<br />'; + } } } if (exists($$record{"$where.$partid.checkedin"})) { @@ -7452,6 +7523,7 @@ sub scantron_get_maxbubble { if (ref($nav_error)) { $$nav_error = 1; } + return; } my $map=$navmap->getResourceByUrl($sequence); my @resources=$navmap->retrieveResources($map,\&scantron_filter,1,0); @@ -9296,7 +9368,7 @@ ENDHEADER sub navmap_errormsg { return '<div class="LC_error">'. &mt('An error occurred retrieving information about resources in the course.').'<br />'. - &mt('It is recommended that you [_1]re-initialize the course[_2] and then return to this grading page..','<a href="/adm/roles?selectrole=1&newrole='.$env{'request.role'}.'">','</a>'). + &mt('It is recommended that you [_1]re-initialize the course[_2] and then return to this grading page.','<a href="/adm/roles?selectrole=1&newrole='.$env{'request.role'}.'">','</a>'). '</div>'; }