'
@@ -2743,6 +2595,8 @@ sub submission {
my $part_resp = join('_',@{ $part_response_id });
next if ($seen{$partid} > 0);
$seen{$partid}++;
+ next if ($$handgrade{$part_resp} ne 'yes'
+ && $env{'form.lastSub'} eq 'hdgrade');
push(@partlist,$partid);
push(@gradePartRespid,$partid.'.'.$respid);
$request->print(&gradeBox($request,$symb,$uname,$udom,$counter,$partid,\%record));
@@ -2856,7 +2710,7 @@ sub check_collaborators {
#--- Retrieve the last submission for all the parts
sub get_last_submission {
- my ($returnhash)=@_;
+ my ($returnhash,$is_tool)=@_;
my (@string,$timestamp,%lasthidden);
if ($$returnhash{'version'}) {
my %lasthash=();
@@ -2922,8 +2776,14 @@ sub get_last_submission {
}
}
if (!@string) {
+ my $msg;
+ if ($is_tool) {
+ $msg = &mt('No grade passed back.');
+ } else {
+ $msg = &mt('Nothing submitted - no attempts.');
+ }
$string[0] =
- '
';
}
return (\@string,\$timestamp);
}
@@ -2955,11 +2815,12 @@ sub show_previous_task_version {
my ($uname,$udom) = ($env{'form.student'},$env{'form.userdom'});
my $usec = &Apache::lonnet::getsection($udom,$uname,$env{'request.course.id'});
if (!&canview($usec)) {
- $request->print('
');
return;
}
my $mode = 'both';
@@ -3131,37 +2992,19 @@ sub processHandGrade {
my $ntstu = $env{'form.NTSTU'};
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
- my ($res_error,%queueable);
- my ($partlist,$handgrade,$responseType,$numresp,$numessay) = &response_type($symb,\$res_error);
- if ($res_error) {
- $request->print(&navmap_errormsg());
- return;
- } else {
- foreach my $part (@{$partlist}) {
- if (ref($responseType->{$part}) eq 'HASH') {
- foreach my $id (keys(%{$responseType->{$part}})) {
- if (($responseType->{$part}->{$id} eq 'essay') ||
- (lc($handgrade->{$part.'_'.$id}) eq 'yes')) {
- $queueable{$part} = 1;
- last;
- }
- }
- }
- }
- }
if ($button eq 'Save & Next') {
my $ctr = 0;
while ($ctr < $ngrade) {
my ($uname,$udom) = split(/:/,$env{'form.unamedom'.$ctr});
my ($errorflag,$pts,$wgt,$numhidden) =
- &saveHandGrade($request,$symb,$uname,$udom,$ctr,undef,undef,\%queueable);
+ &saveHandGrade($request,$symb,$uname,$udom,$ctr);
if ($errorflag eq 'no_score') {
$ctr++;
next;
}
if ($errorflag eq 'not_allowed') {
- $request->print(
+ $request->print(
'
');
@@ -3210,7 +3053,7 @@ sub processHandGrade {
foreach my $collaborator (@collaborators) {
my ($errorflag,$pts,$wgt) =
&saveHandGrade($request,$symb,$collaborator,$udom,$ctr,
- $env{'form.unamedom'.$ctr},$part,\%queueable);
+ $env{'form.unamedom'.$ctr},$part);
if ($errorflag eq 'not_allowed') {
$request->print("
");
next;
@@ -3232,12 +3075,13 @@ sub processHandGrade {
}
}
- my %keyhash = ();
- if ($numessay) {
+# if ($env{'form.handgrade'} eq 'yes') {
+ if (1) {
# Keywords sorted in alphabatical order
my $loginuser = $env{'user.name'}.':'.$env{'user.domain'};
+ my %keyhash = ();
$env{'form.keywords'} =~ s/,\s{0,}|\s+/ /g;
- $env{'form.keywords'} =~ s/^\s+|\s+$//g;
+ $env{'form.keywords'} =~ s/^\s+|\s+$//;
my (@keywords) = sort(split(/\s+/,$env{'form.keywords'}));
$env{'form.keywords'} = join(' ',@keywords);
$keyhash{$symb.'_keywords'} = $env{'form.keywords'};
@@ -3245,9 +3089,7 @@ sub processHandGrade {
$keyhash{$loginuser.'_kwclr'} = $env{'form.kwclr'};
$keyhash{$loginuser.'_kwsize'} = $env{'form.kwsize'};
$keyhash{$loginuser.'_kwstyle'} = $env{'form.kwstyle'};
- }
- if ($env{'form.compmsg'}) {
# message center - Order of message gets changed. Blank line is eliminated.
# New messages are saved in env for the next student.
# All messages are saved in nohist_handgrade.db
@@ -3270,12 +3112,9 @@ sub processHandGrade {
}
$env{'form.savemsgN'} = --$idx;
$keyhash{$symb.'_savemsgN'} = $env{'form.savemsgN'};
- }
- if (($numessay) || ($env{'form.compmsg'})) {
my $putresult = &Apache::lonnet::put
('nohist_handgrade',\%keyhash,$cdom,$cnum);
}
-
# Called by Save & Refresh from Highlight Attribute Window
my (undef,undef,$fullname) = &getclasslist($env{'form.section'},'1');
if ($env{'form.refresh'} eq 'on') {
@@ -3315,6 +3154,7 @@ sub processHandGrade {
}
return $a cmp $b;
} (keys(%$fullname))) {
+# FIXME: this is fishy, looks like the button label
if ($nextflg == 1 && $button =~ /Next$/) {
push(@parsedlist,$item);
}
@@ -3325,7 +3165,14 @@ sub processHandGrade {
}
}
$ctr = 0;
+# FIXME: this is fishy, looks like the button label
@parsedlist = reverse @parsedlist if ($button eq 'Previous');
+ my $res_error;
+ my ($partlist) = &response_type($symb,\$res_error);
+ if ($res_error) {
+ $request->print(&navmap_errormsg());
+ return;
+ }
foreach my $student (@parsedlist) {
my $submitonly=$env{'form.submitonly'};
my ($uname,$udom) = split(/:/,$student);
@@ -3375,7 +3222,7 @@ sub processHandGrade {
$ctr++;
}
if ($total < 0) {
- my $the_end.='
'."\n";
$request->print($the_end);
}
return '';
@@ -3383,7 +3230,7 @@ sub processHandGrade {
#---- Save the score and award for each student, if changed
sub saveHandGrade {
- my ($request,$symb,$stuname,$domain,$newflg,$submitter,$part,$queueable) = @_;
+ my ($request,$symb,$stuname,$domain,$newflg,$submitter,$part) = @_;
my @version_parts;
my $usec = &Apache::lonnet::getsection($domain,$stuname,
$env{'request.course.id'});
@@ -3495,7 +3342,7 @@ sub saveHandGrade {
&Apache::lonnet::cstore(\%newrecord,$symb,
$env{'request.course.id'},$domain,$stuname);
&check_and_remove_from_queue(\@parts,\%record,\%newrecord,$symb,
- $cdom,$cnum,$domain,$stuname,$queueable);
+ $cdom,$cnum,$domain,$stuname);
}
if ($aggregateflag) {
&Apache::lonnet::cinc('nohist_resourcetracker',\%aggregate,
@@ -3535,7 +3382,7 @@ sub makehidden {
}
sub check_and_remove_from_queue {
- my ($parts,$record,$newrecord,$symb,$cdom,$cnum,$domain,$stuname,$queueable) = @_;
+ my ($parts,$record,$newrecord,$symb,$cdom,$cnum,$domain,$stuname) = @_;
my @ungraded_parts;
foreach my $part (@{$parts}) {
if ( $record->{ 'resource.'.$part.'.awarded'} eq ''
@@ -3543,9 +3390,7 @@ sub check_and_remove_from_queue {
&& $newrecord->{'resource.'.$part.'.awarded'} eq ''
&& $newrecord->{'resource.'.$part.'.solved' } ne 'excused'
) {
- if ($queueable->{$part}) {
- push(@ungraded_parts, $part);
- }
+ push(@ungraded_parts, $part);
}
}
if ( !@ungraded_parts ) {
@@ -3571,19 +3416,19 @@ sub handback_files {
my $part_resp = join('_',@{ $part_response_id });
if (($env{'form.'.$newflg.'_'.$part_resp.'_countreturndoc'} =~ /^\d+$/) & ($new_part eq $part_id)) {
for (my $counter=1; $counter<=$env{'form.'.$newflg.'_'.$part_resp.'_countreturndoc'}; $counter++) {
- # if multiple files are uploaded names will be 'returndoc2','returndoc3'
- if ($env{'form.'.$newflg.'_'.$part_resp.'_returndoc'.$counter}) {
+ # if multiple files are uploaded names will be 'returndoc2','returndoc3'
+ if ($env{'form.'.$newflg.'_'.$part_resp.'_returndoc'.$counter}) {
my $fname=$env{'form.'.$newflg.'_'.$part_resp.'_returndoc'.$counter.'.filename'};
my ($directory,$answer_file) =
($env{'form.'.$newflg.'_'.$part_resp.'_origdoc'.$counter} =~ /^(.*?)([^\/]*)$/);
my ($answer_name,$answer_ver,$answer_ext) =
- &file_name_version_ext($answer_file);
+ &Apache::lonnet::file_name_version_ext($answer_file);
my ($portfolio_path) = ($directory =~ /^.+$stuname\/portfolio(.*)/);
my $getpropath = 1;
- my ($dir_list,$listerror) =
+ my ($dir_list,$listerror) =
&Apache::lonnet::dirlist($portfolio_root.$portfolio_path,
$domain,$stuname,$getpropath);
- my $version = &get_next_version($answer_name,$answer_ext,$dir_list);
+ my $version = &Apache::lonnet::get_next_version($answer_name,$answer_ext,$dir_list);
# fix filename
my ($save_file_name) = (($directory.$answer_name.".$version.".$answer_ext) =~ /^.+\/${stuname}\/(.*)/);
my $result=&Apache::lonnet::finishuserfileupload($stuname,$domain,
@@ -3601,8 +3446,7 @@ sub handback_files {
$$newrecord{"resource.$new_part.$resp_id.handback"}.=',';
}
$$newrecord{"resource.$new_part.$resp_id.handback"} .= $save_file_name;
- $file_msg.='
'));
}
@@ -3613,7 +3457,7 @@ sub handback_files {
$request->print('
');
my @what = ($symb,$env{'request.course.id'},'handback');
&Apache::lonnet::mark_as_readonly($domain,$stuname,\@handedback,\@what);
- my $user_lh = &Apache::loncommon::user_lang($stuname,$domain,$env{'request.course.id'});
+ my $user_lh = &Apache::loncommon::user_lang($stuname,$domain,$env{'request.course.id'});
my ($subject,$message);
if (scalar(@handedback) == 1) {
$subject = &mt_user($user_lh,'File Handed Back by Instructor');
@@ -3733,29 +3577,14 @@ sub version_portfiles {
my $version_parts = join('|',@$v_flag);
my @returned_keys;
my $parts = join('|', @$parts_graded);
- my $portfolio_root = '/userfiles/portfolio';
foreach my $key (keys(%$record)) {
my $new_portfiles;
if ($key =~ /^resource\.($version_parts)\./ && $key =~ /\.portfiles$/ ) {
my @versioned_portfiles;
my @portfiles = split(/\s*,\s*/,$$record{$key});
- foreach my $file (@portfiles) {
- &Apache::lonnet::unmark_as_readonly($domain,$stu_name,[$symb,$env{'request.course.id'}],$file);
- my ($directory,$answer_file) =($file =~ /^(.*?)([^\/]*)$/);
- my ($answer_name,$answer_ver,$answer_ext) =
- &file_name_version_ext($answer_file);
- my $getpropath = 1;
- my ($dir_list,$listerror) =
- &Apache::lonnet::dirlist($portfolio_root.$directory,$domain,
- $stu_name,$getpropath);
- my $version = &get_next_version($answer_name,$answer_ext,$dir_list);
- my $new_answer = &version_selected_portfile($domain, $stu_name, $directory, $answer_file, $version);
- if ($new_answer ne 'problem getting file') {
- push(@versioned_portfiles, $directory.$new_answer);
- &Apache::lonnet::mark_as_readonly($domain,$stu_name,
- [$directory.$new_answer],
- [$symb,$env{'request.course.id'},'graded']);
- }
+ if (@portfiles) {
+ &Apache::lonnet::portfiles_versioning($symb,$domain,$stu_name,\@portfiles,
+ \@versioned_portfiles);
}
$$record{$key} = join(',',@versioned_portfiles);
push(@returned_keys,$key);
@@ -3764,64 +3593,6 @@ sub version_portfiles {
return (@returned_keys);
}
-sub get_next_version {
- my ($answer_name, $answer_ext, $dir_list) = @_;
- my $version;
- if (ref($dir_list) eq 'ARRAY') {
- foreach my $row (@{$dir_list}) {
- my ($file) = split(/\&/,$row,2);
- my ($file_name,$file_version,$file_ext) =
- &file_name_version_ext($file);
- if (($file_name eq $answer_name) &&
- ($file_ext eq $answer_ext)) {
- # gets here if filename and extension match,
- # regardless of version
- if ($file_version ne '') {
- # a versioned file is found so save it for later
- if ($file_version > $version) {
- $version = $file_version;
- }
- }
- }
- }
- }
- $version ++;
- return($version);
-}
-
-sub version_selected_portfile {
- my ($domain,$stu_name,$directory,$file_name,$version) = @_;
- my ($answer_name,$answer_ver,$answer_ext) =
- &file_name_version_ext($file_name);
- my $new_answer;
- $env{'form.copy'} = &Apache::lonnet::getfile("/uploaded/$domain/$stu_name/portfolio$directory$file_name");
- if($env{'form.copy'} eq '-1') {
- $new_answer = 'problem getting file';
- } else {
- $new_answer = $answer_name.'.'.$version.'.'.$answer_ext;
- my $copy_result = &Apache::lonnet::finishuserfileupload(
- $stu_name,$domain,'copy',
- '/portfolio'.$directory.$new_answer);
- }
- return ($new_answer);
-}
-
-sub file_name_version_ext {
- my ($file)=@_;
- my @file_parts = split(/\./, $file);
- my ($name,$version,$ext);
- if (@file_parts > 1) {
- $ext=pop(@file_parts);
- if (@file_parts > 1 && $file_parts[-1] =~ /^\d+$/) {
- $version=pop(@file_parts);
- }
- $name=join('.',@file_parts);
- } else {
- $name=join('.',@file_parts);
- }
- return($name,$version,$ext);
-}
-
#--------------------------------------------------------------------------------------
#
#-------------------------- Next few routines handles grading by section or whole class
@@ -3999,6 +3770,11 @@ VIEWJAVASCRIPT
#--- show scores for a section or whole class w/ option to change/update a score
sub viewgrades {
my ($request,$symb) = @_;
+ my ($is_tool,$toolsymb);
+ if ($symb =~ /ext\.tool$/) {
+ $is_tool = 1;
+ $toolsymb = $symb;
+ }
&viewgrades_js($request);
#need to make sure we have the correct data for later EXT calls,
@@ -4033,26 +3809,7 @@ sub viewgrades {
}
my ($common_header,$specific_header,@sections,$section_display);
- if ($env{'request.course.sec'} ne '') {
- @sections = ($env{'request.course.sec'});
- } else {
- @sections = &Apache::loncommon::get_env_multiple('form.section');
- }
-
-# Check if Save button should be usable
- my $disabled = ' disabled="disabled"';
- if ($perm{'mgr'}) {
- if (grep(/^all$/,@sections)) {
- undef($disabled);
- } else {
- foreach my $sec (@sections) {
- if (&canmodify($sec)) {
- undef($disabled);
- last;
- }
- }
- }
- }
+ @sections = &Apache::loncommon::get_env_multiple('form.section');
if (grep(/^all$/,@sections)) {
@sections = ('all');
if ($group_display) {
@@ -4062,7 +3819,7 @@ sub viewgrades {
$common_header = &mt('Assign Common Grade to Students not assigned to any groups');
$specific_header = &mt('Assign Grade to Specific Students not assigned to any groups');
} else {
- $common_header = &mt('Assign Common Grade to Class');
+ $common_header = &mt('Assign Common Grade to Class');
$specific_header = &mt('Assign Grade to Specific Students in Class');
}
} elsif (grep(/^none$/,@sections)) {
@@ -4075,7 +3832,7 @@ sub viewgrades {
$specific_header = &mt('Assign Grade to Specific Students in no Section and in no Group');
} else {
$common_header = &mt('Assign Common Grade to Students in no Section');
- $specific_header = &mt('Assign Grade to Specific Students in no Section');
+ $specific_header = &mt('Assign Grade to Specific Students in no Section');
}
} else {
$section_display = join (", ",@sections);
@@ -4089,7 +3846,7 @@ sub viewgrades {
$specific_header = &mt('Assign Grade to Specific Students in Section(s) [_1] and no Group',$section_display);
} else {
$common_header = &mt('Assign Common Grade to Students in Section(s) [_1]',$section_display);
- $specific_header = &mt('Assign Grade to Specific Students in Section(s) [_1]',$section_display);
+ $specific_header = &mt('Assign Grade to Specific Students in Section(s) [_1]',$section_display);
}
}
my %submit_types = &substatus_options();
@@ -4098,7 +3855,13 @@ sub viewgrades {
if ($env{'form.submitonly'} eq 'all') {
$result.= '
';
+ my $text;
+ if ($is_tool) {
+ $text = &mt('(transaction status: "[_1]")',$submission_status);
+ } else {
+ $text = &mt('(submission status: "[_1]")',$submission_status);
+ }
+ $result.= '
';
}
$result .= &Apache::loncommon::start_data_table();
#radio buttons/text box for assigning points for a section or class.
@@ -4111,12 +3874,18 @@ sub viewgrades {
my %weight = ();
my $ctsparts = 0;
my %seen = ();
- my @part_response_id = &flatten_responseType($responseType);
+ my @part_response_id;
+ if ($is_tool) {
+ @part_response_id = ([0,'']);
+ } else {
+ @part_response_id = &flatten_responseType($responseType);
+ }
foreach my $part_response_id (@part_response_id) {
my ($partid,$respid) = @{ $part_response_id };
my $part_resp = join('_',@{ $part_response_id });
next if $seen{$partid};
$seen{$partid}++;
+# my $handgrade=$$handgrade{$part_resp};
my $wgt = &Apache::lonnet::EXT('resource.'.$partid.'.weight',$symb);
$weight{$partid} = $wgt eq '' ? '1' : $wgt;
@@ -4135,10 +3904,10 @@ sub viewgrades {
$partid.'" size="4" '.'onchange="javascript:writePoint(\''.
$partid.'\','.$weight{$partid}.',\'textval\')" /> /'.
$weight{$partid}.' '.&mt('(problem weight)').''."\n";
- $line.= '
'.
&Apache::loncommon::end_data_table_row().
&Apache::loncommon::end_data_table();
return $result;
@@ -4880,20 +4642,19 @@ ENDUPFORM
sub csvuploadmap {
- my ($request,$symb) = @_;
+ my ($request,$symb)= @_;
if (!$symb) {return '';}
my $datatoken;
if (!$env{'form.datatoken'}) {
$datatoken=&Apache::loncommon::upfile_store($request);
} else {
- $datatoken=&Apache::loncommon::valid_datatoken($env{'form.datatoken'});
- if ($datatoken ne '') {
+ $datatoken=&Apache::loncommon::valid_datatoken($env{'form.datatoken'});
+ if ($datatoken ne '') {
&Apache::loncommon::load_tmp_file($request,$datatoken);
}
}
my @records=&Apache::loncommon::upfile_record_sep();
- if ($env{'form.noFirstLine'}) { shift(@records); }
&csvuploadmap_header($request,$symb,$datatoken,$#records+1);
my ($i,$keyfields);
if (@records) {
@@ -4930,8 +4691,6 @@ sub csvuploadmap {
sub csvuploadoptions {
my ($request,$symb)= @_;
my $overwrite=&mt('Overwrite any existing score');
- my $checked=(($env{'form.noFirstLine'})?'1':'0');
- my $ignore=&mt('Ignore First Line');
$request->print(<
@@ -4945,7 +4704,7 @@ ENDPICK
my %fields=&get_fields();
if (!defined($fields{'domain'})) {
my $domform = &Apache::loncommon::select_dom_form($env{'request.role.domain'},'default_domain');
- $request->print("\n".&mt('Users are in domain: [_1]',$domform)."
\n");
+ $request->print("\n".&mt('Users are in domain: [_1]',$domform)."
\n");
}
foreach my $key (sort(keys(%env))) {
if ($key !~ /^form\.(.*)$/) { next; }
@@ -4979,15 +4738,14 @@ sub get_fields {
}
sub csvuploadassign {
- my ($request,$symb) = @_;
+ my ($request,$symb)= @_;
if (!$symb) {return '';}
my $error_msg = '';
my $datatoken = &Apache::loncommon::valid_datatoken($env{'form.datatoken'});
- if ($datatoken ne '') {
+ if ($datatoken ne '') {
&Apache::loncommon::load_tmp_file($request,$datatoken);
}
my @gradedata = &Apache::loncommon::upfile_record_sep();
- if ($env{'form.noFirstLine'}) { shift(@gradedata); }
my %fields=&get_fields();
my $courseid=$env{'request.course.id'};
my ($classlist) = &getclasslist('all',0);
@@ -5009,13 +4767,45 @@ sub csvuploadassign {
if (!$username) {
my $id=$entries{$fields{'ID'}};
$id=~s/\s//g;
- my %ids=&Apache::lonnet::idget($domain,$id);
- $username=$ids{$id};
+ if ($id ne '') {
+ my %ids=&Apache::lonnet::idget($domain,[$id]);
+ $username=$ids{$id};
+ } else {
+ if ($entries{$fields{'clicker'}}) {
+ my $clicker = $entries{$fields{'clicker'}};
+ $clicker=~s/\s//g;
+ if ($clicker ne '') {
+ my %clickers = &Apache::lonnet::idget($domain,[$clicker],'clickers');
+ if ($clickers{$clicker} ne '') {
+ my $match = 0;
+ my @inclass;
+ foreach my $poss (split(/,/,$clickers{$clicker})) {
+ if (exists($$classlist{"$poss:$domain"})) {
+ $username = $poss;
+ push(@inclass,$poss);
+ $match ++;
+
+ }
+ }
+ if ($match > 1) {
+ undef($username);
+ $request->print(''.
+ &mt('Score not saved for clicker: [_1] (matched multiple usernames: [_2])',
+ $clicker,join(', ',@inclass)).'
');
+ }
+ }
+ }
+ }
+ }
}
if (!exists($$classlist{"$username:$domain"})) {
my $id=$entries{$fields{'ID'}};
$id=~s/\s//g;
- if ($id) {
+ my $clicker = $entries{$fields{'clicker'}};
+ $clicker=~s/\s//g;
+ if ($clicker) {
+ push(@skipped,"$clicker:$domain");
+ } elsif ($id) {
push(@skipped,"$id:$domain");
} else {
push(@skipped,"$username:$domain");
@@ -5043,7 +4833,7 @@ sub csvuploadassign {
my $award=($pcr == 0) ? 'incorrect_by_override'
: 'correct_by_override';
if ($pcr>1) {
- push(@warnings,&mt("[_1]: point value larger than weight","$username:$domain"));
+ push(@warnings,&mt("[_1]: point value larger than weight","$username:$domain"));
}
$grades{"resource.$part.awarded"}=$pcr;
$grades{"resource.$part.solved"}=$award;
@@ -5064,7 +4854,7 @@ sub csvuploadassign {
$grades{$store_key}=$entries{$fields{$dest}};
}
}
- if (! %grades) {
+ if (! %grades) {
push(@skipped,&mt("[_1]: no data to save","$username:$domain"));
} else {
$grades{"resource.regrader"}="$env{'user.name'}:$env{'user.domain'}";
@@ -5079,13 +4869,13 @@ sub csvuploadassign {
$env{'course.'.$env{'request.course.id'}.'.domain'},
$env{'course.'.$env{'request.course.id'}.'.num'},
$domain,$username);
- } else {
+ $countdone++;
+ } else {
$request->print("".
&mt("Failed to save data for student [_1]. Message when trying to save was: [_2]",
"$username:$domain",$result)."
");
}
$request->rflush();
- $countdone++;
}
}
$request->print('
'.&Apache::lonhtmlcommon::confirm_success(&mt("Saved scores for [quant,_1,student]",$countdone),$countdone==0));
@@ -5154,30 +4944,30 @@ LISTJAVASCRIPT
# Collection of hidden fields
my $ctr=0;
foreach (@$titles) {
- my ($minder,$showtitle) = ($_ =~ /(\d+)\.(.*)/);
- $result.=''."\n";
- $result.=''."\n";
- $ctr++;
+ my ($minder,$showtitle) = ($_ =~ /(\d+)\.(.*)/);
+ $result.=''."\n";
+ $result.=''."\n";
+ $ctr++;
}
$result.=''."\n".
- ''."\n";
+ ''."\n";
$result.=&build_section_inputs();
my $stu_status = join(':',&Apache::loncommon::get_env_multiple('form.Status'));
$result.=''."\n".
- ''."\n".
- ''."\n";
+ ''."\n".
+ ''."\n";
# Show grading options
$result.=&Apache::lonhtmlcommon::start_pick_box();
my $select = '';
@@ -5203,7 +4993,7 @@ LISTJAVASCRIPT
.''
.&Apache::lonhtmlcommon::row_closure();
-
+
$result.=
&Apache::lonhtmlcommon::row_title(&mt('Use CODE'))
.''
@@ -5275,7 +5065,7 @@ sub getSymbMap {
my @sequences = $navmap->retrieveResources(undef, sub { shift->is_map(); },
1,0,1);
for my $sequence ($navmap->getById('0.0'), @sequences) {
- if ($navmap->hasResource($sequence, sub { shift->is_problem(); }, 0) ) {
+ if ($navmap->hasResource($sequence, sub { shift->is_gradable(); }, 0) ) {
my $title = $minder.'.'.
&HTML::Entities::encode($sequence->compTitle(),'"\'&');
push(@titles, $title); # minder in case two titles are identical
@@ -5306,10 +5096,10 @@ sub displayPage {
&Apache::lonnet::clear_EXT_cache_status();
if (!&canview($usec)) {
- $request->print(
+ $request->print(
''.
&mt('Unable to view requested student. ([_1])',
- $env{'form.student'}).
+ $env{'form.student'}).
'');
return;
}
@@ -5372,10 +5162,11 @@ sub displayPage {
if($curRes == $iterator->BEGIN_MAP) { $depth++; }
if($curRes == $iterator->END_MAP) { $depth--; }
- if (ref($curRes) && $curRes->is_problem()) {
+ if (ref($curRes) && $curRes->is_gradable()) {
my $parts = $curRes->parts();
my $title = $curRes->compTitle();
my $symbx = $curRes->symb();
+ my $is_tool = ($symbx =~ /ext\.tool$/);
$studentTable.=
&Apache::loncommon::start_data_table_row().
''.$prob.
@@ -5386,26 +5177,34 @@ sub displayPage {
' | ';
$studentTable.='';
my %form = ('CODE' => $env{'form.CODE'},);
- if ($env{'form.vProb'} eq 'yes' ) {
- $studentTable.=&show_problem($request,$symbx,$uname,$udom,1,
- undef,'both',\%form);
- } else {
- my $companswer = &Apache::loncommon::get_student_answers($symbx,$uname,$udom,$env{'request.course.id'},%form);
- $companswer =~ s|||g;
-# while ($companswer =~ /()/s) { #\n");
-# }
-# $companswer =~ s|||g;
- $studentTable.=' '.$title.' '.&mt('Correct answer').': '.$companswer;
+ if ($is_tool) {
+ $studentTable.=' '.$title.' ';
+ } else {
+ if ($env{'form.vProb'} eq 'yes' ) {
+ $studentTable.=&show_problem($request,$symbx,$uname,$udom,1,
+ undef,'both',\%form);
+ } else {
+ my $companswer = &Apache::loncommon::get_student_answers($symbx,$uname,$udom,$env{'request.course.id'},%form);
+ $companswer =~ s|||g;
+# while ($companswer =~ /()/s) { #\n");
+# }
+# $companswer =~ s|||g;
+ $studentTable.=' '.$title.' '.&mt('Correct answer').': '.$companswer;
+ }
}
my %record = &Apache::lonnet::restore($symbx,$env{'request.course.id'},$udom,$uname);
if ($env{'form.lastSub'} eq 'datesub') {
if ($record{'version'} eq '') {
- $studentTable.=' '.&mt('No recorded submission for this problem.').' ';
+ my $msg = &mt('No recorded submission for this problem.');
+ if ($is_tool) {
+ $msg = &mt('No recorded transactions for this external tool');
+ }
+ $studentTable.=' '.$msg.' ';
} else {
my %responseType = ();
foreach my $partid (@{$parts}) {
@@ -5418,11 +5217,10 @@ sub displayPage {
$responseType{$partid} = \%responseIds;
}
$studentTable.= &displaySubByDates($symbx,\%record,$parts,\%responseType,$checkIcon,$uname,$udom);
-
}
} elsif ($env{'form.lastSub'} eq 'all') {
my $last = ($env{'form.lastSub'} eq 'last' ? 'last' : '');
- my $identifier = (&canmodify($usec)? $prob : '');
+ my $identifier = (&canmodify($usec)? $prob : '');
$studentTable.=&Apache::loncommon::get_previous_attempt($symbx,$uname,$udom,
$env{'request.course.id'},
'','.submission',undef,
@@ -5444,14 +5242,10 @@ sub displayPage {
}
$curRes = $iterator->next();
}
- my $disabled;
- unless (&canmodify($usec)) {
- $disabled = ' disabled="disabled"';
- }
$studentTable.=
' '."\n".
- ''.
''."\n";
$request->print($studentTable);
@@ -5463,13 +5257,14 @@ sub displaySubByDates {
my ($symb,$record,$parts,$responseType,$checkIcon,$uname,$udom) = @_;
my $isCODE=0;
my $isTask = ($symb =~/\.task$/);
+ my $is_tool = ($symb =~/\.tool$/);
if (exists($record->{'resource.CODE'})) { $isCODE=1; }
my $studentTable=&Apache::loncommon::start_data_table().
&Apache::loncommon::start_data_table_header_row().
''.&mt('Date/Time').' | '.
($isCODE?''.&mt('CODE').' | ':'').
($isTask?''.&mt('Version').' | ':'').
- ''.&mt('Submission').' | '.
+ ''.($is_tool?&mt('Grade'):&mt('Submission')).' | '.
''.&mt('Status').' | '.
&Apache::loncommon::end_data_table_header_row();
my ($version);
@@ -5477,7 +5272,11 @@ sub displaySubByDates {
my %orders;
$mark{'correct_by_student'} = $checkIcon;
if (!exists($$record{'1:timestamp'})) {
- return ' '.&mt('Nothing submitted - no attempts.').' ';
+ if ($is_tool) {
+ return ' '.&mt('No grade passed back.').' ';
+ } else {
+ return ' '.&mt('Nothing submitted - no attempts.').' ';
+ }
}
my $interaction;
@@ -5510,59 +5309,64 @@ sub displaySubByDates {
if (($type eq 'anonsurvey') || ($type eq 'anonsurveycred')) {
$hidden = 1;
}
- my @matchKey;
+ my @matchKey;
if ($isTask) {
- @matchKey = sort(grep(/^resource\.\d+\.\Q$partid\E\.award$/,@versionKeys));
+ @matchKey = sort(grep /^resource\.\d+\.\Q$partid\E\.award$/,@versionKeys);
+ } elsif ($is_tool) {
+ @matchKey = sort(grep /^resource\.\Q$partid\E\.awarded$/,@versionKeys);
} else {
- @matchKey = sort(grep(/^resource\.\Q$partid\E\..*?\.submission$/,@versionKeys));
+ @matchKey = 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].='';
- $displaySub[0].=''.&mt('Part: [_1]',$display_part).''
- .' '
- .'('.&mt('Response ID: [_1]',$responseId).')'
- .''
- .' ';
- if ($hidden) {
- $displaySub[0].= &mt('Anonymous Survey').'';
+ if ($is_tool) {
+ $displaySub[0].=$$record{"$version:resource.$partid.awarded"};
} else {
- my ($trial,$rndseed,$newvariation);
- if ($type eq 'randomizetry') {
- $trial = $$record{"$where.$partid.tries"};
- $rndseed = $$record{"$where.$partid.rndseed"};
- }
- if ($$record{"$where.$partid.tries"} eq '') {
- $displaySub[0].=&mt('Trial not counted');
- } else {
- $displaySub[0].=&mt('Trial: [_1]',
- $$record{"$where.$partid.tries"});
- if (($rndseed ne '') && ($lastrndseed{$partid} ne '')) {
- if (($rndseed ne $lastrndseed{$partid}) &&
- (($type eq 'randomizetry') || ($lasttype{$partid} eq 'randomizetry'))) {
- $newvariation = ' ('.&mt('New variation this try').')';
- }
+ my ($responseId)= ($isTask ? ($matchKey=~ /^resource\.(.*?)\.\Q$partid\E\.award$/)
+ : ($matchKey=~ /^resource\.\Q$partid\E\.(.*?)\.submission$/));
+ $displaySub[0].='';
+ $displaySub[0].=''.&mt('Part: [_1]',$display_part).''
+ .' '
+ .'('.&mt('Response ID: [_1]',$responseId).')'
+ .''
+ .' ';
+ if ($hidden) {
+ $displaySub[0].= &mt('Anonymous Survey').'';
+ } else {
+ my ($trial,$rndseed,$newvariation);
+ if ($type eq 'randomizetry') {
+ $trial = $$record{"$where.$partid.tries"};
+ $rndseed = $$record{"$where.$partid.rndseed"};
}
- $lastrndseed{$partid} = $rndseed;
- $lasttype{$partid} = $type;
- }
- my $responseType=($isTask ? 'Task'
+ if ($$record{"$where.$partid.tries"} eq '') {
+ $displaySub[0].=&mt('Trial not counted');
+ } else {
+ $displaySub[0].=&mt('Trial: [_1]',
+ $$record{"$where.$partid.tries"});
+ if (($rndseed ne '') && ($lastrndseed{$partid} ne '')) {
+ if (($rndseed ne $lastrndseed{$partid}) &&
+ (($type eq 'randomizetry') || ($lasttype{$partid} eq 'randomizetry'))) {
+ $newvariation = ' ('.&mt('New variation this try').')';
+ }
+ }
+ $lastrndseed{$partid} = $rndseed;
+ $lasttype{$partid} = $type;
+ }
+ my $responseType=($isTask ? 'Task'
: $responseType->{$partid}->{$responseId});
- if (!exists($orders{$partid})) { $orders{$partid}={}; }
- if ((!exists($orders{$partid}->{$responseId})) || ($trial)) {
- $orders{$partid}->{$responseId}=
- &get_order($partid,$responseId,$symb,$uname,$udom,
- $no_increment,$type,$trial,$rndseed);
- }
- $displaySub[0].=''.$newvariation.''; # /nobreak
- $displaySub[0].=' '.
- &cleanRecord($$record{$version.':'.$matchKey},$responseType,$symb,$partid,$responseId,$record,$orders{$partid}->{$responseId},"$version:",$uname,$udom,$type,$trial,$rndseed).' ';
+ if (!exists($orders{$partid})) { $orders{$partid}={}; }
+ if ((!exists($orders{$partid}->{$responseId})) || ($trial)) {
+ $orders{$partid}->{$responseId}=
+ &get_order($partid,$responseId,$symb,$uname,$udom,
+ $no_increment,$type,$trial,$rndseed);
+ }
+ $displaySub[0].=''.$newvariation.''; # /nobreak
+ $displaySub[0].=' '.
+ &cleanRecord($$record{$version.':'.$matchKey},$responseType,$symb,$partid,$responseId,$record,$orders{$partid}->{$responseId},"$version:",$uname,$udom,$type,$trial,$rndseed).' ';
+ }
}
}
}
@@ -5577,14 +5381,22 @@ sub displaySubByDates {
lc($$record{"$where.$partid.award"}).' '.
$mark{$$record{"$where.$partid.solved"}}.
' ';
+ } elsif (($is_tool) && (exists($$record{"$version:resource.$partid.solved"}))) {
+ if ($$record{"$version:resource.$partid.solved"} =~ /^(in|)correct_by_passback$/) {
+ $displaySub[1].=&mt('Grade passed back by external tool');
+ }
}
if (exists $$record{"$where.$partid.regrader"}) {
- $displaySub[2].=$$record{"$where.$partid.regrader"}.
- ' ('.&mt('Part').': '.$display_part.')';
+ $displaySub[2].=$$record{"$where.$partid.regrader"};
+ unless ($is_tool) {
+ $displaySub[2].=' ('.&mt('Part').': '.$display_part.')';
+ }
} elsif ($$record{"$version:resource.$partid.regrader"} =~ /\S/) {
$displaySub[2].=
- $$record{"$version:resource.$partid.regrader"}.
- ' ('.&mt('Part').': '.$display_part.')';
+ $$record{"$version:resource.$partid.regrader"};
+ unless ($is_tool) {
+ $displaySub[2].=' ('.&mt('Part').': '.$display_part.')';
+ }
}
}
# needed because old essay regrader has not parts info
@@ -5669,7 +5481,6 @@ sub updateGradeByPage {
my @displayPts=();
my %aggregate = ();
my $aggregateflag = 0;
- my %queueable;
if ($env{'form.HIDE'.$prob}) {
my %record = &Apache::lonnet::restore($symbx,$env{'request.course.id'},$udom,$uname);
my ($version,$parts) = split(/:/,$env{'form.HIDE'.$prob},2);
@@ -5679,20 +5490,7 @@ sub updateGradeByPage {
foreach my $partid (@{$parts}) {
my $newpts = $env{'form.GD_BOX'.$question.'_'.$partid};
my $oldpts = $env{'form.oldpts'.$question.'_'.$partid};
- my @types = $curRes->responseType($partid);
- if (grep(/^essay$/,@types)) {
- $queueable{$partid} = 1;
- } else {
- my @ids = $curRes->responseIds($partid);
- for (my $i=0; $i < scalar(@ids); $i++) {
- my $hndgrd = &Apache::lonnet::EXT('resource.'.$partid.'_'.$ids[$i].
- '.handgrade',$symb);
- if (lc($hndgrd) eq 'yes') {
- $queueable{$partid} = 1;
- last;
- }
- }
- }
+
my $wgt = $env{'form.WGT'.$question.'_'.$partid} != 0 ?
$env{'form.WGT'.$question.'_'.$partid} : 1;
my $partial = $newpts/$wgt;
@@ -5758,7 +5556,7 @@ sub updateGradeByPage {
$env{'request.course.id'},
$udom,$uname);
&check_and_remove_from_queue($parts,\%record,undef,$symbx,
- $cdom,$cnum,$udom,$uname,\%queueable);
+ $cdom,$cnum,$udom,$uname);
}
if ($aggregateflag) {
@@ -5857,7 +5655,7 @@ the homework problem.
sub defaultFormData {
my ($symb)=@_;
- return '';
+ return '';
}
@@ -6103,24 +5901,24 @@ sub scantron_selectphase {
if (&Apache::lonnet::allowed('usc',$env{'request.role.domain'}) ||
&Apache::lonnet::allowed('usc',$env{'request.course.id'})) {
- # Chunk of form to prompt for a scantron file upload.
+ # Chunk of form to prompt for a scantron file upload.
$r->print('
');
- my $cdom= $env{'course.'.$env{'request.course.id'}.'.domain'};
- my $cnum= $env{'course.'.$env{'request.course.id'}.'.num'};
- my $alertmsg = &mt('Please use the browse button to select a file from your local directory.');
- &js_escape(\$alertmsg);
- my ($formatoptions,$formattitle,$formatjs) = &scantron_upload_dataformat($cdom);
- $r->print(&Apache::lonhtmlcommon::scripttag('
+ my $cdom= $env{'course.'.$env{'request.course.id'}.'.domain'};
+ my $cnum= $env{'course.'.$env{'request.course.id'}.'.num'};
+ my $alertmsg = &mt('Please use the browse button to select a file from your local directory.');
+ &js_escape(\$alertmsg);
+ my ($formatoptions,$formattitle,$formatjs) = &scantron_upload_dataformat($cdom);
+ $r->print(&Apache::lonhtmlcommon::scripttag('
function checkUpload(formname) {
- if (formname.upfile.value == "") {
- alert("'.$alertmsg.'");
- return false;
- }
- formname.submit();
+ if (formname.upfile.value == "") {
+ alert("'.$alertmsg.'");
+ return false;
+ }
+ formname.submit();
}'."\n".$formatjs));
- $r->print('
+ $r->print('
'
- );
+ );
}
@@ -6204,6 +6002,8 @@ sub scantron_selectphase {
$r->print($result);
+
+
# Chunk of the form that prompts to view a scoring office file,
# corrected file, skipped records in a file.
@@ -6270,7 +6070,9 @@ sub scantron_selectphase {
=item username_to_idmap
creates a hash keyed by student/employee ID with values of the corresponding
- student username:domain.
+ student username:domain. If a single ID occurs for more than one student,
+ the status of the student is checked, and if Active, the value in the hash
+ will be set to the Active student.
Arguments:
@@ -6470,12 +6272,12 @@ sub digits_to_letters {
=item scantron_parse_scanline
- Decodes a scanline from the selected scantron file
+ Decodes a scanline from the selected bubblesheet file
Arguments:
- line - The text of the scantron file line to process
+ line - The text of the bubblesheet file line to process
whichline - Line number
- scantron_config - Hash describing the format of the scantron lines.
+ scantron_config - Hash describing the format of the bubblesheet lines.
scan_data - Hash of extra information about the scanline
(see scantron_getfile for more information)
just_header - True if should not process question answers but only
@@ -6500,7 +6302,7 @@ sub digits_to_letters {
totalref - Ref of scalar used to score total number of bubble
lines needed for responses in a scan line (used when
randompick in use.
-
+
Returns:
Hash containing the result of parsing the scanline
@@ -6593,7 +6395,7 @@ sub scantron_parse_scanline {
$partids_by_symb,$orderedforcode,
$respnumlookup,$startline);
if ($total) {
- $lastpos = $total*$$scantron_config{'Qlength'};
+ $lastpos = $total*$$scantron_config{'Qlength'};
}
if (ref($totalref)) {
$$totalref = $total;
@@ -6607,7 +6409,7 @@ sub scantron_parse_scanline {
if (($randompick || $randomorder) && (ref($respnumlookup) eq 'HASH')) {
$answers_needed = $bubble_lines_per_response{$respnumlookup->{$questnum}};
} else {
- $answers_needed = $bubble_lines_per_response{$questnum};
+ $answers_needed = $bubble_lines_per_response{$questnum};
}
my $answer_length = ($$scantron_config{'Qlength'} * $answers_needed)
|| 1;
@@ -6667,12 +6469,9 @@ sub scantron_parse_scanline {
}
sub get_master_seq {
- my ($resources,$master_seq,$symb_to_resource,$need_symb_in_map,$symb_for_examcode) = @_;
- return unless ((ref($resources) eq 'ARRAY') && (ref($master_seq) eq 'ARRAY') &&
+ my ($resources,$master_seq,$symb_to_resource) = @_;
+ return unless ((ref($resources) eq 'ARRAY') && (ref($master_seq) eq 'ARRAY') &&
(ref($symb_to_resource) eq 'HASH'));
- if ($need_symb_in_map) {
- return unless (ref($symb_for_examcode) eq 'HASH');
- }
my $resource_error;
foreach my $resource (@{$resources}) {
my $ressymb;
@@ -6680,14 +6479,6 @@ sub get_master_seq {
$ressymb = $resource->symb();
push(@{$master_seq},$ressymb);
$symb_to_resource->{$ressymb} = $resource;
- if ($need_symb_in_map) {
- unless ($resource->is_map()) {
- my $map=(&Apache::lonnet::decode_symb($ressymb))[0];
- unless (exists($symb_for_examcode->{$map})) {
- $symb_for_examcode->{$map} = $ressymb;
- }
- }
- }
} else {
$resource_error = 1;
last;
@@ -6757,7 +6548,7 @@ sub scantron_validator_lettnum {
my $occurrences = 0;
my $responsenum = $questnum-1;
if (($randompick || $randomorder) && (ref($respnumlookup) eq 'HASH')) {
- $responsenum = $respnumlookup->{$questnum-1}
+ $responsenum = $respnumlookup->{$questnum-1}
}
if (($responsetype_per_response{$responsenum} eq 'essayresponse') ||
($responsetype_per_response{$responsenum} eq 'formularesponse') ||
@@ -7053,7 +6844,7 @@ sub scantron_process_corrections {
}
}
if ($err) {
- $r->print(
+ $r->print(
''
.&mt('Unable to accept last correction, an error occurred: [_1]',
$errmsg)
@@ -7356,7 +7147,7 @@ sub scantron_validate_file {
while (!$stop && $currentphase < scalar(@validate_phases)) {
$r->print(&mt('Validating '.$validate_phases[$currentphase]).' ');
$r->rflush();
-
+
my $which="scantron_validate_".$validate_phases[$currentphase];
{
no strict 'refs';
@@ -7386,7 +7177,7 @@ sub scantron_validate_file {
$r->print('');
$r->print(' '.&mt('this error').' ');
- $r->print(' '.&mt('Or return to [_1]Grade/Manage/Review Bubblesheets[_2] to start over.','','').' ');
+ $r->print(''.&mt('Or return to [_1]Grade/Manage/Review Bubblesheets[_2] to start over.','','').' ');
} else {
if ($validate_phases[$currentphase] eq 'doublebubble' || $validate_phases[$currentphase] eq 'missingbubbles') {
$r->print('');
@@ -7765,9 +7556,10 @@ sub scantron_validate_sequence {
my @resources=
$navmap->retrieveResources($map,\&scantron_filter_not_exam,1,0);
if (@resources) {
- $r->print(''
+ $r->print(
+ ' '
.&mt('Some resources in the sequence currently are not set to'
- .' exam mode. Grading these resources currently may not'
+ .' bubblesheet exam mode. Grading these resources currently may not'
.' work correctly.')
.' '
);
@@ -7889,10 +7681,10 @@ sub scantron_get_correction {
if ($error =~ /ID$/) {
if ($error eq 'incorrectID') {
- $r->print(''.&mt("The encoded ID is not in the classlist").
+ $r->print(' '.&mt("The encoded ID is not in the classlist").
" \n");
} elsif ($error eq 'duplicateID') {
- $r->print(''.&mt("The encoded ID has also been used by a previous paper [_1]",$arg)." \n");
+ $r->print(''.&mt("The encoded ID has also been used by a previous paper [_1]",$arg)." \n");
}
$r->print($message);
$r->print("".&mt("How should I handle this?")." \n");
@@ -7912,8 +7704,8 @@ sub scantron_get_correction {
} elsif ($error eq 'duplicateCODE') {
$r->print(' '.&mt("The encoded CODE has also been used by a previous paper [_1], and CODEs are supposed to be unique.",join(', ',@{$arg}))." \n");
}
- $r->print("".&mt('The CODE on the form is [_1]',
- "'$$scan_record{'scantron.CODE'}'")
+ $r->print(" ".&mt('The CODE on the form is [_1]',
+ "'$$scan_record{'scantron.CODE'}'")
." \n");
$r->print($message);
$r->print("".&mt("How should I handle this?")." \n");
@@ -8010,7 +7802,7 @@ ENDSCRIPT
# The form field scantron_questions is actually a list of line numbers not
# a list of question numbers. Therefore:
#
-
+
my $line_list = &questions_to_line_list($arg,$randomorder,$randompick,
$respnumlookup,$startline);
@@ -8035,7 +7827,7 @@ sub verify_bubbles_checked {
my $ansnumstr = join('","',@ansnums);
my $warning = &mt("A bubble or 'No bubble' selection has not been made for one or more lines.");
&js_escape(\$warning);
- my $output = &Apache::lonhtmlcommon::scripttag(<{$question-1};
- if (ref($startline) eq 'HASH') {
+ if (ref($startline) eq 'HASH') {
$first = $startline->{$question-1};
}
} else {
@@ -8221,7 +8014,16 @@ sub prompt_for_corrections {
($responsetype_per_response{$responsenum} eq 'imageresponse') ||
($responsetype_per_response{$responsenum} eq 'reactionresponse') ||
($responsetype_per_response{$responsenum} eq 'organicresponse')) {
- $r->print(&mt("Although this particular question type requires handgrading, the instructions for this question in the bubblesheet exam directed students to leave [quant,_1,line] blank on their bubblesheets.",$lines).'
'.&mt('A non-zero score can be assigned to the student during bubblesheet grading by selecting a bubble in at least one line.').' '.&mt('The score for this question will be a sum of the numeric values for the selected bubbles from each line, where A=1 point, B=2 points etc.').' '.&mt("To assign a score of zero for this question, mark all lines as 'No bubble'.").'
');
+ $r->print(
+ &mt("Although this particular question type requires handgrading, the instructions for this question in the bubblesheet exam directed students to leave [quant,_1,line] blank on their bubblesheets.",$lines)
+ .'
'
+ .&mt('A non-zero score can be assigned to the student during bubblesheet grading by selecting a bubble in at least one line.')
+ .' '
+ .&mt('The score for this question will be a sum of the numeric values for the selected bubbles from each line, where A=1 point, B=2 points etc.')
+ .' '
+ .&mt("To assign a score of zero for this question, mark all lines as 'No bubble'.")
+ .'
'
+ );
} else {
$r->print(&mt("Select at most one bubble in a single line and select 'No Bubble' in all the other lines. ")." ");
}
@@ -8261,7 +8063,7 @@ sub scantron_bubble_selector {
my $max=$$scan_config{'Qlength'};
my $scmode=$$scan_config{'Qon'};
- if ($scmode eq 'number' || $scmode eq 'letter') {
+ if ($scmode eq 'number' || $scmode eq 'letter') {
if (($$scan_config{'BubblesPerRow'} =~ /^\d+$/) &&
($$scan_config{'BubblesPerRow'} > 0)) {
$max=$$scan_config{'BubblesPerRow'};
@@ -8504,17 +8306,6 @@ sub scantron_validate_doublebubble {
if (ref($map)) {
$randomorder = $map->randomorder();
$randompick = $map->randompick();
- unless ($randomorder || $randompick) {
- foreach my $res ($navmap->retrieveResources($map,sub { $_[0]->is_map() },1,0,1)) {
- if ($res->randomorder()) {
- $randomorder = 1;
- }
- if ($res->randompick()) {
- $randompick = 1;
- }
- last if ($randomorder || $randompick);
- }
- }
if ($randomorder || $randompick) {
$nav_error = &get_master_seq(\@resources,\@master_seq,\%symb_to_resource);
if ($nav_error) {
@@ -8591,7 +8382,7 @@ sub scantron_get_maxbubble {
my $response_number = 0;
my $bubble_line = 0;
foreach my $resource (@resources) {
- my $resid = $resource->id();
+ my $resid = $resource->id();
my ($analysis,$parts) = &scantron_partids_tograde($resource,$cid,$uname,
$udom,undef,$bubbles_per_row);
if ((ref($analysis) eq 'HASH') && (ref($parts) eq 'ARRAY')) {
@@ -8642,7 +8433,7 @@ sub scantron_get_maxbubble {
$bubble_lines_per_response{$response_number} = $lines;
$responsetype_per_response{$response_number} =
$analysis->{$part_id.'.type'};
- $masterseq_id_responsenum{$resid.'_'.$part_id} = $response_number;
+ $masterseq_id_responsenum{$resid.'_'.$part_id} = $response_number;
$response_number++;
$bubble_line += $lines;
@@ -8698,17 +8489,6 @@ sub scantron_validate_missingbubbles {
if (ref($map)) {
$randomorder = $map->randomorder();
$randompick = $map->randompick();
- unless ($randomorder || $randompick) {
- foreach my $res ($navmap->retrieveResources($map,sub { $_[0]->is_map() },1,0,1)) {
- if ($res->randomorder()) {
- $randomorder = 1;
- }
- if ($res->randompick()) {
- $randompick = 1;
- }
- last if ($randomorder || $randompick);
- }
- }
if ($randomorder || $randompick) {
$nav_error = &get_master_seq(\@resources,\@master_seq,\%symb_to_resource);
if ($nav_error) {
@@ -8734,9 +8514,9 @@ sub scantron_validate_missingbubbles {
for (my $i=0;$i<=$scanlines->{'count'};$i++) {
my $line=&scantron_get_line($scanlines,$scan_data,$i);
if ($line=~/^[\s\cz]*$/) { next; }
- my $scan_record =
+ my $scan_record =
&scantron_parse_scanline($line,$i,\%scantron_config,$scan_data,undef,\%idmap,
- $randomorder,$randompick,$sequence,\@master_seq,
+ $randomorder,$randompick,$sequence,\@master_seq,
\%symb_to_resource,\%grader_partids_by_symb,
\%orderedforcode,\%respnumlookup,\%startline);
if (!defined($$scan_record{'scantron.missingerror'})) { next; }
@@ -8747,36 +8527,36 @@ sub scantron_validate_missingbubbles {
foreach my $missing (@{$$scan_record{'scantron.missingerror'}}) {
my $lastbubble;
if ($missing =~ /^(\d+)\.(\d+)$/) {
- my $question = $1;
- my $subquestion = $2;
- my ($first,$responsenum);
- if ($randomorder || $randompick) {
- $responsenum = $respnumlookup{$question-1};
- $first = $startline{$question-1};
- } else {
- $responsenum = $question-1;
- $first = $first_bubble_line{$responsenum};
- }
- if (!defined($first)) { next; }
- my @subans = split(/,/,$subdivided_bubble_lines{$responsenum});
- my $subcount = 1;
- while ($subcount<$subquestion) {
- $first += $subans[$subcount-1];
- $subcount ++;
- }
- my $count = $subans[$subquestion-1];
- $lastbubble = $first + $count;
+ my $question = $1;
+ my $subquestion = $2;
+ my ($first,$responsenum);
+ if ($randomorder || $randompick) {
+ $responsenum = $respnumlookup{$question-1};
+ $first = $startline{$question-1};
+ } else {
+ $responsenum = $question-1;
+ $first = $first_bubble_line{$responsenum};
+ }
+ if (!defined($first)) { next; }
+ my @subans = split(/,/,$subdivided_bubble_lines{$responsenum});
+ my $subcount = 1;
+ while ($subcount<$subquestion) {
+ $first += $subans[$subcount-1];
+ $subcount ++;
+ }
+ my $count = $subans[$subquestion-1];
+ $lastbubble = $first + $count;
} else {
- my ($first,$responsenum);
- if ($randomorder || $randompick) {
- $responsenum = $respnumlookup{$missing-1};
- $first = $startline{$missing-1};
- } else {
- $responsenum = $missing-1;
- $first = $first_bubble_line{$responsenum};
- }
- if (!defined($first)) { next; }
- $lastbubble = $first + $bubble_lines_per_response{$responsenum};
+ my ($first,$responsenum);
+ if ($randomorder || $randompick) {
+ $responsenum = $respnumlookup{$missing-1};
+ $first = $startline{$missing-1};
+ } else {
+ $responsenum = $missing-1;
+ $first = $first_bubble_line{$responsenum};
+ }
+ if (!defined($first)) { next; }
+ $lastbubble = $first + $bubble_lines_per_response{$responsenum};
}
if ($lastbubble > $max_bubble) { next; }
push(@to_correct,$missing);
@@ -8839,7 +8619,7 @@ sub scantron_process_students {
my $default_form_data=&defaultFormData($symb);
my %scantron_config=&Apache::lonnet::get_scantron_config($env{'form.scantron_format'});
- my $bubbles_per_row = &bubblesheet_bubbles_per_row(\%scantron_config);
+ my $bubbles_per_row = &bubblesheet_bubbles_per_row(\%scantron_config);
my ($scanlines,$scan_data)=&scantron_getfile();
my $classlist=&Apache::loncoursedata::get_classlist();
my %idmap=&username_to_idmap($classlist);
@@ -8850,21 +8630,10 @@ sub scantron_process_students {
}
my $map=$navmap->getResourceByUrl($sequence);
my ($randomorder,$randompick,@master_seq,%symb_to_resource,%grader_partids_by_symb,
- %grader_randomlists_by_symb,%symb_for_examcode);
+ %grader_randomlists_by_symb);
if (ref($map)) {
$randomorder = $map->randomorder();
$randompick = $map->randompick();
- unless ($randomorder || $randompick) {
- foreach my $res ($navmap->retrieveResources($map,sub { $_[0]->is_map() },1,0,1)) {
- if ($res->randomorder()) {
- $randomorder = 1;
- }
- if ($res->randompick()) {
- $randompick = 1;
- }
- last if ($randomorder || $randompick);
- }
- }
} else {
$r->print(&navmap_errormsg());
return '';
@@ -8872,7 +8641,7 @@ sub scantron_process_students {
my $nav_error;
my @resources=$navmap->retrieveResources($map,\&scantron_filter,1,0);
if ($randomorder || $randompick) {
- $nav_error = &get_master_seq(\@resources,\@master_seq,\%symb_to_resource,1,\%symb_for_examcode);
+ $nav_error = &get_master_seq(\@resources,\@master_seq,\%symb_to_resource);
if ($nav_error) {
$r->print(&navmap_errormsg());
return '';
@@ -8934,7 +8703,7 @@ SCANTRONFORM
my %startline = ();
my $total;
my $scan_record=&scantron_parse_scanline($line,$i,\%scantron_config,
- $scan_data,undef,\%idmap,$randomorder,
+ $scan_data,undef,\%idmap,$randomorder,
$randompick,$sequence,\@master_seq,
\%symb_to_resource,\%grader_partids_by_symb,
\%orderedforcode,\%respnumlookup,\%startline,
@@ -8964,7 +8733,7 @@ SCANTRONFORM
my @mapresources = @resources;
if ($randomorder || $randompick) {
- @mapresources =
+ @mapresources =
&users_order($user,$scancode,$sequence,\@master_seq,\%symb_to_resource,
\%orderedforcode);
}
@@ -9019,16 +8788,11 @@ SCANTRONFORM
}
if (($scancode) && ($randomorder || $randompick)) {
- foreach my $key (keys(%symb_for_examcode)) {
- my $symb_in_map = $symb_for_examcode{$key};
- if ($symb_in_map ne '') {
- my $parmresult =
- &Apache::lonparmset::storeparm_by_symb($symb_in_map,
- '0_examcode',2,$scancode,
- 'string_examcode',$uname,
- $udom);
- }
- }
+ my $parmresult =
+ &Apache::lonparmset::storeparm_by_symb($symb,
+ '0_examcode',2,$scancode,
+ 'string_examcode',$uname,
+ $udom);
}
$completedstudents{$uname}={'line'=>$line};
if ($env{'form.verifyrecord'}) {
@@ -9058,7 +8822,7 @@ SCANTRONFORM
if (&grade_student_bubbles($r,$uname,$udom,$scan_record,$scancode,
\@mapresources,\%partids_by_symb,
$bubbles_per_row,$randomorder,$randompick,
- \%respnumlookup,\%startline)
+ \%respnumlookup,\%startline)
eq 'ssi_error') {
$ssi_error = 0; # So end of handler error message does not trigger.
$r->print("");
@@ -9151,7 +8915,7 @@ sub graders_resources_pass {
=item users_order
Returns array of resources in current map, ordered based on either CODE,
- if this is a CODEd exam, or based on student's identity if this is a
+ if this is a CODEd exam, or based on student's identity if this is a
"NAMEd" exam.
Should be used when randomorder and/or randompick applied when the
@@ -9178,7 +8942,7 @@ sub users_order {
if (ref($actual_seq) eq 'ARRAY') {
@mapresources = map { $symb_to_resource->{$_}; } @{$actual_seq};
if (ref($orderedforcode) eq 'HASH') {
- if (@mapresources > 0) {
+ if (@mapresources > 0) {
$orderedforcode->{$scancode} = \@mapresources;
}
}
@@ -9191,7 +8955,7 @@ sub users_order {
$master_seq,
$user,undef,1);
if (ref($actual_seq) eq 'ARRAY') {
- @mapresources =
+ @mapresources =
map { $symb_to_resource->{$_}; } @{$actual_seq};
}
}
@@ -9247,7 +9011,7 @@ sub grade_student_bubbles {
}
sub scantron_upload_scantron_data {
- my ($r,$symb) = @_;
+ my ($r,$symb)=@_;
my $dom = $env{'request.role.domain'};
my ($formatoptions,$formattitle,$formatjs) = &scantron_upload_dataformat($dom);
my $domdesc = &Apache::lonnet::domain($dom,'description');
@@ -9256,7 +9020,7 @@ sub scantron_upload_scantron_data {
'domainid',
'coursename',$dom);
my $syllabuslink = ''.&mt('Syllabus').''.
- (' 'x2).&mt('(shows course personnel)');
+ (' 'x2).&mt('(shows course personnel)');
my $default_form_data=&defaultFormData($symb);
my $nofile_alert = &mt('Please use the browse button to select a file from your local directory.');
&js_escape(\$nofile_alert);
@@ -9337,20 +9101,20 @@ END
if (keys(%{$domconfig{'scantron'}{'config'}}) > 1) {
if (($domconfig{'scantron'}{'config'}{'dat'}) &&
(ref($domconfig{'scantron'}{'config'}{'csv'}) eq 'HASH')) {
- if (ref($domconfig{'scantron'}{'config'}{'csv'}{'fields'}) eq 'HASH') {
+ if (ref($domconfig{'scantron'}{'config'}{'csv'}{'fields'}) eq 'HASH') {
if (keys(%{$domconfig{'scantron'}{'config'}{'csv'}{'fields'}})) {
my ($onclick,$formatextra,$singleline);
my @lines = &Apache::lonnet::get_scantronformat_file();
my $count = 0;
foreach my $line (@lines) {
- next if (($line =~ /^\#/) || ($line eq ''));
+ next if ($line =~ /^#/);
$singleline = $line;
$count ++;
}
if ($count > 1) {
$formatextra = ''.
''.
- &mt('Bubblesheet type').': '.
+ &mt('Bubblesheet type:').' '.
&scantron_scantab().' ';
$onclick = ' onclick="toggleScantab(this.form);"';
$formatjs = <<"END";
@@ -9403,7 +9167,7 @@ END
}
sub scantron_upload_scantron_data_save {
- my ($r,$symb) = @_;
+ my($r,$symb)=@_;
my $doanotherupload=
' ';
return $result;
}
sub selectfield {
- my ($full)=@_;
- my %options =
- (&substatus_options,
- 'select_form_order' => ['yes','queued','graded','incorrect','all']);
-
- #
- # PrepareClasslist() needs to be called to avoid getting a sections list
- # for a different course from the @Sections global in lonstatistics.pm,
- # populated by an earlier request.
- #
- &Apache::lonstatistics::PrepareClasslist();
-
+ my ($full,$is_tool)=@_;
+ my %options;
+ if ($is_tool) {
+ %options =
+ (&transtatus_options,
+ 'select_form_order' => ['yes','incorrect','all']);
+ } else {
+ %options =
+ (&substatus_options,
+ 'select_form_order' => ['yes','queued','graded','incorrect','all']);
+ }
my $result='
-
+
-
+
-
+
';
if ($full) {
+ my $heading = &mt('Submission Status');
+ if ($is_tool) {
+ $heading = &mt('Transaction Status');
+ }
$result.='
';
@@ -10417,7 +10151,7 @@ sub process_clicker {
my $pcorrect=&mt("Percentage points for correct solution");
my $pincorrect=&mt("Percentage points for incorrect solution");
my $selectform=&Apache::loncommon::select_form($env{'form.upfiletype'},'upfiletype',
- {'iclicker' => 'i>clicker',
+ {'iclicker' => 'i>clicker',
'interwrite' => 'interwrite PRS',
'turning' => 'Turning Technologies'});
$symb = &Apache::lonenc::check_encrypt($symb);
@@ -10478,12 +10212,12 @@ ENDUPFORM
ENDGRADINGFORM
- $result.=''.&Apache::loncommon::end_data_table_row().
+ $result.=''.&Apache::loncommon::end_data_table_row().
&Apache::loncommon::start_data_table_row().' '.(<$pcorrect:
-
+'
ENDPERCFORM
$result.=' | '.
&Apache::loncommon::end_data_table_row().
@@ -10492,7 +10226,7 @@ ENDPERCFORM
}
sub process_clicker_file {
- my ($r,$symb) = @_;
+ my ($r,$symb)=@_;
if (!$symb) {return '';}
my %Saveable_Parameters=&clicker_grading_parameters();
@@ -10820,8 +10554,9 @@ sub turning_eval {
return ($errormsg,$number);
}
+
sub assign_clicker_grades {
- my ($r,$symb) = @_;
+ my ($r,$symb)=@_;
if (!$symb) {return '';}
# See which part we are saving to
my $res_error;
@@ -10832,11 +10567,11 @@ sub assign_clicker_grades {
# FIXME: This should probably look for the first handgradeable part
my $part=$$partlist[0];
# Start screen output
- my $result = &Apache::loncommon::start_data_table().
- &Apache::loncommon::start_data_table_header_row().
- ' '.&mt('Assigning grades based on clicker file').' | '.
- &Apache::loncommon::end_data_table_header_row().
- &Apache::loncommon::start_data_table_row().' ';
+ my $result=&Apache::loncommon::start_data_table().
+ &Apache::loncommon::start_data_table_header_row().
+ ' | '.&mt('Assigning grades based on clicker file').' | '.
+ &Apache::loncommon::end_data_table_header_row().
+ &Apache::loncommon::start_data_table_row().' ';
# Get correct result
# FIXME: Possibly need delimiter other than ":"
my @correct=();
@@ -10891,14 +10626,14 @@ sub assign_clicker_grades {
&mt('More than one entry found for [_1]!',''.$user.'').
' ';
}
- $users{$user}=1;
+ $users{$user}=1;
my @answer=split(/\,/,$env{$key});
my $sum=0;
my $realnumber=$number;
for (my $i=0;$i<$number;$i++) {
if ($correct[$i] eq '-') {
$realnumber--;
- } elsif (($answer[$i]) || ($answer[$i]=~/^[0\.]+$/)) {
+ } elsif (($answer[$i]) || ($answer[$i]=~/^[0\.]+$/)) {
if ($gradingmechanism eq 'attendance') {
$sum+=$pcorrect;
} elsif ($correct[$i] eq '*') {
@@ -10957,7 +10692,7 @@ sub navmap_errormsg {
}
sub startpage {
- my ($r,$symb,$crumbs,$onlyfolderflag,$nodisplayflag,$stuvcurrent,$stuvdisp,$nomenu,$head_extra,$onload,$divforres) = @_;
+ my ($r,$symb,$crumbs,$onlyfolderflag,$nodisplayflag,$stuvcurrent,$stuvdisp,$nomenu,$js,$onload) = @_;
my %args;
if ($onload) {
my %loaditems = (
@@ -10966,24 +10701,23 @@ sub startpage {
$args{'add_entries'} = \%loaditems;
}
if ($nomenu) {
- $args{'only_body'} = 1;
- $r->print(&Apache::loncommon::start_page("Student's Version",$head_extra,\%args));
+ $args{'only_body'} = 1;
+ $r->print(&Apache::loncommon::start_page("Student's Version",$js,\%args));
} else {
- if ($env{'request.course.id'}) {
- unshift(@$crumbs,{href=>&href_symb_cmd($symb,'gradingmenu'),text=>"Grading"});
- }
+ unshift(@$crumbs,{href=>&href_symb_cmd($symb,'gradingmenu'),text=>"Grading"});
$args{'bread_crumbs'} = $crumbs;
- $r->print(&Apache::loncommon::start_page('Grading',$head_extra,\%args));
+ $r->print(&Apache::loncommon::start_page('Grading',$js,\%args));
+ &Apache::lonquickgrades::startGradeScreen($r,($env{'form.symb'}?'probgrading':'grading'));
}
unless ($nodisplayflag) {
- $r->print(&Apache::lonhtmlcommon::resource_info_box($symb,$onlyfolderflag,$stuvcurrent,$stuvdisp,$divforres));
+ $r->print(&Apache::lonhtmlcommon::resource_info_box($symb,$onlyfolderflag,$stuvcurrent,$stuvdisp));
}
}
sub select_problem {
my ($r)=@_;
$r->print(''.&mt('Select the problem or one of the problems you want to grade').'');
}
@@ -10999,7 +10733,7 @@ sub handler {
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'});
# see what command we need to execute
-
+
my @commands=&Apache::loncommon::get_env_multiple('form.command');
my $command=$commands[0];
@@ -11035,98 +10769,62 @@ sub handler {
if (($symb eq '' || $command eq '') && ($env{'request.course.id'})) {
#
# Not called from a resource, but inside a course
-#
+#
&startpage($request,undef,[],1,1);
&select_problem($request);
} else {
- if ($command eq 'submission' && $perm{'vgr'}) {
- my ($stuvcurrent,$stuvdisp,$versionform,$js,$onload);
+ if ($command eq 'submission' && $perm{'vgr'}) {
+ my ($stuvcurrent,$stuvdisp,$versionform,$js);
if (($env{'form.student'} ne '') && ($env{'form.userdom'} ne '')) {
($stuvcurrent,$stuvdisp,$versionform,$js) =
&choose_task_version_form($symb,$env{'form.student'},
$env{'form.userdom'});
}
- my $divforres;
- if ($env{'form.student'} eq '') {
- $js .= &part_selector_js();
- $onload = "toggleParts('gradesub');";
- } else {
- $divforres = 1;
- }
- my $head_extra = $js;
- unless ($env{'form.vProb'} eq 'no') {
- my $csslinks = &Apache::loncommon::css_links($symb);
- if ($csslinks) {
- $head_extra .= "\n$csslinks";
- }
- }
- &startpage($request,$symb,[{href=>"", text=>"Student Submissions"}],undef,undef,
- $stuvcurrent,$stuvdisp,undef,$head_extra,$onload,$divforres);
+ &startpage($request,$symb,[{href=>"", text=>"Student Submissions"}],undef,undef,$stuvcurrent,$stuvdisp,undef,$js);
if ($versionform) {
- if ($divforres) {
- $request->print('');
- }
$request->print($versionform);
}
- ($env{'form.student'} eq '' ? &listStudents($request,$symb,'',$divforres) : &submission($request,0,0,$symb,$divforres,$command));
+ $request->print(' ');
+ ($env{'form.student'} eq '' ? &listStudents($request,$symb) : &submission($request,0,0,$symb));
} elsif ($command eq 'versionsub' && $perm{'vgr'}) {
my ($stuvcurrent,$stuvdisp,$versionform,$js) =
&choose_task_version_form($symb,$env{'form.student'},
$env{'form.userdom'},
$env{'form.inhibitmenu'});
- my $head_extra = $js;
- unless ($env{'form.vProb'} eq 'no') {
- my $csslinks = &Apache::loncommon::css_links($symb);
- if ($csslinks) {
- $head_extra .= "\n$csslinks";
- }
- }
- &startpage($request,$symb,[{href=>"", text=>"Previous Student Version"}],undef,undef,
- $stuvcurrent,$stuvdisp,$env{'form.inhibitmenu'},$head_extra);
+ &startpage($request,$symb,[{href=>"", text=>"Previous Student Version"}],undef,undef,$stuvcurrent,$stuvdisp,$env{'form.inhibitmenu'},$js);
if ($versionform) {
$request->print($versionform);
}
$request->print(' ');
$request->print(&show_previous_task_version($request,$symb));
- } elsif ($command eq 'pickStudentPage' && $perm{'vgr'}) {
+ } elsif ($command eq 'pickStudentPage' && $perm{'vgr'}) {
&startpage($request,$symb,[{href=>&href_symb_cmd($symb,'all_for_one'),text=>'Grade page/folder for one student'},
{href=>'',text=>'Select student'}],1,1);
- &pickStudentPage($request,$symb);
- } elsif ($command eq 'displayPage' && $perm{'vgr'}) {
- my $csslinks;
- unless ($env{'form.vProb'} eq 'no') {
- $csslinks = &Apache::loncommon::css_links($symb,'map');
- }
+ &pickStudentPage($request,$symb);
+ } elsif ($command eq 'displayPage' && $perm{'vgr'}) {
&startpage($request,$symb,
[{href=>&href_symb_cmd($symb,'all_for_one'),text=>'Grade page/folder for one student'},
{href=>'',text=>'Select student'},
- {href=>'',text=>'Grade student'}],1,1,undef,undef,undef,$csslinks);
- &displayPage($request,$symb);
- } elsif ($command eq 'gradeByPage' && $perm{'mgr'}) {
+ {href=>'',text=>'Grade student'}],1,1);
+ &displayPage($request,$symb);
+ } elsif ($command eq 'gradeByPage' && $perm{'mgr'}) {
&startpage($request,$symb,[{href=>&href_symb_cmd($symb,'all_for_one'),text=>'Grade page/folder for one student'},
{href=>'',text=>'Select student'},
{href=>'',text=>'Grade student'},
{href=>'',text=>'Store grades'}],1,1);
- &updateGradeByPage($request,$symb);
- } elsif ($command eq 'processGroup' && $perm{'vgr'}) {
- my $csslinks;
- unless ($env{'form.vProb'} eq 'no') {
- $csslinks = &Apache::loncommon::css_links($symb);
- }
+ &updateGradeByPage($request,$symb);
+ } elsif ($command eq 'processGroup' && $perm{'vgr'}) {
&startpage($request,$symb,[{href=>'',text=>'...'},
- {href=>'',text=>'Modify grades'}],undef,undef,undef,undef,undef,$csslinks,undef,1);
- &processGroup($request,$symb);
- } elsif ($command eq 'gradingmenu' && $perm{'vgr'}) {
+ {href=>'',text=>'Modify grades'}]);
+ &processGroup($request,$symb);
+ } elsif ($command eq 'gradingmenu' && $perm{'vgr'}) {
&startpage($request,$symb);
- $request->print(&grading_menu($request,$symb));
- } elsif ($command eq 'individual' && $perm{'vgr'}) {
+ $request->print(&grading_menu($request,$symb));
+ } elsif ($command eq 'individual' && $perm{'vgr'}) {
&startpage($request,$symb,[{href=>'',text=>'Select individual students to grade'}]);
- $request->print(&submit_options($request,$symb));
+ $request->print(&submit_options($request,$symb));
} elsif ($command eq 'ungraded' && $perm{'vgr'}) {
- my $js = &part_selector_js();
- my $onload = "toggleParts('gradesub');";
- &startpage($request,$symb,[{href=>'',text=>'Grade ungraded submissions'}],
- undef,undef,undef,undef,undef,$js,$onload);
+ &startpage($request,$symb,[{href=>'',text=>'Grade ungraded submissions'}]);
$request->print(&listStudents($request,$symb,'graded'));
} elsif ($command eq 'table' && $perm{'vgr'}) {
&startpage($request,$symb,[{href=>"", text=>"Grading table"}]);
@@ -11134,26 +10832,26 @@ sub handler {
} elsif ($command eq 'all_for_one' && $perm{'vgr'}) {
&startpage($request,$symb,[{href=>'',text=>'Grade page/folder for one student'}],1,1);
$request->print(&submit_options_sequence($request,$symb));
- } elsif ($command eq 'viewgrades' && $perm{'vgr'}) {
+ } elsif ($command eq 'viewgrades' && $perm{'vgr'}) {
&startpage($request,$symb,[{href=>&href_symb_cmd($symb,"table"), text=>"Grading table"},{href=>'', text=>"Modify grades"}]);
- $request->print(&viewgrades($request,$symb));
- } elsif ($command eq 'handgrade' && $perm{'mgr'}) {
+ $request->print(&viewgrades($request,$symb));
+ } elsif ($command eq 'handgrade' && $perm{'mgr'}) {
&startpage($request,$symb,[{href=>'',text=>'...'},
{href=>'',text=>'Store grades'}]);
- $request->print(&processHandGrade($request,$symb));
- } elsif ($command eq 'editgrades' && $perm{'mgr'}) {
+ $request->print(&processHandGrade($request,$symb));
+ } elsif ($command eq 'editgrades' && $perm{'mgr'}) {
&startpage($request,$symb,[{href=>&href_symb_cmd($symb,"table"), text=>"Grading table"},
{href=>&href_symb_cmd($symb,'viewgrades').'&group=all§ion=all&Status=Active',
text=>"Modify grades"},
{href=>'', text=>"Store grades"}]);
- $request->print(&editgrades($request,$symb));
+ $request->print(&editgrades($request,$symb));
} elsif ($command eq 'initialverifyreceipt' && $perm{'vgr'}) {
&startpage($request,$symb,[{href=>'',text=>'Verify Receipt Number'}]);
$request->print(&initialverifyreceipt($request,$symb));
- } elsif ($command eq 'verify' && $perm{'vgr'}) {
+ } elsif ($command eq 'verify' && $perm{'vgr'}) {
&startpage($request,$symb,[{href=>&href_symb_cmd($symb,"initialverifyreceipt"),text=>'Verify Receipt Number'},
{href=>'',text=>'Verification Result'}]);
- $request->print(&verifyreceipt($request,$symb));
+ $request->print(&verifyreceipt($request,$symb));
} elsif ($command eq 'processclicker' && $perm{'mgr'}) {
&startpage($request,$symb,[{href=>'', text=>'Process clicker'}]);
$request->print(&process_clicker($request,$symb));
@@ -11166,84 +10864,83 @@ sub handler {
{href=>'', text=>'Process clicker file'},
{href=>'', text=>'Store grades'}]);
$request->print(&assign_clicker_grades($request,$symb));
- } elsif ($command eq 'csvform' && $perm{'mgr'}) {
+ } elsif ($command eq 'csvform' && $perm{'mgr'}) {
&startpage($request,$symb,[{href=>'', text=>'Upload Scores'}],1,1);
- $request->print(&upcsvScores_form($request,$symb));
- } elsif ($command eq 'csvupload' && $perm{'mgr'}) {
+ $request->print(&upcsvScores_form($request,$symb));
+ } elsif ($command eq 'csvupload' && $perm{'mgr'}) {
&startpage($request,$symb,[{href=>'', text=>'Upload Scores'}],1,1);
- $request->print(&csvupload($request,$symb));
- } elsif ($command eq 'csvuploadmap' && $perm{'mgr'} ) {
+ $request->print(&csvupload($request,$symb));
+ } elsif ($command eq 'csvuploadmap' && $perm{'mgr'} ) {
&startpage($request,$symb,[{href=>'', text=>'Upload Scores'}],1,1);
- $request->print(&csvuploadmap($request,$symb));
- } elsif ($command eq 'csvuploadoptions' && $perm{'mgr'}) {
- if ($env{'form.associate'} ne 'Reverse Association') {
+ $request->print(&csvuploadmap($request,$symb));
+ } elsif ($command eq 'csvuploadoptions' && $perm{'mgr'}) {
+ if ($env{'form.associate'} ne 'Reverse Association') {
&startpage($request,$symb,[{href=>'', text=>'Upload Scores'}],1,1);
- $request->print(&csvuploadoptions($request,$symb));
- } else {
- if ( $env{'form.upfile_associate'} ne 'reverse' ) {
- $env{'form.upfile_associate'} = 'reverse';
- } else {
- $env{'form.upfile_associate'} = 'forward';
- }
+ $request->print(&csvuploadoptions($request,$symb));
+ } else {
+ if ( $env{'form.upfile_associate'} ne 'reverse' ) {
+ $env{'form.upfile_associate'} = 'reverse';
+ } else {
+ $env{'form.upfile_associate'} = 'forward';
+ }
&startpage($request,$symb,[{href=>'', text=>'Upload Scores'}],1,1);
- $request->print(&csvuploadmap($request,$symb));
- }
- } elsif ($command eq 'csvuploadassign' && $perm{'mgr'} ) {
+ $request->print(&csvuploadmap($request,$symb));
+ }
+ } elsif ($command eq 'csvuploadassign' && $perm{'mgr'} ) {
&startpage($request,$symb,[{href=>'', text=>'Upload Scores'}],1,1);
- $request->print(&csvuploadassign($request,$symb));
- } elsif ($command eq 'scantron_selectphase' && $perm{'mgr'}) {
+ $request->print(&csvuploadassign($request,$symb));
+ } elsif ($command eq 'scantron_selectphase' && $perm{'mgr'}) {
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1,
undef,undef,undef,undef,'toggleScantab(document.rules);');
- $request->print(&scantron_selectphase($request,undef,$symb));
- } elsif ($command eq 'scantron_warning' && $perm{'mgr'}) {
+ $request->print(&scantron_selectphase($request,undef,$symb));
+ } elsif ($command eq 'scantron_warning' && $perm{'mgr'}) {
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1);
- $request->print(&scantron_do_warning($request,$symb));
- } elsif ($command eq 'scantron_validate' && $perm{'mgr'}) {
+ $request->print(&scantron_do_warning($request,$symb));
+ } elsif ($command eq 'scantron_validate' && $perm{'mgr'}) {
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1);
- $request->print(&scantron_validate_file($request,$symb));
- } elsif ($command eq 'scantron_process' && $perm{'mgr'}) {
+ $request->print(&scantron_validate_file($request,$symb));
+ } elsif ($command eq 'scantron_process' && $perm{'mgr'}) {
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1);
- $request->print(&scantron_process_students($request,$symb));
- } elsif ($command eq 'scantronupload' &&
- (&Apache::lonnet::allowed('usc',$env{'request.role.domain'})||
- &Apache::lonnet::allowed('usc',$env{'request.course.id'}))) {
+ $request->print(&scantron_process_students($request,$symb));
+ } elsif ($command eq 'scantronupload' &&
+ (&Apache::lonnet::allowed('usc',$env{'request.role.domain'})||
+ &Apache::lonnet::allowed('usc',$env{'request.course.id'}))) {
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1,
undef,undef,undef,undef,'toggleScantab(document.rules);');
- $request->print(&scantron_upload_scantron_data($request,$symb));
- } elsif ($command eq 'scantronupload_save' &&
- (&Apache::lonnet::allowed('usc',$env{'request.role.domain'})||
- &Apache::lonnet::allowed('usc',$env{'request.course.id'}))) {
+ $request->print(&scantron_upload_scantron_data($request,$symb));
+ } elsif ($command eq 'scantronupload_save' &&
+ (&Apache::lonnet::allowed('usc',$env{'request.role.domain'})||
+ &Apache::lonnet::allowed('usc',$env{'request.course.id'}))) {
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1);
- $request->print(&scantron_upload_scantron_data_save($request,$symb));
- } elsif ($command eq 'scantron_download' &&
- &Apache::lonnet::allowed('usc',$env{'request.course.id'})) {
+ $request->print(&scantron_upload_scantron_data_save($request,$symb));
+ } elsif ($command eq 'scantron_download' &&
+ &Apache::lonnet::allowed('usc',$env{'request.course.id'})) {
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1);
- $request->print(&scantron_download_scantron_data($request,$symb));
+ $request->print(&scantron_download_scantron_data($request,$symb));
} elsif ($command eq 'checksubmissions' && $perm{'vgr'}) {
&startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1);
$request->print(&checkscantron_results($request,$symb));
} elsif ($command eq 'downloadfilesselect' && $perm{'vgr'}) {
- my $js = &part_selector_js();
- my $onload = "toggleParts('gradingMenu');";
- &startpage($request,$symb,[{href=>'', text=>'Select which submissions to download'}],
- undef,undef,undef,undef,undef,$js,$onload);
+ &startpage($request,$symb,[{href=>'', text=>'Select which submissions to download'}]);
$request->print(&submit_options_download($request,$symb));
} elsif ($command eq 'downloadfileslink' && $perm{'vgr'}) {
&startpage($request,$symb,
[{href=>&href_symb_cmd($symb,'downloadfilesselect'), text=>'Select which submissions to download'},
- {href=>'', text=>'Download submitted files'}],
- undef,undef,undef,undef,undef,undef,undef,1);
- $request->print('');
+ {href=>'', text=>'Download submitted files'}]);
&submit_download_link($request,$symb);
- } elsif ($command) {
+ } elsif ($command) {
&startpage($request,$symb,[{href=>'', text=>'Access denied'}]);
- $request->print(''.&mt('Access Denied ([_1])',$command).' ');
- }
+ $request->print(''.&mt('Access Denied ([_1])',$command).' ');
+ }
}
if ($ssi_error) {
&ssi_print_error($request);
}
- $request->print(&Apache::loncommon::end_page());
+ if ($env{'form.inhibitmenu'}) {
+ $request->print(&Apache::loncommon::end_page());
+ } else {
+ &Apache::lonquickgrades::endGradeScreen($request);
+ }
&reset_caches();
return OK;
}
@@ -11267,7 +10964,7 @@ described at http://www.lon-capa.org.
=head1 OVERVIEW
Do an ssi with retries:
-While I'd love to factor out this with the vesrion in lonprintout,
+While I'd love to factor out this with the version in lonprintout,
that would either require a data coupling between modules, which I refuse to perpetuate (there's quite enough of that already), or would require the invention of another infrastructure
I'm not quite ready to invent (e.g. an ssi_with_retry object).
@@ -11314,6 +11011,75 @@ ssi_with_retries()
=over
+=head1 Routines to display previous version of a Task for a specific student
+
+Tasks are graded pass/fail. Students who have yet to pass a particular Task
+can receive another opportunity. Access to tasks is slot-based. If a slot
+requires a proctor to check-in the student, a new version of the Task will
+be created when the student is checked in to the new opportunity.
+
+If a particular student has tried two or more versions of a particular task,
+the submission screen provides a user with vgr privileges (e.g., a Course
+Coordinator) the ability to display a previous version worked on by the
+student. By default, the current version is displayed. If a previous version
+has been selected for display, submission data are only shown that pertain
+to that particular version, and the interface to submit grades is not shown.
+
+=over 4
+
+=item show_previous_task_version()
+
+Displays a specified version of a student's Task, as the student sees it.
+
+Inputs: 2
+ request - request object
+ symb - unique symb for current instance of resource
+
+Output: None.
+
+Side Effects: calls &show_problem() to print version of Task, with
+ version contained in form item: $env{'form.previousversion'}
+
+=item choose_task_version_form()
+
+Displays a web form used to select which version of a student's view of a
+Task should be displayed. Either launches a pop-up window, or replaces
+content in existing pop-up, or replaces page in main window.
+
+Inputs: 4
+ symb - unique symb for current instance of resource
+ uname - username of student
+ udom - domain of student
+ nomenu - 1 if display is in a pop-up window, and hence no menu
+ breadcrumbs etc., are displayed
+
+Output: 4
+ current - student's current version
+ displayed - student's version being displayed
+ result - scalar containing HTML for web form used to switch to
+ a different version (or a link to close window, if pop-up).
+ js - javascript for processing selection in versions web form
+
+Side Effects: None.
+
+=item previous_display_javascript()
+
+Inputs: 2
+ nomenu - 1 if display is in a pop-up window, and hence no menu
+ breadcrumbs etc., are displayed.
+ current - student's current version number.
+
+Output: 1
+ js - javascript for processing selection in versions web form.
+
+Side Effects: None.
+
+=back
+
+=head1 Routines to process bubblesheet data.
+
+=over 4
+
=item scantron_get_correction() :
Builds the interface screen to interact with the operator to fix a
@@ -11340,8 +11106,8 @@ ssi_with_retries()
- missingbubble - array ref of the bubble lines that have missing
bubble errors
- $randomorder - True if exam folder (or a sub-folder) has randomorder set
- $randompick - True if exam folder (or a sub-folder) has randompick set
+ $randomorder - True if exam folder has randomorder set
+ $randompick - True if exam folder has randompick set
$respnumlookup - Reference to HASH mapping question numbers in bubble lines
for current line to question number used for same question
in "Master Seqence" (as seen by Course Coordinator).
@@ -11350,6 +11116,7 @@ ssi_with_retries()
or code-based randompick and/or randomorder.
+
=item scantron_get_maxbubble() :
Arguments:
@@ -11429,7 +11196,9 @@ ssi_with_retries()
=item navmap_errormsg() :
Returns HTML mark-up inside a with a link to re-initialize the course.
- Should be called whenever the request to instantiate a navmap object fails.
+ Should be called whenever the request to instantiate a navmap object fails.
+
+=back
=back
| |