Diff for /loncom/interface/lonnavmaps.pm between versions 1.575 and 1.576

version 1.575, 2025/05/27 23:31:49 version 1.576, 2025/06/28 14:34:46
Line 637  sub getDescription { Line 637  sub getDescription {
   
     my $open = $res->opendate($part);      my $open = $res->opendate($part);
     my $due = $res->duedate($part);      my $due = $res->duedate($part);
       my $overdue = $res->overduedate($part);
     my $answer = $res->answerdate($part);      my $answer = $res->answerdate($part);
   
     if ($status == $res->NETWORK_FAILURE) {       if ($status == $res->NETWORK_FAILURE) { 
Line 690  sub getDescription { Line 691  sub getDescription {
     }      }
     if ($status == $res->OPEN) {      if ($status == $res->OPEN) {
         if ($due) {          if ($due) {
     if ($res->is_practice()) {              my $now = time;
  return &mt("Closes [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'start'),$res->symb(),'duedate',$part)).$slotinfo;              if (($now >= $due) && ($overdue) && ($now < $overdue)) {
     } else {                  if ($res->is_practice()) {
  return &mt("Due [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'end'),$res->symb(),'duedate',$part)).$slotinfo;                      return &mt("Closes [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($overdue,'start'),$res->symb(),'duedate',$part)).$slotinfo;
     }                  } else {
                       return &mt("Grace period ends [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($overdue,'end'),$res->symb(),'grace',$part)).$slotinfo;
                   }
               } else {
                   if ($res->is_practice()) {
                       return &mt("Closes [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'start'),$res->symb(),'duedate',$part)).$slotinfo;
                   } else {
                       return &mt("Due [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'end'),$res->symb(),'duedate',$part)).$slotinfo;
                   }
               }
         } else {          } else {
             return &Apache::lonhtmlcommon::direct_parm_link(&mt("Open, no due date"),$res->symb(),'duedate',$part).$slotinfo;              return &Apache::lonhtmlcommon::direct_parm_link(&mt("Open, no due date"),$res->symb(),'duedate',$part).$slotinfo;
         }          }
Line 5177  sub awarded { Line 5187  sub awarded {
     if (!defined($part)) { $part = '0'; }      if (!defined($part)) { $part = '0'; }
     return $self->{NAV_MAP}->{STUDENT_DATA}->{$self->{SYMB}}->{'resource.'.$part.'.awarded'};      return $self->{NAV_MAP}->{STUDENT_DATA}->{$self->{SYMB}}->{'resource.'.$part.'.awarded'};
 }  }
   sub latefrac {
       my $self = shift; my $part = shift;
       $self->{NAV_MAP}->get_user_data();
       if (!defined($part)) { $part = '0'; }
       return $self->{NAV_MAP}->{STUDENT_DATA}->{$self->{SYMB}}->{'resource.'.$part.'.latefrac'};
   }
 sub taskversion {  sub taskversion {
     my $self = shift; my $part = shift;      my $self = shift; my $part = shift;
     $self->{NAV_MAP}->get_user_data();      $self->{NAV_MAP}->get_user_data();
Line 5266  sub opendate { Line 5282  sub opendate {
     }      }
     return $opendate;      return $opendate;
 }  }
   sub overduedate {
       my ($self,$part) = @_;
       my $duedate = $self->parmval("duedate", $part);
       my $overduedate;
       if ($duedate) {
           my $grace = $self->parmval("grace", $part);
           if ($grace) {
               my $grace_end = (split(/,/,$grace))[-1];
               my ($offset) = split(/:/,$grace_end,2);
               if ($offset > 0) {
                   $overduedate = $offset + $duedate;
               }
           }
       }
       return $overduedate;
   }
   sub partial_credit_overdue {
       my ($self,$part) = @_;
       my $reduction;
       my $duedate = $self->parmval("duedate", $part);
       if ($duedate) {
           my $grace = $self->parmval("grace",$part);
           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 problemstatus {  sub problemstatus {
     (my $self, my $part) = @_;      (my $self, my $part) = @_;
     my $problemstatus = $self->parmval("problemstatus", $part);      my $problemstatus = $self->parmval("problemstatus", $part);
Line 5844  sub getDateStatus { Line 5925  sub getDateStatus {
   
     my $open = $self->opendate($part);      my $open = $self->opendate($part);
     my $due = $self->duedate($part);      my $due = $self->duedate($part);
       my $overdue = $self->overduedate($part);
     my $answer = $self->answerdate($part);      my $answer = $self->answerdate($part);
   
     if (!$open && !$due && !$answer) {      if (!$open && !$due && !$answer) {
Line 5853  sub getDateStatus { Line 5935  sub getDateStatus {
     }      }
     if (!$open || $now < $open) {return $self->OPEN_LATER}      if (!$open || $now < $open) {return $self->OPEN_LATER}
     if (!$due || $now < $due) {return $self->OPEN}      if (!$due || $now < $due) {return $self->OPEN}
       if ($overdue && $now < $overdue) {return $self->OPEN}
     if ($answer && $now < $answer) {return $self->PAST_DUE_ANSWER_LATER}      if ($answer && $now < $answer) {return $self->PAST_DUE_ANSWER_LATER}
     if ($answer) { return $self->ANSWER_OPEN; }      if ($answer) { return $self->ANSWER_OPEN; }
     return PAST_DUE_NO_ANSWER;      return PAST_DUE_NO_ANSWER;
Line 6121  sub status { Line 6204  sub status {
     # If there's an answer date and we're past it, don't      # If there's an answer date and we're past it, don't
     # suppress the feedback; student should know      # suppress the feedback; student should know
     if ($self->duedate($part) && $self->duedate($part) < time() &&      if ($self->duedate($part) && $self->duedate($part) < time() &&
           (!$self->overduedate($part) || $self->overduedate($part) < time()) &&
  $self->answerdate($part) && $self->answerdate($part) < time()) {   $self->answerdate($part) && $self->answerdate($part) < time()) {
  $suppressFeedback = 0;   $suppressFeedback = 0;
     }      }

Removed from v.1.575  
changed lines
  Added in v.1.576


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>