--- loncom/homework/grades.pm 2010/04/27 13:18:04 1.633
+++ loncom/homework/grades.pm 2011/03/31 17:58:25 1.646
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# The LON-CAPA Grading handler
#
-# $Id: grades.pm,v 1.633 2010/04/27 13:18:04 www Exp $
+# $Id: grades.pm,v 1.646 2011/03/31 17:58:25 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -40,10 +40,11 @@ use Apache::lonhomework;
use Apache::lonpickcode;
use Apache::loncoursedata;
use Apache::lonmsg();
-use Apache::Constants qw(:common);
+use Apache::Constants qw(:common :http);
use Apache::lonlocal;
use Apache::lonenc;
use Apache::lonstathelpers;
+use Apache::lonquickgrades;
use String::Similarity;
use LONCAPA;
@@ -212,8 +213,13 @@ sub reset_caches {
}
sub get_analyze {
- my ($symb,$uname,$udom,$no_increment,$add_to_hash)=@_;
+ my ($symb,$uname,$udom,$no_increment,$add_to_hash,$type,$trial,$rndseed)=@_;
my $key = "$symb\0$uname\0$udom";
+ if ($type eq 'randomizetry') {
+ if ($trial ne '') {
+ $key .= "\0".$trial;
+ }
+ }
if (exists($analyze_cache{$key})) {
my $getupdate = 0;
if (ref($add_to_hash) eq 'HASH') {
@@ -241,9 +247,15 @@ sub reset_caches {
'grade_courseid' => $env{'request.course.id'},
'grade_username' => $uname,
'grade_noincrement' => $no_increment);
+ if ($type eq 'randomizetry') {
+ $form{'grade_questiontype'} = $type;
+ if ($rndseed ne '') {
+ $form{'grade_rndseed'} = $rndseed;
+ }
+ }
if (ref($add_to_hash)) {
%form = (%form,%{$add_to_hash});
- }
+ }
my $subresult=&ssi_with_retries($url, $ssi_retries,%form);
(undef,$subresult)=split(/_HASH_REF__/,$subresult,2);
my %analyze=&Apache::lonnet::str2hash($subresult);
@@ -256,15 +268,15 @@ sub reset_caches {
}
sub get_order {
- my ($partid,$respid,$symb,$uname,$udom,$no_increment)=@_;
- my $analyze = &get_analyze($symb,$uname,$udom,$no_increment);
+ my ($partid,$respid,$symb,$uname,$udom,$no_increment,$type,$trial,$rndseed)=@_;
+ my $analyze = &get_analyze($symb,$uname,$udom,$no_increment,undef,$type,$trial,$rndseed);
return $analyze->{"$partid.$respid.shown"};
}
sub get_radiobutton_correct_foil {
- my ($partid,$respid,$symb,$uname,$udom)=@_;
- my $analyze = &get_analyze($symb,$uname,$udom);
- my $foils = &get_order($partid,$respid,$symb,$uname,$udom);
+ my ($partid,$respid,$symb,$uname,$udom,$type,$trial,$rndseed)=@_;
+ my $analyze = &get_analyze($symb,$uname,$udom,undef,undef,$type,$trial,$rndseed);
+ my $foils = &get_order($partid,$respid,$symb,$uname,$udom,undef,$type,$trial,$rndseed);
if (ref($foils) eq 'ARRAY') {
foreach my $foil (@{$foils}) {
if ($analyze->{"$partid.$respid.foil.value.$foil"} eq 'true') {
@@ -306,7 +318,7 @@ sub reset_caches {
# response types only.
sub cleanRecord {
my ($answer,$response,$symb,$partid,$respid,$record,$order,$version,
- $uname,$udom) = @_;
+ $uname,$udom,$type,$trial,$rndseed) = @_;
my $grayFont = '';
if ($response =~ /^(option|rank)$/) {
my %answer=&Apache::lonnet::str2hash($answer);
@@ -350,7 +362,7 @@ sub cleanRecord {
my %answer=&Apache::lonnet::str2hash($answer);
my ($toprow,$bottomrow);
my $correct =
- &get_radiobutton_correct_foil($partid,$respid,$symb,$uname,$udom);
+ &get_radiobutton_correct_foil($partid,$respid,$symb,$uname,$udom,$type,$trial,$rndseed);
foreach my $foil (@$order) {
if (exists($answer{$foil})) {
if ($foil eq $correct) {
@@ -2132,6 +2144,12 @@ KEYWORDS
my ($ressub,$hide,$subval) = split(/:/,$submission,3);
# Similarity check
my $similar='';
+ my ($type,$trial,$rndseed);
+ if ($hide eq 'rand') {
+ $type = 'randomizetry';
+ $trial = $record{"resource.$partid.tries"};
+ $rndseed = $record{"resource.$partid.rndseed"};
+ }
if($env{'form.checkPlag'}){
my ($oname,$odom,$ocrsid,$oessay,$osim)=
&most_similar($uname,$udom,$subval,\%old_essays);
@@ -2141,7 +2159,7 @@ KEYWORDS
&Apache::lonnet::coursedescription($ocrsid,
{'one_time' => 1});
- if ($hide) {
+ if ($hide eq 'anon') {
$similar='
'.&mt("Essay was found to be similar to another essay submitted for this assignment.").'
'.
&mt('As the current submission is for an anonymous survey, no other details are available.').'
';
} else {
@@ -2158,7 +2176,8 @@ KEYWORDS
}
}
}
- my $order=&get_order($partid,$respid,$symb,$uname,$udom);
+ my $order=&get_order($partid,$respid,$symb,$uname,$udom,
+ undef,$type,$trial,$rndseed);
if ($env{'form.lastSub'} eq 'lastonly' ||
($env{'form.lastSub'} eq 'hdgrade' &&
$$handgrade{$$part[0].'_'.$$part[1]} eq 'yes')) {
@@ -2170,7 +2189,7 @@ KEYWORDS
' ';
my $files=&get_submitted_files($udom,$uname,$partid,$respid,\%record);
if (@$files) {
- if ($hide) {
+ if ($hide eq 'anon') {
$lastsubonly.='
'.&mt('[quant,_1,file] uploaded to this anonymous survey',scalar(@{$files}));
} else {
$lastsubonly.='
'.&mt('Like all files provided by users, this file may contain viruses').'
';
@@ -2181,12 +2200,12 @@ KEYWORDS
}
$lastsubonly.='
';
}
- if ($hide) {
+ if ($hide eq 'anon') {
$lastsubonly.=''.&mt('Anonymous Survey').'';
} else {
$lastsubonly.=''.&mt('Submitted Answer:').' '.
&cleanRecord($subval,$responsetype,$symb,$partid,
- $respid,\%record,$order,undef,$uname,$udom);
+ $respid,\%record,$order,undef,$uname,$udom,$type,$trial,$rndseed);
}
if ($similar) {$lastsubonly.="
$similar\n";}
$lastsubonly.='';
@@ -2385,35 +2404,51 @@ sub get_last_submission {
&Apache::lonlocal::locallocaltime($$returnhash{$version.':timestamp'});
}
}
- my %typeparts;
+ my (%typeparts,%randombytry);
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')) {
+ ($lasthash{$key} eq 'anonsurveycred') ||
+ ($lasthash{$key} eq 'randomizetry')) {
my ($ign,@parts) = split(/\./,$key);
pop(@parts);
- unless ($showsurv) {
- my $id = join(',',@parts);
- $typeparts{$ign.'.'.$id} = $lasthash{$key};
+ my $id = join('.',@parts);
+ if ($lasthash{$key} eq 'randomizetry') {
+ $randombytry{$ign.'.'.$id} = $lasthash{$key};
+ } else {
+ unless ($showsurv) {
+ $typeparts{$ign.'.'.$id} = $lasthash{$key};
+ }
}
delete($lasthash{$key});
}
}
}
my @hidden = keys(%typeparts);
+ my @randomize = keys(%randombytry);
foreach my $key (keys(%lasthash)) {
next if ($key !~ /\.submission$/);
my $hide;
if (@hidden) {
foreach my $id (@hidden) {
if ($key =~ /^\Q$id\E/) {
- $hide = 1;
+ $hide = 'anon';
last;
}
}
}
+ unless ($hide) {
+ if (@randomize) {
+ foreach my $id (@hidden) {
+ if ($key =~ /^\Q$id\E/) {
+ $hide = 'rand';
+ last;
+ }
+ }
+ }
+ }
my ($partid,$foo) = split(/submission$/,$key);
my $draft = $lasthash{$partid.'awarddetail'} eq 'DRAFT' ?
'Draft Copy ' : '';
@@ -4057,6 +4092,9 @@ sub csvuploadassign {
my $pcr=$entries{$fields{$dest}} / $wgt;
my $award=($pcr == 0) ? 'incorrect_by_override'
: 'correct_by_override';
+ if ($pcr>1) {
+ push(@skipped,&mt("[_1]: point value larger than weight","$username:$domain"));
+ }
$grades{"resource.$part.awarded"}=$pcr;
$grades{"resource.$part.solved"}=$award;
$points{$part}=1;
@@ -4362,8 +4400,8 @@ sub displayPage {
&Apache::loncommon::start_data_table_row().
'
".&mt('You have forgetten to specify some information. Please go Back and try again.')."
"); + $r->print("".&mt('You have forgotten to specify some information. Please go Back and try again.')."
"); if ( $env{'form.selectpage'} eq '') { $r->print(''.&mt('You have not selected a Sequence to grade').'
'); } if ( $env{'form.scantron_selectfile'} eq '') { - $r->print(''.&mt('You have not selected a file that contains the student\'s response data.').'
'); + $r->print(''.&mt("You have not selected a file that contains the student's response data.").'
'); } if ( $env{'form.scantron_format'} eq '') { - $r->print(''.&mt('You have not selected a the format of the student\'s response data.').'
'); + $r->print(''.&mt("You have not selected the format of the student's response data.").'
'); } } else { my $warning=&scantron_warning_screen('Grading: Validate Records'); @@ -8380,32 +8430,32 @@ sub grading_menu { { linktext => 'Select individual students to grade', url => $url1a, permission => 'F', - icon => 'edit-find-replace.png', + icon => 'grade_students.png', linktitle => 'Grade current resource for a selection of students.' }, { linktext => 'Grade ungraded submissions.', url => $url1b, permission => 'F', - icon => 'edit-find-replace.png', + icon => 'ungrade_sub.png', linktitle => 'Grade all submissions that have not been graded yet.' }, { linktext => 'Grading table', url => $url1c, permission => 'F', - icon => 'edit-find-replace.png', + icon => 'grading_table.png', linktitle => 'Grade current resource for all students.' }, { linktext => 'Grade page/folder for one student', url => $url1d, permission => 'F', - icon => 'edit-find-replace.png', + icon => 'grade_PageFolder.png', linktitle => 'Grade all resources in current page/sequence/folder for one student.' }, { linktext => 'Download submissions', url => $url1e, permission => 'F', - icon => 'edit-find-replace.png', + icon => 'download_sub.png', linktitle => 'Download all students submissions.' }]}, { categorytitle=>'Automated Grading', @@ -8426,13 +8476,13 @@ sub grading_menu { { linktext => 'Grade/Manage/Review Bubblesheets', url => $url4, permission => 'F', - icon => 'stat.png', + icon => 'bubblesheet.png', linktitle => 'Grade scantron exams, upload/download scantron data files, and review previously graded scantron exams.' }, { linktext => 'Verify Receipt Number', url => $url5, permission => 'F', - icon => 'edit-find-replace.png', + icon => 'receipt_number.png', linktitle => 'Verify a system-generated receipt number for correct problem solution.' } @@ -8537,6 +8587,14 @@ sub submit_options { sub selectfield { my ($full)=@_; + my %options = + (&Apache::lonlocal::texthash( + 'yes' => 'with submissions', + 'queued' => 'in grading queue', + 'graded' => 'with ungraded submissions', + 'incorrect' => 'with incorrect submissions', + 'all' => 'with any status'), + 'select_form_order' => ['yes','queued','graded','incorrect','all']); my $result='