version 1.387, 2024/12/09 22:22:57
|
version 1.395, 2025/06/28 14:35:00
|
Line 600 sub check_access {
|
Line 600 sub check_access {
|
return ('SHOW_ANSWER'); |
return ('SHOW_ANSWER'); |
} |
} |
} |
} |
foreach my $temp ("opendate","duedate","answerdate") { |
foreach my $temp ("opendate","duedate","overduedate","answerdate") { |
$lastdate = $date; |
$lastdate = $date; |
if ($temp eq 'duedate') { |
if ($temp eq 'duedate') { |
$date = &due_date($id,$symb); |
$date = &due_date($id,$symb); |
|
} elsif ($temp eq 'overduedate') { |
|
$date = &overdue_date($id,$symb); |
} else { |
} else { |
$date = &Apache::lonnet::EXT("resource.$id.$temp",$symb); |
$date = &Apache::lonnet::EXT("resource.$id.$temp",$symb); |
} |
} |
Line 644 sub check_access {
|
Line 646 sub check_access {
|
} elsif ($type eq 'duedate') { |
} elsif ($type eq 'duedate') { |
$status='CAN_ANSWER'; |
$status='CAN_ANSWER'; |
$datemsg = &mt('is due at [_1]',$date); |
$datemsg = &mt('is due at [_1]',$date); |
|
} elsif ($type eq 'overduedate') { |
|
$status='CAN_ANSWER'; |
|
$datemsg = &mt('past-due grace period until [_1]',$date); |
} elsif ($type eq 'answerdate') { |
} elsif ($type eq 'answerdate') { |
$status='CLOSED'; |
$status='CLOSED'; |
$datemsg = &mt('was due on [_1], and answers will be available on [_2]', |
$datemsg = &mt('was due on [_1], and answers will be available on [_2]', |
Line 734 sub due_date {
|
Line 739 sub due_date {
|
return $date; |
return $date; |
} |
} |
|
|
|
sub overdue_date { |
|
my ($part_id,$symb,$udom,$uname)=@_; |
|
my $date; |
|
my $duedate= &Apache::lonnet::EXT("resource.$part_id.duedate",$symb, |
|
$udom,$uname); |
|
if ($duedate ne '') { |
|
my $grace = &Apache::lonnet::EXT("resource.$part_id.grace",$symb, |
|
$udom,$uname); |
|
if ($grace) { |
|
my $grace_end = (split(/,/,$grace))[-1]; |
|
my ($offset) = split(/:/,$grace_end,2); |
|
if ($offset > 0) { |
|
$date = $offset + $duedate; |
|
} |
|
} |
|
} |
|
return $date; |
|
} |
|
|
|
sub partial_credit_overdue { |
|
my ($part_id,$symb,$udom,$uname)=@_; |
|
my $reduction; |
|
my $duedate = &Apache::lonnet::EXT("resource.$part_id.duedate",$symb, |
|
$udom,$uname); |
|
if ($duedate) { |
|
my $grace = &Apache::lonnet::EXT("resource.$part_id.grace",$symb, |
|
$udom,$uname); |
|
if ($grace) { |
|
my $lateness = time - $duedate; |
|
if ($lateness > 0) { |
|
my ($start,$end,$startfrac,$endfrac,$usegrad); |
|
$start = 0; |
|
$startfrac = 1.0; |
|
$usegrad = 0; |
|
foreach my $item (split(/,/,$grace)) { |
|
my ($offset,$frac,$grad) = split(/:/,$item); |
|
if ($lateness > $offset) { |
|
$start = $offset; |
|
$startfrac = $frac; |
|
next; |
|
} elsif ($lateness <= $offset) { |
|
$end = $offset; |
|
$endfrac = $frac; |
|
$usegrad = $grad; |
|
last; |
|
} |
|
} |
|
if ($end) { |
|
if (($end == $start) || ($startfrac == $endfrac)) { |
|
$reduction = $endfrac; |
|
} elsif ($end - $start > 0) { |
|
if (($endfrac <= 1.0) && ($endfrac >= 0)) { |
|
$reduction = $endfrac; |
|
if ($usegrad) { |
|
my $decline = $startfrac - $endfrac; |
|
my $fraction = ($lateness - $start)/($end - $start); |
|
if (($fraction <= 1) && ($fraction >= 0)) { |
|
my $value = $startfrac - ($decline*$fraction); |
|
$reduction = sprintf("%.2f", $value); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
return $reduction; |
|
} |
|
|
sub seconds_to_human_length { |
sub seconds_to_human_length { |
my ($length)=@_; |
my ($length)=@_; |
|
|
Line 1989 sub do_ltipassback {
|
Line 2064 sub do_ltipassback {
|
} |
} |
undef(@Apache::lonhomework::ltipassback); |
undef(@Apache::lonhomework::ltipassback); |
} |
} |
|
return OK; |
} |
} |
|
|
sub run_passback { |
sub run_passback { |
Line 2008 sub run_passback {
|
Line 2084 sub run_passback {
|
my $uname = $item->{'uname'}; |
my $uname = $item->{'uname'}; |
my $udom = $item->{'udom'}; |
my $udom = $item->{'udom'}; |
my $uhome = $item->{'uhome'}; |
my $uhome = $item->{'uhome'}; |
|
my $usec = $item->{'usec'}; |
my $keynum = $item->{'lti'}->{'cipher'}; |
my $keynum = $item->{'lti'}->{'cipher'}; |
my $crsdef = $item->{'crsdef'}; |
my $crsdef = $item->{'crsdef'}; |
my $scoretype = $item->{'format'}; |
my $scoretype = $item->{'format'}; |
Line 2041 sub run_passback {
|
Line 2118 sub run_passback {
|
if (($pbscope eq 'map') || ($pbscope eq 'nonrec')) { |
if (($pbscope eq 'map') || ($pbscope eq 'nonrec')) { |
if ((keys(%total_by_symb)) && (keys(%possible_by_symb))) { |
if ((keys(%total_by_symb)) && (keys(%possible_by_symb))) { |
($total,$possible) = |
($total,$possible) = |
&get_lti_score($uname,$udom,$map,$pbscope,\%total_by_symb,\%possible_by_symb); |
&get_lti_score($uname,$udom,$usec,$map,$pbscope,\%total_by_symb,\%possible_by_symb); |
} else { |
} else { |
($total,$possible) = &get_lti_score($uname,$udom,$map,$pbscope); |
($total,$possible) = &get_lti_score($uname,$udom,$usec,$map,$pbscope); |
} |
} |
} elsif ($pbscope eq 'course') { |
} elsif ($pbscope eq 'course') { |
($total,$possible) = &get_lti_score($uname,$udom); |
($total,$possible) = &get_lti_score($uname,$udom,$usec); |
} |
} |
$item->{'total'} = $total; |
$item->{'total'} = $total; |
$item->{'possible'} = $possible; |
$item->{'possible'} = $possible; |
Line 2082 sub run_passback {
|
Line 2159 sub run_passback {
|
} |
} |
$value=~s/\&$//; |
$value=~s/\&$//; |
&Apache::lonnet::courselog(&escape($linkuri).':'.$uname.':'.$udom.':EXPORT:'.$value); |
&Apache::lonnet::courselog(&escape($linkuri).':'.$uname.':'.$udom.':EXPORT:'.$value); |
&Apache::lonnet::cstore({'score' => $score},$skey,$namespace,$udom,$uname,'',$ip,1); |
&Apache::lonnet::store_userdata({'score' => $score},$skey,$namespace,$udom,$uname,$ip); |
} |
} |
} else { |
} else { |
if ($item->{'linkprot'}) { |
if ($item->{'linkprot'}) { |
Line 2111 sub run_passback {
|
Line 2188 sub run_passback {
|
$no_passback .= " LTI launcher $linkprotector ($appname) for $linkuri (${cdom}_${cnum})"; |
$no_passback .= " LTI launcher $linkprotector ($appname) for $linkuri (${cdom}_${cnum})"; |
&Apache::lonnet::logthis($no_passback." for $uname:$udom"); |
&Apache::lonnet::logthis($no_passback." for $uname:$udom"); |
&Apache::lonnet::log($udom,$uname,$uhome,"$no_passback score=$score total=$total poss=$possible"); |
&Apache::lonnet::log($udom,$uname,$uhome,"$no_passback score=$score total=$total poss=$possible"); |
&Apache::lonnet::put('linkprot_passback_pending',$item,$cdom,$cnum); |
if ($item->{'linkprot'}) { |
|
my $pendingkey = &Time::HiRes::time().':'.$uname.':'.$udom.':'. |
|
"$linkuri\0$linkprotector\0$scope"; |
|
&Apache::lonnet::put('linkprot_passback_pending',{$pendingkey => $item},$cdom,$cnum); |
|
} |
} |
} |
} |
} |
} |
} |
Line 2121 sub run_passback {
|
Line 2202 sub run_passback {
|
} |
} |
|
|
sub get_lti_score { |
sub get_lti_score { |
my ($uname,$udom,$mapurl,$pbscope,$totals,$possibles) = @_; |
my ($uname,$udom,$usec,$mapurl,$pbscope,$totals,$possibles) = @_; |
my $navmap = Apache::lonnavmaps::navmap->new($uname,$udom); |
my $navmap = Apache::lonnavmaps::navmap->new($uname,$udom,$usec); |
if (ref($navmap)) { |
if (ref($navmap)) { |
my $iterator; |
my $iterator; |
if ($mapurl ne '') { |
if ($mapurl ne '') { |
my $map = $navmap->getResourceByUrl($mapurl); |
my $map = $navmap->getResourceByUrl($mapurl); |
my $firstres = $map->map_start(); |
if (ref($map)) { |
my $finishres = $map->map_finish(); |
my $firstres = $map->map_start(); |
my $recursive = 1; |
my $finishres = $map->map_finish(); |
if ($pbscope eq 'nonrec') { |
my $recursive = 1; |
$recursive = 0; |
if ($pbscope eq 'nonrec') { |
|
$recursive = 0; |
|
} |
|
$iterator = $navmap->getIterator($firstres,$finishres,undef,$recursive); |
} |
} |
$iterator = $navmap->getIterator($firstres,$finishres,undef,$recursive); |
|
} else { |
} else { |
$iterator = $navmap->getIterator(undef,undef,undef,1); |
$iterator = $navmap->getIterator(undef,undef,undef,1); |
} |
} |