version 1.596.2.12.2.56, 2021/01/05 22:01:28
|
version 1.596.2.12.2.60, 2022/02/09 23:50:00
|
Line 1150 LISTJAVASCRIPT
|
Line 1150 LISTJAVASCRIPT
|
my @sections; |
my @sections; |
if ($env{'request.course.sec'} ne '') { |
if ($env{'request.course.sec'} ne '') { |
@sections = ($env{'request.course.sec'}); |
@sections = ($env{'request.course.sec'}); |
|
} elsif ($env{'form.section'} eq '') { |
|
@sections = ('all'); |
} else { |
} else { |
@sections = &Apache::loncommon::get_env_multiple('form.section'); |
@sections = &Apache::loncommon::get_env_multiple('form.section'); |
} |
} |
Line 1191 LISTJAVASCRIPT
|
Line 1193 LISTJAVASCRIPT
|
'<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n". |
'<input type="hidden" name="symb" value="'.&Apache::lonenc::check_encrypt($symb).'" />'."\n". |
'<input type="hidden" name="saveStatusOld" value="'.$saveStatus.'" />'."\n"; |
'<input type="hidden" name="saveStatusOld" value="'.$saveStatus.'" />'."\n"; |
if (exists($env{'form.Status'})) { |
if (exists($env{'form.Status'})) { |
$gradeTable .= '<input type="hidden" name="Status" value="'.$stu_status.'" />'."\n"; |
$gradeTable .= '<input type="hidden" name="Status" value="'.$env{'form.Status'}.'" />'."\n"; |
} else { |
} else { |
$gradeTable .= &Apache::lonhtmlcommon::row_closure() |
$gradeTable .= &Apache::lonhtmlcommon::row_closure() |
.&Apache::lonhtmlcommon::row_title(&mt('Student Status')) |
.&Apache::lonhtmlcommon::row_title(&mt('Student Status')) |
Line 3129 sub processHandGrade {
|
Line 3131 sub processHandGrade {
|
my $ntstu = $env{'form.NTSTU'}; |
my $ntstu = $env{'form.NTSTU'}; |
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
|
my ($res_error,%queueable); |
|
my ($partlist,$handgrade,$responseType,$numresp,$numessay) = &response_type($symb,\$res_error); |
|
if ($res_error) { |
|
$request->print(&navmap_errormsg()); |
|
return; |
|
} else { |
|
foreach my $part (@{$partlist}) { |
|
if (ref($responseType->{$part}) eq 'HASH') { |
|
foreach my $id (keys(%{$responseType->{$part}})) { |
|
if (($responseType->{$part}->{$id} eq 'essay') || |
|
(lc($handgrade->{$part.'_'.$id}) eq 'yes')) { |
|
$queueable{$part} = 1; |
|
last; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
if ($button eq 'Save & Next') { |
if ($button eq 'Save & Next') { |
my $ctr = 0; |
my $ctr = 0; |
while ($ctr < $ngrade) { |
while ($ctr < $ngrade) { |
my ($uname,$udom) = split(/:/,$env{'form.unamedom'.$ctr}); |
my ($uname,$udom) = split(/:/,$env{'form.unamedom'.$ctr}); |
my ($errorflag,$pts,$wgt,$numhidden) = |
my ($errorflag,$pts,$wgt,$numhidden) = |
&saveHandGrade($request,$symb,$uname,$udom,$ctr); |
&saveHandGrade($request,$symb,$uname,$udom,$ctr,undef,undef,\%queueable); |
if ($errorflag eq 'no_score') { |
if ($errorflag eq 'no_score') { |
$ctr++; |
$ctr++; |
next; |
next; |
Line 3190 sub processHandGrade {
|
Line 3210 sub processHandGrade {
|
foreach my $collaborator (@collaborators) { |
foreach my $collaborator (@collaborators) { |
my ($errorflag,$pts,$wgt) = |
my ($errorflag,$pts,$wgt) = |
&saveHandGrade($request,$symb,$collaborator,$udom,$ctr, |
&saveHandGrade($request,$symb,$collaborator,$udom,$ctr, |
$env{'form.unamedom'.$ctr},$part); |
$env{'form.unamedom'.$ctr},$part,\%queueable); |
if ($errorflag eq 'not_allowed') { |
if ($errorflag eq 'not_allowed') { |
$request->print("<span class=\"LC_error\">".&mt('Not allowed to modify grades for [_1]',"$collaborator:$udom")."</span>"); |
$request->print("<span class=\"LC_error\">".&mt('Not allowed to modify grades for [_1]',"$collaborator:$udom")."</span>"); |
next; |
next; |
Line 3212 sub processHandGrade {
|
Line 3232 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 = (); |
my %keyhash = (); |
if ($numessay) { |
if ($numessay) { |
# Keywords sorted in alphabatical order |
# Keywords sorted in alphabatical order |
Line 3370 sub processHandGrade {
|
Line 3383 sub processHandGrade {
|
|
|
#---- Save the score and award for each student, if changed |
#---- Save the score and award for each student, if changed |
sub saveHandGrade { |
sub saveHandGrade { |
my ($request,$symb,$stuname,$domain,$newflg,$submitter,$part) = @_; |
my ($request,$symb,$stuname,$domain,$newflg,$submitter,$part,$queueable) = @_; |
my @version_parts; |
my @version_parts; |
my $usec = &Apache::lonnet::getsection($domain,$stuname, |
my $usec = &Apache::lonnet::getsection($domain,$stuname, |
$env{'request.course.id'}); |
$env{'request.course.id'}); |
Line 3482 sub saveHandGrade {
|
Line 3495 sub saveHandGrade {
|
&Apache::lonnet::cstore(\%newrecord,$symb, |
&Apache::lonnet::cstore(\%newrecord,$symb, |
$env{'request.course.id'},$domain,$stuname); |
$env{'request.course.id'},$domain,$stuname); |
&check_and_remove_from_queue(\@parts,\%record,\%newrecord,$symb, |
&check_and_remove_from_queue(\@parts,\%record,\%newrecord,$symb, |
$cdom,$cnum,$domain,$stuname); |
$cdom,$cnum,$domain,$stuname,$queueable); |
} |
} |
if ($aggregateflag) { |
if ($aggregateflag) { |
&Apache::lonnet::cinc('nohist_resourcetracker',\%aggregate, |
&Apache::lonnet::cinc('nohist_resourcetracker',\%aggregate, |
Line 3522 sub makehidden {
|
Line 3535 sub makehidden {
|
} |
} |
|
|
sub check_and_remove_from_queue { |
sub check_and_remove_from_queue { |
my ($parts,$record,$newrecord,$symb,$cdom,$cnum,$domain,$stuname) = @_; |
my ($parts,$record,$newrecord,$symb,$cdom,$cnum,$domain,$stuname,$queueable) = @_; |
my @ungraded_parts; |
my @ungraded_parts; |
foreach my $part (@{$parts}) { |
foreach my $part (@{$parts}) { |
if ( $record->{ 'resource.'.$part.'.awarded'} eq '' |
if ( $record->{ 'resource.'.$part.'.awarded'} eq '' |
Line 3530 sub check_and_remove_from_queue {
|
Line 3543 sub check_and_remove_from_queue {
|
&& $newrecord->{'resource.'.$part.'.awarded'} eq '' |
&& $newrecord->{'resource.'.$part.'.awarded'} eq '' |
&& $newrecord->{'resource.'.$part.'.solved' } ne 'excused' |
&& $newrecord->{'resource.'.$part.'.solved' } ne 'excused' |
) { |
) { |
push(@ungraded_parts, $part); |
if ($queueable->{$part}) { |
|
push(@ungraded_parts, $part); |
|
} |
} |
} |
} |
} |
if ( !@ungraded_parts ) { |
if ( !@ungraded_parts ) { |
Line 4472 sub editgrades {
|
Line 4487 sub editgrades {
|
&Apache::loncommon::end_data_table_header_row(); |
&Apache::loncommon::end_data_table_header_row(); |
my @noupdate; |
my @noupdate; |
my ($updateCtr,$noupdateCtr) = (1,1); |
my ($updateCtr,$noupdateCtr) = (1,1); |
|
my ($got_types,%queueable); |
for ($i=0; $i<$env{'form.total'}; $i++) { |
for ($i=0; $i<$env{'form.total'}; $i++) { |
my $user = $env{'form.ctr'.$i}; |
my $user = $env{'form.ctr'.$i}; |
my ($uname,$udom)=split(/:/,$user); |
my ($uname,$udom)=split(/:/,$user); |
Line 4571 sub editgrades {
|
Line 4587 sub editgrades {
|
$udom,$uname); |
$udom,$uname); |
my $all_graded = 1; |
my $all_graded = 1; |
my $none_graded = 1; |
my $none_graded = 1; |
|
unless ($got_types) { |
|
my $error; |
|
my ($plist,$handgrd,$resptype) = &response_type($symb,\$error); |
|
unless ($error) { |
|
foreach my $part (@parts) { |
|
if (ref($resptype->{$part}) eq 'HASH') { |
|
foreach my $id (keys(%{$resptype->{$part}})) { |
|
if (($resptype->{$part}->{$id} eq 'essay') || |
|
(lc($handgrd->{$part.'_'.$id}) eq 'yes')) { |
|
$queueable{$part} = 1; |
|
last; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
$got_types = 1; |
|
} |
foreach my $part (@parts) { |
foreach my $part (@parts) { |
if ( $record{'resource.'.$part.'.awarded'} eq '' ) { |
if ($queueable{$part}) { |
$all_graded = 0; |
if ( $record{'resource.'.$part.'.awarded'} eq '' ) { |
} else { |
$all_graded = 0; |
$none_graded = 0; |
} else { |
} |
$none_graded = 0; |
|
} |
|
} |
} |
} |
|
|
if ($all_graded || $none_graded) { |
if ($all_graded || $none_graded) { |
Line 5633 sub updateGradeByPage {
|
Line 5669 sub updateGradeByPage {
|
my @displayPts=(); |
my @displayPts=(); |
my %aggregate = (); |
my %aggregate = (); |
my $aggregateflag = 0; |
my $aggregateflag = 0; |
|
my %queueable; |
if ($env{'form.HIDE'.$prob}) { |
if ($env{'form.HIDE'.$prob}) { |
my %record = &Apache::lonnet::restore($symbx,$env{'request.course.id'},$udom,$uname); |
my %record = &Apache::lonnet::restore($symbx,$env{'request.course.id'},$udom,$uname); |
my ($version,$parts) = split(/:/,$env{'form.HIDE'.$prob},2); |
my ($version,$parts) = split(/:/,$env{'form.HIDE'.$prob},2); |
Line 5642 sub updateGradeByPage {
|
Line 5679 sub updateGradeByPage {
|
foreach my $partid (@{$parts}) { |
foreach my $partid (@{$parts}) { |
my $newpts = $env{'form.GD_BOX'.$question.'_'.$partid}; |
my $newpts = $env{'form.GD_BOX'.$question.'_'.$partid}; |
my $oldpts = $env{'form.oldpts'.$question.'_'.$partid}; |
my $oldpts = $env{'form.oldpts'.$question.'_'.$partid}; |
|
my @types = $curRes->responseType($partid); |
|
if (grep(/^essay$/,@types)) { |
|
$queueable{$partid} = 1; |
|
} else { |
|
my @ids = $curRes->responseIds($partid); |
|
for (my $i=0; $i < scalar(@ids); $i++) { |
|
my $hndgrd = &Apache::lonnet::EXT('resource.'.$partid.'_'.$ids[$i]. |
|
'.handgrade',$symb); |
|
if (lc($hndgrd) eq 'yes') { |
|
$queueable{$partid} = 1; |
|
last; |
|
} |
|
} |
|
} |
my $wgt = $env{'form.WGT'.$question.'_'.$partid} != 0 ? |
my $wgt = $env{'form.WGT'.$question.'_'.$partid} != 0 ? |
$env{'form.WGT'.$question.'_'.$partid} : 1; |
$env{'form.WGT'.$question.'_'.$partid} : 1; |
my $partial = $newpts/$wgt; |
my $partial = $newpts/$wgt; |
Line 5708 sub updateGradeByPage {
|
Line 5758 sub updateGradeByPage {
|
$env{'request.course.id'}, |
$env{'request.course.id'}, |
$udom,$uname); |
$udom,$uname); |
&check_and_remove_from_queue($parts,\%record,undef,$symbx, |
&check_and_remove_from_queue($parts,\%record,undef,$symbx, |
$cdom,$cnum,$udom,$uname); |
$cdom,$cnum,$udom,$uname,\%queueable); |
} |
} |
|
|
if ($aggregateflag) { |
if ($aggregateflag) { |
Line 6617 sub scantron_parse_scanline {
|
Line 6667 sub scantron_parse_scanline {
|
} |
} |
|
|
sub get_master_seq { |
sub get_master_seq { |
my ($resources,$master_seq,$symb_to_resource) = @_; |
my ($resources,$master_seq,$symb_to_resource,$need_symb_in_map,$symb_for_examcode) = @_; |
return unless ((ref($resources) eq 'ARRAY') && (ref($master_seq) eq 'ARRAY') && |
return unless ((ref($resources) eq 'ARRAY') && (ref($master_seq) eq 'ARRAY') && |
(ref($symb_to_resource) eq 'HASH')); |
(ref($symb_to_resource) eq 'HASH')); |
|
if ($need_symb_in_map) { |
|
return unless (ref($symb_for_examcode) eq 'HASH'); |
|
} |
my $resource_error; |
my $resource_error; |
foreach my $resource (@{$resources}) { |
foreach my $resource (@{$resources}) { |
my $ressymb; |
my $ressymb; |
Line 6627 sub get_master_seq {
|
Line 6680 sub get_master_seq {
|
$ressymb = $resource->symb(); |
$ressymb = $resource->symb(); |
push(@{$master_seq},$ressymb); |
push(@{$master_seq},$ressymb); |
$symb_to_resource->{$ressymb} = $resource; |
$symb_to_resource->{$ressymb} = $resource; |
|
if ($need_symb_in_map) { |
|
unless ($resource->is_map()) { |
|
my $map=(&Apache::lonnet::decode_symb($ressymb))[0]; |
|
unless (exists($symb_for_examcode->{$map})) { |
|
$symb_for_examcode->{$map} = $ressymb; |
|
} |
|
} |
|
} |
} else { |
} else { |
$resource_error = 1; |
$resource_error = 1; |
last; |
last; |
Line 8443 sub scantron_validate_doublebubble {
|
Line 8504 sub scantron_validate_doublebubble {
|
if (ref($map)) { |
if (ref($map)) { |
$randomorder = $map->randomorder(); |
$randomorder = $map->randomorder(); |
$randompick = $map->randompick(); |
$randompick = $map->randompick(); |
|
unless ($randomorder || $randompick) { |
|
foreach my $res ($navmap->retrieveResources($map,sub { $_[0]->is_map() },1,0,1)) { |
|
if ($res->randomorder()) { |
|
$randomorder = 1; |
|
} |
|
if ($res->randompick()) { |
|
$randompick = 1; |
|
} |
|
last if ($randomorder || $randompick); |
|
} |
|
} |
if ($randomorder || $randompick) { |
if ($randomorder || $randompick) { |
$nav_error = &get_master_seq(\@resources,\@master_seq,\%symb_to_resource); |
$nav_error = &get_master_seq(\@resources,\@master_seq,\%symb_to_resource); |
if ($nav_error) { |
if ($nav_error) { |
Line 8626 sub scantron_validate_missingbubbles {
|
Line 8698 sub scantron_validate_missingbubbles {
|
if (ref($map)) { |
if (ref($map)) { |
$randomorder = $map->randomorder(); |
$randomorder = $map->randomorder(); |
$randompick = $map->randompick(); |
$randompick = $map->randompick(); |
|
unless ($randomorder || $randompick) { |
|
foreach my $res ($navmap->retrieveResources($map,sub { $_[0]->is_map() },1,0,1)) { |
|
if ($res->randomorder()) { |
|
$randomorder = 1; |
|
} |
|
if ($res->randompick()) { |
|
$randompick = 1; |
|
} |
|
last if ($randomorder || $randompick); |
|
} |
|
} |
if ($randomorder || $randompick) { |
if ($randomorder || $randompick) { |
$nav_error = &get_master_seq(\@resources,\@master_seq,\%symb_to_resource); |
$nav_error = &get_master_seq(\@resources,\@master_seq,\%symb_to_resource); |
if ($nav_error) { |
if ($nav_error) { |
Line 8767 sub scantron_process_students {
|
Line 8850 sub scantron_process_students {
|
} |
} |
my $map=$navmap->getResourceByUrl($sequence); |
my $map=$navmap->getResourceByUrl($sequence); |
my ($randomorder,$randompick,@master_seq,%symb_to_resource,%grader_partids_by_symb, |
my ($randomorder,$randompick,@master_seq,%symb_to_resource,%grader_partids_by_symb, |
%grader_randomlists_by_symb); |
%grader_randomlists_by_symb,%symb_for_examcode); |
if (ref($map)) { |
if (ref($map)) { |
$randomorder = $map->randomorder(); |
$randomorder = $map->randomorder(); |
$randompick = $map->randompick(); |
$randompick = $map->randompick(); |
|
unless ($randomorder || $randompick) { |
|
foreach my $res ($navmap->retrieveResources($map,sub { $_[0]->is_map() },1,0,1)) { |
|
if ($res->randomorder()) { |
|
$randomorder = 1; |
|
} |
|
if ($res->randompick()) { |
|
$randompick = 1; |
|
} |
|
last if ($randomorder || $randompick); |
|
} |
|
} |
} else { |
} else { |
$r->print(&navmap_errormsg()); |
$r->print(&navmap_errormsg()); |
return ''; |
return ''; |
Line 8778 sub scantron_process_students {
|
Line 8872 sub scantron_process_students {
|
my $nav_error; |
my $nav_error; |
my @resources=$navmap->retrieveResources($map,\&scantron_filter,1,0); |
my @resources=$navmap->retrieveResources($map,\&scantron_filter,1,0); |
if ($randomorder || $randompick) { |
if ($randomorder || $randompick) { |
$nav_error = &get_master_seq(\@resources,\@master_seq,\%symb_to_resource); |
$nav_error = &get_master_seq(\@resources,\@master_seq,\%symb_to_resource,1,\%symb_for_examcode); |
if ($nav_error) { |
if ($nav_error) { |
$r->print(&navmap_errormsg()); |
$r->print(&navmap_errormsg()); |
return ''; |
return ''; |
Line 8925 SCANTRONFORM
|
Line 9019 SCANTRONFORM
|
} |
} |
|
|
if (($scancode) && ($randomorder || $randompick)) { |
if (($scancode) && ($randomorder || $randompick)) { |
my $parmresult = |
foreach my $key (keys(%symb_for_examcode)) { |
&Apache::lonparmset::storeparm_by_symb($symb, |
my $symb_in_map = $symb_for_examcode{$key}; |
'0_examcode',2,$scancode, |
if ($symb_in_map ne '') { |
'string_examcode',$uname, |
my $parmresult = |
$udom); |
&Apache::lonparmset::storeparm_by_symb($symb_in_map, |
|
'0_examcode',2,$scancode, |
|
'string_examcode',$uname, |
|
$udom); |
|
} |
|
} |
} |
} |
$completedstudents{$uname}={'line'=>$line}; |
$completedstudents{$uname}={'line'=>$line}; |
if ($env{'form.verifyrecord'}) { |
if ($env{'form.verifyrecord'}) { |
Line 9568 sub checkscantron_results {
|
Line 9667 sub checkscantron_results {
|
if (ref($map)) { |
if (ref($map)) { |
$randomorder=$map->randomorder(); |
$randomorder=$map->randomorder(); |
$randompick=$map->randompick(); |
$randompick=$map->randompick(); |
|
unless ($randomorder || $randompick) { |
|
foreach my $res ($navmap->retrieveResources($map,sub { $_[0]->is_map() },1,0,1)) { |
|
if ($res->randomorder()) { |
|
$randomorder = 1; |
|
} |
|
if ($res->randompick()) { |
|
$randompick = 1; |
|
} |
|
last if ($randomorder || $randompick); |
|
} |
|
} |
} |
} |
my @resources=$navmap->retrieveResources($map,\&scantron_filter,1,0); |
my @resources=$navmap->retrieveResources($map,\&scantron_filter,1,0); |
my $nav_error = &get_master_seq(\@resources,\@master_seq,\%symb_to_resource); |
my $nav_error = &get_master_seq(\@resources,\@master_seq,\%symb_to_resource); |
Line 10113 sub selectfield {
|
Line 10223 sub selectfield {
|
my %options = |
my %options = |
(&substatus_options, |
(&substatus_options, |
'select_form_order' => ['yes','queued','graded','incorrect','all']); |
'select_form_order' => ['yes','queued','graded','incorrect','all']); |
|
|
|
# |
|
# PrepareClasslist() needs to be called to avoid getting a sections list |
|
# for a different course from the @Sections global in lonstatistics.pm, |
|
# populated by an earlier request. |
|
# |
|
&Apache::lonstatistics::PrepareClasslist(); |
|
|
my $result='<div class="LC_columnSection"> |
my $result='<div class="LC_columnSection"> |
|
|
<fieldset> |
<fieldset> |
Line 10851 sub startpage {
|
Line 10969 sub startpage {
|
$args{'only_body'} = 1; |
$args{'only_body'} = 1; |
$r->print(&Apache::loncommon::start_page("Student's Version",$head_extra,\%args)); |
$r->print(&Apache::loncommon::start_page("Student's Version",$head_extra,\%args)); |
} else { |
} else { |
unshift(@$crumbs,{href=>&href_symb_cmd($symb,'gradingmenu'),text=>"Grading"}); |
if ($env{'request.course.id'}) { |
|
unshift(@$crumbs,{href=>&href_symb_cmd($symb,'gradingmenu'),text=>"Grading"}); |
|
} |
$args{'bread_crumbs'} = $crumbs; |
$args{'bread_crumbs'} = $crumbs; |
$r->print(&Apache::loncommon::start_page('Grading',$head_extra,\%args)); |
$r->print(&Apache::loncommon::start_page('Grading',$head_extra,\%args)); |
} |
} |
Line 11220 ssi_with_retries()
|
Line 11340 ssi_with_retries()
|
- missingbubble - array ref of the bubble lines that have missing |
- missingbubble - array ref of the bubble lines that have missing |
bubble errors |
bubble errors |
|
|
$randomorder - True if exam folder has randomorder set |
$randomorder - True if exam folder (or a sub-folder) has randomorder set |
$randompick - True if exam folder has randompick set |
$randompick - True if exam folder (or a sub-folder) has randompick set |
$respnumlookup - Reference to HASH mapping question numbers in bubble lines |
$respnumlookup - Reference to HASH mapping question numbers in bubble lines |
for current line to question number used for same question |
for current line to question number used for same question |
in "Master Seqence" (as seen by Course Coordinator). |
in "Master Seqence" (as seen by Course Coordinator). |