version 1.596.2.12.2.58, 2021/12/17 15:22:13
|
version 1.596.2.12.2.63, 2024/12/09 01:24:24
|
Line 2178 sub files_exist {
|
Line 2178 sub files_exist {
|
my ($uname,$udom,$fullname) = split(/:/,$student); |
my ($uname,$udom,$fullname) = split(/:/,$student); |
my %record = &Apache::lonnet::restore($symb,$env{'request.course.id'}, |
my %record = &Apache::lonnet::restore($symb,$env{'request.course.id'}, |
$udom,$uname); |
$udom,$uname); |
my ($string,$timestamp)= &get_last_submission(\%record); |
my ($string)= &get_last_submission(\%record); |
foreach my $submission (@$string) { |
foreach my $submission (@$string) { |
my ($partid,$respid) = |
my ($partid,$respid) = |
($submission =~ /^resource\.([^\.]*)\.([^\.]*)\.submission/); |
($submission =~ /^resource\.([^\.]*)\.([^\.]*)\.submission/); |
Line 2523 sub submission {
|
Line 2523 sub submission {
|
# (3) All transactions (by date) |
# (3) All transactions (by date) |
# (4) The whole record (with detailed information for all transactions) |
# (4) The whole record (with detailed information for all transactions) |
|
|
my ($string,$timestamp)= &get_last_submission(\%record); |
my ($string,$timestamp,$lastgradetime,$lastsubmittime) = |
|
&get_last_submission(\%record); |
|
|
my $lastsubonly; |
my $lastsubonly; |
|
|
if ($$timestamp eq '') { |
if ($timestamp eq '') { |
$lastsubonly.='<div class="LC_grade_submissions_body">'.$$string[0].'</div>'; |
$lastsubonly.='<div class="LC_grade_submissions_body">'.$string->[0].'</div>'; |
} else { |
} else { |
|
my ($shownsubmdate,$showngradedate); |
|
if ($lastsubmittime && $lastgradetime) { |
|
$shownsubmdate = &Apache::lonlocal::locallocaltime($lastsubmittime); |
|
if ($lastgradetime > $lastsubmittime) { |
|
$showngradedate = &Apache::lonlocal::locallocaltime($lastgradetime); |
|
} |
|
} else { |
|
$shownsubmdate = $timestamp; |
|
} |
$lastsubonly = |
$lastsubonly = |
'<div class="LC_grade_submissions_body">' |
'<div class="LC_grade_submissions_body">' |
.'<b>'.&mt('Date Submitted:').'</b> '.$$timestamp."\n"; |
.'<b>'.&mt('Date Submitted:').'</b> '.$shownsubmdate."\n"; |
|
if ($showngradedate) { |
|
$lastsubonly .= '<br /><b>'.&mt('Date Graded:').'</b> '.$showngradedate."\n"; |
|
} |
|
|
my %seenparts; |
my %seenparts; |
my @part_response_id = &flatten_responseType($responseType); |
my @part_response_id = &flatten_responseType($responseType); |
Line 2857 sub check_collaborators {
|
Line 2870 sub check_collaborators {
|
#--- Retrieve the last submission for all the parts |
#--- Retrieve the last submission for all the parts |
sub get_last_submission { |
sub get_last_submission { |
my ($returnhash)=@_; |
my ($returnhash)=@_; |
my (@string,$timestamp,%lasthidden); |
my (@string,$timestamp,$lastgradetime,$lastsubmittime); |
if ($$returnhash{'version'}) { |
if ($$returnhash{'version'}) { |
my %lasthash=(); |
my %lasthash=(); |
my ($version); |
my %prevsolved=(); |
|
my %solved=(); |
|
my $version; |
for ($version=1;$version<=$$returnhash{'version'};$version++) { |
for ($version=1;$version<=$$returnhash{'version'};$version++) { |
|
my %handgraded = (); |
foreach my $key (sort(split(/\:/, |
foreach my $key (sort(split(/\:/, |
$$returnhash{$version.':keys'}))) { |
$$returnhash{$version.':keys'}))) { |
$lasthash{$key}=$$returnhash{$version.':'.$key}; |
$lasthash{$key}=$$returnhash{$version.':'.$key}; |
$timestamp = |
if ($key =~ /\.([^.]+)\.regrader$/) { |
&Apache::lonlocal::locallocaltime($$returnhash{$version.':timestamp'}); |
$handgraded{$1} = 1; |
|
} elsif ($key =~ /\.portfiles$/) { |
|
if (($$returnhash{$version.':'.$key} ne '') && |
|
($$returnhash{$version.':'.$key} !~ /\.\d+\.\w+$/)) { |
|
$lastsubmittime = $$returnhash{$version.':timestamp'}; |
|
} |
|
} elsif ($key =~ /\.submission$/) { |
|
if ($$returnhash{$version.':'.$key} ne '') { |
|
$lastsubmittime = $$returnhash{$version.':timestamp'}; |
|
} |
|
} elsif ($key =~ /\.([^.]+)\.solved$/) { |
|
$prevsolved{$1} = $solved{$1}; |
|
$solved{$1} = $lasthash{$key}; |
|
} |
} |
} |
|
foreach my $partid (keys(%handgraded)) { |
|
if (($prevsolved{$partid} eq 'ungraded_attempted') && |
|
(($solved{$partid} eq 'incorrect_by_override') || |
|
($solved{$partid} eq 'correct_by_override'))) { |
|
$lastgradetime = $$returnhash{$version.':timestamp'}; |
|
} |
|
if ($solved{$partid} ne '') { |
|
$prevsolved{$partid} = $solved{$partid}; |
|
} |
|
} |
} |
} |
|
# |
|
# Timestamp is for last transaction for this resource, which does not |
|
# necessarily correspond to the time of last submission for problem (or part). |
|
# |
|
if ($lasthash{'timestamp'} ne '') { |
|
$timestamp = &Apache::lonlocal::locallocaltime($lasthash{'timestamp'}); |
|
} |
my (%typeparts,%randombytry); |
my (%typeparts,%randombytry); |
my $showsurv = |
my $showsurv = |
&Apache::lonnet::allowed('vas',$env{'request.course.id'}); |
&Apache::lonnet::allowed('vas',$env{'request.course.id'}); |
Line 2925 sub get_last_submission {
|
Line 2971 sub get_last_submission {
|
$string[0] = |
$string[0] = |
'<span class="LC_warning">'.&mt('Nothing submitted - no attempts.').'</span>'; |
'<span class="LC_warning">'.&mt('Nothing submitted - no attempts.').'</span>'; |
} |
} |
return (\@string,\$timestamp); |
return (\@string,$timestamp,$lastgradetime,$lastsubmittime); |
} |
} |
|
|
#--- High light keywords, with style choosen by user. |
#--- High light keywords, with style choosen by user. |
Line 3760 sub version_portfiles {
|
Line 3806 sub version_portfiles {
|
$$record{$key} = join(',',@versioned_portfiles); |
$$record{$key} = join(',',@versioned_portfiles); |
push(@returned_keys,$key); |
push(@returned_keys,$key); |
} |
} |
} |
} |
return (@returned_keys); |
return (@returned_keys); |
} |
} |
|
|
sub get_next_version { |
sub get_next_version { |
Line 5079 sub csvuploadassign {
|
Line 5125 sub csvuploadassign {
|
$env{'course.'.$env{'request.course.id'}.'.domain'}, |
$env{'course.'.$env{'request.course.id'}.'.domain'}, |
$env{'course.'.$env{'request.course.id'}.'.num'}, |
$env{'course.'.$env{'request.course.id'}.'.num'}, |
$domain,$username); |
$domain,$username); |
|
$countdone++; |
} else { |
} else { |
$request->print("<p><span class=\"LC_error\">". |
$request->print("<p><span class=\"LC_error\">". |
&mt("Failed to save data for student [_1]. Message when trying to save was: [_2]", |
&mt("Failed to save data for student [_1]. Message when trying to save was: [_2]", |
"$username:$domain",$result)."</span></p>"); |
"$username:$domain",$result)."</span></p>"); |
} |
} |
$request->rflush(); |
$request->rflush(); |
$countdone++; |
|
} |
} |
} |
} |
$request->print('<br />'.&Apache::lonhtmlcommon::confirm_success(&mt("Saved scores for [quant,_1,student]",$countdone),$countdone==0)); |
$request->print('<br />'.&Apache::lonhtmlcommon::confirm_success(&mt("Saved scores for [quant,_1,student]",$countdone),$countdone==0)); |
Line 5669 sub updateGradeByPage {
|
Line 5715 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 5678 sub updateGradeByPage {
|
Line 5725 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($part); |
my @types = $curRes->responseType($partid); |
if (grep(/^essay$/,@types)) { |
if (grep(/^essay$/,@types)) { |
$queueable{$partid} = 1; |
$queueable{$partid} = 1; |
} else { |
} else { |
my @ids = $curRes->responseIds($part); |
my @ids = $curRes->responseIds($partid); |
for (my $i=0; $i < scalar(@ids); $i++) { |
for (my $i=0; $i < scalar(@ids); $i++) { |
my $hndgrd = &Apache::lonnet::EXT('resource.'.$part.'_'.$ids[$i]. |
my $hndgrd = &Apache::lonnet::EXT('resource.'.$partid.'_'.$ids[$i]. |
'.handgrade',$symb); |
'.handgrade',$symb); |
if (lc($hndgrd) eq 'yes') { |
if (lc($hndgrd) eq 'yes') { |
$queueable{$partid} = 1; |
$queueable{$partid} = 1; |
Line 6666 sub scantron_parse_scanline {
|
Line 6713 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 6676 sub get_master_seq {
|
Line 6726 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 8492 sub scantron_validate_doublebubble {
|
Line 8550 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 8675 sub scantron_validate_missingbubbles {
|
Line 8744 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 8816 sub scantron_process_students {
|
Line 8896 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 8827 sub scantron_process_students {
|
Line 8918 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 8974 SCANTRONFORM
|
Line 9065 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 9293 END
|
Line 9389 END
|
my @lines = &Apache::lonnet::get_scantronformat_file(); |
my @lines = &Apache::lonnet::get_scantronformat_file(); |
my $count = 0; |
my $count = 0; |
foreach my $line (@lines) { |
foreach my $line (@lines) { |
next if ($line =~ /^#/); |
next if (($line =~ /^\#/) || ($line eq '')); |
$singleline = $line; |
$singleline = $line; |
$count ++; |
$count ++; |
} |
} |
Line 9455 sub validate_uploaded_scantron_file {
|
Line 9551 sub validate_uploaded_scantron_file {
|
my %unique_formats; |
my %unique_formats; |
my @formatlines = &Apache::lonnet::get_scantronformat_file(); |
my @formatlines = &Apache::lonnet::get_scantronformat_file(); |
foreach my $line (@formatlines) { |
foreach my $line (@formatlines) { |
chomp($line); |
next if (($line =~ /^\#/) || ($line eq '')); |
my @config = split(/:/,$line); |
my @config = split(/:/,$line); |
my $idstart = $config[5]; |
my $idstart = $config[5]; |
my $idlength = $config[6]; |
my $idlength = $config[6]; |
Line 9617 sub checkscantron_results {
|
Line 9713 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 11279 ssi_with_retries()
|
Line 11386 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). |