||g;
$studentTable.=' '.$title.' '.&mt('Correct answer').': '.$companswer;
- }
+ }
}
my %record = &Apache::lonnet::restore($symbx,$env{'request.course.id'},$udom,$uname);
@@ -6637,11 +5172,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,
@@ -6663,14 +5197,10 @@ sub displayPage {
}
$curRes = $iterator->next();
}
- my $disabled;
- unless (&canmodify($usec)) {
- $disabled = ' disabled="disabled"';
- }
$studentTable.=
'
'."\n".
- ' '.
''."\n";
$request->print($studentTable);
@@ -6700,7 +5230,7 @@ sub displaySubByDates {
if ($is_tool) {
return ' '.&mt('No grade passed back.').' ';
} else {
- return ' '.&mt('Nothing submitted - no attempts.').' ';
+ return ' '.&mt('Nothing submitted - no attempts.').' ';
}
}
@@ -6734,13 +5264,13 @@ 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));
+ @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);
@@ -6751,7 +5281,7 @@ sub displaySubByDates {
$displaySub[0].=$$record{"$version:resource.$partid.awarded"};
} else {
my ($responseId)= ($isTask ? ($matchKey=~ /^resource\.(.*?)\.\Q$partid\E\.award$/)
- : ($matchKey=~ /^resource\.\Q$partid\E\.(.*?)\.submission$/));
+ : ($matchKey=~ /^resource\.\Q$partid\E\.(.*?)\.submission$/));
$displaySub[0].='';
$displaySub[0].=''.&mt('Part: [_1]',$display_part).' '
.' '
@@ -6770,8 +5300,8 @@ sub displaySubByDates {
$displaySub[0].=&mt('Trial not counted');
} else {
$displaySub[0].=&mt('Trial: [_1]',
- $$record{"$where.$partid.tries"});
- if (($rndseed ne '') && ($lastrndseed{$partid} ne '')) {
+ $$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').')';
@@ -6779,12 +5309,12 @@ sub displaySubByDates {
}
$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}=
+ }
+ 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);
}
@@ -6806,16 +5336,16 @@ 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');
- }
+ } 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"};
- unless ($is_tool) {
+ unless ($is_tool) {
$displaySub[2].=' ('.&mt('Part').': '.$display_part.')';
- }
+ }
} elsif ($$record{"$version:resource.$partid.regrader"} =~ /\S/) {
$displaySub[2].=
$$record{"$version:resource.$partid.regrader"};
@@ -6886,7 +5416,6 @@ sub updateGradeByPage {
$iterator->next(); # skip the first BEGIN_MAP
my $curRes = $iterator->next(); # for "current resource"
my ($depth,$question,$prob,$changeflag,$hideflag)= (1,1,1,0,0);
- my (@updates,%weights,%excuseds,%awardeds,@symbs_in_map);
while ($depth > 0) {
if($curRes == $iterator->BEGIN_MAP) { $depth++; }
if($curRes == $iterator->END_MAP) { $depth--; }
@@ -6895,7 +5424,6 @@ sub updateGradeByPage {
my $parts = $curRes->parts();
my $title = $curRes->compTitle();
my $symbx = $curRes->symb();
- push(@symbs_in_map,$symbx);
$studentTable.=
&Apache::loncommon::start_data_table_row().
' '.$prob.
@@ -6908,37 +5436,18 @@ 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);
my $numchgs = &makehidden($version,$parts,\%record,$symbx,$udom,$uname,1);
- if ($numchgs) {
- push(@updates,$symbx);
- }
$hideflag += $numchgs;
}
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;
- $weights{$symbx}{$partid} = $wgt;
- $excuseds{$symbx}{$partid} = '';
my $partial = $newpts/$wgt;
my $score;
if ($partial > 0) {
@@ -6950,7 +5459,6 @@ sub updateGradeByPage {
if ($dropMenu eq 'excused') {
$partial = '';
$score = 'excused';
- $excuseds{$symbx}{$partid} = 1;
} elsif ($dropMenu eq 'reset status'
&& $env{'form.solved'.$question.'_'.$partid} ne '') { #update only if previous record exists
$newrecord{'resource.'.$partid.'.tries'} = 0;
@@ -6978,11 +5486,6 @@ sub updateGradeByPage {
(($score eq 'excused') ? 'excused' : $newpts).
' ';
$question++;
- if (($newpts eq '') || ($partial eq '')) {
- $awardeds{$symbx}{$partid} = 0;
- } else {
- $awardeds{$symbx}{$partid} = $partial;
- }
next if ($dropMenu eq 'reset status' || ($newpts eq $oldpts && $score ne 'excused'));
$newrecord{'resource.'.$partid.'.awarded'} = $partial if $partial ne '';
@@ -7008,7 +5511,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) {
@@ -7022,9 +5525,6 @@ sub updateGradeByPage {
&Apache::loncommon::end_data_table_row();
$prob++;
- if ($changeflag) {
- push(@updates,$symbx);
- }
}
$curRes = $iterator->next();
}
@@ -7038,95 +5538,9 @@ sub updateGradeByPage {
$hideflag).' ');
$request->print($hidemsg.$grademsg.$studentTable);
- if (@updates) {
- my (@allsymbs,$mapsymb,@recurseup,%parentmapsymbs,%possmappb,%possrespb);
- @allsymbs = @updates;
- if (ref($map)) {
- $mapsymb = $map->symb();
- push(@allsymbs,$mapsymb);
- @recurseup = $navmap->recurseup_maps($map->src,1);
- }
- if (@recurseup) {
- push(@allsymbs,@recurseup);
- map { $parentmapsymbs{$_} = 1; } @recurseup;
- }
- my %passback = &Apache::lonnet::get('nohist_linkprot_passback',\@allsymbs,$cdom,$cnum);
- my (%uniqsymbs,$use_symbs_in_map,%launch_to_symb);
- if (keys(%passback)) {
- foreach my $possible (keys(%passback)) {
- if (ref($passback{$possible}) eq 'HASH') {
- if ($possible eq $mapsymb) {
- foreach my $launcher (keys(%{$passback{$possible}})) {
- $possmappb{$launcher} = 1;
- $launch_to_symb{$launcher} = $possible;
- }
- $use_symbs_in_map = 1;
- } elsif (exists($parentmapsymbs{$possible})) {
- foreach my $launcher (keys(%{$passback{$possible}})) {
- my ($linkuri,$linkprotector,$scope) = split(/\0/,$launcher);
- if ($scope eq 'rec') {
- $possmappb{$launcher} = 1;
- $use_symbs_in_map = 1;
- $launch_to_symb{$launcher} = $possible;
- }
- }
- } elsif (grep(/^\Q$possible$\E$/,@updates)) {
- foreach my $launcher (keys(%{$passback{$possible}})) {
- $possrespb{$launcher} = 1;
- $launch_to_symb{$launcher} = $possible;
- }
- $uniqsymbs{$possible} = 1;
- }
- }
- }
- }
- if ($use_symbs_in_map) {
- map { $uniqsymbs{$_} = 1; } @symbs_in_map;
- }
- my @posslaunchers;
- if (keys(%possmappb)) {
- push(@posslaunchers,keys(%possmappb));
- }
- if (keys(%possrespb)) {
- push(@posslaunchers,keys(%possrespb));
- }
- if (@posslaunchers) {
- my (%pbsave,%skip_passback,%needpb);
- my %pbids = &Apache::lonnet::get('nohist_'.$cdom.'_'.$cnum.'_linkprot_pb',\@posslaunchers,$udom,$uname);
- foreach my $key (keys(%pbids)) {
- if (ref($pbids{$key}) eq 'ARRAY') {
- if ($launch_to_symb{$key}) {
- $needpb{$key} = $launch_to_symb{$key};
- }
- }
- }
- my @symbs = keys(%uniqsymbs);
- &process_passbacks('updatebypage',\@symbs,$cdom,$cnum,$udom,$uname,$usec,\%weights,
- \%awardeds,\%excuseds,\%needpb,\%skip_passback,\%pbsave,\%pbids);
- if (@Apache::grades::ltipassback) {
- unless ($registered_cleanup) {
- my $handlers = $request->get_handlers('PerlCleanupHandler');
- $request->set_handlers('PerlCleanupHandler' =>
- [\&Apache::grades::make_passback,@{$handlers}]);
- $registered_cleanup=1;
- }
- }
- }
- }
return '';
}
-sub make_passback {
- if (@Apache::grades::ltipassback) {
- my $lonhost = $Apache::lonnet::perlvar{'lonHostID'};
- my $ip = &Apache::lonnet::get_host_ip($lonhost);
- foreach my $item (@Apache::grades::ltipassback) {
- &Apache::lonhomework::run_passback($item,$lonhost,$ip);
- }
- undef(@Apache::grades::ltipassback);
- }
-}
-
#-------- end of section for handling grading by page/sequence ---------
#
#-------------------------------------------------------------------
@@ -7196,7 +5610,7 @@ the homework problem.
sub defaultFormData {
my ($symb)=@_;
- return ' ';
+ return ' ';
}
@@ -7349,7 +5763,7 @@ sub scantron_uploads {
sub scantron_scantab {
my $result=''."\n";
$result.=' '."\n";
- my @lines = &Apache::lonnet::get_scantronformat_file();
+ my @lines = &get_scantronformat_file();
if (@lines > 0) {
foreach my $line (@lines) {
next if (($line =~ /^\#/) || ($line eq ''));
@@ -7361,6 +5775,62 @@ sub scantron_scantab {
return $result;
}
+=pod
+
+=item get_scantronformat_file
+
+ Returns an array containing lines from the scantron format file for
+ the domain of the course.
+
+ If a url for a custom.tab file is listed in domain's configuration.db,
+ lines are from this file.
+
+ Otherwise, if a default.tab has been published in RES space by the
+ domainconfig user, lines are from this file.
+
+ Otherwise, fall back to getting lines from the legacy file on the
+ local server: /home/httpd/lonTabs/default_scantronformat.tab
+
+=cut
+
+sub get_scantronformat_file {
+ my $cdom= $env{'course.'.$env{'request.course.id'}.'.domain'};
+ my %domconfig = &Apache::lonnet::get_dom('configuration',['scantron'],$cdom);
+ my $gottab = 0;
+ my @lines;
+ if (ref($domconfig{'scantron'}) eq 'HASH') {
+ if ($domconfig{'scantron'}{'scantronformat'} ne '') {
+ my $formatfile = &Apache::lonnet::getfile($Apache::lonnet::perlvar{'lonDocRoot'}.$domconfig{'scantron'}{'scantronformat'});
+ if ($formatfile ne '-1') {
+ @lines = split("\n",$formatfile,-1);
+ $gottab = 1;
+ }
+ }
+ }
+ if (!$gottab) {
+ my $confname = $cdom.'-domainconfig';
+ my $default = $Apache::lonnet::perlvar{'lonDocRoot'}.'/res/'.$cdom.'/'.$confname.'/default.tab';
+ my $formatfile = &Apache::lonnet::getfile($default);
+ if ($formatfile ne '-1') {
+ @lines = split("\n",$formatfile,-1);
+ $gottab = 1;
+ }
+ }
+ if (!$gottab) {
+ my @domains = &Apache::lonnet::current_machine_domains();
+ if (grep(/^\Q$cdom\E$/,@domains)) {
+ my $fh=Apache::File->new($Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab');
+ @lines = <$fh>;
+ close($fh);
+ } else {
+ my $fh=Apache::File->new($Apache::lonnet::perlvar{'lonTabDir'}.'/default_scantronformat.tab');
+ @lines = <$fh>;
+ close($fh);
+ }
+ }
+ return @lines;
+}
+
=pod
=item scantron_CODElist
@@ -7442,58 +5912,49 @@ 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('
+
+ '.&Apache::loncommon::start_data_table('LC_scantron_action').'
+ '.&Apache::loncommon::start_data_table_header_row().'
+
+ '.&mt('Specify a bubblesheet data file to upload.').'
+
+ '.&Apache::loncommon::end_data_table_header_row().'
+ '.&Apache::loncommon::start_data_table_row().'
+
+');
+ my $default_form_data=&defaultFormData($symb);
+ 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);
+ $r->print(&Apache::lonhtmlcommon::scripttag('
function checkUpload(formname) {
- if (formname.upfile.value == "") {
- alert("'.$alertmsg.'");
- return false;
- }
- formname.submit();
- }'."\n".$formatjs));
- $r->print('
+ if (formname.upfile.value == "") {
+ alert("'.$alertmsg.'");
+ return false;
+ }
+ formname.submit();
+ }'));
+ $r->print('
'
- );
+ '.&mt('File to upload: [_1]',' ').'
+
+
+
+');
+ $r->print('
+
+ '.&Apache::loncommon::end_data_table_row().'
+ '.&Apache::loncommon::end_data_table().'
+');
}
# Chunk of form to prompt for a file to grade and how:
@@ -7543,6 +6004,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.
@@ -7604,12 +6067,106 @@ sub scantron_selectphase {
return;
}
+=pod
+
+=item get_scantron_config
+
+ Parse and return the bubblesheet configuration line selected as a
+ hash of configuration file fields.
+
+ Arguments:
+ which - the name of the configuration to parse from the file.
+
+
+ Returns:
+ If the named configuration is not in the file, an empty
+ hash is returned.
+ a hash with the fields
+ name - internal name for the this configuration setup
+ description - text to display to operator that describes this config
+ CODElocation - if 0 or the string 'none'
+ - no CODE exists for this config
+ if -1 || the string 'letter'
+ - a CODE exists for this config and is
+ a string of letters
+ Unsupported value (but planned for future support)
+ if a positive integer
+ - The CODE exists as the first n items from
+ the question section of the form
+ if the string 'number'
+ - The CODE exists for this config and is
+ a string of numbers
+ CODEstart - (only matter if a CODE exists) column in the line where
+ the CODE starts
+ CODElength - length of the CODE
+ IDstart - column where the student/employee ID starts
+ IDlength - length of the student/employee ID info
+ Qstart - column where the information from the bubbled
+ 'questions' start
+ Qlength - number of columns comprising a single bubble line from
+ the sheet. (usually either 1 or 10)
+ Qon - either a single character representing the character used
+ to signal a bubble was chosen in the positional setup, or
+ the string 'letter' if the letter of the chosen bubble is
+ in the final, or 'number' if a number representing the
+ chosen bubble is in the file (1->A 0->J)
+ Qoff - the character used to represent that a bubble was
+ left blank
+ PaperID - if the scanning process generates a unique number for each
+ sheet scanned the column that this ID number starts in
+ PaperIDlength - number of columns that comprise the unique ID number
+ for the sheet of paper
+ FirstName - column that the first name starts in
+ FirstNameLength - number of columns that the first name spans
+
+ LastName - column that the last name starts in
+ LastNameLength - number of columns that the last name spans
+ BubblesPerRow - number of bubbles available in each row used to
+ bubble an answer. (If not specified, 10 assumed).
+
+=cut
+
+sub get_scantron_config {
+ my ($which) = @_;
+ my @lines = &get_scantronformat_file();
+ my %config;
+ #FIXME probably should move to XML it has already gotten a bit much now
+ foreach my $line (@lines) {
+ my ($name,$descrip)=split(/:/,$line);
+ if ($name ne $which ) { next; }
+ chomp($line);
+ my @config=split(/:/,$line);
+ $config{'name'}=$config[0];
+ $config{'description'}=$config[1];
+ $config{'CODElocation'}=$config[2];
+ $config{'CODEstart'}=$config[3];
+ $config{'CODElength'}=$config[4];
+ $config{'IDstart'}=$config[5];
+ $config{'IDlength'}=$config[6];
+ $config{'Qstart'}=$config[7];
+ $config{'Qlength'}=$config[8];
+ $config{'Qoff'}=$config[9];
+ $config{'Qon'}=$config[10];
+ $config{'PaperID'}=$config[11];
+ $config{'PaperIDlength'}=$config[12];
+ $config{'FirstName'}=$config[13];
+ $config{'FirstNamelength'}=$config[14];
+ $config{'LastName'}=$config[15];
+ $config{'LastNamelength'}=$config[16];
+ $config{'BubblesPerRow'}=$config[17];
+ last;
+ }
+ return %config;
+}
+
=pod
=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:
@@ -7649,7 +6206,7 @@ sub username_to_idmap {
Process a requested correction to a scanline.
Arguments:
- $scantron_config - hash from &Apache::lonnet::get_scantron_config()
+ $scantron_config - hash from &get_scantron_config()
$scan_data - hash of correction information
(see &scantron_getfile())
$line - existing scanline
@@ -7809,12 +6366,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
@@ -7839,7 +6396,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
@@ -7932,7 +6489,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;
@@ -7946,7 +6503,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;
@@ -8006,12 +6563,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;
@@ -8019,14 +6573,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;
@@ -8096,7 +6642,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') ||
@@ -8343,7 +6889,7 @@ sub scantron_filter {
sub scantron_process_corrections {
my ($r) = @_;
- my %scantron_config=&Apache::lonnet::get_scantron_config($env{'form.scantron_format'});
+ my %scantron_config=&get_scantron_config($env{'form.scantron_format'});
my ($scanlines,$scan_data)=&scantron_getfile();
my $classlist=&Apache::loncoursedata::get_classlist();
my $which=$env{'form.scantron_line'};
@@ -8392,7 +6938,7 @@ sub scantron_process_corrections {
}
}
if ($err) {
- $r->print(
+ $r->print(
''
.&mt('Unable to accept last correction, an error occurred: [_1]',
$errmsg)
@@ -8512,7 +7058,7 @@ sub check_for_error {
sub scantron_warning_screen {
my ($button_text,$symb)=@_;
my $title=&Apache::lonnet::gettitle($env{'form.selectpage'});
- my %scantron_config=&Apache::lonnet::get_scantron_config($env{'form.scantron_format'});
+ my %scantron_config=&get_scantron_config($env{'form.scantron_format'});
my $CODElist;
if ($scantron_config{'CODElocation'} &&
$scantron_config{'CODEstart'} &&
@@ -8668,7 +7214,7 @@ sub scantron_validate_file {
#get the student pick code ready
$r->print(&Apache::loncommon::studentbrowser_javascript());
my $nav_error;
- my %scantron_config=&Apache::lonnet::get_scantron_config($env{'form.scantron_format'});
+ my %scantron_config=&get_scantron_config($env{'form.scantron_format'});
my $max_bubble=&scantron_get_maxbubble(\$nav_error,\%scantron_config);
if ($nav_error) {
$r->print(&navmap_errormsg());
@@ -8695,7 +7241,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';
@@ -8725,7 +7271,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(' ');
@@ -9104,9 +7650,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.')
.'
'
);
@@ -9127,7 +7674,7 @@ sub scantron_validate_ID {
my %idmap=&username_to_idmap($classlist);
#get scantron line setup
- my %scantron_config=&Apache::lonnet::get_scantron_config($env{'form.scantron_format'});
+ my %scantron_config=&get_scantron_config($env{'form.scantron_format'});
my ($scanlines,$scan_data)=&scantron_getfile();
my $nav_error;
@@ -9228,10 +7775,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");
@@ -9251,8 +7798,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");
@@ -9349,7 +7896,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);
@@ -9374,7 +7921,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 {
@@ -9560,7 +8108,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. ")." ");
}
@@ -9587,7 +8144,7 @@ sub prompt_for_corrections {
Arguments:
$r - Apache request object
- $scan_config - hash from &Apache::lonnet::get_scantron_config()
+ $scan_config - hash from &get_scantron_config()
$line - Number of the line being displayed.
$questionnum - Question number (may include subquestion)
$error - Type of error.
@@ -9600,7 +8157,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'};
@@ -9751,7 +8308,7 @@ sub get_codes {
sub scantron_validate_CODE {
my ($r,$currentphase) = @_;
- my %scantron_config=&Apache::lonnet::get_scantron_config($env{'form.scantron_format'});
+ my %scantron_config=&get_scantron_config($env{'form.scantron_format'});
if ($scantron_config{'CODElocation'} &&
$scantron_config{'CODEstart'} &&
$scantron_config{'CODElength'}) {
@@ -9825,7 +8382,7 @@ sub scantron_validate_doublebubble {
&Apache::lonnet::decode_symb($env{'form.selectpage'});
#get scantron line setup
- my %scantron_config=&Apache::lonnet::get_scantron_config($env{'form.scantron_format'});
+ my %scantron_config=&get_scantron_config($env{'form.scantron_format'});
my ($scanlines,$scan_data)=&scantron_getfile();
my $navmap = Apache::lonnavmaps::navmap->new();
@@ -9843,17 +8400,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) {
@@ -9930,7 +8476,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')) {
@@ -9981,7 +8527,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;
@@ -10018,7 +8564,7 @@ sub scantron_validate_missingbubbles {
&Apache::lonnet::decode_symb($env{'form.selectpage'});
#get scantron line setup
- my %scantron_config=&Apache::lonnet::get_scantron_config($env{'form.scantron_format'});
+ my %scantron_config=&get_scantron_config($env{'form.scantron_format'});
my ($scanlines,$scan_data)=&scantron_getfile();
my $navmap = Apache::lonnavmaps::navmap->new();
@@ -10037,17 +8583,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) {
@@ -10073,9 +8608,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; }
@@ -10086,36 +8621,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);
@@ -10158,7 +8693,7 @@ sub hand_bubble_option {
}
}
if ($needs_hand_bubbles) {
- my %scantron_config=&Apache::lonnet::get_scantron_config($env{'form.scantron_format'});
+ my %scantron_config=&get_scantron_config($env{'form.scantron_format'});
my $bubbles_per_row = &bubblesheet_bubbles_per_row(\%scantron_config);
return &mt('The sequence to be graded contains response types which are handgraded.').''.
&mt('If you have already graded these by bubbling sheets to indicate points awarded, [_1]what point value is assigned to a filled last bubble in each row?',' ').
@@ -10177,8 +8712,8 @@ 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 %scantron_config=&get_scantron_config($env{'form.scantron_format'});
+ 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);
@@ -10189,21 +8724,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 '';
@@ -10211,7 +8735,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 '';
@@ -10256,7 +8780,7 @@ SCANTRONFORM
return ''; # Dunno why the other returns return '' rather than just returning.
}
- my %lettdig = &Apache::lonnet::letter_to_digits();
+ my %lettdig = &letter_to_digits();
my $numletts = scalar(keys(%lettdig));
my %orderedforcode;
@@ -10273,7 +8797,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,
@@ -10303,7 +8827,7 @@ SCANTRONFORM
my @mapresources = @resources;
if ($randomorder || $randompick) {
- @mapresources =
+ @mapresources =
&users_order($user,$scancode,$sequence,\@master_seq,\%symb_to_resource,
\%orderedforcode);
}
@@ -10358,16 +8882,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'}) {
@@ -10397,7 +8916,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("");
@@ -10490,7 +9009,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
@@ -10517,7 +9036,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;
}
}
@@ -10530,7 +9049,7 @@ sub users_order {
$master_seq,
$user,undef,1);
if (ref($actual_seq) eq 'ARRAY') {
- @mapresources =
+ @mapresources =
map { $symb_to_resource->{$_}; } @{$actual_seq};
}
}
@@ -10586,16 +9105,15 @@ 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');
$r->print(&Apache::loncommon::coursebrowser_javascript($dom));
my $select_link=&Apache::loncommon::selectcourse_link('rules','courseid',
'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);
@@ -10628,7 +9146,6 @@ sub scantron_upload_scantron_data {
return;
}
- '.$formatjs.'
'));
$r->print('
'.&mt('Send bubblesheet data to a course').'
@@ -10644,12 +9161,7 @@ sub scantron_upload_scantron_data {
&Apache::lonhtmlcommon::row_closure().
&Apache::lonhtmlcommon::row_title(&mt('Domain')).
' '.$domdesc.
- &Apache::lonhtmlcommon::row_closure());
- if ($formatoptions) {
- $r->print(&Apache::lonhtmlcommon::row_title($formattitle).$formatoptions.
- &Apache::lonhtmlcommon::row_closure());
- }
- $r->print(
+ &Apache::lonhtmlcommon::row_closure().
&Apache::lonhtmlcommon::row_title(&mt('File to upload')).
' '.
&Apache::lonhtmlcommon::row_closure(1).
@@ -10662,87 +9174,9 @@ sub scantron_upload_scantron_data {
return '';
}
-sub scantron_upload_dataformat {
- my ($dom) = @_;
- my ($formatoptions,$formattitle,$formatjs);
- $formatjs = <<'END';
-function toggleScantab(form) {
- return;
-}
-END
- my %domconfig = &Apache::lonnet::get_dom('configuration',['scantron'],$dom);
- if (ref($domconfig{'scantron'}) eq 'HASH') {
- if (ref($domconfig{'scantron'}{'config'}) eq 'HASH') {
- 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 (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 ''));
- $singleline = $line;
- $count ++;
- }
- if ($count > 1) {
- $formatextra = ''.
- ''.
- &mt('Bubblesheet type').': '.
- &scantron_scantab().'
';
- $onclick = ' onclick="toggleScantab(this.form);"';
- $formatjs = <<"END";
-function toggleScantab(form) {
- var divid = 'bubbletype';
- if (document.getElementById(divid)) {
- var radioname = 'fileformat';
- var num = form.elements[radioname].length;
- if (num) {
- for (var i=0; i ';
- }
- $formattitle = &mt('File format');
- $formatoptions = ' '.
- &mt('Plain Text (no delimiters)').
- ' '.(' 'x2).
- ' '.
- &mt('Comma separated values').' '.$formatextra;
- }
- }
- }
- } elsif (keys(%{$domconfig{'scantron'}{'config'}}) == 1) {
- if (ref($domconfig{'scantron'}{'config'}{'csv'}{'fields'}) eq 'HASH') {
- if (keys(%{$domconfig{'scantron'}{'config'}{'csv'}{'fields'}})) {
- $formattitle = &mt('Bubblesheet type');
- $formatoptions = &scantron_scantab();
- }
- }
- }
- }
- }
- return ($formatoptions,$formattitle,$formatjs);
-}
sub scantron_upload_scantron_data_save {
- my ($r,$symb) = @_;
+ my($r,$symb)=@_;
my $doanotherupload=
' ';
return $result;
}
@@ -11582,34 +9952,26 @@ sub selectfield {
(&transtatus_options,
'select_form_order' => ['yes','incorrect','all']);
} else {
- %options =
+ %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 $result='
-
+
'.&mt('Sections').'
'.&Apache::lonstatistics::SectionSelect('section','multiple',5).'
-
+
'.&mt('Groups').'
'.&Apache::lonstatistics::GroupSelect('group','multiple',5).'
-
+
'.&mt('Access Status').'
@@ -11784,7 +10146,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);
@@ -11845,12 +10207,12 @@ ENDUPFORM
ENDGRADINGFORM
- $result.=' '.&Apache::loncommon::end_data_table_row().
+ $result.=''.&Apache::loncommon::end_data_table_row().
&Apache::loncommon::start_data_table_row().''.(<$pcorrect:
$pincorrect:
-
+'
ENDPERCFORM
$result.=' '.
&Apache::loncommon::end_data_table_row().
@@ -11859,7 +10221,7 @@ ENDPERCFORM
}
sub process_clicker_file {
- my ($r,$symb) = @_;
+ my ($r,$symb)=@_;
if (!$symb) {return '';}
my %Saveable_Parameters=&clicker_grading_parameters();
@@ -11931,22 +10293,6 @@ sub process_clicker_file {
''.&HTML::Entities::encode($env{'form.upfile.filename'},'<>&"').' '),1);
return $result;
}
- my $mimetype;
- if ($env{'form.upfiletype'} eq 'iclicker') {
- my $mm = new File::MMagic;
- $mimetype = $mm->checktype_contents($env{'form.upfile'});
- unless (($mimetype eq 'text/plain') || ($mimetype eq 'text/html')) {
- $result.= ''.
- &Apache::lonhtmlcommon::confirm_success(
- &mt('File format is neither csv (iclicker 6) nor xml (iclicker 7)'),1).'
';
- return $result;
- }
- } elsif (($env{'form.upfiletype'} ne 'interwrite') && ($env{'form.upfiletype'} ne 'turning')) {
- $result .= ''.
- &Apache::lonhtmlcommon::confirm_success(
- &mt('Invalid clicker type: choose one of: i>clicker, Interwrite PRS, or Turning Technologies.'),1).'
';
- return $result;
- }
# Were able to get all the info needed, now analyze the file
@@ -11973,14 +10319,12 @@ ENDHEADER
my $errormsg='';
my $number=0;
if ($env{'form.upfiletype'} eq 'iclicker') {
- if ($mimetype eq 'text/plain') {
- ($errormsg,$number)=&iclicker_eval(\@questiontitles,\%responses);
- } elsif ($mimetype eq 'text/html') {
- ($errormsg,$number)=&iclickerxml_eval(\@questiontitles,\%responses);
- }
- } elsif ($env{'form.upfiletype'} eq 'interwrite') {
+ ($errormsg,$number)=&iclicker_eval(\@questiontitles,\%responses);
+ }
+ if ($env{'form.upfiletype'} eq 'interwrite') {
($errormsg,$number)=&interwrite_eval(\@questiontitles,\%responses);
- } elsif ($env{'form.upfiletype'} eq 'turning') {
+ }
+ if ($env{'form.upfiletype'} eq 'turning') {
($errormsg,$number)=&turning_eval(\@questiontitles,\%responses);
}
$result.=' '.&mt('Found [_1] question(s)',$number).' '.
@@ -12033,7 +10377,7 @@ ENDHEADER
"\n".&mt("Username").": ".
"\n".&mt("Domain").": ".
&Apache::loncommon::select_dom_form($env{'course.'.$env{'request.course.id'}.'.domain'},'udom'.$id).' '.
- &Apache::loncommon::selectstudent_link('clickeranalysis','uname'.$id,'udom'.$id,'',$id);
+ &Apache::loncommon::selectstudent_link('clickeranalysis','uname'.$id,'udom'.$id,0,$id);
$unknown_count++;
}
}
@@ -12088,49 +10432,6 @@ sub iclicker_eval {
return ($errormsg,$number);
}
-sub iclickerxml_eval {
- my ($questiontitles,$responses)=@_;
- my $number=0;
- my $errormsg='';
- my @state;
- my %respbyid;
- my $p = HTML::Parser->new
- (
- xml_mode => 1,
- start_h =>
- [sub {
- my ($tagname,$attr) = @_;
- push(@state,$tagname);
- if ("@state" eq "ssn p") {
- my $title = $attr->{qn};
- $title =~ s/(^\s+|\s+$)//g;
- $questiontitles->[$number]=$title;
- } elsif ("@state" eq "ssn p v") {
- my $id = $attr->{id};
- my $entry = $attr->{ans};
- $id=~s/^[\#0]+//;
- $entry =~s/[^a-zA-Z0-9\.\*\-\+]+//g;
- $respbyid{$id}[$number] = $entry;
- }
- }, "tagname, attr"],
- end_h =>
- [sub {
- my ($tagname) = @_;
- if ("@state" eq "ssn p") {
- $number++;
- }
- pop(@state);
- }, "tagname"],
- );
-
- $p->parse($env{'form.upfile'});
- $p->eof;
- foreach my $id (keys(%respbyid)) {
- $responses->{$id}=join(',',@{$respbyid{$id}});
- }
- return ($errormsg,$number);
-}
-
sub interwrite_eval {
my ($questiontitles,$responses)=@_;
my $number=0;
@@ -12187,8 +10488,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;
@@ -12196,18 +10498,14 @@ sub assign_clicker_grades {
if ($res_error) {
return &navmap_errormsg();
}
- my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
- my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
- my %needpb = &passbacks_for_symb($cdom,$cnum,$symb);
- my (%skip_passback,%pbsave);
# 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=();
@@ -12262,14 +10560,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 '*') {
@@ -12309,15 +10607,6 @@ sub assign_clicker_grades {
$result.="Failed to save student $username:$domain. Message when trying to save was ($returncode) ";
} else {
$storecount++;
- if (keys(%needpb)) {
- my (%weights,%awardeds,%excuseds);
- my $usec = &Apache::lonnet::getsection($domain,$username,$env{'request.course.id'});
- $weights{$symb}{$part} = &Apache::lonnet::EXT("resource.$part.weight",$symb,$domain,$username,$usec);
- $awardeds{$symb}{$part} = $ave;
- $excuseds{$symb}{$part} = '';
- &process_passbacks('clickergrade',[$symb],$cdom,$cnum,$domain,$username,$usec,\%weights,
- \%awardeds,\%excuseds,\%needpb,\%skip_passback,\%pbsave);
- }
}
}
}
@@ -12337,108 +10626,28 @@ sub navmap_errormsg {
}
sub startpage {
- my ($r,$symb,$crumbs,$onlyfolderflag,$nodisplayflag,$stuvcurrent,$stuvdisp,$nomenu,$head_extra,$onload,$divforres) = @_;
- my %args;
- if ($onload) {
- my %loaditems = (
- 'onload' => $onload,
- );
- $args{'add_entries'} = \%loaditems;
- }
+ my ($r,$symb,$crumbs,$onlyfolderflag,$nodisplayflag,$stuvcurrent,$stuvdisp,$nomenu,$js) = @_;
if ($nomenu) {
- $args{'only_body'} = 1;
- $r->print(&Apache::loncommon::start_page("Student's Version",$head_extra,\%args));
+ $r->print(&Apache::loncommon::start_page("Student's Version",$js,{'only_body' => '1'}));
} else {
- if ($env{'request.course.id'}) {
- unshift(@$crumbs,{href=>&href_symb_cmd($symb,'gradingmenu'),text=>"Grading"});
- }
- $args{'bread_crumbs'} = $crumbs;
- $r->print(&Apache::loncommon::start_page('Grading',$head_extra,\%args));
+ unshift(@$crumbs,{href=>&href_symb_cmd($symb,'gradingmenu'),text=>"Grading"});
+ $r->print(&Apache::loncommon::start_page('Grading',$js,
+ {'bread_crumbs' => $crumbs}));
+ &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').' ');
}
-#----- display problem, answer, and submissions for a single student (no grading)
-
-sub view_as_user {
- my ($symb,$vuname,$vudom,$hasperm) = @_;
- my $plainname = &Apache::loncommon::plainname($vuname,$vudom,'lastname');
- my $displayname = &nameUserString('',$plainname,$vuname,$vudom);
- my $output = &Apache::loncommon::get_student_view($symb,$vuname,$vudom,
- $env{'request.course.id'},
- undef,{'disable_submit' => 1}).
- "\n\n".
- ''.
- '
'.$displayname.' '.
- "\n".
- &Apache::loncommon::track_student_link('View recent activity',
- $vuname,$vudom,'check').' '.
- "\n";
- if (&Apache::lonnet::allowed('opa',$env{'request.course.id'}) ||
- (($env{'request.course.sec'} ne '') &&
- &Apache::lonnet::allowed('opa',$env{'request.course.id'}.'/'.$env{'request.course.sec'}))) {
- $output .= &Apache::loncommon::pprmlink(&mt('Set/Change parameters'),
- $vuname,$vudom,$symb,'check');
- }
- $output .= "\n";
- my $companswer = &Apache::loncommon::get_student_answers($symb,$vuname,$vudom,
- $env{'request.course.id'});
- $companswer=~s|
||g;
- $companswer=~s|name="submit"|name="would_have_been_submit"|g;
- $output .= '
'.
- '
'.&mt('Correct answer for[_1]',$displayname).' '.
- $companswer.
- ''."\n";
- my $is_tool = ($symb =~ /ext\.tool$/);
- my ($essayurl,%coursedesc_by_cid);
- (undef,undef,$essayurl) = &Apache::lonnet::decode_symb($symb);
- my %record = &Apache::lonnet::restore($symb,$env{'request.course.id'},$vudom,$vuname);
- my $res_error;
- my ($partlist,$handgrade,$responseType,$numresp,$numessay) =
- &response_type($symb,\$res_error);
- my $fullname;
- my $collabinfo;
- if ($numessay) {
- unless ($hasperm) {
- &init_perm();
- }
- ($collabinfo,$fullname)=
- &check_collaborators($symb,$vuname,$vudom,\%record,$handgrade,0);
- unless ($hasperm) {
- &reset_perm();
- }
- }
- my $checkIcon = '
';
- my ($lastsubonly,$partinfo) =
- &show_last_submission($vuname,$vudom,$symb,$essayurl,$responseType,'datesub',
- '',$fullname,\%record,\%coursedesc_by_cid);
- $output .= '
'.
- '
'.&mt('Submissions').' '."\n".$collabinfo."\n";
- if (($numresp > $numessay) & !$is_tool) {
- $output .='
'.
- &mt('Part(s) graded correct by the computer is marked with a [_1] symbol.',$checkIcon).
- "
\n";
- }
- $output .= $partinfo;
- $output .= $lastsubonly;
- $output .= &displaySubByDates($symb,\%record,$partlist,$responseType,$checkIcon,$vuname,$vudom);
- $output .= '
'."\n";
- return $output;
-}
-
sub handler {
my $request=$_[0];
&reset_caches();
@@ -12450,7 +10659,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];
@@ -12473,10 +10682,6 @@ sub handler {
&Apache::lonnet::logthis("grades got multiple commands ".join(':',@commands));
}
-# -------------------------------------- Flag and buffer for registered cleanup
- $registered_cleanup=0;
- undef(@Apache::grades::ltipassback);
-
# see what the symb is
my $symb=$env{'form.symb'};
@@ -12490,98 +10695,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"}]);
@@ -12589,26 +10758,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));
@@ -12621,122 +10790,81 @@ 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'}) {
- &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(&csvuploadassign($request,$symb));
+ } elsif ($command eq 'scantron_selectphase' && $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_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_validate_file($request,$symb));
- } elsif ($command eq 'scantron_process' && $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_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_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_upload_scantron_data_save($request,$symb));
- } elsif ($command eq 'scantron_download' &&
- &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);
- $request->print(&scantron_download_scantron_data($request,$symb));
+ $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'})) {
+ &startpage($request,$symb,[{href=>'', text=>'Grade/Manage/Review Bubblesheets'}],1,1);
+ $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 eq 'initialpassback') {
- &startpage($request,$symb,[{href=>'', text=>'Choose Launcher'}],undef,1);
- $request->print(&initialpassback($request,$symb));
- } elsif ($command eq 'passback') {
- &startpage($request,$symb,
- [{href=>&href_symb_cmd($symb,'initialpassback'), text=>'Choose Launcher'},
- {href=>'', text=>'Types of User'}],undef,1);
- $request->print(&passback_filters($request,$symb));
- } elsif ($command eq 'passbacknames') {
- my $chosen;
- if ($env{'form.passback'} ne '') {
- if ($env{'form.passback'} eq &unescape($env{'form.passback'})) {
- $env{'form.passback'} = &escape($env{'form.passback'} );
- }
- $chosen = &HTML::Entities::encode($env{'form.passback'},'<>"&');
- }
- &startpage($request,$symb,
- [{href=>&href_symb_cmd($symb,'initialpassback'), text=>'Choose Launcher'},
- {href=>&href_symb_cmd($symb,'passback').'&passback='.$chosen, text=>'Types of User'},
- {href=>'', text=>'Select Users'}],undef,1);
- $request->print(&names_for_passback($request,$symb));
- } elsif ($command eq 'passbackscores') {
- my ($chosen,$stu_status);
- if ($env{'form.passback'} ne '') {
- if ($env{'form.passback'} eq &unescape($env{'form.passback'})) {
- $env{'form.passback'} = &escape($env{'form.passback'} );
- }
- $chosen = &HTML::Entities::encode($env{'form.passback'},'<>"&');
- }
- if ($env{'form.Status'}) {
- $stu_status = &HTML::Entities::encode($env{'form.Status'});
- }
- &startpage($request,$symb,
- [{href=>&href_symb_cmd($symb,'initialpassback'), text=>'Choose Launcher'},
- {href=>&href_symb_cmd($symb,'passback').'&passback='.$chosen, text=>'Types of User'},
- {href=>&href_symb_cmd($symb,'passbacknames').'&Status='.$stu_status.'&passback='.$chosen, text=>'Select Users'},
- {href=>'', text=>'Execute Passback'}],undef,1);
- $request->print(&do_passback($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;
}
@@ -12760,7 +10888,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).
@@ -12807,6 +10935,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
@@ -12816,7 +11013,7 @@ ssi_with_retries()
$r - Apache request object
$i - number of the current scanline
$scan_record - hash ref as returned from &scantron_parse_scanline()
- $scan_config - hash ref as returned from &Apache::lonnet::get_scantron_config()
+ $scan_config - hash ref as returned from &get_scantron_config()
$line - full contents of the current scanline
$error - error condition, valid values are
'incorrectCODE', 'duplicateCODE',
@@ -12833,8 +11030,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).
@@ -12843,6 +11040,7 @@ ssi_with_retries()
or code-based randompick and/or randomorder.
+
=item scantron_get_maxbubble() :
Arguments:
@@ -12922,7 +11120,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