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

version 1.575, 2025/05/27 23:31:49 version 1.577, 2025/06/28 17:34:00
Line 425  Convenience function, so others can use Line 425  Convenience function, so others can use
 Convenience function, so others can use it: Is there only one try remaining for the  Convenience function, so others can use it: Is there only one try remaining for the
 part, with more than one try to begin with, not due yet and still can be done?  part, with more than one try to begin with, not due yet and still can be done?
   
   =item graceEndsUnder24Hours()
   
   Convenience function, so others can use it: Is the problem past-due with a grace period
   which ends in less than 24 hours, and still can be done?
   
 =item advancedUser()  =item advancedUser()
   
 This puts a human-readable name on the env variable.  This puts a human-readable name on the env variable.
Line 637  sub getDescription { Line 642  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 696  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 749  sub getDescription { Line 764  sub getDescription {
             }              }
         }          }
         if ($due) {          if ($due) {
             return &mt("Due [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'end'),$res->symb(),'duedate',$part)) .              my $now = time;
                 " $triesString";              if (($now >= $due) && ($overdue) && ($now < $overdue)) {
                   return &mt("Grace period ends [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($overdue,'end'),$res->symb(),'grace',$part)).
          " $triesString";
               } else {
                   return &mt("Due [_1]",&Apache::lonhtmlcommon::direct_parm_link(&timeToHumanString($due,'end'),$res->symb(),'duedate',$part)) .
                          " $triesString";
               }
         } else {          } else {
             return &Apache::lonhtmlcommon::direct_parm_link(&mt("No due date"),$res->symb(),'duedate',$part)." $triesString";              return &Apache::lonhtmlcommon::direct_parm_link(&mt("No due date"),$res->symb(),'duedate',$part)." $triesString";
         }          }
Line 784  sub lastTry { Line 805  sub lastTry {
         $res->duedate($part) > time();          $res->duedate($part) > time();
 }  }
   
   sub graceEndsUnder24Hours {
       my $res = shift;
       my $part = shift;
       my $status = $res->status($part);
       my $now = time();
   
       return ($status == $res->OPEN() ||
               $status == $res->TRIES_LEFT()) &&
               $res->duedate($part) && $res->duedate($part) < $now &&
               $res->overduedate($part) && $res->overduedate($part) < time()+(24*60*60) &&
               $res->duedate($part) && $res->duedate($part) < $now+(24*60*60) &&
               $res->overduedate($part) > $now;
   }
   
 sub advancedUser {  sub advancedUser {
     return $env{'request.role.adv'};      return $env{'request.role.adv'};
Line 1254  sub render_long_status { Line 1288  sub render_long_status {
         if (dueInLessThan24Hours($resource, $part)) {          if (dueInLessThan24Hours($resource, $part)) {
             $color = $hurryUpColor;              $color = $hurryUpColor;
             $info = ' title="'.&mt('Due in less than 24 hours!').'"';              $info = ' title="'.&mt('Due in less than 24 hours!').'"';
           } elsif (graceEndsUnder24Hours($resource, $part)) {
               $color = $hurryUpColor;
               $info = ' title="'.&mt('Grace period ends in less than 24 hours!').'"';
         } elsif (lastTry($resource, $part)) {          } elsif (lastTry($resource, $part)) {
             unless (($resource->problemstatus($part) eq 'no') ||              unless (($resource->problemstatus($part) eq 'no') ||
                     ($resource->problemstatus($part) eq 'no_feedback_ever')) {                      ($resource->problemstatus($part) eq 'no_feedback_ever')) {
Line 5177  sub awarded { Line 5214  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 5309  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 5952  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 5962  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 6231  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.577


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