');
+ hDoc.write('');
+ hDoc.write("Text Color<\\/b><\\/td> Font Size<\\/b><\\/td> Font Style<\\/td><\\/tr>");
}
function highlightbody(clrval,clrtxt,clrsel,szval,sztxt,szsel,syval,sytxt,sysel) {
var hDoc = hwdWin.document;
- hDoc.write("");
+ hDoc.write(" ");
hDoc.write("");
- hDoc.write(" "+clrtxt+"<\\/td>");
+ hDoc.write(" "+clrtxt+"<\\/td>");
hDoc.write(" ");
- hDoc.write(" "+sztxt+"<\\/td>");
+ hDoc.write(" "+sztxt+"<\\/td>");
hDoc.write(" ");
- hDoc.write(" "+sytxt+"<\\/td>");
+ hDoc.write(" "+sytxt+"<\\/td>");
hDoc.write("<\\/tr>");
}
function highlightend() {
var hDoc = hwdWin.document;
- hDoc.write("<\\/table> ");
- hDoc.write(" ");
- hDoc.write(" ");
+ hDoc.write("<\\/table>");
+ hDoc.write("<\\/td><\\/tr><\\/table> ");
+ hDoc.write(" ");
+ hDoc.write(" ");
hDoc.write("<\\/form>");
hDoc.write('$end_page_highlight_central');
hDoc.close();
@@ -1966,7 +1751,7 @@ sub gradeBox {
$wgt = ($wgt > 0 ? $wgt : '1');
my $score = ($$record{'resource.'.$partid.'.awarded'} eq '' ?
'' : &compute_points($$record{'resource.'.$partid.'.awarded'},$wgt));
- my $data_WGT=' '."\n";
+ my $result=' '."\n";
my $display_part= &get_display_part($partid,$symb);
my %last_resets = &get_last_resets($symb,$env{'request.course.id'},
[$partid]);
@@ -1974,7 +1759,7 @@ sub gradeBox {
if ($last_resets{$partid}) {
$aggtries = &get_num_tries($record,$last_resets{$partid},$partid);
}
- my $result=&Apache::loncommon::start_data_table_row();
+ $result.=&Apache::loncommon::start_data_table_row();
my $ctr = 0;
my $thisweight = 0;
my $increment = &get_increment();
@@ -2010,10 +1795,10 @@ sub gradeBox {
$line.=''.&mt('reset status').' '."\n";
+ #&mt(' Part: [_1] Points: [_2] or [_3] ',$display_part,$radio,$line);
$result .=
- ''.$data_WGT.$display_part.' '.$radio.' '.&mt('or').' '.$line.' ';
+ ''.$display_part.' '.$radio.' '.&mt('or').' '.$line.' ';
$result.=&Apache::loncommon::end_data_table_row();
- $result.=&Apache::loncommon::start_data_table_row().'';
$result.=' '."\n".
' '."\n".
' '."\n";
my $res_error;
$result.=&handback_box($symb,$uname,$udom,$counter,$partid,$record,\$res_error);
- $result.=' '.&Apache::loncommon::end_data_table_row();
if ($res_error) {
return &navmap_errormsg();
}
@@ -2032,11 +1816,10 @@ sub gradeBox {
}
sub handback_box {
- my ($symb,$uname,$udom,$counter,$partid,$record,$res_error_pointer) = @_;
- my ($partlist,$handgrade,$responseType,$numresp,$numessay) = &response_type($symb,$res_error_pointer);
- return unless ($numessay);
+ my ($symb,$uname,$udom,$counter,$partid,$record,$res_error) = @_;
+ my ($partlist,$handgrade,$responseType) = &response_type($symb,$res_error);
my (@respids);
- my @part_response_id = &flatten_responseType($responseType);
+ my @part_response_id = &flatten_responseType($responseType);
foreach my $part_response_id (@part_response_id) {
my ($part,$resp) = @{ $part_response_id };
if ($part eq $partid) {
@@ -2048,10 +1831,9 @@ sub handback_box {
my $prefix = $counter.'_'.$partid.'_'.$respid.'_';
my $files=&get_submitted_files($udom,$uname,$partid,$respid,$record);
next if (!@$files);
- my $file_counter = 0;
+ my $file_counter = 1;
foreach my $file (@$files) {
if ($file =~ /\/portfolio\//) {
- $file_counter++;
my ($file_path, $file_disp) = ($file =~ m|(.+/)(.+)$|);
my ($name,$version,$ext) = &file_name_version_ext($file_disp);
$file_disp = "$name.$ext";
@@ -2059,14 +1841,11 @@ sub handback_box {
$result.=&mt('Return commented version of [_1] to student.',
''.$file_disp.' ');
$result.=' '."\n";
- $result.=' '."\n";
+ $result.=' ';
+ $result.='('.&mt('File will be uploaded when you click on Save & Next below.').') ';
+ $file_counter++;
}
}
- if ($file_counter) {
- $result .= ' '."\n".
- ''.
- '('.&mt('File(s) will be uploaded when you click on Save & Next below.',$file_counter).') ';
- }
}
return $result;
}
@@ -2099,27 +1878,14 @@ sub show_problem {
$companswer=~s|||g;
$companswer=~s|name="submit"|name="would_have_been_submit"|g;
}
- my $renderheading = &mt('View of the problem');
- my $answerheading = &mt('Correct answer');
- if (($uname ne $env{'user.name'}) || ($udom ne $env{'user.domain'})) {
- my $stu_fullname = $env{'form.fullname'};
- if ($stu_fullname eq '') {
- $stu_fullname = &Apache::loncommon::plainname($uname,$udom,'lastname');
- }
- my $forwhom = &nameUserString(undef,$stu_fullname,$uname,$udom);
- if ($forwhom ne '') {
- $renderheading = &mt('View of the problem for[_1]',$forwhom);
- $answerheading = &mt('Correct answer for[_1]',$forwhom);
- }
- }
$rendered=
''
- .'
'.$renderheading.' '
+ .''.&mt('View of the problem').' '
.$rendered
.'';
$companswer=
''
- .'
'.$answerheading.' '
+ .''.&mt('Correct answer').' '
.$companswer
.'';
my $result;
@@ -2136,6 +1902,7 @@ sub show_problem {
sub files_exist {
my ($r, $symb) = @_;
my @students = &Apache::loncommon::get_env_multiple('form.stuinfo');
+
foreach my $student (@students) {
my ($uname,$udom,$fullname) = split(/:/,$student);
my %record = &Apache::lonnet::restore($symb,$env{'request.course.id'},
@@ -2154,10 +1921,6 @@ sub files_exist {
sub download_all_link {
my ($r,$symb) = @_;
- unless (&files_exist($r, $symb)) {
- $r->print(&mt('There are currently no submitted documents.'));
- return;
- }
my $all_students =
join("\n", &Apache::loncommon::get_env_multiple('form.stuinfo'));
@@ -2170,54 +1933,7 @@ sub download_all_link {
'cgi.'.$identifier.'.parts' => $parts,});
$r->print(''.
&mt('Download All Submitted Documents').' ');
- return;
-}
-
-sub submit_download_link {
- my ($request,$symb) = @_;
- if (!$symb) { return ''; }
- my $res_error;
- my ($partlist,$handgrade,$responseType,$numresp,$numessay,$numdropbox) =
- &response_type($symb,\$res_error);
- if ($res_error) {
- $request->print(&mt('An error occurred retrieving response types'));
- return;
- }
- unless ($numessay) {
- $request->print(&mt('No essayresponse items found'));
- return;
- }
- my @chosenparts = &Apache::loncommon::get_env_multiple('form.vPart');
- if (@chosenparts) {
- $request->print(&showResourceInfo($symb,$partlist,$responseType,
- undef,undef,1));
- }
- if ($numessay) {
- my $submitonly= $env{'form.submitonly'} eq '' ? 'all' : $env{'form.submitonly'};
- my $getsec = $env{'form.section'} eq '' ? 'all' : $env{'form.section'};
- my $getgroup = $env{'form.group'} eq '' ? 'all' : $env{'form.group'};
- (undef,undef,my $fullname) = &getclasslist($getsec,1,$getgroup,$symb,$submitonly,1);
- if (ref($fullname) eq 'HASH') {
- my @students = map { $_.':'.$fullname->{$_} } (keys(%{$fullname}));
- if (@students) {
- @{$env{'form.stuinfo'}} = @students;
- if ($numdropbox) {
- &download_all_link($request,$symb);
- } else {
- $request->print(&mt('No essayrespose items with dropbox found'));
- }
-# FIXME Need a mechanism to download essays, i.e., if $numessay > $numdropbox
-# Needs to omit user's identity if resource instance is for an anonymous survey.
- } else {
- $request->print(&mt('No students match the criteria you selected'));
- }
- } else {
- $request->print(&mt('Could not retrieve student information'));
- }
- } else {
- $request->print(&mt('No essayresponse items found'));
- }
- return;
+ return
}
sub build_section_inputs {
@@ -2235,58 +1951,42 @@ sub build_section_inputs {
# --------------------------- show submissions of a student, option to grade
sub submission {
- my ($request,$counter,$total,$symb,$divforres,$calledby) = @_;
+ my ($request,$counter,$total) = @_;
my ($uname,$udom) = ($env{'form.student'},$env{'form.userdom'});
$udom = ($udom eq '' ? $env{'user.domain'} : $udom); #has form.userdom changed for a student?
my $usec = &Apache::lonnet::getsection($udom,$uname,$env{'request.course.id'});
$env{'form.fullname'} = &Apache::loncommon::plainname($uname,$udom,'lastname') if $env{'form.fullname'} eq '';
-
+ my $symb = &get_symb($request);
if ($symb eq '') { $request->print("Unable to handle ambiguous references:."); return ''; }
- my $probtitle=&Apache::lonnet::gettitle($symb);
- my ($essayurl,%coursedesc_by_cid);
if (!&canview($usec)) {
- $request->print(
- ''.
- &mt('Unable to view requested student.').
- ' '.&mt('([_1] in section [_2] in course id [_3])',
- $uname.':'.$udom,$usec,$env{'request.course.id'}).
- ' ');
+ $request->print('Unable to view requested student.('.
+ $uname.':'.$udom.' in section '.$usec.' in course id '.
+ $env{'request.course.id'}.') ');
+ $request->print(&show_grading_menu_form($symb));
return;
}
- my $res_error;
- my ($partlist,$handgrade,$responseType,$numresp,$numessay) =
- &response_type($symb,\$res_error);
- if ($res_error) {
- $request->print(&navmap_errormsg());
- return;
- }
-
if (!$env{'form.lastSub'}) { $env{'form.lastSub'} = 'datesub'; }
if (!$env{'form.vProb'}) { $env{'form.vProb'} = 'yes'; }
if (!$env{'form.vAns'}) { $env{'form.vAns'} = 'yes'; }
- if (($numessay) && ($calledby eq 'submission') && (!exists($env{'form.compmsg'}))) {
- $env{'form.compmsg'} = 1;
- }
my $last = ($env{'form.lastSub'} eq 'last' ? 'last' : '');
my $checkIcon = ' ';
+ my %old_essays;
# header info
if ($counter == 0) {
- my @chosenparts = &Apache::loncommon::get_env_multiple('form.vPart');
- if (@chosenparts) {
- $request->print(&showResourceInfo($symb,$partlist,$responseType,'gradesub'));
- } elsif ($divforres) {
- $request->print('
');
- } else {
- $request->print(' ');
- }
&sub_page_js($request);
- &sub_grademessage_js($request) if ($env{'form.compmsg'});
- &sub_page_kw_js($request) if ($numessay);
+ &sub_page_kw_js($request) if ($env{'form.handgrade'} eq 'yes');
+ $env{'form.probTitle'} = $env{'form.probTitle'} eq '' ?
+ &Apache::lonnet::gettitle($symb) : $env{'form.probTitle'};
+ if ($env{'form.handgrade'} eq 'yes' && &files_exist($request, $symb)) {
+ &download_all_link($request, $symb);
+ }
+ $request->print(' '.&mt('Submission Record').' '."\n".
+ ' '.&mt('Resource: [_1]',$env{'form.probTitle'}).' '."\n");
# option to display problem, only once else it cause problems
# with the form later since the problem has a form.
@@ -2303,57 +2003,57 @@ sub submission {
$request->print(&show_problem($request,$symb,$uname,$udom,0,1,$mode));
}
+ # kwclr is the only variable that is guaranteed to be non blank
+ # if this subroutine has been called once.
my %keyhash = ();
- if (($env{'form.kwclr'} eq '' && $numessay) || ($env{'form.compmsg'})) {
+ if ($env{'form.kwclr'} eq '' && $env{'form.handgrade'} eq 'yes') {
%keyhash = &Apache::lonnet::dump('nohist_handgrade',
$env{'course.'.$env{'request.course.id'}.'.domain'},
$env{'course.'.$env{'request.course.id'}.'.num'});
- }
- # kwclr is the only variable that is guaranteed not to be blank
- # if this subroutine has been called once.
- if ($env{'form.kwclr'} eq '' && $numessay) {
+
my $loginuser = $env{'user.name'}.':'.$env{'user.domain'};
$env{'form.keywords'} = $keyhash{$symb.'_keywords'} ne '' ? $keyhash{$symb.'_keywords'} : '';
$env{'form.kwclr'} = $keyhash{$loginuser.'_kwclr'} ne '' ? $keyhash{$loginuser.'_kwclr'} : 'red';
$env{'form.kwsize'} = $keyhash{$loginuser.'_kwsize'} ne '' ? $keyhash{$loginuser.'_kwsize'} : '0';
$env{'form.kwstyle'} = $keyhash{$loginuser.'_kwstyle'} ne '' ? $keyhash{$loginuser.'_kwstyle'} : '';
- }
- if ($env{'form.compmsg'}) {
- $env{'form.msgsub'} = $keyhash{$symb.'_subject'} ne '' ?
- $keyhash{$symb.'_subject'} : $probtitle;
+ $env{'form.msgsub'} = $keyhash{$symb.'_subject'} ne '' ?
+ $keyhash{$symb.'_subject'} : $env{'form.probTitle'};
$env{'form.savemsgN'} = $keyhash{$symb.'_savemsgN'} ne '' ? $keyhash{$symb.'_savemsgN'} : '0';
}
-
my $overRideScore = $env{'form.overRideScore'} eq '' ? 'no' : $env{'form.overRideScore'};
my $stu_status = join(':',&Apache::loncommon::get_env_multiple('form.Status'));
$request->print(''.&show_grading_menu_form($symb);
+ }
+ $request->print($toGrade);
+ return;
} else {
$request->print(''."\n");
}
- # grading message center
-
- if ($env{'form.compmsg'}) {
- my $result=''.
- '
'.&mt('Send Message').' '.
- '
';
- my ($lastname,$givenn) = split(/,/,$env{'form.fullname'});
- my $msgfor = $givenn.' '.$lastname;
- if (scalar(@$col_fullnames) > 0) {
- my $lastone = pop(@$col_fullnames);
- $msgfor .= ', '.(join ', ',@$col_fullnames).' and '.$lastone.'.';
- }
- $msgfor =~ s/\'/\\'/g; #' stupid emacs - no! javascript
- $result.='
'."\n".
- '
'."\n".
- '
'.
- &mt('Compose message to student'.(scalar(@$col_fullnames) >= 1 ? 's' : '')).' ('.
- &mt('incl. grades').' )'.
- '
'."\n".
- '
('.
- &mt('Message will be sent when you click on Save & Next below.').")\n".
- '
';
- $request->print($result);
+ # essay grading message center
+ if ($env{'form.handgrade'} eq 'yes') {
+ my $result='';
+
+ $result.='
';
+ my ($lastname,$givenn) = split(/,/,$env{'form.fullname'});
+ my $msgfor = $givenn.' '.$lastname;
+ if (scalar(@$col_fullnames) > 0) {
+ my $lastone = pop(@$col_fullnames);
+ $msgfor .= ', '.(join ', ',@$col_fullnames).' and '.$lastone.'.';
+ }
+ $msgfor =~ s/\'/\\'/g; #' stupid emacs - no! javascript
+ $result.='
'."\n".
+ '
'."\n";
+ $result.='
'.
+ &mt('Compose message to student').(scalar(@$col_fullnames) >= 1 ? 's' : '').' ('.
+ &mt('incl. grades').' )'.
+ '
'."\n".
+ '
('.
+ &mt('Message will be sent when you click on Save & Next below.').")\n";
+ $result.='
';
+ $request->print($result);
}
my %seen = ();
@@ -2705,6 +2348,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));
@@ -2755,6 +2400,7 @@ sub submission {
$endform.=" ";
$endform.='
';
+ $endform.=&show_grading_menu_form($symb);
$request->print($endform);
}
return '';
@@ -2773,10 +2419,10 @@ sub check_collaborators {
next if ($record->{'resource.'.$part.'.collaborators'} eq '');
my (@good_collaborators, @bad_collaborators);
foreach my $possible_collaborator
- (split(/[,;\s]+/,$record->{'resource.'.$part.'.collaborators'})) {
+ (split(/,?\s+/,$record->{'resource.'.$part.'.collaborators'})) {
$possible_collaborator =~ s/[\$\^\(\)]//g;
next if ($possible_collaborator eq '');
- my ($co_name,$co_dom) = split(/:/,$possible_collaborator);
+ my ($co_name,$co_dom) = split(/\@|:/,$possible_collaborator);
$co_dom = $udom if (! defined($co_dom) || $co_dom =~ /^domain$/i);
next if ($co_name eq $uname && $co_dom eq $udom);
# Doing this grep allows 'fuzzy' specification
@@ -2789,13 +2435,13 @@ sub check_collaborators {
}
}
if (scalar(@good_collaborators) != 0) {
- $result.=' '.&mt('Collaborators:').'';
+ $result.=' '.&mt('Collaborators: ');
foreach my $name (@good_collaborators) {
my ($lastname,$givenn) = split(/,/,$$fullname{$name});
push(@col_fullnames, $givenn.' '.$lastname);
- $result.=''.$fullname->{$name}.' ';
+ $result.=$fullname->{$name}.' ';
}
- $result.=' '."\n";
+ $result.=' '."\n";
my ($part)=split(/\./,$part);
$result.=' '.
@@ -2831,56 +2477,39 @@ sub get_last_submission {
&Apache::lonlocal::locallocaltime($$returnhash{$version.':timestamp'});
}
}
- my (%typeparts,%randombytry);
+ my %typeparts;
my $showsurv =
&Apache::lonnet::allowed('vas',$env{'request.course.id'});
foreach my $key (sort(keys(%lasthash))) {
if ($key =~ /\.type$/) {
if (($lasthash{$key} eq 'anonsurvey') ||
- ($lasthash{$key} eq 'anonsurveycred') ||
- ($lasthash{$key} eq 'randomizetry')) {
+ ($lasthash{$key} eq 'anonsurveycred')) {
my ($ign,@parts) = split(/\./,$key);
pop(@parts);
- my $id = join('.',@parts);
- if ($lasthash{$key} eq 'randomizetry') {
- $randombytry{$ign.'.'.$id} = $lasthash{$key};
- } else {
- unless ($showsurv) {
- $typeparts{$ign.'.'.$id} = $lasthash{$key};
- }
+ unless ($showsurv) {
+ my $id = join(',',@parts);
+ $typeparts{$ign.'.'.$id} = $lasthash{$key};
}
delete($lasthash{$key});
}
}
}
my @hidden = keys(%typeparts);
- my @randomize = keys(%randombytry);
foreach my $key (keys(%lasthash)) {
next if ($key !~ /\.submission$/);
my $hide;
if (@hidden) {
foreach my $id (@hidden) {
if ($key =~ /^\Q$id\E/) {
- $hide = 'anon';
+ $hide = 1;
last;
}
}
}
- unless ($hide) {
- if (@randomize) {
- foreach my $id (@randomize) {
- if ($key =~ /^\Q$id\E/) {
- $hide = 'rand';
- last;
- }
- }
- }
- }
my ($partid,$foo) = split(/submission$/,$key);
- my $draft = $lasthash{$partid.'awarddetail'} eq 'DRAFT' ? 1 : 0;
- push(@string, join(':', $key, $hide, $draft, (
- ref($lasthash{$key}) eq 'ARRAY' ?
- join(',', @{$lasthash{$key}}) : $lasthash{$key}) ));
+ my $draft = $lasthash{$partid.'awarddetail'} eq 'DRAFT' ?
+ 'Draft Copy ' : '';
+ push(@string, join(':', $key, $hide, $draft.$lasthash{$key}));
}
}
if (!@string) {
@@ -2903,190 +2532,10 @@ sub keywords_highlight {
return $string;
}
-# For Tasks provide a mechanism to display previous version for one specific student
-
-sub show_previous_task_version {
- my ($request,$symb) = @_;
- if ($symb eq '') {
- $request->print(
- ''.
- &mt('Unable to handle ambiguous references.').
- ' ');
- return '';
- }
- 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(''.
- &mt('Unable to view previous version for requested student.').
- ' '.&mt('([_1] in section [_2] in course id [_3])',
- $uname.':'.$udom,$usec,$env{'request.course.id'}).
- ' ');
- return;
- }
- my $mode = 'both';
- my $isTask = ($symb =~/\.task$/);
- if ($isTask) {
- if ($env{'form.previousversion'} =~ /^\d+$/) {
- if ($env{'form.fullname'} eq '') {
- $env{'form.fullname'} =
- &Apache::loncommon::plainname($uname,$udom,'lastname');
- }
- my $probtitle=&Apache::lonnet::gettitle($symb);
- $request->print("\n\n".
- ''.
- '
'.&nameUserString(undef,$env{'form.fullname'},$uname,$udom).
- ' '."\n");
- &Apache::lonxml::clear_problem_counter();
- $request->print(&show_problem($request,$symb,$uname,$udom,1,1,$mode,
- {'previousversion' => $env{'form.previousversion'} }));
- $request->print("\n");
- }
- }
- return;
-}
-
-sub choose_task_version_form {
- my ($symb,$uname,$udom,$nomenu) = @_;
- my $isTask = ($symb =~/\.task$/);
- my ($current,$version,$result,$js,$displayed,$rowtitle);
- if ($isTask) {
- my %record = &Apache::lonnet::restore($symb,$env{'request.course.id'},
- $udom,$uname);
- if (($record{'resource.0.version'} eq '') ||
- ($record{'resource.0.version'} < 2)) {
- return ($record{'resource.0.version'},
- $record{'resource.0.version'},$result,$js);
- } else {
- $current = $record{'resource.0.version'};
- }
- if ($env{'form.previousversion'}) {
- $displayed = $env{'form.previousversion'};
- $rowtitle = &mt('Choose another version:')
- } else {
- $displayed = $current;
- $rowtitle = &mt('Show earlier version:');
- }
- $result = '';
- my $list;
- my $numversions = 0;
- for (my $i=1; $i<=$record{'resource.0.version'}; $i++) {
- if ($i == $current) {
- if (!$env{'form.previousversion'} || $nomenu) {
- next;
- } else {
- $list .= '
'.&mt('Current').' '."\n";
- $numversions ++;
- }
- } elsif (defined($record{'resource.'.$i.'.0.status'})) {
- unless ($i == $env{'form.previousversion'}) {
- $numversions ++;
- }
- $list .= '
'.$i.' '."\n";
- }
- }
- if ($numversions) {
- $symb = &HTML::Entities::encode($symb,'<>"&');
- $result .=
- '
';
- $js = &previous_display_javascript($nomenu,$current);
- } elsif ($displayed && $nomenu) {
- $result .= '
'.&mt('Close window').' ';
- } else {
- $result .= &mt('No previous versions to show for this student');
- }
- $result .= '
';
- }
- return ($current,$displayed,$result,$js);
-}
-
-sub previous_display_javascript {
- my ($nomenu,$current) = @_;
- my $js = <<"JSONE";
-
-ENDJS
-
-}
-
#--- Called from submission routine
sub processHandGrade {
- my ($request,$symb) = @_;
+ my ($request) = shift;
+ my $symb = &get_symb($request);
my (undef,undef,$url) = &Apache::lonnet::decode_symb($symb);
my $button = $env{'form.gradeOpt'};
my $ngrade = $env{'form.NCT'};
@@ -3098,26 +2547,16 @@ sub processHandGrade {
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);
+ my ($errorflag,$pts,$wgt) = &saveHandGrade($request,$symb,$uname,$udom,$ctr);
if ($errorflag eq 'no_score') {
$ctr++;
next;
}
if ($errorflag eq 'not_allowed') {
- $request->print(
- ''
- .&mt('Not allowed to modify grades for [_1]',"$uname:$udom")
- .' ');
+ $request->print("Not allowed to modify grades for $uname:$udom ");
$ctr++;
next;
}
- if ($numhidden) {
- $request->print(
- ''
- .&mt('For [_1]: [quant,_2,transaction] hidden',"$uname:$udom",$numhidden)
- .' ');
- }
my $includemsg = $env{'form.includemsg'.$ctr};
my ($subject,$message,$msgstatus) = ('','','');
my $restitle = &Apache::lonnet::gettitle($symb);
@@ -3136,7 +2575,7 @@ sub processHandGrade {
if ($env{'form.withgrades'.$ctr}) {
$message.="\n\nPoint".($pts > 1 ? 's':'').' awarded = '.$pts.' out of '.$wgt;
$messagetail = " for $restitle ";
+ $feedurl."?symb=$showsymb\">$env{'form.probTitle'}";
}
$msgstatus =
&Apache::lonmsg::user_normal_msg($uname,$udom,$subject,
@@ -3145,7 +2584,7 @@ sub processHandGrade {
undef,undef,$showsymb,
$restitle);
$request->print(' '.&mt('Sending message to [_1]',$uname.':'.$udom).': '.
- $msgstatus.' ');
+ $msgstatus);
}
if ($env{'form.collaborator'.$ctr}) {
my @collabstrs=&Apache::loncommon::get_env_multiple("form.collaborator$ctr");
@@ -3164,7 +2603,7 @@ sub processHandGrade {
$udom);
if ($env{'form.withgrades'.$ctr}) {
$messagetail = " for $restitle ";
+ $baseurl."?symb=$showsymb\">$env{'form.probTitle'}";
}
$msgstatus =
&Apache::lonmsg::user_normal_msg($collaborator,$udom,$subject,$message.$messagetail,undef,$baseurl,undef,undef,undef,$showsymb,$restitle);
@@ -3176,17 +2615,10 @@ sub processHandGrade {
}
}
- my $res_error;
- my ($partlist,$handgrade,$responseType,$numresp,$numessay) = &response_type($symb,\$res_error);
- if ($res_error) {
- $request->print(&navmap_errormsg());
- return;
- }
-
- my %keyhash = ();
- if ($numessay) {
+ if ($env{'form.handgrade'} eq 'yes') {
# 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+$//;
my (@keywords) = sort(split(/\s+/,$env{'form.keywords'}));
@@ -3196,9 +2628,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
@@ -3221,12 +2651,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') {
@@ -3241,12 +2668,22 @@ sub processHandGrade {
my $processUser = $env{'form.unamedom'.$ctr};
($env{'form.student'},$env{'form.userdom'}) = split(/:/,$processUser);
$env{'form.fullname'} = $$fullname{$processUser};
- &submission($request,$ctr,$total-1,$symb);
+ &submission($request,$ctr,$total-1);
$ctr++;
}
return '';
}
+# Go directly to grade student - from submission or link from chart page
+ if ($button eq 'Grade Student') {
+# (undef,undef,$env{'form.handgrade'},undef,undef) = &showResourceInfo($symb);
+ my $processUser = $env{'form.unamedom'.$env{'form.studentNo'}};
+ ($env{'form.student'},$env{'form.userdom'}) = split(/:/,$processUser);
+ $env{'form.fullname'} = $$fullname{$processUser};
+ &submission($request,0,0);
+ return '';
+ }
+
# Get the next/previous one or group of students
my $firststu = $env{'form.unamedom0'};
my $laststu = $env{'form.unamedom'.($ngrade-1)};
@@ -3277,6 +2714,12 @@ sub processHandGrade {
}
$ctr = 0;
@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);
@@ -3322,11 +2765,14 @@ sub processHandGrade {
$env{'form.student'} = $uname;
$env{'form.userdom'} = $udom;
$env{'form.fullname'} = $$fullname{$_};
- &submission($request,$ctr,$total,$symb);
+ &submission($request,$ctr,$total);
$ctr++;
}
if ($total < 0) {
- my $the_end.=''.&mt('[_1]Message:[_2] No more students for this section or class.','',' ').'
'."\n";
+ my $the_end = ''.&mt('LON-CAPA User Message').' '."\n";
+ $the_end.=&mt('Message: No more students for this section or class.').' '."\n";
+ $the_end.=&mt('Click on the button below to return to the grading menu.').' '."\n";
+ $the_end.=&show_grading_menu_form($symb);
$request->print($the_end);
}
return '';
@@ -3342,14 +2788,9 @@ sub saveHandGrade {
my %record = &Apache::lonnet::restore($symb,$env{'request.course.id'},$domain,$stuname);
my @parts_graded;
my %newrecord = ();
- my ($pts,$wgt,$totchg) = ('','',0);
+ my ($pts,$wgt) = ('','');
my %aggregate = ();
my $aggregateflag = 0;
- if ($env{'form.HIDE'.$newflg}) {
- my ($version,$parts) = split(/:/,$env{'form.HIDE'.$newflg},2);
- my $numchgs = &makehidden($version,$parts,\%record,$symb,$domain,$stuname,1);
- $totchg += $numchgs;
- }
my @parts = split(/:/,$env{'form.partlist'.$newflg});
foreach my $new_part (@parts) {
#collaborator ($submi may vary for different parts
@@ -3452,37 +2893,7 @@ sub saveHandGrade {
&Apache::lonnet::cinc('nohist_resourcetracker',\%aggregate,
$cdom,$cnum);
}
- return ('',$pts,$wgt,$totchg);
-}
-
-sub makehidden {
- my ($version,$parts,$record,$symb,$domain,$stuname,$tolog) = @_;
- return unless (ref($record) eq 'HASH');
- my %modified;
- my $numchanged = 0;
- if (exists($record->{$version.':keys'})) {
- my $partsregexp = $parts;
- $partsregexp =~ s/,/|/g;
- foreach my $key (split(/\:/,$record->{$version.':keys'})) {
- if ($key =~ /^resource\.(?:$partsregexp)\.([^\.]+)$/) {
- my $item = $1;
- unless (($item eq 'solved') || ($item =~ /^award(|msg|ed)$/)) {
- $modified{$key} = $record->{$version.':'.$key};
- }
- } elsif ($key =~ m{^(resource\.(?:$partsregexp)\.[^\.]+\.)(.+)$}) {
- $modified{$1.'hidden'.$2} = $record->{$version.':'.$key};
- } elsif ($key =~ /^(ip|timestamp|host)$/) {
- $modified{$key} = $record->{$version.':'.$key};
- }
- }
- if (keys(%modified)) {
- if (&Apache::lonnet::putstore($env{'request.course.id'},$symb,$version,\%modified,
- $domain,$stuname,$tolog) eq 'ok') {
- $numchanged ++;
- }
- }
- }
- return $numchanged;
+ return ('',$pts,$wgt);
}
sub check_and_remove_from_queue {
@@ -3512,80 +2923,64 @@ sub handback_files {
$request->print(' '.&navmap_errormsg().' ');
return;
}
- my @handedback;
- my $file_msg;
my @part_response_id = &flatten_responseType($responseType);
foreach my $part_response_id (@part_response_id) {
my ($part_id,$resp_id) = @{ $part_response_id };
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 (($env{'form.'.$newflg.'_'.$part_resp.'_returndoc1'}) && ($new_part == $part_id)) {
# 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 $file_counter = 1;
+ my $file_msg;
+ while ($env{'form.'.$newflg.'_'.$part_resp.'_returndoc'.$file_counter}) {
+ my $fname=$env{'form.'.$newflg.'_'.$part_resp.'_returndoc'.$file_counter.'.filename'};
my ($directory,$answer_file) =
- ($env{'form.'.$newflg.'_'.$part_resp.'_origdoc'.$counter} =~ /^(.*?)([^\/]*)$/);
+ ($env{'form.'.$newflg.'_'.$part_resp.'_origdoc'.$file_counter} =~ /^(.*?)([^\/]*)$/);
my ($answer_name,$answer_ver,$answer_ext) =
&file_name_version_ext($answer_file);
my ($portfolio_path) = ($directory =~ /^.+$stuname\/portfolio(.*)/);
my $getpropath = 1;
- 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);
- # fix filename
+ my @dir_list = &Apache::lonnet::dirlist($portfolio_root.$portfolio_path,$domain,$stuname,$getpropath);
+ my $version = &get_next_version($answer_name, $answer_ext, \@dir_list);
+ # fix file name
my ($save_file_name) = (($directory.$answer_name.".$version.".$answer_ext) =~ /^.+\/${stuname}\/(.*)/);
my $result=&Apache::lonnet::finishuserfileupload($stuname,$domain,
- $newflg.'_'.$part_resp.'_returndoc'.$counter,
+ $newflg.'_'.$part_resp.'_returndoc'.$file_counter,
$save_file_name);
if ($result !~ m|^/uploaded/|) {
$request->print(''.
&mt('An error occurred ([_1]) while trying to upload [_2].',
- $result,$newflg.'_'.$part_resp.'_returndoc'.$counter).
+ $result,$newflg.'_'.$part_resp.'_returndoc'.$file_counter).
' ');
} else {
# mark the file as read only
- push(@handedback,$save_file_name);
+ my @files = ($save_file_name);
+ my @what = ($symb,$env{'request.course.id'},'handback');
+ &Apache::lonnet::mark_as_readonly($domain,$stuname,\@files,\@what);
if (exists($$newrecord{"resource.$new_part.$resp_id.handback"})) {
$$newrecord{"resource.$new_part.$resp_id.handback"}.=',';
}
$$newrecord{"resource.$new_part.$resp_id.handback"} .= $save_file_name;
- $file_msg.=''.$save_file_name." ";
+ $file_msg.= "\n".''.$save_file_name." ";
}
- $request->print(' '.&mt('[_1] will be the uploaded filename [_2]',''.$fname.' ',''.$env{'form.'.$newflg.'_'.$part_resp.'_origdoc'.$counter}.' '));
- }
+ $request->print(" ".$fname." will be the uploaded file name");
+ $request->print(" ".$env{'form.'.$newflg.'_'.$part_resp.'_origdoc'.$file_counter});
+ $file_counter++;
+ }
+ my $subject = "File Handed Back by Instructor ";
+ my $message = "A file has been returned that was originally submitted in reponse to: ";
+ $message .= "".&Apache::lonnet::gettitle($symb)." ";
+ $message .= ' The returned file(s) are named: '. $file_msg;
+ $message .= " and can be found in your portfolio space.";
+ my ($feedurl,$showsymb) =
+ &get_feedurl_and_symb($symb,$domain,$stuname);
+ my $restitle = &Apache::lonnet::gettitle($symb);
+ my $msgstatus =
+ &Apache::lonmsg::user_normal_msg($stuname,$domain,$subject.
+ ' (File Returned) ['.$restitle.']',$message,undef,
+ $feedurl,undef,undef,undef,$showsymb,$restitle);
}
}
- }
- if (@handedback > 0) {
- $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 ($subject,$message);
- if (scalar(@handedback) == 1) {
- $subject = &mt_user($user_lh,'File Handed Back by Instructor');
- $message = &mt_user($user_lh,'A file has been returned that was originally submitted in response to: ');
- } else {
- $subject = &mt_user($user_lh,'Files Handed Back by Instructor');
- $message = &mt_user($user_lh,'Files have been returned that were originally submitted in response to: ');
- }
- $message .= "".&Apache::lonnet::gettitle($symb)."
";
- $message .= &mt_user($user_lh,'The returned file(s) are named: [_1]'," $file_msg ").
- &mt_user($user_lh,'The file(s) can be found in your [_1]portfolio[_2].','',' ');
- my ($feedurl,$showsymb) =
- &get_feedurl_and_symb($symb,$domain,$stuname);
- my $restitle = &Apache::lonnet::gettitle($symb);
- $subject .= ' '.&mt_user($user_lh,'(File Returned)').' ['.$restitle.']';
- my $msgstatus =
- &Apache::lonmsg::user_normal_msg($stuname,$domain,$subject,
- $message,undef,$feedurl,undef,undef,undef,$showsymb,
- $restitle);
- if ($msgstatus) {
- $request->print(&mt('Notification message status: [_1]',''.$msgstatus.' ').' ');
- }
- }
return;
}
@@ -3693,11 +3088,9 @@ sub version_portfiles {
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 $getpropath = 1;
+ my @dir_list = &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);
@@ -3716,24 +3109,21 @@ sub version_portfiles {
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
+ 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;
- }
+ # a versioned file is found so save it for later
+ if ($file_version > $version) {
+ $version = $file_version;
}
}
}
- }
+ }
$version ++;
return($version);
}
@@ -3780,7 +3170,6 @@ sub viewgrades_js {
my ($request) = shift;
my $alertmsg = &mt('A number equal or greater than 0 is expected. Entered value = ');
- &js_escape(\$alertmsg);
$request->print(&Apache::lonhtmlcommon::scripttag(<'.&mt('Manual Grading').' ';
+ $result.=''.&mt('Current Resource: [_1]',$env{'form.probTitle'}).' '."\n";
#view individual student submission form - called using Javascript viewOneStudent
$result.=&jscriptNform($symb);
@@ -3968,69 +3359,23 @@ sub viewgrades {
' '."\n".
' '."\n".
&build_section_inputs().
+ ' '."\n".
' '."\n".
+ ' '."\n";
- #retrieve selected groups
- my (@groups,$group_display);
- @groups = &Apache::loncommon::get_env_multiple('form.group');
- if (grep(/^all$/,@groups)) {
- @groups = ('all');
- } elsif (grep(/^none$/,@groups)) {
- @groups = ('none');
- } elsif (@groups > 0) {
- $group_display = join(', ',@groups);
- }
-
- my ($common_header,$specific_header,@sections,$section_display);
- @sections = &Apache::loncommon::get_env_multiple('form.section');
- if (grep(/^all$/,@sections)) {
- @sections = ('all');
- if ($group_display) {
- $common_header = &mt('Assign Common Grade to Students in Group(s) [_1]',$group_display);
- $specific_header = &mt('Assign Grade to Specific Students in Group(s) [_1]',$group_display);
- } elsif (grep(/^none$/,@groups)) {
- $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');
- $specific_header = &mt('Assign Grade to Specific Students in Class');
- }
- } elsif (grep(/^none$/,@sections)) {
- @sections = ('none');
- if ($group_display) {
- $common_header = &mt('Assign Common Grade to Students in no Section and in Group(s) [_1]',$group_display);
- $specific_header = &mt('Assign Grade to Specific Students in no Section and in Group(s)',$group_display);
- } elsif (grep(/^none$/,@groups)) {
- $common_header = &mt('Assign Common Grade to Students in no Section and in no Group');
- $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');
- }
- } else {
- $section_display = join (", ",@sections);
- if ($group_display) {
- $common_header = &mt('Assign Common Grade to Students in Section(s) [_1], and in Group(s) [_2]',
- $section_display,$group_display);
- $specific_header = &mt('Assign Grade to Specific Students in Section(s) [_1], and in Group(s) [_2]',
- $section_display,$group_display);
- } elsif (grep(/^none$/,@groups)) {
- $common_header = &mt('Assign Common Grade to Students in Section(s) [_1] and no Group',$section_display);
- $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);
- }
+ my ($common_header,$specific_header);
+ if ($env{'form.section'} eq 'all') {
+ $common_header = &mt('Assign Common Grade to Class');
+ $specific_header = &mt('Assign Grade to Specific Students in Class');
+ } elsif ($env{'form.section'} eq 'none') {
+ $common_header = &mt('Assign Common Grade to Students in no Section');
+ $specific_header = &mt('Assign Grade to Specific Students in no Section');
+ } else {
+ my $section_display = join (", ",&Apache::loncommon::get_env_multiple('form.section'));
+ $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);
}
- my %submit_types = &substatus_options();
- my $submission_status = $submit_types{$env{'form.submitonly'}};
-
- if ($env{'form.submitonly'} eq 'all') {
- $result.= ''.$common_header.' ';
- } else {
- $result.= ''.$common_header.' '.&mt('(submission status: "[_1]")',$submission_status).' ';
- }
- $result .= &Apache::loncommon::start_data_table();
+ $result.= ''.$common_header.' '.&Apache::loncommon::start_data_table();
#radio buttons/text box for assigning points for a section or class.
#handles different parts of a problem
my $res_error;
@@ -4047,6 +3392,7 @@ sub viewgrades {
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;
@@ -4065,9 +3411,8 @@ sub viewgrades {
$partid.'" size="4" '.'onchange="javascript:writePoint(\''.
$partid.'\','.$weight{$partid}.',\'textval\')" /> /'.
$weight{$partid}.' '.&mt('(problem weight)').' '."\n";
- $line.= ''.&mt('Grade Status').': '.
- ''.&mt('Grade Status').': '.
' '.
''.&mt('excused').' '.
@@ -4092,12 +3437,8 @@ sub viewgrades {
#table listing all the students in a section/class
#header of table
- if ($env{'form.submitonly'} eq 'all') {
- $result.= ''.$specific_header.' ';
- } else {
- $result.= ''.$specific_header.' '.&mt('(submission status: "[_1]")',$submission_status).' ';
- }
- $result.= &Apache::loncommon::start_data_table().
+ $result.= ''.$specific_header.' '.
+ &Apache::loncommon::start_data_table().
&Apache::loncommon::start_data_table_header_row().
''.&mt('No.').' '.
''.&nameUserString('header')." \n";
@@ -4115,14 +3456,11 @@ sub viewgrades {
if (!$display) { $display = &Apache::lonnet::metadata($url,$part.'.name'); }
my ($partid) = &split_part_type($part);
push(@partids,$partid);
-#
-# FIXME: Looks like $display looks at English text
-#
my $display_part=&get_display_part($partid,$symb);
if ($display =~ /^Partial Credit Factor/) {
$result.=''.
- &mt('Score Part: [_1][_2](weight = [_3])',
- $display_part,' ',$weight{$partid}).' '."\n";
+ &mt('Score Part: [_1] (weight = [_2])',
+ $display_part,$weight{$partid}).''."\n";
next;
} else {
@@ -4143,7 +3481,7 @@ sub viewgrades {
#get info for each student
#list all the students - with points and grade status
- my (undef,undef,$fullname) = &getclasslist(\@sections,'1',\@groups);
+ my (undef,undef,$fullname) = &getclasslist($env{'form.section'},'1');
my $ctr = 0;
foreach (sort
{
@@ -4152,142 +3490,36 @@ sub viewgrades {
}
return $a cmp $b;
} (keys(%$fullname))) {
+ $ctr++;
$result.=&viewstudentgrade($symb,$env{'request.course.id'},
- $_,$$fullname{$_},\@parts,\%weight,\$ctr,\%last_resets);
+ $_,$$fullname{$_},\@parts,\%weight,$ctr,\%last_resets);
}
$result.=&Apache::loncommon::end_data_table();
$result.=' '."\n";
$result.=' '."\n";
- if ($ctr == 0) {
+ if (scalar(%$fullname) eq 0) {
+ my $colspan=3+scalar(@parts);
+ my $section_display = join (", ",&Apache::loncommon::get_env_multiple('form.section'));
my $stu_status = join(' or ',&Apache::loncommon::get_env_multiple('form.Status'));
- $result=''.&mt('Manual Grading').' '.
- '';
- if ($env{'form.submitonly'} eq 'all') {
- if (grep(/^all$/,@sections)) {
- if (grep(/^all$/,@groups)) {
- $result .= &mt('There are no students with enrollment status [_1] to modify or grade.',
- $stu_status);
- } elsif (grep(/^none$/,@groups)) {
- $result .= &mt('There are no students with no group assigned and with enrollment status [_1] to modify or grade.',
- $stu_status);
- } else {
- $result .= &mt('There are no students in group(s) [_1] with enrollment status [_2] to modify or grade.',
- $group_display,$stu_status);
- }
- } elsif (grep(/^none$/,@sections)) {
- if (grep(/^all$/,@groups)) {
- $result .= &mt('There are no students in no section with enrollment status [_1] to modify or grade.',
- $stu_status);
- } elsif (grep(/^none$/,@groups)) {
- $result .= &mt('There are no students in no section and no group with enrollment status [_1] to modify or grade.',
- $stu_status);
- } else {
- $result .= &mt('There are no students in no section in group(s) [_1] with enrollment status [_2] to modify or grade.',
- $group_display,$stu_status);
- }
- } else {
- if (grep(/^all$/,@groups)) {
- $result .= &mt('There are no students in section(s) [_1] with enrollment status [_2] to modify or grade.',
- $section_display,$stu_status);
- } elsif (grep(/^none$/,@groups)) {
- $result .= &mt('There are no students in section(s) [_1] and no group with enrollment status [_2] to modify or grade.',
- $section_display,$stu_status);
- } else {
- $result .= &mt('There are no students in section(s) [_1] and group(s) [_2] with enrollment status [_3] to modify or grade.',
- $section_display,$group_display,$stu_status);
- }
- }
- } else {
- if (grep(/^all$/,@sections)) {
- if (grep(/^all$/,@groups)) {
- $result .= &mt('There are no students with enrollment status [_1] and submission status "[_2]" to modify or grade.',
- $stu_status,$submission_status);
- } elsif (grep(/^none$/,@groups)) {
- $result .= &mt('There are no students with no group assigned with enrollment status [_1] and submission status "[_2]" to modify or grade.',
- $stu_status,$submission_status);
- } else {
- $result .= &mt('There are no students in group(s) [_1] with enrollment status [_2] and submission status "[_3]" to modify or grade.',
- $group_display,$stu_status,$submission_status);
- }
- } elsif (grep(/^none$/,@sections)) {
- if (grep(/^all$/,@groups)) {
- $result .= &mt('There are no students in no section with enrollment status [_1] and submission status "[_2]" to modify or grade.',
- $stu_status,$submission_status);
- } elsif (grep(/^none$/,@groups)) {
- $result .= &mt('There are no students in no section and no group with enrollment status [_1] and submission status "[_2]" to modify or grade.',
- $stu_status,$submission_status);
- } else {
- $result .= &mt('There are no students in no section in group(s) [_1] with enrollment status [_2] and submission status "[_3]" to modify or grade.',
- $group_display,$stu_status,$submission_status);
- }
- } else {
- if (grep(/^all$/,@groups)) {
- $result .= &mt('There are no students in section(s) [_1] with enrollment status [_2] and submission status "[_3]" to modify or grade.',
- $section_display,$stu_status,$submission_status);
- } elsif (grep(/^none$/,@groups)) {
- $result .= &mt('There are no students in section(s) [_1] and no group with enrollment status [_2] and submission status "[_3]" to modify or grade.',
- $section_display,$stu_status,$submission_status);
- } else {
- $result .= &mt('There are no students in section(s) [_1] and group(s) [_2] with enrollment status [_3] and submission status "[_4]" to modify or grade.',
- $section_display,$group_display,$stu_status,$submission_status);
- }
- }
- }
- $result .= ' ';
+ $result=''.
+ &mt('There are no students in section(s) [_1] with enrollment status [_2] to modify or grade.',
+ $section_display, $stu_status).
+ ' ';
}
+ $result.=&show_grading_menu_form($symb);
return $result;
}
-#--- call by previous routine to display each student who satisfies submission filter.
+#--- call by previous routine to display each student
sub viewstudentgrade {
my ($symb,$courseid,$student,$fullname,$parts,$weight,$ctr,$last_resets) = @_;
my ($uname,$udom) = split(/:/,$student);
my %record=&Apache::lonnet::restore($symb,$courseid,$udom,$uname);
- my $submitonly = $env{'form.submitonly'};
- unless (($submitonly eq 'all') || ($submitonly eq 'queued')) {
- my %partstatus = ();
- if (ref($parts) eq 'ARRAY') {
- foreach my $apart (@{$parts}) {
- my ($part,$type) = &split_part_type($apart);
- my ($status,undef) = split(/_/,$record{"resource.$part.solved"},2);
- $status = 'nothing' if ($status eq '');
- $partstatus{$part} = $status;
- my $subkey = "resource.$part.submitted_by";
- $partstatus{$subkey} = $record{$subkey} if ($record{$subkey} ne '');
- }
- my $submitted = 0;
- my $graded = 0;
- my $incorrect = 0;
- foreach my $key (keys(%partstatus)) {
- $submitted = 1 if ($partstatus{$key} ne 'nothing');
- $graded = 1 if ($partstatus{$key} =~ /^ungraded/);
- $incorrect = 1 if ($partstatus{$key} =~ /^incorrect/);
-
- my $partid = (split(/\./,$key))[1];
- if ($partstatus{'resource.'.$partid.'.'.$key.'.submitted_by'} ne '') {
- $submitted = 0;
- }
- }
- return if (!$submitted && ($submitonly eq 'yes' ||
- $submitonly eq 'incorrect' ||
- $submitonly eq 'graded'));
- return if (!$graded && ($submitonly eq 'graded'));
- return if (!$incorrect && $submitonly eq 'incorrect');
- }
- }
- if ($submitonly eq 'queued') {
- my ($cdom,$cnum) = split(/_/,$courseid);
- my %queue_status =
- &Apache::bridgetask::get_student_status($symb,$cdom,$cnum,
- $udom,$uname);
- return if (!defined($queue_status{'gradingqueue'}));
- }
- $$ctr++;
- my %aggregates = ();
+ my %aggregates = ();
my $result=&Apache::loncommon::start_data_table_row().''.
- ' '.
- "\n".$$ctr.' '.
+ ' '.
+ "\n".$ctr.' '.
''.$fullname.' '.
'('.$uname.($env{'user.domain'} eq $udom ? '' : ':'.$udom).') '."\n";
@@ -4347,11 +3579,13 @@ sub viewstudentgrade {
#--- change scores for all the students in a section/class
# record does not get update if unchanged
sub editgrades {
- my ($request,$symb) = @_;
+ my ($request) = @_;
+ my $symb=&get_symb($request);
my $section_display = join (", ",&Apache::loncommon::get_env_multiple('form.section'));
my $title=''.&mt('Current Grade Status').' ';
- $title.=''.&mt('Section:').' '.$section_display.' '."\n";
+ $title.=''.&mt('Current Resource: [_1]',$env{'form.probTitle'}).' '."\n";
+ $title.=''.&mt('Section: [_1]',$section_display).' '."\n";
my $result= &Apache::loncommon::start_data_table().
&Apache::loncommon::start_data_table_header_row().
@@ -4385,7 +3619,6 @@ sub editgrades {
$ctr++;
}
my (undef,undef,$url) = &Apache::lonnet::decode_symb($symb);
- my $totcolspan = 0;
foreach my $partid (@partid) {
$header .= ''.&mt('Old Score').' '.
''.&mt('New Score').' ';
@@ -4402,7 +3635,6 @@ sub editgrades {
''.&mt('New').' '.$display.' ';
$columns{$partid}+=2;
}
- $totcolspan += $columns{$partid};
}
foreach my $partid (@partid) {
my $display_part=&get_display_part($partid,$symb);
@@ -4418,20 +3650,20 @@ sub editgrades {
my @noupdate;
my ($updateCtr,$noupdateCtr) = (1,1);
for ($i=0; $i<$env{'form.total'}; $i++) {
+ my $line;
my $user = $env{'form.ctr'.$i};
my ($uname,$udom)=split(/:/,$user);
my %newrecord;
my $updateflag = 0;
- my $usec=$classlist->{"$uname:$udom"}[5];
- my $canmodify = &canmodify($usec);
- my $line = ''.
- &nameUserString(undef,$$fullname{$user},$uname,$udom).' ';
- if (!$canmodify) {
- push(@noupdate,
- $line."".
- &mt('Not allowed to modify student')." ");
- next;
- }
+ $line .= ''.&nameUserString(undef,$$fullname{$user},$uname,$udom).' ';
+ my $usec=$classlist->{"$uname:$udom"}[5];
+ if (!&canmodify($usec)) {
+ my $numcols=scalar(@partid)*4+2;
+ push(@noupdate,
+ $line."".
+ &mt('Not allowed to modify student')." ");
+ next;
+ }
my %aggregate = ();
my $aggregateflag = 0;
$user=~s/:/_/; # colon doen't work in javascript for names
@@ -4546,7 +3778,8 @@ sub editgrades {
}
}
if (@noupdate) {
- my $numcols=$totcolspan+2;
+# my $numcols=(scalar(@partid)*(scalar(@parts)-1)*2)+3;
+ my $numcols=scalar(@partid)*4+2;
$result .= &Apache::loncommon::start_data_table_row('LC_empty_row').
''.
&mt('No Changes Occurred For the Students Below').
@@ -4559,7 +3792,8 @@ sub editgrades {
&Apache::loncommon::end_data_table_row();
}
}
- $result .= &Apache::loncommon::end_data_table();
+ $result .= &Apache::loncommon::end_data_table().
+ &show_grading_menu_form($symb);
my $msg = ''.
&mt('Number of records updated = [_1] for [quant,_2,student].',
$rec_update,$count).' '.
@@ -4589,8 +3823,6 @@ sub split_part_type {
sub csvupload_javascript_reverse_associate {
my $error1=&mt('You need to specify the username or the student/employee ID');
my $error2=&mt('You need to specify at least one grading field');
- &js_escape(\$error1);
- &js_escape(\$error2);
return(<print('
ENDPICK
}
sub checkforfile_js {
my $alertmsg = &mt('Please use the browse button to select a file from your local directory.');
- &js_escape(\$alertmsg);
my $result = &Apache::lonhtmlcommon::scripttag(<'.&mt('Specify a file containing the class scores for current resource.').''.
- &Apache::loncommon::end_data_table_header_row().
- &Apache::loncommon::start_data_table_row().'';
+ $env{'form.probTitle'} = &Apache::lonnet::gettitle($symb);
+# my ($table) = &showResourceInfo($symb,$env{'form.probTitle'});
+# $result.=$table;
+ $result.=''."\n";
+ $result.=''."\n";
+ $result.=' '.&mt('Specify a file containing the class scores for current resource.').
+ ' '."\n";
+ $result.=''."\n";
my $upload=&mt("Upload Scores");
my $upfile_select=&Apache::loncommon::upfile_select_html();
my $ignore=&mt('Ignore First Line');
@@ -4774,32 +4013,33 @@ sub upcsvScores_form {
ENDUPFORM
$result.=&Apache::loncommon::help_open_topic("Course_Convert_To_CSV",
- &mt("How do I create a CSV file from a spreadsheet")).
- ' '.
- &Apache::loncommon::end_data_table_row().
- &Apache::loncommon::end_data_table();
+ &mt("How do I create a CSV file from a spreadsheet"))
+ .'
'."\n";
+ $result.='
'."\n";
+ $result.=&show_grading_menu_form($symb);
return $result;
}
sub csvuploadmap {
- my ($request,$symb) = @_;
+ my ($request)= @_;
+ my ($symb)=&get_symb($request);
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 '') {
- &Apache::loncommon::load_tmp_file($request,$datatoken);
- }
+ $datatoken=$env{'form.datatoken'};
+ &Apache::loncommon::load_tmp_file($request);
}
my @records=&Apache::loncommon::upfile_record_sep();
if ($env{'form.noFirstLine'}) { shift(@records); }
@@ -4832,29 +4072,39 @@ sub csvuploadmap {
}
}
&csvuploadmap_footer($request,$i,$keyfields);
+ $request->print(&show_grading_menu_form($symb));
return '';
}
sub csvuploadoptions {
- my ($request,$symb)= @_;
- my $overwrite=&mt('Overwrite any existing score');
+ my ($request)= @_;
+ my ($symb)=&get_symb($request);
my $checked=(($env{'form.noFirstLine'})?'1':'0');
my $ignore=&mt('Ignore First Line');
$request->print(<
+Uploading Class Grade Options
+
- $overwrite
+ Overwrite any existing score
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 Users are in domain: ".$domform."
\n");
}
foreach my $key (sort(keys(%env))) {
if ($key !~ /^form\.(.*)$/) { next; }
@@ -4865,8 +4115,9 @@ ENDPICK
}
# FIXME do a check for any duplicated user ids...
# FIXME do a check for any invalid user ids?...
- $request->print('
+ $request->print('
'."\n");
+ $request->print(&show_grading_menu_form($symb));
return '';
}
@@ -4888,21 +4139,19 @@ sub get_fields {
}
sub csvuploadassign {
- my ($request,$symb) = @_;
+ my ($request)= @_;
+ my ($symb)=&get_symb($request);
if (!$symb) {return '';}
my $error_msg = '';
- my $datatoken = &Apache::loncommon::valid_datatoken($env{'form.datatoken'});
- if ($datatoken ne '') {
- &Apache::loncommon::load_tmp_file($request,$datatoken);
- }
+ &Apache::loncommon::load_tmp_file($request);
my @gradedata = &Apache::loncommon::upfile_record_sep();
if ($env{'form.noFirstLine'}) { shift(@gradedata); }
my %fields=&get_fields();
+ $request->print('Assigning Grades ');
my $courseid=$env{'request.course.id'};
my ($classlist) = &getclasslist('all',0);
my @notallowed;
my @skipped;
- my @warnings;
my $countdone=0;
foreach my $grade (@gradedata) {
my %entries=&Apache::loncommon::record_sep($grade);
@@ -4951,9 +4200,6 @@ sub csvuploadassign {
my $pcr=$entries{$fields{$dest}} / $wgt;
my $award=($pcr == 0) ? 'incorrect_by_override'
: 'correct_by_override';
- if ($pcr>1) {
- push(@warnings,&mt("[_1]: point value larger than weight","$username:$domain"));
- }
$grades{"resource.$part.awarded"}=$pcr;
$grades{"resource.$part.solved"}=$award;
$points{$part}=1;
@@ -4973,7 +4219,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'}";
@@ -4981,13 +4227,7 @@ sub csvuploadassign {
$env{'request.course.id'},
$domain,$username);
if ($result eq 'ok') {
-# Successfully stored
$request->print('.');
-# Remove from grading queue
- &Apache::bridgetask::remove_from_queue('gradingqueue',$symb,
- $env{'course.'.$env{'request.course.id'}.'.domain'},
- $env{'course.'.$env{'request.course.id'}.'.num'},
- $domain,$username);
} else {
$request->print("".
&mt("Failed to save data for student [_1]. Message when trying to save was: [_2]",
@@ -4998,10 +4238,6 @@ sub csvuploadassign {
}
}
$request->print(' '.&Apache::lonhtmlcommon::confirm_success(&mt("Saved scores for [quant,_1,student]",$countdone),$countdone==0));
- if (@warnings) {
- $request->print(' '.&Apache::lonhtmlcommon::confirm_success(&mt('Warnings generated for the following saved scores:'),1).' ');
- $request->print(join(', ',@warnings));
- }
if (@skipped) {
$request->print(' '.&Apache::lonhtmlcommon::confirm_success(&mt('No scores stored for the following username(s):'),1).' ');
$request->print(join(', ',@skipped));
@@ -5011,6 +4247,7 @@ sub csvuploadassign {
$request->print(join(', ',@notallowed));
}
$request->print(" \n");
+ $request->print(&show_grading_menu_form($symb));
return $error_msg;
}
#------------- end of section for handling csv file upload ---------
@@ -5021,10 +4258,9 @@ sub csvuploadassign {
#
#--- Select a page/sequence and a student to grade
sub pickStudentPage {
- my ($request,$symb) = @_;
+ my ($request) = shift;
my $alertmsg = &mt('Please select the student you wish to grade.');
- &js_escape(\$alertmsg);
$request->print(&Apache::lonhtmlcommon::scripttag(< '.
&mt('Manual Grading by Page or Sequence').' ';
@@ -5059,11 +4294,21 @@ LISTJAVASCRIPT
my ($curpage) =&Apache::lonnet::decode_symb($symb);
# my ($curpage,$mapId) =&Apache::lonnet::decode_symb($symb);
# my $type=($curpage =~ /\.(page|sequence)/);
-
- # Collection of hidden fields
+ my $select = ''."\n";
my $ctr=0;
foreach (@$titles) {
my ($minder,$showtitle) = ($_ =~ /(\d+)\.(.*)/);
+ $select.=''.$showtitle.' '."\n";
+ $ctr++;
+ }
+ $select.= ' ';
+ $result.=' '.&mt('Problems from').': '.$select." \n";
+
+ $ctr=0;
+ foreach (@$titles) {
+ my ($minder,$showtitle) = ($_ =~ /(\d+)\.(.*)/);
$result.=' '."\n";
$result.=' '."\n";
$ctr++;
@@ -5071,56 +4316,27 @@ LISTJAVASCRIPT
$result.=' '."\n".
' '."\n";
+ my $options =
+ ' '.&mt('no').' '."\n".
+ ' '.&mt('yes').' '." \n";
+ $result.=' '.&mt('View Problem Text').': '.$options;
+
+ $options =
+ ' '.&mt('none').' '."\n".
+ ' '.&mt('by dates and submissions').' '."\n".
+ ' '.&mt('all details').' '."\n";
+ $result.=' '.&mt('Submissions').': '.$options;
+
$result.=&build_section_inputs();
my $stu_status = join(':',&Apache::loncommon::get_env_multiple('form.Status'));
$result.=' '."\n".
- ' '."\n".
- ' '."\n";
-
- # Show grading options
- $result.=&Apache::lonhtmlcommon::start_pick_box();
- my $select = ''."\n";
- $ctr=0;
- foreach (@$titles) {
- my ($minder,$showtitle) = ($_ =~ /(\d+)\.(.*)/);
- $select.=''.$showtitle.' '."\n";
- $ctr++;
- }
- $select.= ' ';
+ ' '."\n".
+ ' '."\n".
+ ' '." \n";
- $result.=
- &Apache::lonhtmlcommon::row_title(&mt('Problems from'))
- .$select
- .&Apache::lonhtmlcommon::row_closure();
-
- $result.=
- &Apache::lonhtmlcommon::row_title(&mt('View Problem Text'))
- .' '.&mt('no').' '."\n"
- .' '
- .&mt('yes').' '."\n"
- .&Apache::lonhtmlcommon::row_closure();
-
- $result.=
- &Apache::lonhtmlcommon::row_title(&mt('View Submissions'))
- .' '
- .&mt('none').' '."\n"
- .' '.&mt('all submissions').' '."\n"
- .' '
- .&mt('all submissions with details').' '
- .&Apache::lonhtmlcommon::row_closure();
-
- $result.=
- &Apache::lonhtmlcommon::row_title(&mt('Use CODE'))
- .' '
- .&Apache::lonhtmlcommon::row_closure(1)
- .&Apache::lonhtmlcommon::end_pick_box();
+ $result.=' '.&mt('Use CODE').': '."\n";
- # Show list of students to select for grading
- $result.=' '."\n";
$request->print($result);
@@ -5134,7 +4350,7 @@ LISTJAVASCRIPT
''.&nameUserString('header').' '.
&Apache::loncommon::end_data_table_header_row();
- my (undef,undef,$fullname) = &getclasslist($getsec,'1',$getgroup);
+ my (undef,undef,$fullname) = &getclasslist($getsec,'1');
my $ptr = 1;
foreach my $student (sort
{
@@ -5162,6 +4378,7 @@ LISTJAVASCRIPT
$studentTable.=' '."\n";
+ $studentTable.=&show_grading_menu_form($symb);
$request->print($studentTable);
return '';
@@ -5198,7 +4415,9 @@ sub getSymbMap {
#
#--- Displays a page/sequence w/wo problems, w/wo submissions
sub displayPage {
- my ($request,$symb) = @_;
+ my ($request) = shift;
+
+ my ($symb) = &get_symb($request);
my $cdom = $env{"course.$env{'request.course.id'}.domain"};
my $cnum = $env{"course.$env{'request.course.id'}.num"};
my $getsec = $env{'form.section'} eq '' ? 'all' : $env{'form.section'};
@@ -5215,12 +4434,9 @@ sub displayPage {
&Apache::lonnet::clear_EXT_cache_status();
if (!&canview($usec)) {
- $request->print(
- ''.
- &mt('Unable to view requested student. ([_1])',
- $env{'form.student'}).
- ' ');
- return;
+ $request->print(''.&mt('Unable to view requested student. ([_1])',$env{'form.student'}).' ');
+ $request->print(&show_grading_menu_form($symb));
+ return;
}
my $result=' '.$env{'form.title'}.' ';
$result.=' '.&mt('Student: [_1]',&nameUserString(undef,$$fullname{$env{'form.student'}},$uname,$udom)).
@@ -5237,12 +4453,14 @@ sub displayPage {
my $navmap = Apache::lonnavmaps::navmap->new();
unless (ref($navmap)) {
$request->print(&navmap_errormsg());
+ $request->print(&show_grading_menu_form($symb));
return;
}
my ($mapUrl, $id, $resUrl)=&Apache::lonnet::decode_symb($env{'form.page'});
my $map = $navmap->getResourceByUrl($resUrl); # add to navmaps
if (!$map) {
$request->print(''.&mt('Unable to view requested sequence. ([_1])',$resUrl).' ');
+ $request->print(&show_grading_menu_form($symb));
return;
}
my $iterator = $navmap->getIterator($map->map_start(),
@@ -5255,7 +4473,8 @@ sub displayPage {
' '."\n".
' '."\n".
' '."\n".
- ' '."\n";
+ ' '."\n".
+ ' '."\n";
if (defined($env{'form.CODE'})) {
$studentTable.=
@@ -5269,7 +4488,7 @@ sub displayPage {
' '."\n".
&Apache::loncommon::start_data_table().
&Apache::loncommon::start_data_table_header_row().
- '
'.&mt('Prob.').' '.
+ ' Prob. '.
' '.($env{'form.vProb'} eq 'no' ? &mt('Title') : &mt('Problem Text')).'/'.&mt('Grade').' '.
&Apache::loncommon::end_data_table_header_row();
@@ -5289,8 +4508,8 @@ sub displayPage {
&Apache::loncommon::start_data_table_row().
''.$prob.
(scalar(@{$parts}) == 1 ? ''
- : ' ('.&mt('[_1]parts',
- scalar(@{$parts}).' ').')'
+ : ' ('.&mt('[_1] parts)',
+ scalar(@{$parts}))
).
' ';
$studentTable.='';
@@ -5331,11 +4550,9 @@ sub displayPage {
}
} elsif ($env{'form.lastSub'} eq 'all') {
my $last = ($env{'form.lastSub'} eq 'last' ? 'last' : '');
- my $identifier = (&canmodify($usec)? $prob : '');
$studentTable.=&Apache::loncommon::get_previous_attempt($symbx,$uname,$udom,
$env{'request.course.id'},
- '','.submission',undef,
- $usec,$identifier);
+ '','.submission');
}
if (&canmodify($usec)) {
@@ -5359,6 +4576,7 @@ sub displayPage {
' '.
''."\n";
+ $studentTable.=&show_grading_menu_form($symb);
$request->print($studentTable);
return '';
@@ -5373,7 +4591,6 @@ sub displaySubByDates {
&Apache::loncommon::start_data_table_header_row().
' '.&mt('Date/Time').' '.
($isCODE?''.&mt('CODE').' ':'').
- ($isTask?''.&mt('Version').' ':'').
''.&mt('Submission').' '.
''.&mt('Status').' '.
&Apache::loncommon::end_data_table_header_row();
@@ -5387,16 +4604,13 @@ sub displaySubByDates {
my $interaction;
my $no_increment = 1;
- my (%lastrndseed,%lasttype);
for ($version=1;$version<=$$record{'version'};$version++) {
my $timestamp =
&Apache::lonlocal::locallocaltime($$record{$version.':timestamp'});
if (exists($$record{$version.':resource.0.version'})) {
$interaction = $$record{$version.':resource.0.version'};
}
- if ($isTask && $env{'form.previousversion'}) {
- next unless ($interaction == $env{'form.previousversion'});
- }
+
my $where = ($isTask ? "$version:resource.$interaction"
: "$version:resource");
$studentTable.=&Apache::loncommon::start_data_table_row().
@@ -5404,23 +4618,17 @@ sub displaySubByDates {
if ($isCODE) {
$studentTable.=''.$record->{$version.':resource.CODE'}.' ';
}
- if ($isTask) {
- $studentTable.=''.$interaction.' ';
- }
my @versionKeys = split(/\:/,$$record{$version.':keys'});
my @displaySub = ();
foreach my $partid (@{$parts}) {
- my ($hidden,$type);
- $type = $$record{$version.':resource.'.$partid.'.type'};
- if (($type eq 'anonsurvey') || ($type eq 'anonsurveycred')) {
+ my $hidden;
+ if (($$record{$version.':resource.'.$partid.'.type'} eq 'anonsurvey') ||
+ ($$record{$version.':resource.'.$partid.'.type'} eq 'anonsurveycred')) {
$hidden = 1;
}
- my @matchKey;
- if ($isTask) {
- @matchKey = sort(grep(/^resource\.\d+\.\Q$partid\E\.award$/,@versionKeys));
- } else {
- @matchKey = sort(grep(/^resource\.\Q$partid\E\..*?\.submission$/,@versionKeys));
- }
+ my @matchKey = ($isTask ? sort(grep /^resource\.\d+\.\Q$partid\E\.award$/,@versionKeys)
+ : sort(grep /^resource\.\Q$partid\E\..*?\.submission$/,@versionKeys));
+
# next if ($$record{"$version:resource.$partid.solved"} eq '');
my $display_part=&get_display_part($partid,$symb);
foreach my $matchKey (@matchKey) {
@@ -5429,45 +4637,32 @@ sub displaySubByDates {
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).')'
+ .'('.&mt('Part 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"};
- }
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)) {
+ if (!exists($orders{$partid}->{$responseId})) {
$orders{$partid}->{$responseId}=
&get_order($partid,$responseId,$symb,$uname,$udom,
- $no_increment,$type,$trial,$rndseed);
+ $no_increment);
}
- $displaySub[0].=''.$newvariation.' '; # /nobreak
+ $displaySub[0].=' '; # /nobreak
$displaySub[0].=' '.
- &cleanRecord($$record{$version.':'.$matchKey},$responseType,$symb,$partid,$responseId,$record,$orders{$partid}->{$responseId},"$version:",$uname,$udom,$type,$trial,$rndseed).' ';
+ &cleanRecord($$record{$version.':'.$matchKey},$responseType,$symb,$partid,$responseId,$record,$orders{$partid}->{$responseId},"$version:",$uname,$udom).' ';
}
}
}
@@ -5508,7 +4703,7 @@ sub displaySubByDates {
}
sub updateGradeByPage {
- my ($request,$symb) = @_;
+ my ($request) = shift;
my $cdom = $env{"course.$env{'request.course.id'}.domain"};
my $cnum = $env{"course.$env{'request.course.id'}.num"};
@@ -5519,6 +4714,7 @@ sub updateGradeByPage {
my $usec=$classlist->{$env{'form.student'}}[5];
if (!&canmodify($usec)) {
$request->print(''.&mt('Unable to modify requested student ([_1])',$env{'form.student'}).' ');
+ $request->print(&show_grading_menu_form($env{'form.symb'}));
return;
}
my $result=' '.$env{'form.title'}.' ';
@@ -5537,6 +4733,8 @@ sub updateGradeByPage {
my $map = $navmap->getResourceByUrl($resUrl); # add to navmaps
if (!$map) {
$request->print(''.&mt('Unable to grade requested sequence ([_1]).',$resUrl).' ');
+ my ($symb)=&get_symb($request);
+ $request->print(&show_grading_menu_form($symb));
return;
}
my $iterator = $navmap->getIterator($map->map_start(),
@@ -5553,7 +4751,7 @@ 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 ($depth,$question,$prob,$changeflag)= (1,1,1,0);
while ($depth > 0) {
if($curRes == $iterator->BEGIN_MAP) { $depth++; }
if($curRes == $iterator->END_MAP) { $depth--; }
@@ -5566,7 +4764,7 @@ sub updateGradeByPage {
&Apache::loncommon::start_data_table_row().
''.$prob.
(scalar(@{$parts}) == 1 ? ''
- : ' ('.&mt('[quant,_1,part]',scalar(@{$parts}))
+ : ' ('.&mt('[quant,_1, part]',scalar(@{$parts}))
.')').' ';
$studentTable.=' '.$title.' ';
@@ -5574,12 +4772,6 @@ sub updateGradeByPage {
my @displayPts=();
my %aggregate = ();
my $aggregateflag = 0;
- 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);
- $hideflag += $numchgs;
- }
foreach my $partid (@{$parts}) {
my $newpts = $env{'form.GD_BOX'.$question.'_'.$partid};
my $oldpts = $env{'form.oldpts'.$question.'_'.$partid};
@@ -5668,13 +4860,11 @@ sub updateGradeByPage {
}
$studentTable.=&Apache::loncommon::end_data_table();
+ $studentTable.=&show_grading_menu_form($env{'form.symb'});
my $grademsg=($changeflag == 0 ? &mt('No score was changed or updated.') :
&mt('The scores were changed for [quant,_1,problem].',
- $changeflag).' ');
- my $hidemsg=($hideflag == 0 ? '' :
- &mt('Submissions were marked "hidden" for [quant,_1,transaction].',
- $hideflag).' ');
- $request->print($hidemsg.$grademsg.$studentTable);
+ $changeflag));
+ $request->print($grademsg.$studentTable);
return '';
}
@@ -5697,19 +4887,19 @@ sub updateGradeByPage {
from the file that we are parsing that represents one entire sheet
'bubble line' refers to the data
- representing the line of bubbles that are on the physical bubblesheet
+ representing the line of bubbles that are on the physical bubble sheet
-The overall process is that a scanned in bubblesheet data is uploaded
+The overall process is that a scanned in bubble sheet data is uploaded
into a course. When a user wants to grade, they select a
-sequence/folder of resources, a file of bubblesheet info, and pick
+sequence/folder of resources, a file of bubble sheet info, and pick
one of the predefined configurations for what each scanline looks
like.
Next each scanline is checked for any errors of either 'missing
bubbles' (it's an error because it may have been mis-scanned
because too light bubbling), 'double bubble' (each bubble line should
-have no more than one letter picked), invalid or duplicated CODE,
+have no more that one letter picked), invalid or duplicated CODE,
invalid student/employee ID
If the CODE option is used that determines the randomization of the
@@ -5718,14 +4908,14 @@ username:domain.
During the validation phase the instructor can choose to skip scanlines.
-After the validation phase, there are now 3 bubblesheet files
+After the validation phase, there are now 3 bubble sheet files
scantron_original_filename (unmodified original file)
scantron_corrected_filename (file where the corrected information has replaced the original information)
scantron_skipped_filename (contains the exact text of scanlines that where skipped)
Also there is a separate hash nohist_scantrondata that contains extra
-correction information that isn't representable in the bubblesheet
+correction information that isn't representable in the bubble sheet
file (see &scantron_getfile() for more information)
After all scanlines are either valid, marked as valid or skipped, then
@@ -5748,7 +4938,9 @@ the homework problem.
sub defaultFormData {
my ($symb)=@_;
- return ' ';
+ return ' '."\n".
+ ' '."\n".
+ ' '."\n";
}
@@ -5797,11 +4989,6 @@ my %subdivided_bubble_lines; # no.
my %responsetype_per_response; # responsetype for each response
-my %masterseq_id_responsenum; # src_id (e.g., 12.3_0.11 etc.) for each
- # numbered response. Needed when randomorder
- # or randompick are in use. Key is ID, value
- # is response number.
-
# Save and restore the bubble lines array to the form env.
@@ -5815,17 +5002,12 @@ sub save_bubble_lines {
$env{"form.scantron.responsetype.$line"} =
$responsetype_per_response{$line};
}
- foreach my $resid (keys(%masterseq_id_responsenum)) {
- my $line = $masterseq_id_responsenum{$resid};
- $env{"form.scantron.residpart.$line"} = $resid;
- }
}
sub restore_bubble_lines {
my $line = 0;
%bubble_lines_per_response = ();
- %masterseq_id_responsenum = ();
while ($env{"form.scantron.bubblelines.$line"}) {
my $value = $env{"form.scantron.bubblelines.$line"};
$bubble_lines_per_response{$line} = $value;
@@ -5835,12 +5017,28 @@ sub restore_bubble_lines {
$env{"form.scantron.sub_bubblelines.$line"};
$responsetype_per_response{$line} =
$env{"form.scantron.responsetype.$line"};
- my $id = $env{"form.scantron.residpart.$line"};
- $masterseq_id_responsenum{$id} = $line;
$line++;
}
}
+# Given the parsed scanline, get the response for
+# 'answer' number n:
+
+sub get_response_bubbles {
+ my ($parsed_line, $response) = @_;
+
+ my $bubble_line = $first_bubble_line{$response-1} +1;
+ my $bubble_lines= $bubble_lines_per_response{$response-1};
+
+ my $selected = "";
+
+ for (my $bline = 0; $bline < $bubble_lines; $bline++) {
+ $selected .= $$parsed_line{"scantron.$bubble_line.answer"}.":";
+ $bubble_line++;
+ }
+ return $selected;
+}
+
=pod
=item scantron_filenames
@@ -5853,16 +5051,14 @@ sub scantron_filenames {
my $cdom=$env{'course.'.$env{'request.course.id'}.'.domain'};
my $cname=$env{'course.'.$env{'request.course.id'}.'.num'};
my $getpropath = 1;
- my ($dirlist,$listerror) = &Apache::lonnet::dirlist('userfiles',$cdom,
- $cname,$getpropath);
+ my @files=&Apache::lonnet::dirlist('userfiles',$cdom,$cname,
+ $getpropath);
my @possiblenames;
- if (ref($dirlist) eq 'ARRAY') {
- foreach my $filename (sort(@{$dirlist})) {
- ($filename)=split(/&/,$filename);
- if ($filename!~/^scantron_orig_/) { next ; }
- $filename=~s/^scantron_orig_//;
- push(@possiblenames,$filename);
- }
+ foreach my $filename (sort(@files)) {
+ ($filename)=split(/&/,$filename);
+ if ($filename!~/^scantron_orig_/) { next ; }
+ $filename=~s/^scantron_orig_//;
+ push(@possiblenames,$filename);
}
return @possiblenames;
}
@@ -5901,7 +5097,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 ''));
@@ -5913,6 +5109,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
@@ -5960,7 +5212,7 @@ sub scantron_CODEunique {
=item scantron_selectphase
- Generates the initial screen to start the bubblesheet process.
+ Generates the initial screen to start the bubble sheet process.
Allows for - starting a grading run.
- downloading existing scan data (original, corrected
or skipped info)
@@ -5974,7 +5226,8 @@ sub scantron_CODEunique {
=cut
sub scantron_selectphase {
- my ($r,$file2grade,$symb) = @_;
+ my ($r,$file2grade) = @_;
+ my ($symb)=&get_symb($r);
if (!$symb) {return '';}
my $map_error;
my $sequence_selector=&getSequenceDropDown($symb,\$map_error);
@@ -5983,6 +5236,7 @@ sub scantron_selectphase {
return;
}
my $default_form_data=&defaultFormData($symb);
+ my $grading_menu_button=&show_grading_menu_form($symb);
my $file_selector=&scantron_uploads($file2grade);
my $format_selector=&scantron_scantab();
my $CODE_selector=&scantron_CODElist();
@@ -5991,63 +5245,6 @@ sub scantron_selectphase {
$ssi_error = 0;
- 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.
-
- $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('
- function checkUpload(formname) {
- if (formname.upfile.value == "") {
- alert("'.$alertmsg.'");
- return false;
- }
- formname.submit();
- }'."\n".$formatjs));
- $r->print('
- '
- );
-
- }
-
# Chunk of form to prompt for a file to grade and how:
$result.= '
@@ -6095,6 +5292,52 @@ sub scantron_selectphase {
$r->print($result);
+ 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.
+
+ $r->print('
+
+ '.&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(&get_symb($r,1));
+ my $cdom= $env{'course.'.$env{'request.course.id'}.'.domain'};
+ my $cnum= $env{'course.'.$env{'request.course.id'}.'.num'};
+ $r->print(&Apache::lonhtmlcommon::scripttag('
+ function checkUpload(formname) {
+ if (formname.upfile.value == "") {
+ alert("'.&mt('Please use the browse button to select a file from your local directory.').'");
+ return false;
+ }
+ formname.submit();
+ }'));
+ $r->print('
+
+');
+
+ $r->print('
+
+ '.&Apache::loncommon::end_data_table_row().'
+ '.&Apache::loncommon::end_data_table().'
+');
+ }
+
# Chunk of the form that prompts to view a scoring office file,
# corrected file, skipped records in a file.
@@ -6121,7 +5364,7 @@ sub scantron_selectphase {
&Apache::lonpickcode::code_list($r,2);
- $r->print(' ');
+ $r->print($grading_menu_button);
return;
}
+=pod
+
+=item get_scantron_config
+
+ Parse and return the scantron 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
+
+=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];
+ last;
+ }
+ return %config;
+}
+
=pod
=item username_to_idmap
@@ -6179,17 +5512,8 @@ sub username_to_idmap {
my ($classlist)= @_;
my %idmap;
foreach my $student (keys(%$classlist)) {
- my $id = $classlist->{$student}->[&Apache::loncoursedata::CL_ID];
- unless ($id eq '') {
- if (!exists($idmap{$id})) {
- $idmap{$id} = $student;
- } else {
- my $status = $classlist->{$student}->[&Apache::loncoursedata::CL_STATUS];
- if ($status eq 'Active') {
- $idmap{$id} = $student;
- }
- }
- }
+ $idmap{$classlist->{$student}->[&Apache::loncoursedata::CL_ID]}=
+ $student;
}
return %idmap;
}
@@ -6201,7 +5525,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
@@ -6371,27 +5695,6 @@ sub digits_to_letters {
(see scantron_getfile for more information)
just_header - True if should not process question answers but only
the stuff to the left of the answers.
- randomorder - True if randomorder in use
- randompick - True if randompick in use
- sequence - Exam folder URL
- master_seq - Ref to array containing symbs in exam folder
- symb_to_resource - Ref to hash of symbs for resources in exam folder
- (corresponding values are resource objects)
- partids_by_symb - Ref to hash of symb -> array ref of partIDs
- orderedforcode - Ref to hash of arrays. keys are CODEs and values
- are refs to an array of resource objects, ordered
- according to order used for CODE, when randomorder
- and or randompick are in use.
- respnumlookup - Ref to hash mapping question numbers in bubble lines
- for current line to question number used for same question
- in "Master Sequence" (as seen by Course Coordinator).
- startline - Ref to hash where key is question number (0 is first)
- and value is number of first bubble line for current
- student or code-based randompick and/or randomorder.
- 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
@@ -6436,12 +5739,12 @@ sub digits_to_letters {
=cut
sub scantron_parse_scanline {
- my ($line,$whichline,$scantron_config,$scan_data,$just_header,$idmap,
- $randomorder,$randompick,$sequence,$master_seq,$symb_to_resource,
- $partids_by_symb,$orderedforcode,$respnumlookup,$startline,$totalref)=@_;
+ my ($line,$whichline,$scantron_config,$scan_data,$just_header)=@_;
my %record;
- my $data=substr($line,0,$$scantron_config{'Qstart'}-1); # stuff before answers
+ my $lastpos = $env{'form.scantron_maxbubble'}*$$scantron_config{'Qlength'};
+ my $questions=substr($line,$$scantron_config{'Qstart'}-1,$lastpos); # Answers
+ my $data=substr($line,0,$$scantron_config{'Qstart'}-1); # earlier stuff
if (!($$scantron_config{'CODElocation'} eq 0 ||
$$scantron_config{'CODElocation'} eq 'none')) {
if ($$scantron_config{'CODElocation'} < 0 ||
@@ -6477,29 +5780,10 @@ sub scantron_parse_scanline {
my $questnum=0;
my $ansnum =1; # Multiple 'answer lines'/question.
- my $lastpos = $env{'form.scantron_maxbubble'}*$$scantron_config{'Qlength'};
- if ($randompick || $randomorder) {
- my $total = &get_respnum_lookups($sequence,$scan_data,$idmap,$line,\%record,
- $master_seq,$symb_to_resource,
- $partids_by_symb,$orderedforcode,
- $respnumlookup,$startline);
- if ($total) {
- $lastpos = $total*$$scantron_config{'Qlength'};
- }
- if (ref($totalref)) {
- $$totalref = $total;
- }
- }
- my $questions=substr($line,$$scantron_config{'Qstart'}-1,$lastpos); # Answers
chomp($questions); # Get rid of any trailing \n.
$questions =~ s/\r$//; # Get rid of trailing \r too (MAC or Win uploads).
while (length($questions)) {
- my $answers_needed;
- if (($randompick || $randomorder) && (ref($respnumlookup) eq 'HASH')) {
- $answers_needed = $bubble_lines_per_response{$respnumlookup->{$questnum}};
- } else {
- $answers_needed = $bubble_lines_per_response{$questnum};
- }
+ my $answers_needed = $bubble_lines_per_response{$questnum};
my $answer_length = ($$scantron_config{'Qlength'} * $answers_needed)
|| 1;
$questnum++;
@@ -6508,16 +5792,11 @@ sub scantron_parse_scanline {
$questions = substr($questions,$answer_length);
if (length($currentquest) < $answer_length) { next; }
- my $subdivided;
- if (($randompick || $randomorder) && (ref($respnumlookup) eq 'HASH')) {
- $subdivided = $subdivided_bubble_lines{$respnumlookup->{$questnum-1}};
- } else {
- $subdivided = $subdivided_bubble_lines{$questnum-1};
- }
- if ($subdivided =~ /,/) {
+ if ($subdivided_bubble_lines{$questnum-1} =~ /,/) {
my $subquestnum = 1;
my $subquestions = $currentquest;
- my @subanswers_needed = split(/,/,$subdivided);
+ my @subanswers_needed =
+ split(/,/,$subdivided_bubble_lines{$questnum-1});
foreach my $subans (@subanswers_needed) {
my $subans_length =
($$scantron_config{'Qlength'} * $subans) || 1;
@@ -6528,13 +5807,10 @@ sub scantron_parse_scanline {
($$scantron_config{'Qon'} eq 'number')) {
$ansnum = &scantron_validator_lettnum($ansnum,
$questnum,$quest_id,$subans,$currsubquest,$whichline,
- \@alphabet,\%record,$scantron_config,$scan_data,
- $randomorder,$randompick,$respnumlookup);
+ \@alphabet,\%record,$scantron_config,$scan_data);
} else {
$ansnum = &scantron_validator_positional($ansnum,
- $questnum,$quest_id,$subans,$currsubquest,$whichline,
- \@alphabet,\%record,$scantron_config,$scan_data,
- $randomorder,$randompick,$respnumlookup);
+ $questnum,$quest_id,$subans,$currsubquest,$whichline, \@alphabet,\%record,$scantron_config,$scan_data);
}
$subquestnum ++;
}
@@ -6543,13 +5819,11 @@ sub scantron_parse_scanline {
($$scantron_config{'Qon'} eq 'number')) {
$ansnum = &scantron_validator_lettnum($ansnum,$questnum,
$quest_id,$answers_needed,$currentquest,$whichline,
- \@alphabet,\%record,$scantron_config,$scan_data,
- $randomorder,$randompick,$respnumlookup);
+ \@alphabet,\%record,$scantron_config,$scan_data);
} else {
$ansnum = &scantron_validator_positional($ansnum,$questnum,
$quest_id,$answers_needed,$currentquest,$whichline,
- \@alphabet,\%record,$scantron_config,$scan_data,
- $randomorder,$randompick,$respnumlookup);
+ \@alphabet,\%record,$scantron_config,$scan_data);
}
}
}
@@ -6557,66 +5831,9 @@ sub scantron_parse_scanline {
return \%record;
}
-sub get_master_seq {
- my ($resources,$master_seq,$symb_to_resource) = @_;
- return unless ((ref($resources) eq 'ARRAY') && (ref($master_seq) eq 'ARRAY') &&
- (ref($symb_to_resource) eq 'HASH'));
- my $resource_error;
- foreach my $resource (@{$resources}) {
- my $ressymb;
- if (ref($resource)) {
- $ressymb = $resource->symb();
- push(@{$master_seq},$ressymb);
- $symb_to_resource->{$ressymb} = $resource;
- } else {
- $resource_error = 1;
- last;
- }
- }
- return $resource_error;
-}
-
-sub get_respnum_lookups {
- my ($sequence,$scan_data,$idmap,$line,$record,$master_seq,$symb_to_resource,
- $partids_by_symb,$orderedforcode,$respnumlookup,$startline) = @_;
- return unless ((ref($record) eq 'HASH') && (ref($master_seq) eq 'ARRAY') &&
- (ref($symb_to_resource) eq 'HASH') && (ref($partids_by_symb) eq 'HASH') &&
- (ref($orderedforcode) eq 'HASH') && (ref($respnumlookup) eq 'HASH') &&
- (ref($startline) eq 'HASH'));
- my ($user,$scancode);
- if ((exists($record->{'scantron.CODE'})) &&
- (&Apache::lonnet::validCODE($record->{'scantron.CODE'}))) {
- $scancode = $record->{'scantron.CODE'};
- } else {
- $user = &scantron_find_student($record,$scan_data,$idmap,$line);
- }
- my @mapresources =
- &users_order($user,$scancode,$sequence,$master_seq,$symb_to_resource,
- $orderedforcode);
- my $total = 0;
- my $count = 0;
- foreach my $resource (@mapresources) {
- my $id = $resource->id();
- my $symb = $resource->symb();
- if (ref($partids_by_symb->{$symb}) eq 'ARRAY') {
- foreach my $partid (@{$partids_by_symb->{$symb}}) {
- my $respnum = $masterseq_id_responsenum{$id.'_'.$partid};
- if ($respnum ne '') {
- $respnumlookup->{$count} = $respnum;
- $startline->{$count} = $total;
- $total += $bubble_lines_per_response{$respnum};
- $count ++;
- }
- }
- }
- }
- return $total;
-}
-
sub scantron_validator_lettnum {
my ($ansnum,$questnum,$quest_id,$answers_needed,$currquest,$whichline,
- $alphabet,$record,$scantron_config,$scan_data,$randomorder,
- $randompick,$respnumlookup) = @_;
+ $alphabet,$record,$scantron_config,$scan_data) = @_;
# Qon 'letter' implies for each slot in currquest we have:
# ? or * for doubles, a letter in A-Z for a bubble, and
@@ -6635,23 +5852,19 @@ sub scantron_validator_lettnum {
$matchon = '\d';
}
my $occurrences = 0;
- my $responsenum = $questnum-1;
- if (($randompick || $randomorder) && (ref($respnumlookup) eq 'HASH')) {
- $responsenum = $respnumlookup->{$questnum-1}
- }
- if (($responsetype_per_response{$responsenum} eq 'essayresponse') ||
- ($responsetype_per_response{$responsenum} eq 'formularesponse') ||
- ($responsetype_per_response{$responsenum} eq 'stringresponse') ||
- ($responsetype_per_response{$responsenum} eq 'imageresponse') ||
- ($responsetype_per_response{$responsenum} eq 'reactionresponse') ||
- ($responsetype_per_response{$responsenum} eq 'organicresponse')) {
+ if (($responsetype_per_response{$questnum-1} eq 'essayresponse') ||
+ ($responsetype_per_response{$questnum-1} eq 'formularesponse') ||
+ ($responsetype_per_response{$questnum-1} eq 'stringresponse') ||
+ ($responsetype_per_response{$questnum-1} eq 'imageresponse') ||
+ ($responsetype_per_response{$questnum-1} eq 'reactionresponse') ||
+ ($responsetype_per_response{$questnum-1} eq 'organicresponse')) {
my @singlelines = split('',$currquest);
foreach my $entry (@singlelines) {
$occurrences = &occurence_count($entry,$matchon);
if ($occurrences > 1) {
last;
}
- }
+ }
} else {
$occurrences = &occurence_count($currquest,$matchon);
}
@@ -6699,8 +5912,7 @@ sub scantron_validator_lettnum {
sub scantron_validator_positional {
my ($ansnum,$questnum,$quest_id,$answers_needed,$currquest,
- $whichline,$alphabet,$record,$scantron_config,$scan_data,
- $randomorder,$randompick,$respnumlookup) = @_;
+ $whichline,$alphabet,$record,$scantron_config,$scan_data) = @_;
# Otherwise there's a positional notation;
# each bubble line requires Qlength items, and there are filled in
@@ -6742,16 +5954,12 @@ sub scantron_validator_positional {
# record all the bubbles filled in as well as the
# fact this response consists of multiple bubbles.
#
- my $responsenum = $questnum-1;
- if (($randompick || $randomorder) && (ref($respnumlookup) eq 'HASH')) {
- $responsenum = $respnumlookup->{$questnum-1}
- }
- if (($responsetype_per_response{$responsenum} eq 'essayresponse') ||
- ($responsetype_per_response{$responsenum} eq 'formularesponse') ||
- ($responsetype_per_response{$responsenum} eq 'stringresponse') ||
- ($responsetype_per_response{$responsenum} eq 'imageresponse') ||
- ($responsetype_per_response{$responsenum} eq 'reactionresponse') ||
- ($responsetype_per_response{$responsenum} eq 'organicresponse')) {
+ if (($responsetype_per_response{$questnum-1} eq 'essayresponse') ||
+ ($responsetype_per_response{$questnum-1} eq 'formularesponse') ||
+ ($responsetype_per_response{$questnum-1} eq 'stringresponse') ||
+ ($responsetype_per_response{$questnum-1} eq 'imageresponse') ||
+ ($responsetype_per_response{$questnum-1} eq 'reactionresponse') ||
+ ($responsetype_per_response{$questnum-1} eq 'organicresponse')) {
my $doubleerror = 0;
while (($currquest >= $$scantron_config{'Qlength'}) &&
(!$doubleerror)) {
@@ -6884,7 +6092,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'};
@@ -6933,11 +6141,7 @@ sub scantron_process_corrections {
}
}
if ($err) {
- $r->print(
- ''
- .&mt('Unable to accept last correction, an error occurred: [_1]',
- $errmsg)
- .'
');
+ $r->print("Unable to accept last correction, an error occurred :$errmsg: ");
} else {
&scantron_put_line($scanlines,$scan_data,$which,$line,$skip);
&scantron_putfile($scanlines,$scan_data);
@@ -7029,7 +6233,7 @@ sub remember_current_skipped {
=item check_for_error
Checks if there was an error when attempting to remove a specific
- scantron_.. bubblesheet data file. Prints out an error if
+ scantron_.. bubble sheet data file. Prints out an error if
something went wrong.
=cut
@@ -7051,37 +6255,32 @@ sub check_for_error {
=cut
sub scantron_warning_screen {
- my ($button_text,$symb)=@_;
+ my ($button_text)=@_;
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'} &&
$scantron_config{'CODElength'}) {
$CODElist=$env{'form.scantron_CODElist'};
- if ($env{'form.scantron_CODElist'} eq '') { $CODElist=''.&mt('None').' '; }
+ if ($env{'form.scantron_CODElist'} eq '') { $CODElist='None '; }
$CODElist=
''.&mt('List of CODES to validate against:').' '.
$env{'form.scantron_CODElist'}.' ';
}
- my $lastbubblepoints;
- if ($env{'form.scantron_lastbubblepoints'} ne '') {
- $lastbubblepoints =
- ''.&mt('Hand-graded items: points from last bubble in row').' '.
- $env{'form.scantron_lastbubblepoints'}.' ';
- }
return ('
-'.&mt("Please double check the information below before clicking on '[_1]'",&mt($button_text)).'
+'.&mt('Please double check the information below before clicking on \'[_1]\'',&mt($button_text)).'
'.&mt('Sequence to be Graded:').' '.$title.'
'.&mt('Data File that will be used:').' '.$env{'form.scantron_selectfile'}.'
-'.$CODElist.$lastbubblepoints.'
+'.$CODElist.'
- '.&mt("If this information is correct, please click on '[_1]'.",&mt($button_text)).'
-'.&mt('If something is incorrect, please return to [_1]Grade/Manage/Review Bubblesheets[_2] to start over.','',' ').'
+
+ '.&mt('If this information is correct, please click on \'[_1]\'.',&mt($button_text)).'
+ '.&mt('If something is incorrect, please click the \'Grading Menu\' button to start over.').'
');
@@ -7097,33 +6296,33 @@ sub scantron_warning_screen {
=cut
sub scantron_do_warning {
- my ($r,$symb)=@_;
+ my ($r)=@_;
+ my ($symb)=&get_symb($r);
if (!$symb) {return '';}
my $default_form_data=&defaultFormData($symb);
$r->print(&scantron_form_start().$default_form_data);
if ( $env{'form.selectpage'} eq '' ||
$env{'form.scantron_selectfile'} eq '' ||
$env{'form.scantron_format'} eq '' ) {
- $r->print("".&mt('You have forgotten to specify some information. Please go Back and try again.')."
");
+ $r->print("".&mt('You have forgetten to specify some information. Please go Back and try again.')."
");
if ( $env{'form.selectpage'} eq '') {
$r->print(''.&mt('You have not selected a Sequence to grade').'
');
}
if ( $env{'form.scantron_selectfile'} eq '') {
- $r->print(''.&mt("You have not selected a file that contains the student's response data.").'
');
+ $r->print(''.&mt('You have not selected a file that contains the student\'s response data.').'
');
}
if ( $env{'form.scantron_format'} eq '') {
- $r->print(''.&mt("You have not selected the format of the student's response data.").'
');
+ $r->print(''.&mt('You have not selected a the format of the student\'s response data.').'
');
}
} else {
- my $warning=&scantron_warning_screen('Grading: Validate Records',$symb);
- my $bubbledbyhand=&hand_bubble_option();
+ my $warning=&scantron_warning_screen('Grading: Validate Records');
$r->print('
-'.$warning.$bubbledbyhand.'
+'.$warning.'
');
}
- $r->print(" ");
+ $r->print(" ".&show_grading_menu_form($symb));
return '';
}
@@ -7160,11 +6359,9 @@ SCANTRONFORM
' '."\n";
$chunk .=
' '."\n";
- $chunk .=
- ' '."\n";
$result .= $chunk;
$line++;
- }
+ }
return $result;
}
@@ -7172,7 +6369,7 @@ SCANTRONFORM
=item scantron_validate_file
- Dispatch routine for doing validation of a bubblesheet data file.
+ Dispatch routine for doing validation of a bubble sheet data file.
Also processes any necessary information resets that need to
occur before validation begins (ignore previous corrections,
@@ -7181,11 +6378,12 @@ SCANTRONFORM
=cut
sub scantron_validate_file {
- my ($r,$symb) = @_;
+ my ($r) = @_;
+ my ($symb)=&get_symb($r);
if (!$symb) {return '';}
my $default_form_data=&defaultFormData($symb);
- # do the detection of only doing skipped records first before we delete
+ # do the detection of only doing skipped records first befroe we delete
# them when doing the corrections reset
if ($env{'form.scantron_options_redo'} ne 'redo_skipped_ready') {
&reset_skipping_status();
@@ -7209,16 +6407,12 @@ 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 $max_bubble=&scantron_get_maxbubble(\$nav_error,\%scantron_config);
+ my $max_bubble=&scantron_get_maxbubble(\$nav_error);
if ($nav_error) {
$r->print(&navmap_errormsg());
return '';
}
my $result=&scantron_form_start($max_bubble).$default_form_data;
- if ($env{'form.scantron_lastbubblepoints'} ne '') {
- $result .= ' ';
- }
$r->print($result);
my @validate_phases=( 'sequence',
@@ -7236,7 +6430,6 @@ 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';
@@ -7244,7 +6437,7 @@ sub scantron_validate_file {
}
}
if (!$stop) {
- my $warning=&scantron_warning_screen('Start Grading',$symb);
+ my $warning=&scantron_warning_screen('Start Grading');
$r->print(&mt('Validation process complete.').' '.
$warning.
&mt('Perform verification for each student after storage of submissions?').
@@ -7254,7 +6447,7 @@ sub scantron_validate_file {
' '.&mt('No').
' '.
&mt('Grading will take longer if you use verification.').' '.
- &mt('Otherwise, Grade/Manage/Review Bubblesheets [_1] Review bubblesheet data can be used once grading is complete.','»').' '.
+ &mt("Alternatively, the 'Review bubblesheet data' utility (see grading menu) can be used for all students after grading is complete.").' '.
' '.
' '."\n");
} else {
@@ -7266,7 +6459,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 click the 'Grading Menu' button to start over.")."
");
} else {
if ($validate_phases[$currentphase] eq 'doublebubble' || $validate_phases[$currentphase] eq 'missingbubbles') {
$r->print(' ');
@@ -7278,7 +6471,7 @@ sub scantron_validate_file {
$r->print(" ".&mt("this scanline saving it for later."));
}
}
- $r->print(" ");
+ $r->print(" ".&show_grading_menu_form($symb));
return '';
}
@@ -7287,7 +6480,7 @@ sub scantron_validate_file {
=item scantron_remove_file
- Removes the requested bubblesheet data file, makes sure that
+ Removes the requested bubble sheet data file, makes sure that
scantron_original_ is never removed
@@ -7312,7 +6505,7 @@ sub scantron_remove_file {
=item scantron_remove_scan_data
- Removes all scan_data correction for the requested bubblesheet
+ Removes all scan_data correction for the requested bubble sheet
data file. (In the case that both the are doing skipped records we need
to remember the old skipped lines for the time being so that element
persists for a while.)
@@ -7349,7 +6542,7 @@ sub scantron_remove_scan_data {
=item scantron_getfile
- Fetches the requested bubblesheet data file (all 3 versions), and
+ Fetches the requested bubble sheet data file (all 3 versions), and
the scan_data hash
Arguments:
@@ -7449,7 +6642,7 @@ sub lonnet_putfile {
=item scantron_putfile
- Stores the current version of the bubblesheet data files, and the
+ Stores the current version of the bubble sheet data files, and the
scan_data hash. (Does not modify the original version only the
corrected and skipped versions.
@@ -7543,7 +6736,7 @@ sub get_todo_count {
=item scantron_put_line
- Updates the 'corrected' or 'skipped' versions of the bubblesheet
+ Updates the 'corrected' or 'skipped' versions of the bubble sheet
data file.
Arguments:
@@ -7645,12 +6838,7 @@ sub scantron_validate_sequence {
my @resources=
$navmap->retrieveResources($map,\&scantron_filter_not_exam,1,0);
if (@resources) {
- $r->print(''
- .&mt('Some resources in the sequence currently are not set to'
- .' exam mode. Grading these resources currently may not'
- .' work correctly.')
- .'
'
- );
+ $r->print("".&mt('Some resources in the sequence currently are not set to exam mode. Grading these resources currently may not work correctly.')."
");
return (1,$currentphase);
}
}
@@ -7668,11 +6856,11 @@ 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;
- &scantron_get_maxbubble(\$nav_error,\%scantron_config); # parse needs the bubble_lines.. array.
+ &scantron_get_maxbubble(\$nav_error); # parse needs the bubble_lines.. array.
if ($nav_error) {
$r->print(&navmap_errormsg());
return(1,$currentphase);
@@ -7731,35 +6919,25 @@ sub scantron_validate_ID {
sub scantron_get_correction {
- my ($r,$i,$scan_record,$scan_config,$line,$error,$arg,
- $randomorder,$randompick,$respnumlookup,$startline)=@_;
+ my ($r,$i,$scan_record,$scan_config,$line,$error,$arg)=@_;
#FIXME in the case of a duplicated ID the previous line, probably need
#to show both the current line and the previous one and allow skipping
#the previous one or the current one
if ( $$scan_record{'scantron.PaperID'} =~ /\S/) {
- $r->print(
- ''
- .&mt('An error was detected ([_1]) for PaperID [_2]',
- "$error ",
- ''.$$scan_record{'scantron.PaperID'}.' ')
- ."
\n");
- } else {
- $r->print(
- ''
- .&mt('An error was detected ([_1]) in scanline [_2] [_3]',
- "$error ", $i, "
$line ")
- ." \n");
- }
- my $message =
- ''
- .&mt('The ID on the form is [_1]',
- "$$scan_record{'scantron.ID'} ")
- .' '
- .&mt('The name on the paper is [_1], [_2]',
- $$scan_record{'scantron.LastName'},
- $$scan_record{'scantron.FirstName'})
- .'
';
+ $r->print("".&mt("An error was detected ($error) ".
+ " for PaperID [_1] ",
+ $$scan_record{'scantron.PaperID'})."
\n");
+ } else {
+ $r->print("".&mt("An error was detected ($error) ".
+ " in scanline [_1]
[_2] ",
+ $i,$line)." \n");
+ }
+ my $message="".&mt("The ID on the form is [_1] ".
+ "The name on the paper is [_2],[_3]",
+ $$scan_record{'scantron.ID'},
+ $$scan_record{'scantron.LastName'},
+ $$scan_record{'scantron.FirstName'})."
";
$r->print(' '."\n");
$r->print(' '."\n");
@@ -7769,10 +6947,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");
@@ -7782,21 +6960,20 @@ sub scantron_get_correction {
$r->print(&Apache::loncommon::selectstudent_link('scantronupload',
'scantron_username','scantron_domain'));
$r->print(": ");
- $r->print("\n:\n".
+ $r->print("\n@".
&Apache::loncommon::select_dom_form($env{'request.role.domain'},'scantron_domain'));
$r->print('');
} elsif ($error =~ /CODE$/) {
if ($error eq 'incorrectCODE') {
- $r->print('
'.&mt("The encoded CODE is not in the list of possible CODEs.")."
\n");
+ $r->print("".&mt("The encoded CODE is not in the list of possible CODEs.")."
\n");
} 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 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'}' ")
- ."
\n");
+ $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");
+ $r->print("".&mt("How should I handle this?")." \n");
$r->print("\n ");
my $i=0;
if ($error eq 'incorrectCODE'
@@ -7823,7 +7000,7 @@ sub scantron_get_correction {
$r->print("
- ".&mt("Use the CODE [_1] that was on the paper, ignoring the error.",
+ ".&mt("Use the CODE [_1] that is was on the paper, ignoring the error.",
"".$$scan_record{'scantron.CODE'}." ")."
");
$r->print("\n ");
@@ -7861,13 +7038,12 @@ ENDSCRIPT
" "));
$r->print("\n ");
} elsif ($error eq 'doublebubble') {
- $r->print('
'.&mt("There have been multiple bubbles scanned for some question(s)")."
\n");
+ $r->print("".&mt("There have been multiple bubbles scanned for some question(s)")."
\n");
# The form field scantron_questions is acutally a list of line numbers.
# represented by this form so:
- my $line_list = &questions_to_line_list($arg,$randomorder,$randompick,
- $respnumlookup,$startline);
+ my $line_list = &questions_to_line_list($arg);
$r->print(' ');
@@ -7875,14 +7051,12 @@ ENDSCRIPT
$r->print("".&mt("Please indicate which bubble should be used for grading")."
");
foreach my $question (@{$arg}) {
my @linenums = &prompt_for_corrections($r,$question,$scan_config,
- $scan_record, $error,
- $randomorder,$randompick,
- $respnumlookup,$startline);
+ $scan_record, $error);
push(@lines_to_correct,@linenums);
}
$r->print(&verify_bubbles_checked(@lines_to_correct));
} elsif ($error eq 'missingbubble') {
- $r->print(''.&mt("There have been [_1]no[_2] bubbles scanned for some question(s)",'',' ')."
\n");
+ $r->print("".&mt("There have been no bubbles scanned for some question(s)")."
\n");
$r->print($message);
$r->print("".&mt("Please indicate which bubble should be used for grading.")."
");
$r->print(&mt("Some questions have no scanned bubbles.")."\n");
@@ -7891,16 +7065,13 @@ ENDSCRIPT
# a list of question numbers. Therefore:
#
- my $line_list = &questions_to_line_list($arg,$randomorder,$randompick,
- $respnumlookup,$startline);
+ my $line_list = &questions_to_line_list($arg);
$r->print(' ');
foreach my $question (@{$arg}) {
my @linenums = &prompt_for_corrections($r,$question,$scan_config,
- $scan_record, $error,
- $randomorder,$randompick,
- $respnumlookup,$startline);
+ $scan_record, $error);
push(@lines_to_correct,@linenums);
}
$r->print(&verify_bubbles_checked(@lines_to_correct));
@@ -7914,8 +7085,7 @@ sub verify_bubbles_checked {
my (@ansnums) = @_;
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') {
- $first = $startline->{$question-1} + 1;
- }
- } else {
- $first = $first_bubble_line{$responsenum} + 1;
- }
- my @subans = split(/,/,$subdivided_bubble_lines{$responsenum});
+ $first = $first_bubble_line{$question-1} + 1;
+ my @subans = split(/,/,$subdivided_bubble_lines{$question-1});
my $subcount = 1;
while ($subcount<$subquestion) {
$first += $subans[$subcount-1];
@@ -7991,16 +7145,8 @@ sub questions_to_line_list {
}
$count = $subans[$subquestion-1];
} else {
- my $responsenum = $question-1;
- if (($randomorder || $randompick) && (ref($respnumlookup) eq 'HASH')) {
- $responsenum = $respnumlookup->{$question-1};
- if (ref($startline) eq 'HASH') {
- $first = $startline->{$question-1} + 1;
- }
- } else {
- $first = $first_bubble_line{$responsenum} + 1;
- }
- $count = $bubble_lines_per_response{$responsenum};
+ $first = $first_bubble_line{$question-1} + 1;
+ $count = $bubble_lines_per_response{$question-1};
}
$last = $first+$count-1;
push(@lines, ($first..$last));
@@ -8022,14 +7168,6 @@ for multi and missing bubble cases).
$scan_config - The scantron file configuration hash.
$scan_record - Reference to the hash that has the the parsed scanlines.
$error - Type of error
- $randomorder - True if randomorder in use.
- $randompick - True if randompick in use.
- $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).
- $startline - Reference to hash where key is question number (0 is first)
- and value is number of first bubble line for current student
- or code-based randompick and/or randomorder.
Implicit inputs:
%bubble_lines_per_response - Starting line numbers for each question.
@@ -8054,26 +7192,15 @@ for multi and missing bubble cases).
=cut
sub prompt_for_corrections {
- my ($r, $question, $scan_config, $scan_record, $error, $randomorder,
- $randompick, $respnumlookup, $startline) = @_;
+ my ($r, $question, $scan_config, $scan_record, $error) = @_;
my ($current_line,$lines);
my @linenums;
my $questionnum = $question;
- my ($first,$responsenum);
if ($question =~ /^(\d+)\.(\d+)$/) {
$question = $1;
+ $current_line = $first_bubble_line{$question-1} + 1 ;
my $subquestion = $2;
- if (($randomorder || $randompick) && (ref($respnumlookup) eq 'HASH')) {
- $responsenum = $respnumlookup->{$question-1};
- if (ref($startline) eq 'HASH') {
- $first = $startline->{$question-1};
- }
- } else {
- $responsenum = $question-1;
- $first = $first_bubble_line{$responsenum};
- }
- $current_line = $first + 1 ;
- my @subans = split(/,/,$subdivided_bubble_lines{$responsenum});
+ my @subans = split(/,/,$subdivided_bubble_lines{$question-1});
my $subcount = 1;
while ($subcount<$subquestion) {
$current_line += $subans[$subcount-1];
@@ -8081,34 +7208,25 @@ sub prompt_for_corrections {
}
$lines = $subans[$subquestion-1];
} else {
- if (($randomorder || $randompick) && (ref($respnumlookup) eq 'HASH')) {
- $responsenum = $respnumlookup->{$question-1};
- if (ref($startline) eq 'HASH') {
- $first = $startline->{$question-1};
- }
- } else {
- $responsenum = $question-1;
- $first = $first_bubble_line{$responsenum};
- }
- $current_line = $first + 1;
- $lines = $bubble_lines_per_response{$responsenum};
+ $current_line = $first_bubble_line{$question-1} + 1 ;
+ $lines = $bubble_lines_per_response{$question-1};
}
if ($lines > 1) {
$r->print(&mt('The group of bubble lines below responds to a single question.').' ');
- if (($responsetype_per_response{$responsenum} eq 'essayresponse') ||
- ($responsetype_per_response{$responsenum} eq 'formularesponse') ||
- ($responsetype_per_response{$responsenum} eq 'stringresponse') ||
- ($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'.").' ');
+ if (($responsetype_per_response{$question-1} eq 'essayresponse') ||
+ ($responsetype_per_response{$question-1} eq 'formularesponse') ||
+ ($responsetype_per_response{$question-1} eq 'stringresponse') ||
+ ($responsetype_per_response{$question-1} eq 'imageresponse') ||
+ ($responsetype_per_response{$question-1} eq 'reactionresponse') ||
+ ($responsetype_per_response{$question-1} eq 'organicresponse')) {
+ $r->print(&mt("Although this particular question type requires handgrading, the instructions for this question in the 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. ")." ");
}
}
for (my $i =0; $i < $lines; $i++) {
my $selected = $$scan_record{"scantron.$current_line.answer"};
- &scantron_bubble_selector($r,$scan_config,$current_line,
+ &scantron_bubble_selector($r,$scan_config,$current_line,
$questionnum,$error,split('', $selected));
push(@linenums,$current_line);
$current_line++;
@@ -8128,7 +7246,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.
@@ -8141,19 +7259,7 @@ sub scantron_bubble_selector {
my $max=$$scan_config{'Qlength'};
my $scmode=$$scan_config{'Qon'};
- if ($scmode eq 'number' || $scmode eq 'letter') {
- if (($$scan_config{'BubblesPerRow'} =~ /^\d+$/) &&
- ($$scan_config{'BubblesPerRow'} > 0)) {
- $max=$$scan_config{'BubblesPerRow'};
- if (($scmode eq 'number') && ($max > 10)) {
- $max = 10;
- } elsif (($scmode eq 'letter') && $max > 26) {
- $max = 26;
- }
- } else {
- $max = 10;
- }
- }
+ if ($scmode eq 'number' || $scmode eq 'letter') { $max=10; }
my @alphabet=('A'..'Z');
$r->print(&Apache::loncommon::start_data_table().
@@ -8292,7 +7398,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'}) {
@@ -8308,7 +7414,7 @@ sub scantron_validate_CODE {
my %allcodes=&get_codes();
my $nav_error;
- &scantron_get_maxbubble(\$nav_error,\%scantron_config); # parse needs the lines per response array.
+ &scantron_get_maxbubble(\$nav_error); # parse needs the lines per response array.
if ($nav_error) {
$r->print(&navmap_errormsg());
return(1,$currentphase);
@@ -8362,43 +7468,12 @@ sub scantron_validate_doublebubble {
#get student info
my $classlist=&Apache::loncoursedata::get_classlist();
my %idmap=&username_to_idmap($classlist);
- my (undef,undef,$sequence)=
- &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();
- unless (ref($navmap)) {
- $r->print(&navmap_errormsg());
- return(1,$currentphase);
- }
- my $map=$navmap->getResourceByUrl($sequence);
- my @resources=$navmap->retrieveResources($map,\&scantron_filter,1,0);
- my ($randomorder,$randompick,@master_seq,%symb_to_resource,%grader_partids_by_symb,
- %grader_randomlists_by_symb,%orderedforcode,%respnumlookup,%startline);
- my $bubbles_per_row = &bubblesheet_bubbles_per_row(\%scantron_config);
-
my $nav_error;
- if (ref($map)) {
- $randomorder = $map->randomorder();
- $randompick = $map->randompick();
- if ($randomorder || $randompick) {
- $nav_error = &get_master_seq(\@resources,\@master_seq,\%symb_to_resource);
- if ($nav_error) {
- $r->print(&navmap_errormsg());
- return(1,$currentphase);
- }
- &graders_resources_pass(\@resources,\%grader_partids_by_symb,
- \%grader_randomlists_by_symb,$bubbles_per_row);
- }
- } else {
- $r->print(&navmap_errormsg());
- return(1,$currentphase);
- }
-
- &scantron_get_maxbubble(\$nav_error,\%scantron_config); # parse needs the bubble line array.
+ &scantron_get_maxbubble(\$nav_error); # parse needs the bubble line array.
if ($nav_error) {
$r->print(&navmap_errormsg());
return(1,$currentphase);
@@ -8408,15 +7483,11 @@ sub scantron_validate_doublebubble {
my $line=&scantron_get_line($scanlines,$scan_data,$i);
if ($line=~/^[\s\cz]*$/) { next; }
my $scan_record=&scantron_parse_scanline($line,$i,\%scantron_config,
- $scan_data,undef,\%idmap,$randomorder,
- $randompick,$sequence,\@master_seq,
- \%symb_to_resource,\%grader_partids_by_symb,
- \%orderedforcode,\%respnumlookup,\%startline);
+ $scan_data);
if (!defined($$scan_record{'scantron.doubleerror'})) { next; }
&scantron_get_correction($r,$i,$scan_record,\%scantron_config,$line,
'doublebubble',
- $$scan_record{'scantron.doubleerror'},
- $randomorder,$randompick,\%respnumlookup,\%startline);
+ $$scan_record{'scantron.doubleerror'});
return (1,$currentphase);
}
return (0,$currentphase+1);
@@ -8424,7 +7495,7 @@ sub scantron_validate_doublebubble {
sub scantron_get_maxbubble {
- my ($nav_error,$scantron_config) = @_;
+ my ($nav_error) = @_;
if (defined($env{'form.scantron_maxbubble'}) &&
$env{'form.scantron_maxbubble'}) {
&restore_bubble_lines();
@@ -8443,7 +7514,6 @@ sub scantron_get_maxbubble {
}
my $map=$navmap->getResourceByUrl($sequence);
my @resources=$navmap->retrieveResources($map,\&scantron_filter,1,0);
- my $bubbles_per_row = &bubblesheet_bubbles_per_row($scantron_config);
&Apache::lonxml::clear_problem_counter();
@@ -8455,14 +7525,11 @@ sub scantron_get_maxbubble {
%first_bubble_line = ();
%subdivided_bubble_lines = ();
%responsetype_per_response = ();
- %masterseq_id_responsenum = ();
my $response_number = 0;
my $bubble_line = 0;
foreach my $resource (@resources) {
- my $resid = $resource->id();
- my ($analysis,$parts) = &scantron_partids_tograde($resource,$cid,$uname,
- $udom,undef,$bubbles_per_row);
+ my ($analysis,$parts) = &scantron_partids_tograde($resource,$cid,$uname,$udom);
if ((ref($analysis) eq 'HASH') && (ref($parts) eq 'ARRAY')) {
foreach my $part_id (@{$parts}) {
my $lines;
@@ -8491,10 +7558,9 @@ sub scantron_get_maxbubble {
if (ref($analysis->{$part_id.'.shown'}) eq 'ARRAY') {
$numshown = scalar(@{$analysis->{$part_id.'.shown'}});
}
- my $bubbles_per_row =
- &bubblesheet_bubbles_per_row($scantron_config);
- my $inner_bubble_lines = int($numbub/$bubbles_per_row);
- if (($numbub % $bubbles_per_row) != 0) {
+ my $bubbles_per_line = 10;
+ my $inner_bubble_lines = int($numbub/$bubbles_per_line);
+ if (($numbub % $bubbles_per_line) != 0) {
$inner_bubble_lines++;
}
for (my $i=0; $i<$numshown; $i++) {
@@ -8505,13 +7571,12 @@ sub scantron_get_maxbubble {
$lines = $numshown * $inner_bubble_lines;
} else {
$lines = $analysis->{"$part_id.bubble_lines"};
- }
+ }
$first_bubble_line{$response_number} = $bubble_line;
$bubble_lines_per_response{$response_number} = $lines;
$responsetype_per_response{$response_number} =
$analysis->{$part_id.'.type'};
- $masterseq_id_responsenum{$resid.'_'.$part_id} = $response_number;
$response_number++;
$bubble_line += $lines;
@@ -8527,76 +7592,26 @@ sub scantron_get_maxbubble {
return $env{'form.scantron_maxbubble'};
}
-sub bubblesheet_bubbles_per_row {
- my ($scantron_config) = @_;
- my $bubbles_per_row;
- if (ref($scantron_config) eq 'HASH') {
- $bubbles_per_row = $scantron_config->{'BubblesPerRow'};
- }
- if ((!$bubbles_per_row) || ($bubbles_per_row < 1)) {
- $bubbles_per_row = 10;
- }
- return $bubbles_per_row;
-}
-
sub scantron_validate_missingbubbles {
my ($r,$currentphase) = @_;
#get student info
my $classlist=&Apache::loncoursedata::get_classlist();
my %idmap=&username_to_idmap($classlist);
- my (undef,undef,$sequence)=
- &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();
- unless (ref($navmap)) {
- $r->print(&navmap_errormsg());
- return(1,$currentphase);
- }
-
- my $map=$navmap->getResourceByUrl($sequence);
- my @resources=$navmap->retrieveResources($map,\&scantron_filter,1,0);
- my ($randomorder,$randompick,@master_seq,%symb_to_resource,%grader_partids_by_symb,
- %grader_randomlists_by_symb,%orderedforcode,%respnumlookup,%startline);
- my $bubbles_per_row = &bubblesheet_bubbles_per_row(\%scantron_config);
-
my $nav_error;
- if (ref($map)) {
- $randomorder = $map->randomorder();
- $randompick = $map->randompick();
- if ($randomorder || $randompick) {
- $nav_error = &get_master_seq(\@resources,\@master_seq,\%symb_to_resource);
- if ($nav_error) {
- $r->print(&navmap_errormsg());
- return(1,$currentphase);
- }
- &graders_resources_pass(\@resources,\%grader_partids_by_symb,
- \%grader_randomlists_by_symb,$bubbles_per_row);
- }
- } else {
- $r->print(&navmap_errormsg());
- return(1,$currentphase);
- }
-
-
- my $max_bubble=&scantron_get_maxbubble(\$nav_error,\%scantron_config);
+ my $max_bubble=&scantron_get_maxbubble(\$nav_error);
if ($nav_error) {
- $r->print(&navmap_errormsg());
return(1,$currentphase);
}
-
if (!$max_bubble) { $max_bubble=2**31; }
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 =
- &scantron_parse_scanline($line,$i,\%scantron_config,$scan_data,undef,\%idmap,
- $randomorder,$randompick,$sequence,\@master_seq,
- \%symb_to_resource,\%grader_partids_by_symb,
- \%orderedforcode,\%respnumlookup,\%startline);
+ my $scan_record=&scantron_parse_scanline($line,$i,\%scantron_config,
+ $scan_data);
if (!defined($$scan_record{'scantron.missingerror'})) { next; }
my @to_correct;
@@ -8605,45 +7620,28 @@ 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;
+ if (!defined($first_bubble_line{$question -1})) { next; }
+ my $first = $first_bubble_line{$question-1};
+ my @subans = split(/,/,$subdivided_bubble_lines{$question-1});
+ 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};
+ if (!defined($first_bubble_line{$missing - 1})) { next; }
+ $lastbubble = $first_bubble_line{$missing - 1} + $bubble_lines_per_response{$missing - 1};
}
if ($lastbubble > $max_bubble) { next; }
push(@to_correct,$missing);
}
if (@to_correct) {
&scantron_get_correction($r,$i,$scan_record,\%scantron_config,
- $line,'missingbubble',\@to_correct,
- $randomorder,$randompick,\%respnumlookup,
- \%startline);
+ $line,'missingbubble',\@to_correct);
return (1,$currentphase);
}
@@ -8651,53 +7649,18 @@ sub scantron_validate_missingbubbles {
return (0,$currentphase+1);
}
-sub hand_bubble_option {
- my (undef, undef, $sequence) =
- &Apache::lonnet::decode_symb($env{'form.selectpage'});
- return if ($sequence eq '');
- my $navmap = Apache::lonnavmaps::navmap->new();
- unless (ref($navmap)) {
- return;
- }
- my $needs_hand_bubbles;
- my $map=$navmap->getResourceByUrl($sequence);
- my @resources=$navmap->retrieveResources($map,\&scantron_filter,1,0);
- foreach my $res (@resources) {
- if (ref($res)) {
- if ($res->is_problem()) {
- my $partlist = $res->parts();
- foreach my $part (@{ $partlist }) {
- my @types = $res->responseType($part);
- if (grep(/^(chem|essay|image|formula|math|string|functionplot)$/,@types)) {
- $needs_hand_bubbles = 1;
- last;
- }
- }
- }
- }
- }
- if ($needs_hand_bubbles) {
- my %scantron_config=&Apache::lonnet::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?',' ').
- ' '.&mt('[quant,_1,point]',$bubbles_per_row).' '.&mt('or').' '.
- ' '.&mt('0 points').'
';
- }
- return;
-}
sub scantron_process_students {
- my ($r,$symb) = @_;
+ my ($r) = @_;
my (undef,undef,$sequence)=&Apache::lonnet::decode_symb($env{'form.selectpage'});
+ my ($symb)=&get_symb($r);
if (!$symb) {
return '';
}
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 ($scanlines,$scan_data)=&scantron_getfile();
my $classlist=&Apache::loncoursedata::get_classlist();
my %idmap=&username_to_idmap($classlist);
@@ -8705,28 +7668,36 @@ sub scantron_process_students {
unless (ref($navmap)) {
$r->print(&navmap_errormsg());
return '';
- }
+ }
my $map=$navmap->getResourceByUrl($sequence);
- my ($randomorder,$randompick,@master_seq,%symb_to_resource,%grader_partids_by_symb,
- %grader_randomlists_by_symb);
- if (ref($map)) {
- $randomorder = $map->randomorder();
- $randompick = $map->randompick();
- } else {
- $r->print(&navmap_errormsg());
- return '';
- }
- 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);
- if ($nav_error) {
- $r->print(&navmap_errormsg());
- return '';
+ my (%grader_partids_by_symb,%grader_randomlists_by_symb);
+ &graders_resources_pass(\@resources,\%grader_partids_by_symb,
+ \%grader_randomlists_by_symb);
+ my $resource_error;
+ foreach my $resource (@resources) {
+ my $ressymb;
+ if (ref($resource)) {
+ $ressymb = $resource->symb();
+ } else {
+ $resource_error = 1;
+ last;
+ }
+ my ($analysis,$parts) =
+ &scantron_partids_tograde($resource,$env{'request.course.id'},
+ $env{'user.name'},$env{'user.domain'},1);
+ $grader_partids_by_symb{$ressymb} = $parts;
+ if (ref($analysis) eq 'HASH') {
+ if (ref($analysis->{'parts_withrandomlist'}) eq 'ARRAY') {
+ $grader_randomlists_by_symb{$ressymb} =
+ $analysis->{'parts_withrandomlist'};
+ }
}
}
- &graders_resources_pass(\@resources,\%grader_partids_by_symb,
- \%grader_randomlists_by_symb,$bubbles_per_row);
+ if ($resource_error) {
+ $r->print(&navmap_errormsg());
+ return '';
+ }
my ($uname,$udom);
my $result= <print(' ');
my $start=&Time::HiRes::time();
my $i=-1;
my $started;
- &scantron_get_maxbubble(\$nav_error,\%scantron_config); # Need the bubble lines array to parse.
+ my $nav_error;
+ &scantron_get_maxbubble(\$nav_error); # Need the bubble lines array to parse.
if ($nav_error) {
$r->print(&navmap_errormsg());
return '';
@@ -8760,13 +7735,13 @@ SCANTRONFORM
if ($ssi_error) {
$r->print("");
&ssi_print_error($r);
+ $r->print(&show_grading_menu_form($symb));
&Apache::lonnet::remove_lock($lock);
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;
while ($i<$scanlines->{'count'}) {
($uname,$udom)=('','');
@@ -8774,18 +7749,12 @@ SCANTRONFORM
my $line=&scantron_get_line($scanlines,$scan_data,$i);
if ($line=~/^[\s\cz]*$/) { next; }
if ($started) {
- &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,'last student');
+ &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,
+ 'last student');
}
$started=1;
- my %respnumlookup = ();
- my %startline = ();
- my $total;
my $scan_record=&scantron_parse_scanline($line,$i,\%scantron_config,
- $scan_data,undef,\%idmap,$randomorder,
- $randompick,$sequence,\@master_seq,
- \%symb_to_resource,\%grader_partids_by_symb,
- \%orderedforcode,\%respnumlookup,\%startline,
- \$total);
+ $scan_data);
unless ($uname=&scantron_find_student($scan_record,$scan_data,
\%idmap,$i)) {
&scantron_add_delay(\@delayqueue,$line,
@@ -8797,26 +7766,10 @@ SCANTRONFORM
'Student '.$uname.' has multiple sheets',2);
next;
}
- my $usec = $classlist->{$uname}->[&Apache::loncoursedata::CL_SECTION];
- my $user = $uname.':'.$usec;
($uname,$udom)=split(/:/,$uname);
- my $scancode;
- if ((exists($scan_record->{'scantron.CODE'})) &&
- (&Apache::lonnet::validCODE($scan_record->{'scantron.CODE'}))) {
- $scancode = $scan_record->{'scantron.CODE'};
- } else {
- $scancode = '';
- }
-
- my @mapresources = @resources;
- if ($randomorder || $randompick) {
- @mapresources =
- &users_order($user,$scancode,$sequence,\@master_seq,\%symb_to_resource,
- \%orderedforcode);
- }
my (%partids_by_symb,$res_error);
- foreach my $resource (@mapresources) {
+ foreach my $resource (@resources) {
my $ressymb;
if (ref($resource)) {
$ressymb = $resource->symb();
@@ -8826,14 +7779,8 @@ SCANTRONFORM
}
if ((exists($grader_randomlists_by_symb{$ressymb})) ||
(ref($grader_partids_by_symb{$ressymb}) ne 'ARRAY')) {
- my $currcode;
- if (exists($grader_randomlists_by_symb{$ressymb})) {
- $currcode = $scancode;
- }
my ($analysis,$parts) =
- &scantron_partids_tograde($resource,$env{'request.course.id'},
- $uname,$udom,undef,$bubbles_per_row,
- $currcode);
+ &scantron_partids_tograde($resource,$env{'request.course.id'},$uname,$udom);
$partids_by_symb{$ressymb} = $parts;
} else {
$partids_by_symb{$ressymb} = $grader_partids_by_symb{$ressymb};
@@ -8853,81 +7800,69 @@ SCANTRONFORM
&scantron_putfile($scanlines,$scan_data);
}
+ my $scancode;
+ if ((exists($scan_record->{'scantron.CODE'})) &&
+ (&Apache::lonnet::validCODE($scan_record->{'scantron.CODE'}))) {
+ $scancode = $scan_record->{'scantron.CODE'};
+ } else {
+ $scancode = '';
+ }
+
if (&grade_student_bubbles($r,$uname,$udom,$scan_record,$scancode,
- \@mapresources,\%partids_by_symb,
- $bubbles_per_row,$randomorder,$randompick,
- \%respnumlookup,\%startline)
- eq 'ssi_error') {
+ \@resources,\%partids_by_symb) eq 'ssi_error') {
$ssi_error = 0; # So end of handler error message does not trigger.
$r->print("");
&ssi_print_error($r);
+ $r->print(&show_grading_menu_form($symb));
&Apache::lonnet::remove_lock($lock);
return ''; # Why return ''? Beats me.
}
- if (($scancode) && ($randomorder || $randompick)) {
- my $parmresult =
- &Apache::lonparmset::storeparm_by_symb($symb,
- '0_examcode',2,$scancode,
- 'string_examcode',$uname,
- $udom);
- }
$completedstudents{$uname}={'line'=>$line};
if ($env{'form.verifyrecord'}) {
my $lastpos = $env{'form.scantron_maxbubble'}*$scantron_config{'Qlength'};
- if ($randompick) {
- if ($total) {
- $lastpos = $total*$scantron_config{'Qlength'};
- }
- }
-
my $studentdata = substr($line,$scantron_config{'Qstart'}-1,$lastpos);
chomp($studentdata);
$studentdata =~ s/\r$//;
my $studentrecord = '';
my $counter = -1;
- foreach my $resource (@mapresources) {
+ foreach my $resource (@resources) {
my $ressymb = $resource->symb();
($counter,my $recording) =
&verify_scantron_grading($resource,$udom,$uname,$env{'request.course.id'},
$counter,$studentdata,$partids_by_symb{$ressymb},
- \%scantron_config,\%lettdig,$numletts,$randomorder,
- $randompick,\%respnumlookup,\%startline);
+ \%scantron_config,\%lettdig,$numletts);
$studentrecord .= $recording;
}
if ($studentrecord ne $studentdata) {
&Apache::lonxml::clear_problem_counter();
if (&grade_student_bubbles($r,$uname,$udom,$scan_record,$scancode,
- \@mapresources,\%partids_by_symb,
- $bubbles_per_row,$randomorder,$randompick,
- \%respnumlookup,\%startline)
- eq 'ssi_error') {
+ \@resources,\%partids_by_symb) eq 'ssi_error') {
$ssi_error = 0; # So end of handler error message does not trigger.
$r->print("");
&ssi_print_error($r);
+ $r->print(&show_grading_menu_form($symb));
&Apache::lonnet::remove_lock($lock);
delete($completedstudents{$uname});
return '';
}
$counter = -1;
$studentrecord = '';
- foreach my $resource (@mapresources) {
+ foreach my $resource (@resources) {
my $ressymb = $resource->symb();
($counter,my $recording) =
&verify_scantron_grading($resource,$udom,$uname,$env{'request.course.id'},
$counter,$studentdata,$partids_by_symb{$ressymb},
- \%scantron_config,\%lettdig,$numletts,
- $randomorder,$randompick,\%respnumlookup,
- \%startline);
+ \%scantron_config,\%lettdig,$numletts);
$studentrecord .= $recording;
}
if ($studentrecord ne $studentdata) {
- $r->print('');
+ $r->print('');
if ($scancode eq '') {
- $r->print(&mt('Mismatch grading bubblesheet for user: [_1] with ID: [_2].',
+ $r->print(&mt('Mismatch grading bubble sheet for user: [_1] with ID: [_2].',
$uname.':'.$udom,$scan_record->{'scantron.ID'}));
} else {
- $r->print(&mt('Mismatch grading bubblesheet for user: [_1] with ID: [_2] and CODE: [_3].',
+ $r->print(&mt('Mismatch grading bubble sheet for user: [_1] with ID: [_2] and CODE: [_3].',
$uname.':'.$udom,$scan_record->{'scantron.ID'},$scancode));
}
$r->print(' '.&Apache::loncommon::start_data_table()."\n".
@@ -8935,12 +7870,12 @@ SCANTRONFORM
'
'.&mt('Source').' '.&mt('Bubbled responses').' '.
&Apache::loncommon::end_data_table_header_row()."\n".
&Apache::loncommon::start_data_table_row().
- ''.&mt('Bubblesheet').' '.
- ''.$studentdata.' '.
+ ''.&mt('Bubble Sheet').' '.
+ ''.$studentdata.' '.
&Apache::loncommon::end_data_table_row().
&Apache::loncommon::start_data_table_row().
- ''.&mt('Stored submissions').' '.
- ''.$studentrecord.' '."\n".
+ 'Stored submissions '.
+ ''.$studentrecord.' '."\n".
&Apache::loncommon::end_data_table_row().
&Apache::loncommon::end_data_table().'');
} else {
@@ -8962,20 +7897,19 @@ SCANTRONFORM
# $r->print("took $lasttime
");
$r->print("");
+ $r->print(&show_grading_menu_form($symb));
return '';
}
sub graders_resources_pass {
- my ($resources,$grader_partids_by_symb,$grader_randomlists_by_symb,
- $bubbles_per_row) = @_;
+ my ($resources,$grader_partids_by_symb,$grader_randomlists_by_symb) = @_;
if ((ref($resources) eq 'ARRAY') && (ref($grader_partids_by_symb)) &&
(ref($grader_randomlists_by_symb) eq 'HASH')) {
foreach my $resource (@{$resources}) {
my $ressymb = $resource->symb();
my ($analysis,$parts) =
&scantron_partids_tograde($resource,$env{'request.course.id'},
- $env{'user.name'},$env{'user.domain'},
- 1,$bubbles_per_row);
+ $env{'user.name'},$env{'user.domain'},1);
$grader_partids_by_symb->{$ressymb} = $parts;
if (ref($analysis) eq 'HASH') {
if (ref($analysis->{'parts_withrandomlist'}) eq 'ARRAY') {
@@ -8988,67 +7922,8 @@ sub graders_resources_pass {
return;
}
-=pod
-
-=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
- "NAMEd" exam.
-
- Should be used when randomorder and/or randompick applied when the
- corresponding exam was printed, prior to students completing bubblesheets
- for the version of the exam the student received.
-
-=cut
-
-sub users_order {
- my ($user,$scancode,$mapurl,$master_seq,$symb_to_resource,$orderedforcode) = @_;
- my @mapresources;
- unless ((ref($master_seq) eq 'ARRAY') && (ref($symb_to_resource) eq 'HASH')) {
- return @mapresources;
- }
- if ($scancode) {
- if ((ref($orderedforcode) eq 'HASH') && (ref($orderedforcode->{$scancode}) eq 'ARRAY')) {
- @mapresources = @{$orderedforcode->{$scancode}};
- } else {
- $env{'form.CODE'} = $scancode;
- my $actual_seq =
- &Apache::lonprintout::master_seq_to_person_seq($mapurl,
- $master_seq,
- $user,$scancode,1);
- if (ref($actual_seq) eq 'ARRAY') {
- @mapresources = map { $symb_to_resource->{$_}; } @{$actual_seq};
- if (ref($orderedforcode) eq 'HASH') {
- if (@mapresources > 0) {
- $orderedforcode->{$scancode} = \@mapresources;
- }
- }
- }
- delete($env{'form.CODE'});
- }
- } else {
- my $actual_seq =
- &Apache::lonprintout::master_seq_to_person_seq($mapurl,
- $master_seq,
- $user,undef,1);
- if (ref($actual_seq) eq 'ARRAY') {
- @mapresources =
- map { $symb_to_resource->{$_}; } @{$actual_seq};
- }
- }
- return @mapresources;
-}
-
sub grade_student_bubbles {
- my ($r,$uname,$udom,$scan_record,$scancode,$resources,$parts,$bubbles_per_row,
- $randomorder,$randompick,$respnumlookup,$startline) = @_;
- my $uselookup = 0;
- if (($randomorder || $randompick) && (ref($respnumlookup) eq 'HASH') &&
- (ref($startline) eq 'HASH')) {
- $uselookup = 1;
- }
-
+ my ($r,$uname,$udom,$scan_record,$scancode,$resources,$parts) = @_;
if (ref($resources) eq 'ARRAY') {
my $count = 0;
foreach my $resource (@{$resources}) {
@@ -9061,21 +7936,11 @@ sub grade_student_bubbles {
'grade_symb' => $ressymb,
'CODE' => $scancode
);
- if ($bubbles_per_row ne '') {
- $form{'bubbles_per_row'} = $bubbles_per_row;
- }
- if ($env{'form.scantron_lastbubblepoints'} ne '') {
- $form{'scantron_lastbubblepoints'} = $env{'form.scantron_lastbubblepoints'};
- }
if (ref($parts) eq 'HASH') {
if (ref($parts->{$ressymb}) eq 'ARRAY') {
foreach my $part (@{$parts->{$ressymb}}) {
- if ($uselookup) {
- $form{'scantron_questnum_start.'.$part} = $startline->{$count} + 1;
- } else {
- $form{'scantron_questnum_start.'.$part} =
- 1+$env{'form.scantron.first_bubble_line.'.$count};
- }
+ $form{'scantron_questnum_start.'.$part} =
+ 1+$env{'form.scantron.first_bubble_line.'.$count};
$count++;
}
}
@@ -9089,21 +7954,18 @@ sub grade_student_bubbles {
}
sub scantron_upload_scantron_data {
- my ($r,$symb) = @_;
+ my ($r)=@_;
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)');
- my $default_form_data=&defaultFormData($symb);
+ (' 'x2).&mt('(shows course personnel)');
+ my $default_form_data=&defaultFormData(&get_symb($r,1));
my $nofile_alert = &mt('Please use the browse button to select a file from your local directory.');
- &js_escape(\$nofile_alert);
my $nocourseid_alert = &mt("Please use the 'Select Course' link to open a separate window where you can search for a course to which a file can be uploaded.");
- &js_escape(\$nocourseid_alert);
$r->print(&Apache::lonhtmlcommon::scripttag('
function checkUpload(formname) {
if (formname.upfile.value == "") {
@@ -9131,10 +7993,9 @@ sub scantron_upload_scantron_data {
return;
}
- '.$formatjs.'
'));
$r->print('
-'.&mt('Send bubblesheet data to a course').'
+'.&mt('Send scanned bubblesheet data to a course').'
');
+ $r->print(' '.$grading_menu_button);
return;
}
sub verify_scantron_grading {
my ($resource,$domain,$username,$cid,$counter,$scandata,$partids,
- $scantron_config,$lettdig,$numletts,$randomorder,$randompick,
- $respnumlookup,$startline) = @_;
+ $scantron_config,$lettdig,$numletts) = @_;
my ($record,%expected,%startpos);
return ($counter,$record) if (!ref($resource));
return ($counter,$record) if (!$resource->is_problem());
@@ -9707,21 +8376,15 @@ sub verify_scantron_grading {
foreach my $part_id (@{$partids}) {
$counter ++;
$expected{$part_id} = 0;
- my $respnum = $counter;
- if ($randomorder || $randompick) {
- $respnum = $respnumlookup->{$counter};
- $startpos{$part_id} = $startline->{$counter} + 1;
- } else {
- $startpos{$part_id} = $env{"form.scantron.first_bubble_line.$counter"};
- }
- if ($env{"form.scantron.sub_bubblelines.$respnum"}) {
- my @sub_lines = split(/,/,$env{"form.scantron.sub_bubblelines.$respnum"});
+ if ($env{"form.scantron.sub_bubblelines.$counter"}) {
+ my @sub_lines = split(/,/,$env{"form.scantron.sub_bubblelines.$counter"});
foreach my $item (@sub_lines) {
$expected{$part_id} += $item;
}
} else {
- $expected{$part_id} = $env{"form.scantron.bubblelines.$respnum"};
+ $expected{$part_id} = $env{"form.scantron.bubblelines.$counter"};
}
+ $startpos{$part_id} = $env{"form.scantron.first_bubble_line.$counter"};
}
if ($symb) {
my %recorded;
@@ -9817,26 +8480,67 @@ sub verify_scantron_grading {
return ($counter,$record);
}
+sub letter_to_digits {
+ my %lettdig = (
+ A => 1,
+ B => 2,
+ C => 3,
+ D => 4,
+ E => 5,
+ F => 6,
+ G => 7,
+ H => 8,
+ I => 9,
+ J => 0,
+ );
+ return %lettdig;
+}
+
+
#-------- end of section for handling grading scantron forms -------
#
#-------------------------------------------------------------------
#-------------------------- Menu interface -------------------------
#
-#--- Href with symb and command ---
+#--- Show a Grading Menu button - Calls the next routine ---
+sub show_grading_menu_form {
+ my ($symb)=@_;
+ my $result.=' '."\n";
+ return $result;
+}
-sub href_symb_cmd {
- my ($symb,$cmd)=@_;
- return '/adm/grades?symb='.&HTML::Entities::encode(&Apache::lonenc::check_encrypt($symb),'<>&"').'&command='.$cmd;
+# -- Retrieve choices for grading form
+sub savedState {
+ my %savedState = ();
+ if ($env{'form.saveState'}) {
+ foreach (split(/:/,$env{'form.saveState'})) {
+ my ($key,$value) = split(/=/,$_,2);
+ $savedState{$key} = $value;
+ }
+ }
+ return \%savedState;
}
sub grading_menu {
- my ($request,$symb) = @_;
+ my ($request) = @_;
+ my ($symb)=&get_symb($request);
if (!$symb) {return '';}
+ my $probTitle = &Apache::lonnet::gettitle($symb);
+# $request->print($table);
my %fields = ('symb'=>&Apache::lonenc::check_encrypt($symb),
- 'command'=>'individual');
-
+ 'probTitle'=>$probTitle,
+ 'command'=>'individual',
+ 'saveState'=>"",
+ 'gradingMenu'=>1,
+ 'showgrading'=>"yes");
+
my $url1a = &Apache::lonhtmlcommon::build_url('grades/',\%fields);
$fields{'command'}='ungraded';
@@ -9848,9 +8552,6 @@ sub grading_menu {
$fields{'command'}='all_for_one';
my $url1d=&Apache::lonhtmlcommon::build_url('grades/',\%fields);
- $fields{'command'}='downloadfilesselect';
- my $url1e=&Apache::lonhtmlcommon::build_url('grades/',\%fields);
-
$fields{'command'} = 'csvform';
my $url2 = &Apache::lonhtmlcommon::build_url('grades/',\%fields);
@@ -9859,42 +8560,33 @@ sub grading_menu {
$fields{'command'} = 'scantron_selectphase';
my $url4 = &Apache::lonhtmlcommon::build_url('grades/',\%fields);
-
- $fields{'command'} = 'initialverifyreceipt';
- my $url5 = &Apache::lonhtmlcommon::build_url('grades/',\%fields);
my @menu = ({ categorytitle=>'Hand Grading',
items =>[
- { linktext => 'Select individual students to grade',
- url => $url1a,
- permission => 'F',
- icon => 'grade_students.png',
- linktitle => 'Grade current resource for a selection of students.'
- },
- { linktext => 'Grade ungraded submissions',
+ { linktext => 'Select individual students to grade',
+ url => $url1a,
+ permission => 'F',
+ icon => 'edit-find-replace.png',
+ linktitle => 'Grade current resource for a selection of students.'
+ },
+ { linktext => 'Grade ungraded submissions.',
url => $url1b,
permission => 'F',
- icon => 'ungrade_sub.png',
+ icon => 'edit-find-replace.png',
linktitle => 'Grade all submissions that have not been graded yet.'
},
{ linktext => 'Grading table',
url => $url1c,
permission => 'F',
- icon => 'grading_table.png',
+ icon => 'edit-find-replace.png',
linktitle => 'Grade current resource for all students.'
},
- { linktext => 'Grade page/folder for one student',
+ { linktext => 'Grade complete page/sequence/folder for one student.',
url => $url1d,
permission => 'F',
- icon => 'grade_PageFolder.png',
+ icon => 'edit-find-replace.png',
linktitle => 'Grade all resources in current page/sequence/folder for one student.'
- },
- { linktext => 'Download submissions',
- url => $url1e,
- permission => 'F',
- icon => 'download_sub.png',
- linktitle => 'Download all students submissions.'
}]},
{ categorytitle=>'Automated Grading',
items =>[
@@ -9914,187 +8606,348 @@ sub grading_menu {
{ linktext => 'Grade/Manage/Review Bubblesheets',
url => $url4,
permission => 'F',
- icon => 'bubblesheet.png',
- linktitle => 'Grade bubblesheet exams, upload/download bubblesheet data files, and review previously graded bubblesheet exams.'
- },
- { linktext => 'Verify Receipt Number',
- url => $url5,
- permission => 'F',
- icon => 'receipt_number.png',
- linktitle => 'Verify a system-generated receipt number for correct problem solution.'
- }
-
+ icon => 'stat.png',
+ linktitle => 'Grade scantron exams, upload/download scantron data files, and review previously graded scantron exams.'
+ }
]
});
+ #$fields{'command'} = 'verify';
+ #$url = &Apache::lonhtmlcommon::build_url('grades/',\%fields);
+ #
# Create the menu
my $Str;
+ # $Str .= ''.&mt('Please select a grading task').' ';
$Str .= '\n";
+ my $receiptalert = &mt("Please enter a receipt number given by a student in the receipt box.");
+ $request->print(&Apache::lonhtmlcommon::scripttag(<'."\n".
- ' '."\n";
- $result.=&selectfield(0).
- '
-
-
-
-
- ';
- return $result;
+sub ungraded {
+ my ($request)=@_;
+ &submit_options($request);
}
-sub submit_options_table {
- my ($request,$symb) = @_;
- if (!$symb) {return '';}
- &commonJSfunctions($request);
- my $result;
-
- $result.='';
- return $result;
+sub all_for_one {
+ my ($request)=@_;
+ &submit_options($request);
}
-sub submit_options_download {
- my ($request,$symb) = @_;
+sub submit_options_sequence {
+ my ($request) = @_;
+ my ($symb)=&get_symb($request);
if (!$symb) {return '';}
+ my $probTitle = &Apache::lonnet::gettitle($symb);
- my $res_error;
- my ($partlist,$handgrade,$responseType,$numresp,$numessay,$numdropbox) =
- &response_type($symb,\$res_error);
- if ($res_error) {
- $request->print(&mt('An error occurred retrieving response types'));
- return;
- }
- unless ($numessay) {
- $request->print(&mt('No essayresponse items found'));
- return;
+ my $receiptalert = &mt("Please enter a receipt number given by a student in the receipt box.");
+ $request->print(&Apache::lonhtmlcommon::scripttag(< 1 ) {
- $table = &showResourceInfo($symb,$partlist,$responseType,'gradingMenu',1,1);
+GRADINGMENUJS
+ &commonJSfunctions($request);
+# my ($table,undef,$hdgrade) = &showResourceInfo($symb,$probTitle);
+ my $result;
+ my (undef,$sections) = &getclasslist('all','0');
+ my $savedState = &savedState();
+ my $saveCmd = ($$savedState{'saveCmd'} eq '' ? 'submission' : $$savedState{'saveCmd'});
+ my $saveSec = ($$savedState{'saveSec'} eq '' ? 'all' : $$savedState{'saveSec'});
+ my $saveSub = ($$savedState{'saveSub'} eq '' ? 'all' : $$savedState{'saveSub'});
+ my $saveStatus = ($$savedState{'saveStatus'} eq '' ? 'Active' : $$savedState{'saveStatus'});
+
+ # Preselect sections
+ my $selsec="";
+ if (ref($sections)) {
+ foreach my $section (sort(@$sections)) {
+ $selsec.=''.$section.' '."\n";
}
}
- &commonJSfunctions($request);
+ $result.='';
+ $result .= &show_grading_menu_form($symb);
return $result;
}
#--- Displays the submissions first page -------
sub submit_options {
- my ($request,$symb) = @_;
+ my ($request) = @_;
+ my ($symb)=&get_symb($request);
if (!$symb) {return '';}
+ my $probTitle = &Apache::lonnet::gettitle($symb);
+ my $receiptalert = &mt("Please enter a receipt number given by a student in the receipt box.");
+ $request->print(&Apache::lonhtmlcommon::scripttag(<'.$section.''."\n";
+ }
+ }
$result.='';
- return $result;
-}
+ ' '."\n".
+# ' '."\n".
+ ' '."\n".
+ ' '."\n".
+ ' '."\n".
+ ' '."\n".
+ ' '."\n";
-sub selectfield {
- my ($full)=@_;
- my %options =
- (&substatus_options,
- 'select_form_order' => ['yes','queued','graded','incorrect','all']);
- my $result='
+ $result.='
+
+ '.&mt('Grade Current Resource').'
+
+
+
'.&mt('Sections').'
- '.&Apache::lonstatistics::SectionSelect('section','multiple',5).'
+ '."\n";
+ $result.= $selsec;
+ $result.= 'all ';
+ $result.='
-
+
'.&mt('Groups').'
'.&Apache::lonstatistics::GroupSelect('group','multiple',5).'
-
+
'.&mt('Access Status').'
- '.&Apache::lonhtmlcommon::StatusOptions(undef,undef,5,undef,'mult').'
- ';
- if ($full) {
- $result.='
+ '.&Apache::lonhtmlcommon::StatusOptions($saveStatus,undef,5,undef,'mult').'
+
+
'.&mt('Submission Status').'
- '.
- &Apache::loncommon::select_form('all','submitonly',\%options).
- ' ';
- }
- $result.='';
- return $result;
-}
+
+
+ '.&mt('with submissions').'
+ '.&mt('in grading queue').'
+ '.&mt('with ungraded submissions').'
+ '.&mt('with incorrect submissions').'
+ '.&mt('with any status').'
+
+
+
+
-sub substatus_options {
- return &Apache::lonlocal::texthash(
- 'yes' => 'with submissions',
- 'queued' => 'in grading queue',
- 'graded' => 'with ungraded submissions',
- 'incorrect' => 'with incorrect submissions',
- 'all' => 'with any status',
- );
-}
-
-sub transtatus_options {
- return &Apache::lonlocal::texthash(
- 'yes' => 'with score transactions',
- 'incorrect' => 'with less than full credit',
- 'all' => 'with any status',
- );
+
+
+
+
+ ';
+ $result .= &show_grading_menu_form($symb);
+ return $result;
}
sub reset_perm {
@@ -10119,21 +8972,6 @@ sub init_perm {
}
}
-sub init_old_essays {
- my ($symb,$apath,$adom,$aname) = @_;
- if ($symb ne '') {
- my %essays = &Apache::lonnet::dump('nohist_essay_'.$apath,$adom,$aname);
- if (keys(%essays) > 0) {
- $old_essays{$symb} = \%essays;
- }
- }
- return;
-}
-
-sub reset_old_essays {
- undef(%old_essays);
-}
-
sub gather_clicker_ids {
my %clicker_ids;
@@ -10196,14 +9034,18 @@ sub clicker_grading_parameters {
}
sub process_clicker {
- my ($r,$symb)=@_;
+ my ($r)=@_;
+ my ($symb)=&get_symb($r);
if (!$symb) {return '';}
my $result=&checkforfile_js();
- $result.=&Apache::loncommon::start_data_table().
- &Apache::loncommon::start_data_table_header_row().
- ''.&mt('Specify a file containing clicker information and set grading options.').' '.
- &Apache::loncommon::end_data_table_header_row().
- &Apache::loncommon::start_data_table_row()."\n";
+ $env{'form.probTitle'} = &Apache::lonnet::gettitle($symb);
+# my ($table) = &showResourceInfo($symb,$env{'form.probTitle'});
+# $result.=$table;
+ $result.=''."\n";
+ $result.=''."\n";
+ $result.=' '.&mt('Specify a file containing the clicker information for this resource.').
+ ' '."\n";
+ $result.=''."\n";
# Attempt to restore parameters from last session, set defaults if not present
my %Saveable_Parameters=&clicker_grading_parameters();
&Apache::loncommon::restore_course_settings('grades_clicker',
@@ -10220,7 +9062,7 @@ sub process_clicker {
}
}
- my $upload=&mt("Evaluate File");
+ my $upload=&mt("Upload File");
my $type=&mt("Type");
my $attendance=&mt("Award points just for participation");
my $personnel=&mt("Correctness determined from response by course personnel");
@@ -10230,9 +9072,8 @@ 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',
- 'interwrite' => 'interwrite PRS',
- 'turning' => 'Turning Technologies'});
+ ('iclicker' => 'i>clicker',
+ 'interwrite' => 'interwrite PRS'));
$symb = &Apache::lonenc::check_encrypt($symb);
$result.= &Apache::lonhtmlcommon::scripttag(<
+
+
$type: $selectform
-ENDUPFORM
- $result.=' '.&Apache::loncommon::end_data_table_row().
- &Apache::loncommon::start_data_table_row().''.(< $attendance
+ $attendance
$personnel
$specific
@@ -10290,41 +9130,40 @@ ENDUPFORM
-ENDGRADINGFORM
- $result.=' '.&Apache::loncommon::end_data_table_row().
- &Apache::loncommon::start_data_table_row().''.(<$pcorrect:
+$pcorrect:
$pincorrect:
-
-ENDPERCFORM
- $result.=' '.
- &Apache::loncommon::end_data_table_row().
- &Apache::loncommon::end_data_table();
+'
+ENDUPFORM
+ $result.='
'."\n".
+ '
'."\n";
+ $result.=&show_grading_menu_form($symb);
return $result;
}
sub process_clicker_file {
- my ($r,$symb) = @_;
+ my ($r)=@_;
+ my ($symb)=&get_symb($r);
if (!$symb) {return '';}
my %Saveable_Parameters=&clicker_grading_parameters();
&Apache::loncommon::store_course_settings('grades_clicker',
\%Saveable_Parameters);
my $result='';
+# my ($result) = &showResourceInfo($symb,$env{'form.probTitle'});
if (($env{'form.gradingmechanism'} eq 'specific') && ($env{'form.specificid'}!~/\w/)) {
$result.=''.&mt('You need to specify a clicker ID for the correct answer').' ';
- return $result;
+ return $result.&show_grading_menu_form($symb);
}
if (($env{'form.gradingmechanism'} eq 'given') && ($env{'form.givenanswer'}!~/\S/)) {
$result.=''.&mt('You need to specify the correct answer').' ';
- return $result;
+ return $result.&show_grading_menu_form($symb);
}
my $foundgiven=0;
if ($env{'form.gradingmechanism'} eq 'given') {
$env{'form.givenanswer'}=~s/^\s*//gs;
$env{'form.givenanswer'}=~s/\s*$//gs;
- $env{'form.givenanswer'}=~s/[^a-zA-Z0-9\.\*\-\+]+/\,/g;
+ $env{'form.givenanswer'}=~s/[^a-zA-Z0-9\.\*\-]+/\,/g;
$env{'form.givenanswer'}=uc($env{'form.givenanswer'});
my @answers=split(/\,/,$env{'form.givenanswer'});
$foundgiven=$#answers+1;
@@ -10363,50 +9202,33 @@ sub process_clicker_file {
$number++;
}
$result.="\n";
- if ($number==0) {
- $result .=
- &Apache::lonhtmlcommon::confirm_success(
- &mt('No IDs found to determine correct answer'),1);
- return $result;
- }
+ if ($number==0) {
+ $result.=''.&mt('No IDs found to determine correct answer').' ';
+ return $result.&show_grading_menu_form($symb);
+ }
}
if (length($env{'form.upfile'}) < 2) {
- $result .=
- &Apache::lonhtmlcommon::confirm_success(
- &mt('The file: [_1] you attempted to upload contained no information. Please check that you entered the correct filename.',
- ''.&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;
+ $result.=&mt('[_1] Error: [_2] The file you attempted to upload, [_3] contained no information. Please check that you entered the correct filename.',
+ '',
+ ' ',
+ ''.&HTML::Entities::encode($env{'form.upfile.filename'},'<>&"').' ');
+ return $result.&show_grading_menu_form($symb);
}
# Were able to get all the info needed, now analyze the file
$result.=&Apache::loncommon::studentbrowser_javascript();
$symb = &Apache::lonenc::check_encrypt($symb);
- $result.=&Apache::loncommon::start_data_table().
- &Apache::loncommon::start_data_table_header_row().
- ' '.&mt('Evaluate clicker file').' '.
- &Apache::loncommon::end_data_table_header_row().
- &Apache::loncommon::start_data_table_row().(<
+ my $heading=&mt('Scanning clicker file');
+ $result.=(<
+
+$heading
".&Apache::loncommon::end_data_table_row().
- &Apache::loncommon::start_data_table_row()."".
- &mt('Clicker registered more than once').": ".$id." ";
+ $result.="\n ".&mt('Clicker registered more than once').": ".$id." ";
$result.="\n".' '.
"";
foreach my $reguser (sort(split(/\,/,$clicker_ids{$id}))) {
@@ -10472,14 +9287,12 @@ ENDHEADER
$student_count++;
}
} else {
- $result.=" ".&Apache::loncommon::end_data_table_row().
- &Apache::loncommon::start_data_table_row()."".
- &mt('Unregistered Clicker')." ".$id." ";
+ $result.="\n ".&mt('Unregistered Clicker')." ".$id." ";
$result.="\n".' '.
"\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);
$unknown_count++;
}
}
@@ -10487,7 +9300,7 @@ ENDHEADER
&mt('Found [_1] registered and [_2] unregistered clickers.',$student_count,$unknown_count);
if (($env{'form.gradingmechanism'} ne 'attendance') && ($env{'form.gradingmechanism'} ne 'given')) {
if ($correct_count==0) {
- $errormsg.="Found no correct answers for grading!";
+ $errormsg.="Found no correct answers answers for grading!";
} elsif ($correct_count>1) {
$result.=''.&mt("Found [_1] entries for grading!",$correct_count).' ';
}
@@ -10500,10 +9313,9 @@ ENDHEADER
} else {
$result.=' ';
}
- $result.=' '.
- &Apache::loncommon::end_data_table_row().
- &Apache::loncommon::end_data_table();
- return $result;
+ $result.='
'."\n".
+ '
'."\n";
+ return $result.&show_grading_menu_form($symb);
}
sub iclicker_eval {
@@ -10525,7 +9337,6 @@ sub iclicker_eval {
$id=~s/^[\#0]+//;
for (my $i=0;$i<$number;$i++) {
my $idx=3+$i*6;
- $entries[$idx]=~s/[^a-zA-Z0-9\.\*\-\+]+//g;
push(@idresponses,$entries[$idx]);
}
$$responses{$id}=join(',',@idresponses);
@@ -10534,49 +9345,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;
@@ -10608,33 +9376,9 @@ sub interwrite_eval {
return ($errormsg,$number);
}
-sub turning_eval {
- my ($questiontitles,$responses)=@_;
- my $number=0;
- my $errormsg='';
- foreach my $line (split(/[\n\r]/,$env{'form.upfile'})) {
- my %components=&Apache::loncommon::record_sep($line);
- my @entries=map {$components{$_}} (sort(keys(%components)));
- if ($#entries>$number) { $number=$#entries; }
- my $id=$entries[0];
- my @idresponses;
- $id=~s/^[\#0]+//;
- unless ($id) { next; }
- for (my $idx=1;$idx<=$#entries;$idx++) {
- $entries[$idx]=~s/\,/\;/g;
- $entries[$idx]=~s/[^a-zA-Z0-9\.\*\-\+\;]+//g;
- push(@idresponses,$entries[$idx]);
- }
- $$responses{$id}=join(',',@idresponses);
- }
- for (my $i=1; $i<=$number; $i++) {
- $$questiontitles[$i]=&mt('Question [_1]',$i);
- }
- return ($errormsg,$number);
-}
-
sub assign_clicker_grades {
- my ($r,$symb) = @_;
+ my ($r)=@_;
+ my ($symb)=&get_symb($r);
if (!$symb) {return '';}
# See which part we are saving to
my $res_error;
@@ -10645,11 +9389,15 @@ 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='';
+# my ($result) = &showResourceInfo($symb,$env{'form.probTitle'});
+
+ my $heading=&mt('Assigning grades based on clicker file');
+ $result.=(<
+
+$heading
+ENDHEADER
# Get correct result
# FIXME: Possibly need delimiter other than ":"
my @correct=();
@@ -10665,26 +9413,25 @@ sub assign_clicker_grades {
$result.=''.
&mt('More than one correct result given for question "[_1]": [_2] versus [_3].',
$env{'form.question:'.$i},$correct[$i],$input[$i]).' ';
- } elsif (($input[$i]) || ($input[$i] eq '0')) {
+ } elsif ($input[$i]) {
$correct[$i]=$input[$i];
}
}
}
}
for (my $i=0;$i<$number;$i++) {
- if ((!$correct[$i]) && ($correct[$i] ne '0')) {
+ if (!$correct[$i]) {
$result.=''.
&mt('No correct result given for question "[_1]"!',
$env{'form.question:'.$i}).' ';
}
}
- $result.=' '.&mt("Correct answer: [_1]",join(', ',map { ((($_) || ($_ eq '0'))?$_:'-') } @correct));
+ $result.=' '.&mt("Correct answer: [_1]",join(', ',map { ($_?$_:'-') } @correct));
}
# Start grading
my $pcorrect=$env{'form.pcorrect'};
my $pincorrect=$env{'form.pincorrect'};
my $storecount=0;
- my %users=();
foreach my $key (keys(%env)) {
my $user='';
if ($key=~/^form\.student\:(.*)$/) {
@@ -10698,42 +9445,24 @@ sub assign_clicker_grades {
$user=$env{'form.multi'.$id};
}
}
- if ($user) {
- if ($users{$user}) {
- $result.=''.
- &mt('More than one entry found for [_1]!',''.$user.' ').
- ' ';
- }
- $users{$user}=1;
+ if ($user) {
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]) {
if ($gradingmechanism eq 'attendance') {
$sum+=$pcorrect;
} elsif ($correct[$i] eq '*') {
$sum+=$pcorrect;
} else {
-# We actually grade if correct or not
- my $increment=$pincorrect;
-# Special case: numerical answer "0"
- if ($correct[$i] eq '0') {
- if ($answer[$i]=~/^[0\.]+$/) {
- $increment=$pcorrect;
- }
-# General numerical answer, both evaluate to something non-zero
- } elsif ((1.0*$correct[$i]!=0) && (1.0*$answer[$i]!=0)) {
- if (1.0*$correct[$i]==1.0*$answer[$i]) {
- $increment=$pcorrect;
- }
-# Must be just alphanumeric
- } elsif ($answer[$i] eq $correct[$i]) {
- $increment=$pcorrect;
+ if ($answer[$i] eq $correct[$i]) {
+ $sum+=$pcorrect;
+ } else {
+ $sum+=$pincorrect;
}
- $sum+=$increment;
}
}
}
@@ -10756,10 +9485,9 @@ sub assign_clicker_grades {
}
# We are done
$result.=' '.&mt('Successfully stored grades for [quant,_1,student].',$storecount).
- ' '.
- &Apache::loncommon::end_data_table_row().
- &Apache::loncommon::end_data_table();
- return $result;
+ '
'."\n".
+ '
'."\n";
+ return $result.&show_grading_menu_form($symb);
}
sub navmap_errormsg {
@@ -10769,266 +9497,141 @@ sub navmap_errormsg {
'';
}
-sub startpage {
- my ($r,$symb,$crumbs,$onlyfolderflag,$nodisplayflag,$stuvcurrent,$stuvdisp,$nomenu,$js,$onload,$divforres) = @_;
- my %args;
- if ($onload) {
- my %loaditems = (
- 'onload' => $onload,
- );
- $args{'add_entries'} = \%loaditems;
- }
- if ($nomenu) {
- $args{'only_body'} = 1;
- $r->print(&Apache::loncommon::start_page("Student's Version",$js,\%args));
- } else {
- unshift(@$crumbs,{href=>&href_symb_cmd($symb,'gradingmenu'),text=>"Grading"});
- $args{'bread_crumbs'} = $crumbs;
- $r->print(&Apache::loncommon::start_page('Grading',$js,\%args));
- }
- unless ($nodisplayflag) {
- $r->print(&Apache::lonhtmlcommon::resource_info_box($symb,$onlyfolderflag,$stuvcurrent,$stuvdisp,$divforres));
- }
-}
-
-sub select_problem {
- my ($r)=@_;
- $r->print(''.&mt('Select the problem or one of the problems you want to grade').' ');
-}
-
sub handler {
my $request=$_[0];
&reset_caches();
- if ($request->header_only) {
- &Apache::loncommon::content_type($request,'text/html');
- $request->send_http_header;
- return OK;
+ if ($env{'browser.mathml'}) {
+ &Apache::loncommon::content_type($request,'text/xml');
+ } else {
+ &Apache::loncommon::content_type($request,'text/html');
}
+ $request->send_http_header;
+ return '' if $request->header_only;
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'});
-
-# see what command we need to execute
-
+ my $symb=&get_symb($request,1);
my @commands=&Apache::loncommon::get_env_multiple('form.command');
my $command=$commands[0];
- &init_perm();
- if (!$env{'request.course.id'}) {
- unless ((&Apache::lonnet::allowed('usc',$env{'request.role.domain'})) &&
- ($command =~ /^scantronupload/)) {
- # Not in a course.
- $env{'user.error.msg'}="/adm/grades::vgr:0:0:Cannot display grades page outside course context";
- return HTTP_NOT_ACCEPTABLE;
- }
- } elsif (!%perm) {
- $request->internal_redirect('/adm/quickgrades');
- return OK;
- }
- &Apache::loncommon::content_type($request,'text/html');
- $request->send_http_header;
-
if ($#commands > 0) {
&Apache::lonnet::logthis("grades got multiple commands ".join(':',@commands));
}
-# see what the symb is
-
- my $symb=$env{'form.symb'};
- unless ($symb) {
- (my $url=$env{'form.url'}) =~ s-^https*://($ENV{'SERVER_NAME'}|$ENV{'HTTP_HOST'})--;
- $symb=&Apache::lonnet::symbread($url);
- }
- &Apache::lonenc::check_decrypt(\$symb);
-
$ssi_error = 0;
- 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);
+ my $brcrum = [{href=>"/adm/grades",text=>"Grading"}];
+ $request->print(&Apache::loncommon::start_page('Grading',undef,
+ {'bread_crumbs' => $brcrum}));
+ if ($symb eq '' && $command eq '') {
+ if ($env{'user.adv'}) {
+ if (($env{'form.codeone'}) && ($env{'form.codetwo'}) &&
+ ($env{'form.codethree'})) {
+ my $token=$env{'form.codeone'}.'*'.$env{'form.codetwo'}.'*'.
+ $env{'form.codethree'};
+ my ($tsymb,$tuname,$tudom,$tcrsid)=
+ &Apache::lonnet::checkin($token);
+ if ($tsymb) {
+ my ($map,$id,$url)=&Apache::lonnet::decode_symb($tsymb);
+ if (&Apache::lonnet::allowed('mgr',$tcrsid)) {
+ $request->print(&ssi_with_retries('/res/'.$url, $ssi_retries,
+ ('grade_username' => $tuname,
+ 'grade_domain' => $tudom,
+ 'grade_courseid' => $tcrsid,
+ 'grade_symb' => $tsymb)));
+ } else {
+ $request->print('Not authorized: '.$token.' ');
+ }
+ } else {
+ $request->print('Not a valid DocID: '.$token.' ');
+ }
+ } else {
+ $request->print(&Apache::lonxml::tokeninputfield());
+ }
+ }
} else {
- if ($command eq 'submission' && $perm{'vgr'}) {
- my ($stuvcurrent,$stuvdisp,$versionform,$js,$onload);
- 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;
- }
- &startpage($request,$symb,[{href=>"", text=>"Student Submissions"}],undef,undef,$stuvcurrent,$stuvdisp,undef,$js,$onload,$divforres);
- if ($versionform) {
- $request->print($versionform);
- }
- ($env{'form.student'} eq '' ? &listStudents($request,$symb,'',$divforres) : &submission($request,0,0,$symb,$divforres,$command));
- } 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'});
- &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'}) {
- &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'}) {
- &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);
- &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'}) {
- &startpage($request,$symb,[{href=>'',text=>'...'},
- {href=>'',text=>'Modify grades'}],undef,undef,undef,undef,undef,undef,undef,1);
- &processGroup($request,$symb);
- } elsif ($command eq 'gradingmenu' && $perm{'vgr'}) {
- &startpage($request,$symb);
- $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));
+ &init_perm();
+ if ($command eq 'submission' && $perm{'vgr'}) {
+ ($env{'form.student'} eq '' ? &listStudents($request) : &submission($request,0,0));
+ } elsif ($command eq 'pickStudentPage' && $perm{'vgr'}) {
+ &pickStudentPage($request);
+ } elsif ($command eq 'displayPage' && $perm{'vgr'}) {
+ &displayPage($request);
+ } elsif ($command eq 'gradeByPage' && $perm{'mgr'}) {
+ &updateGradeByPage($request);
+ } elsif ($command eq 'processGroup' && $perm{'vgr'}) {
+ &processGroup($request);
+ } elsif ($command eq 'gradingmenu' && $perm{'vgr'}) {
+ $request->print(&grading_menu($request));
+ } elsif ($command eq 'individual' && $perm{'vgr'}) {
+ $request->print(&individual($request));
} 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);
- $request->print(&listStudents($request,$symb,'graded'));
+ $request->print(&submit_options($request));
} elsif ($command eq 'table' && $perm{'vgr'}) {
- &startpage($request,$symb,[{href=>"", text=>"Grading table"}]);
- $request->print(&submit_options_table($request,$symb));
+ $request->print(&submit_options($request));
} 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'}) {
- &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'}) {
- &startpage($request,$symb,[{href=>'',text=>'...'},
- {href=>'',text=>'Store grades'}]);
- $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));
- } 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'}) {
- &startpage($request,$symb,[{href=>&href_symb_cmd($symb,"initialverifyreceipt"),text=>'Verify Receipt Number'},
- {href=>'',text=>'Verification Result'}]);
- $request->print(&verifyreceipt($request,$symb));
+ $request->print(&submit_options_sequence($request));
+ } elsif ($command eq 'viewgrades' && $perm{'vgr'}) {
+ $request->print(&viewgrades($request));
+ } elsif ($command eq 'handgrade' && $perm{'mgr'}) {
+ $request->print(&processHandGrade($request));
+ } elsif ($command eq 'editgrades' && $perm{'mgr'}) {
+ $request->print(&editgrades($request));
+ } elsif ($command eq 'verify' && $perm{'vgr'}) {
+ $request->print(&verifyreceipt($request));
} elsif ($command eq 'processclicker' && $perm{'mgr'}) {
- &startpage($request,$symb,[{href=>'', text=>'Process clicker'}]);
- $request->print(&process_clicker($request,$symb));
+ $request->print(&process_clicker($request));
} elsif ($command eq 'processclickerfile' && $perm{'mgr'}) {
- &startpage($request,$symb,[{href=>&href_symb_cmd($symb,'processclicker'), text=>'Process clicker'},
- {href=>'', text=>'Process clicker file'}]);
- $request->print(&process_clicker_file($request,$symb));
+ $request->print(&process_clicker_file($request));
} elsif ($command eq 'assignclickergrades' && $perm{'mgr'}) {
- &startpage($request,$symb,[{href=>&href_symb_cmd($symb,'processclicker'), text=>'Process clicker'},
- {href=>'', text=>'Process clicker file'},
- {href=>'', text=>'Store grades'}]);
- $request->print(&assign_clicker_grades($request,$symb));
- } 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'}) {
- &startpage($request,$symb,[{href=>'', text=>'Upload Scores'}],1,1);
- $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') {
- &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';
- }
- &startpage($request,$symb,[{href=>'', text=>'Upload Scores'}],1,1);
- $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'}) {
- &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'}) {
- &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'}) {
- &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'}))) {
- &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));
+ $request->print(&assign_clicker_grades($request));
+ } elsif ($command eq 'csvform' && $perm{'mgr'}) {
+ $request->print(&upcsvScores_form($request));
+ } elsif ($command eq 'csvupload' && $perm{'mgr'}) {
+ $request->print(&csvupload($request));
+ } elsif ($command eq 'csvuploadmap' && $perm{'mgr'} ) {
+ $request->print(&csvuploadmap($request));
+ } elsif ($command eq 'csvuploadoptions' && $perm{'mgr'}) {
+ if ($env{'form.associate'} ne 'Reverse Association') {
+ $request->print(&csvuploadoptions($request));
+ } else {
+ if ( $env{'form.upfile_associate'} ne 'reverse' ) {
+ $env{'form.upfile_associate'} = 'reverse';
+ } else {
+ $env{'form.upfile_associate'} = 'forward';
+ }
+ $request->print(&csvuploadmap($request));
+ }
+ } elsif ($command eq 'csvuploadassign' && $perm{'mgr'} ) {
+ $request->print(&csvuploadassign($request));
+ } elsif ($command eq 'scantron_selectphase' && $perm{'mgr'}) {
+ $request->print(&scantron_selectphase($request));
+ } elsif ($command eq 'scantron_warning' && $perm{'mgr'}) {
+ $request->print(&scantron_do_warning($request));
+ } elsif ($command eq 'scantron_validate' && $perm{'mgr'}) {
+ $request->print(&scantron_validate_file($request));
+ } elsif ($command eq 'scantron_process' && $perm{'mgr'}) {
+ $request->print(&scantron_process_students($request));
+ } elsif ($command eq 'scantronupload' &&
+ (&Apache::lonnet::allowed('usc',$env{'request.role.domain'})||
+ &Apache::lonnet::allowed('usc',$env{'request.course.id'}))) {
+ $request->print(&scantron_upload_scantron_data($request));
+ } 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_save($request));
+ } elsif ($command eq 'scantron_download' &&
+ &Apache::lonnet::allowed('usc',$env{'request.course.id'})) {
+ $request->print(&scantron_download_scantron_data($request));
} 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);
- $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);
- &submit_download_link($request,$symb);
- } elsif ($command) {
- &startpage($request,$symb,[{href=>'', text=>'Access denied'}]);
- $request->print(''.&mt('Access Denied ([_1])',$command).'
');
- }
+ $request->print(&checkscantron_results($request));
+ } elsif ($command) {
+ $request->print(''.&mt('Access Denied ([_1])',$command).'
');
+ }
}
if ($ssi_error) {
&ssi_print_error($request);
}
$request->print(&Apache::loncommon::end_page());
&reset_caches();
- return OK;
+ return '';
}
1;
@@ -11061,11 +9664,11 @@ At least the logic that drives this has
ssi_with_retries - Does the server side include of a resource.
if the ssi call returns an error we'll retry it up to
the number of times requested by the caller.
- If we still have a problem, no text is appended to the
+ If we still have a proble, no text is appended to the
output and we set some global variables.
to indicate to the caller an SSI error occurred.
All of this is supposed to deal with the issues described
- in LON-CAPA BZ 5631 see:
+ in LonCAPA BZ 5631 see:
http://bugs.lon-capa.org/show_bug.cgi?id=5631
by informing the user that this happened.
@@ -11106,7 +9709,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',
@@ -11123,16 +9726,6 @@ ssi_with_retries()
- missingbubble - array ref of the bubble lines that have missing
bubble errors
- $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).
- $startline - Reference to hash where key is question number (0 is first)
- and value is number of first bubble line for current student
- or code-based randompick and/or randomorder.
-
-
=item scantron_get_maxbubble() :
Arguments:
@@ -11142,8 +9735,6 @@ ssi_with_retries()
calling routine should trap the error condition and display the warning
found in &navmap_errormsg().
- $scantron_config - Reference to bubblesheet format configuration hash.
-
Returns the maximum number of bubble lines that are expected to
occur. Does this by walking the selected sequence rendering the
resource and then checking &Apache::lonxml::get_problem_counter()
@@ -11153,7 +9744,7 @@ ssi_with_retries()
$env{'form.scantron.bubble_lines.n'},
$env{'form.scantron.first_bubble_line.n'} and
$env{"form.scantron.sub_bubblelines.n"}
- which are the total number of bubble lines, the number of bubble
+ which are the total number of bubble, lines, the number of bubble
lines for response n and number of the first bubble line for response n,
and a comma separated list of numbers of bubble lines for sub-questions
(for optionresponse, matchresponse, and rankresponse items), for response n.
@@ -11167,7 +9758,7 @@ ssi_with_retries()
=item scantron_process_students() :
- Routine that does the actual grading of the bubblesheet information.
+ Routine that does the actual grading of the bubble sheet information.
The parsed scanline hash is added to %env
@@ -11187,7 +9778,7 @@ ssi_with_retries()
=item scantron_upload_scantron_data() :
- Creates the screen for adding a new bubblesheet data file to a course.
+ Creates the screen for adding a new bubble sheet data file to a course.
=item scantron_upload_scantron_data_save() :
@@ -11201,7 +9792,7 @@ ssi_with_retries()
=item scantron_download_scantron_data() :
Shows a list of the three internal files (original, corrected,
- skipped) for a specific bubblesheet data file that exists in the
+ skipped) for a specific bubble sheet data file that exists in the
course.
=item scantron_validate_ID() :