--- loncom/homework/grades.pm 2022/02/09 23:50:00 1.596.2.12.2.60 +++ loncom/homework/grades.pm 2023/03/10 23:36:22 1.596.2.12.2.60.2.3 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # The LON-CAPA Grading handler # -# $Id: grades.pm,v 1.596.2.12.2.60 2022/02/09 23:50:00 raeburn Exp $ +# $Id: grades.pm,v 1.596.2.12.2.60.2.3 2023/03/10 23:36:22 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -2178,7 +2178,7 @@ sub files_exist { my ($uname,$udom,$fullname) = split(/:/,$student); my %record = &Apache::lonnet::restore($symb,$env{'request.course.id'}, $udom,$uname); - my ($string,$timestamp)= &get_last_submission(\%record); + my ($string)= &get_last_submission(\%record); foreach my $submission (@$string) { my ($partid,$respid) = ($submission =~ /^resource\.([^\.]*)\.([^\.]*)\.submission/); @@ -2523,16 +2523,28 @@ sub submission { # (3) All transactions (by date) # (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; - if ($$timestamp eq '') { - $lastsubonly.='
'.$$string[0].'
'; + if ($timestamp eq '') { + $lastsubonly.='
'.$string->[0].'
'; } else { + my ($shownsubmdate,$showngradedate); + if ($lastsubmittime && $lastgradetime) { + $shownsubmdate = &Apache::lonlocal::locallocaltime($lastsubmittime); + if ($lastgradetime > $lastsubmittime) { + $showngradedate = &Apache::lonlocal::locallocaltime($lastgradetime); + } + } else { + $shownsubmdate = $timestamp; + } $lastsubonly = '
' - .''.&mt('Date Submitted:').' '.$$timestamp."\n"; + .''.&mt('Date Submitted:').' '.$shownsubmdate."\n"; + if ($showngradedate) { + $lastsubonly .= '
'.&mt('Date Graded:').' '.$showngradedate."\n"; + } my %seenparts; my @part_response_id = &flatten_responseType($responseType); @@ -2857,17 +2869,45 @@ sub check_collaborators { #--- Retrieve the last submission for all the parts sub get_last_submission { my ($returnhash)=@_; - my (@string,$timestamp,%lasthidden); + my (@string,$timestamp,$lastgradetime,$lastsubmittime); if ($$returnhash{'version'}) { my %lasthash=(); - my ($version); + my %prevsolved=(); + my %solved=(); + my $version; for ($version=1;$version<=$$returnhash{'version'};$version++) { + my %handgraded = (); foreach my $key (sort(split(/\:/, $$returnhash{$version.':keys'}))) { $lasthash{$key}=$$returnhash{$version.':'.$key}; - $timestamp = - &Apache::lonlocal::locallocaltime($$returnhash{$version.':timestamp'}); - } + if ($key =~ /\.([^.]+)\.regrader$/) { + $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 = + &Apache::lonlocal::locallocaltime($$returnhash{$version.':timestamp'}); } my (%typeparts,%randombytry); my $showsurv = @@ -2925,7 +2965,7 @@ sub get_last_submission { $string[0] = ''.&mt('Nothing submitted - no attempts.').''; } - return (\@string,\$timestamp); + return (\@string,$timestamp,$lastgradetime,$lastsubmittime); } #--- High light keywords, with style choosen by user. @@ -9343,7 +9383,7 @@ END my @lines = &Apache::lonnet::get_scantronformat_file(); my $count = 0; foreach my $line (@lines) { - next if ($line =~ /^#/); + next if (($line =~ /^\#/) || ($line eq '')); $singleline = $line; $count ++; } @@ -9505,7 +9545,7 @@ sub validate_uploaded_scantron_file { my %unique_formats; my @formatlines = &Apache::lonnet::get_scantronformat_file(); foreach my $line (@formatlines) { - chomp($line); + next if (($line =~ /^\#/) || ($line eq '')); my @config = split(/:/,$line); my $idstart = $config[5]; my $idlength = $config[6];