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

version 1.566, 2024/12/10 04:52:30 version 1.576, 2025/06/28 14:34:46
Line 48  described at http://www.lon-capa.org. Line 48  described at http://www.lon-capa.org.
   
 =head1 OVERVIEW  =head1 OVERVIEW
   
 X<lonnavmaps, overview> When a user enters a course, LON-CAPA examines the  X<lonnavmaps, overview>
   When a user enters a course, LON-CAPA examines the
 course structure and caches it in what is often referred to as the  course structure and caches it in what is often referred to as the
 "big hash" X<big hash>. You can see it if you are logged into  "big hash" X<big hash>. You can see it if you are logged into
 LON-CAPA, in a course, by going to /adm/test. The content of   LON-CAPA, in a course, by going to /adm/test. The content of 
Line 636  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 689  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 1120  sub render_resource { Line 1131  sub render_resource {
     }      }
   
     # Decide what to display      # Decide what to display
     $result .= "$newBranchText$linkopen$icon$linkclose";      $result .= "$newBranchText$linkopen$icon";
           
     my $curMarkerBegin = '';      my $curMarkerBegin = '';
     my $curMarkerEnd = '';      my $curMarkerEnd = '';
Line 1160  sub render_resource { Line 1171  sub render_resource {
             $linkopen = "<a href=\"$link\">";              $linkopen = "<a href=\"$link\">";
         }          }
     }      }
     $result .= "$curMarkerBegin$linkopen$title$partLabel$linkclose$curMarkerEnd$editmapLink$nonLinkedText</td>";      $result .= "$curMarkerBegin$title$partLabel$curMarkerEnd$linkclose$editmapLink$nonLinkedText</td>";
   
     return $result;      return $result;
 }  }
Line 1379  sub cmp_title { Line 1390  sub cmp_title {
 sub render {  sub render {
     my $args = shift;      my $args = shift;
     &Apache::loncommon::get_unprocessed_cgi($ENV{QUERY_STRING});      &Apache::loncommon::get_unprocessed_cgi($ENV{QUERY_STRING});
     my $result = '';  
     # Configure the renderer.      # Configure the renderer.
     my $cols = $args->{'cols'};      my $cols = $args->{'cols'};
     if (!defined($cols)) {      if (!defined($cols)) {
         # no columns, no nav maps.          # no columns, no nav maps.
         return '';          return '';
     }      }
       my $legend = '';
       my $tools = '';
       my $result = '';
       my $tools_printed = 0;
       my $tablestarted = 0;
     my $navmap;      my $navmap;
     if (defined($args->{'navmap'})) {      if (defined($args->{'navmap'})) {
         $navmap = $args->{'navmap'};          $navmap = $args->{'navmap'};
Line 1572  sub render { Line 1587  sub render {
     my $curRes;      my $curRes;
     my $foundJump = 0;      my $foundJump = 0;
     my $counter = 0;      my $counter = 0;
       
     while (($curRes = $mapIterator->next()) && !$foundJump) {      while (($curRes = $mapIterator->next()) && !$foundJump) {
         if (ref($curRes)) { $counter++; }          if (ref($curRes)) { $counter++; }
                   # Speed up display after course initialization
           # when $jump is empty. Note: we still need
           # $counter to be 1 in that case if there is at
           # least one resource.
           last if (($jump eq '') && ($counter));
   
         if (ref($curRes) && $jump eq $curRes->symb()) {          if (ref($curRes) && $jump eq $curRes->symb()) {
                           
             # This is why we have to use the main iterator instead of the              # This is why we have to use the main iterator instead of the
Line 1594  sub render { Line 1614  sub render {
     my $printKey = $args->{'printKey'};      my $printKey = $args->{'printKey'};
     my $printCloseAll = $args->{'printCloseAll'};      my $printCloseAll = $args->{'printCloseAll'};
     if (!defined($printCloseAll)) { $printCloseAll = 1; }      if (!defined($printCloseAll)) { $printCloseAll = 1; }
      
     # Print key?      # Print key?
     if ($printKey) {      if ($printKey) {
         $result .= '<table border="0" cellpadding="2" cellspacing="0">';          my $location = &Apache::loncommon::lonhttpdurl("/adm/lonMisc");
         $result.='<tr><td align="right" valign="bottom">Key:&nbsp;&nbsp;</td>';          $legend = '<div class="LC_navtools">'."\n".
  my $location=&Apache::loncommon::lonhttpdurl("/adm/lonMisc");                    '<span class="LC_middle LC_right">'.&mt('Key').':</span>'.
         if ($navmap->{LAST_CHECK}) {                    '<span class="LC_middle LC_center">&nbsp;&nbsp;'.
             $result .=                     '<img src="'.$location.'/chat.gif" alt="" /> '.&mt('Unread Discussion').
                 '<img src="'.$location.'/chat.gif" alt="" /> '.&mt('New discussion since').' '.                    '&nbsp;&nbsp;'.
                 strftime("%A, %b %e at %I:%M %P", localtime($navmap->{LAST_CHECK})).                    '<img src="'.$location.'/feedback.gif" alt="" /> '.
                 '</td><td align="center" valign="bottom">&nbsp;&nbsp;'.                    &mt('New message (click to open)').
                 '<img src="'.$location.'/feedback.gif" alt="" /> '.&mt('New message (click to open)').'<p>'.                    '</span></div>'.
                 '</td>';                     '<div style="padding:0;clear:both;margin:0;border:0"></div>'."\n";
         } else {  
             $result .= '<td align="center" valign="bottom">&nbsp;&nbsp;'.  
                 '<img src="'.$location.'/chat.gif" alt="" /> '.&mt('Discussions').'</td><td align="center" valign="bottom">'.  
                 '&nbsp;&nbsp;<img src="'.$location.'/feedback.gif" alt="" /> '.&mt('New message (click to open)').  
                 '</td>';   
         }  
   
         $result .= '</tr></table>';  
     }      }
   
     if ($printCloseAll && !$args->{'resource_no_folder_link'}) {      if ($printCloseAll && !$args->{'resource_no_folder_link'}) {
Line 1634  sub render { Line 1646  sub render {
                               "location.href='$link'",$text);                                "location.href='$link'",$text);
             }              }
  } else {   } else {
     $result.= '<a href="'.$link.'">'.&mt($text).'</a>';      $tools = '<a href="'.$link.'">'.&mt($text).'</a>';
  }   }
         $result .= "\n";          $tools .= "\n";
     }      }
   
     # Check for any unread discussions in all resources.      # Check for any unread discussions in all resources.
Line 1648  sub render { Line 1660  sub render {
  my $time=time;   my $time=time;
         my $submit = &mt($markread);          my $submit = &mt($markread);
         my $querystr = &HTML::Entities::encode($ENV{'QUERY_STRING'},'<>&"');          my $querystr = &HTML::Entities::encode($ENV{'QUERY_STRING'},'<>&"');
  $result .= (<<END);   $tools .= (<<END);
     <form name="clearbubbles" method="post" action="/adm/feedback" aria-hidden="true">      <form name="clearbubbles" method="post" action="/adm/feedback" aria-hidden="true">
  <input type="hidden" name="navurl" value="$querystr" />   <input type="hidden" name="navurl" value="$querystr" />
  <input type="hidden" name="navtime" value="$time" />   <input type="hidden" name="navtime" value="$time" />
Line 1665  END Line 1677  END
     }      }
     if ($totdisc > 0) {      if ($totdisc > 0) {
  $haveDisc =~ s/:$//;   $haveDisc =~ s/:$//;
  $result .= (<<END);   $tools .= (<<END);
  <input type="hidden" name="navmaps" value="$haveDisc" />   <input type="hidden" name="navmaps" value="$haveDisc" />
 END  END
             }              }
  }   }
  $result .= <<END;   $tools .= <<END;
         <input type="submit" value="$submit" class="LC_visually_hidden" tabindex="-1" disabled="disabled" />          <input type="submit" value="$submit" class="LC_visually_hidden" tabindex="-1" disabled="disabled" />
     </form>      </form>
 END  END
Line 1695  END Line 1707  END
     }      }
   
     if ($args->{'caller'} eq 'navmapsdisplay') {      if ($args->{'caller'} eq 'navmapsdisplay') {
         $result .= &show_linkitems_toolbar($args,$condition);          $tools .= &show_linkitems_toolbar($args,$condition);
     } elsif ($args->{'sort_html'}) {       } elsif ($args->{'sort_html'}) { 
         $result.=$args->{'sort_html'};           $tools .= $args->{'sort_html'}; 
     }      }
   
     #$result .= "<br />\n";      #$tools .= "<br />\n";
     if ($r) {  
         $r->print($result);  
         $r->rflush();  
         $result = "";  
     }  
     # End parameter setting      # End parameter setting
       
     $result .= "<br />\n";  
   
     # Data      # Data
     $result.=&Apache::loncommon::start_data_table("LC_tableOfContent");      
   
     my $res = "Apache::lonnavmaps::resource";      my $res = "Apache::lonnavmaps::resource";
     my %condenseStatuses =      my %condenseStatuses =
Line 1723  END Line 1727  END
     $args->{'counter'} = 0; # counts the rows      $args->{'counter'} = 0; # counts the rows
     $args->{'indentLevel'} = 0;      $args->{'indentLevel'} = 0;
     $args->{'isNewBranch'} = 0;      $args->{'isNewBranch'} = 0;
     $args->{'condensed'} = 0;         $args->{'condensed'} = 0;
       $args->{'deeplinknolist'} = 0;
   
     my $location = &Apache::loncommon::lonhttpdurl("/adm/lonIcons/whitespace_21.gif");      my $location = &Apache::loncommon::lonhttpdurl("/adm/lonIcons/whitespace_21.gif");
     $args->{'indentString'} = setDefault($args->{'indentString'}, "<img src='$location' alt='' />");      $args->{'indentString'} = setDefault($args->{'indentString'}, "<img src='$location' alt='' />");
Line 1898  END Line 1903  END
   
         # If this has been filtered out, continue on          # If this has been filtered out, continue on
         if (!(&$filterFunc($curRes))) {          if (!(&$filterFunc($curRes))) {
               if (!$userCanSeeHidden && !$curRes->randomout && $curRes->deeplinkout) {
                   $args->{'deeplinknolist'} ++;
               }
             $args->{'isNewBranch'} = 0; # Don't falsely remember this              $args->{'isNewBranch'} = 0; # Don't falsely remember this
             next;              next;
         }           } 
Line 1922  END Line 1930  END
                     if ($userCanSeeHidden) {                      if ($userCanSeeHidden) {
                         $args->{'mapHiddenDeepLink'} = 1;                          $args->{'mapHiddenDeepLink'} = 1;
                     } else {                      } else {
                           $args->{'deeplinknolist'} ++;
                         next;                          next;
                     }                      }
                 } else {                  } else {
Line 1931  END Line 1940  END
                         if ($userCanSeeHidden) {                          if ($userCanSeeHidden) {
                             $args->{'mapUnlisted'} = 1;                              $args->{'mapUnlisted'} = 1;
                         } else {                          } else {
                               $args->{'deeplinknolist'} ++;
                             next;                              next;
                         }                          }
                     }                      }
Line 1944  END Line 1954  END
         }          }
   
         $args->{'counter'}++;          $args->{'counter'}++;
           unless ($tablestarted) {
               $result.=&Apache::loncommon::start_data_table("LC_tableOfContent").
                        &Apache::loncommon::start_data_table_header_row('LC_visually_hidden').
                        '<th>'.&mt('Resource or Folder').'</th>'.
                        '<th>'.&mt('Alerts').'</th>'.
                        '<th>'.&mt('Status Icon').'</th>'.
                        '<th>'.&mt('Date/Completion Status').'</th>'.
                        &Apache::loncommon::end_data_table_row()."\n";
                        $tablestarted = 1;
           }
   
         # Does it have multiple parts?          # Does it have multiple parts?
         $args->{'multipart'} = 0;          $args->{'multipart'} = 0;
Line 2094  END Line 2114  END
         }          }
   
         if ($r && $rownum % 20 == 0) {          if ($r && $rownum % 20 == 0) {
               unless ($tools_printed) {
                   $r->print($legend.$tools);
                   $legend = "";
                   $tools = "";
                   $tools_printed = 1;
               }
             $r->print($result);              $r->print($result);
             $result = "";              $result = "";
             $r->rflush();              $r->rflush();
Line 2109  END Line 2135  END
  }   }
     }      }
   
     $result.=&Apache::loncommon::end_data_table();      if ($tablestarted) {
           $result .= &Apache::loncommon::end_data_table();
       }
           
     # Print out the part that jumps to #curloc if it exists      # Print out the part that jumps to #curloc if it exists
     # delay needed because the browser is processing the jump before      # delay needed because the browser is processing the jump before
Line 2127  if (location.href.indexOf('#curloc')==-1 Line 2155  if (location.href.indexOf('#curloc')==-1
     }      }
   
     if ($r) {      if ($r) {
           unless ($tools_printed) {
               if (($args->{'counter'}) || ($userCanSeeHidden) ||
                   (($args->{'caller'} eq 'navmapsdisplay') &&
                    ($env{'form.showOnlyHomework'} ||
                     $ENV{QUERY_STRING} =~ /^jumpToFirstHomework/))) {
                   $r->print($legend.$tools);
               }
               $legend = "";
               $tools = "";
               $tools_printed = 1;
           }
         $r->print($result);          $r->print($result);
         $result = "";          $result = "";
         $r->rflush();          $r->rflush();
     }      }
                   
     return $result;      return $legend.$tools.$result;
 }  }
   
 sub add_linkitem {  sub add_linkitem {
Line 2148  sub show_linkitems_toolbar { Line 2187  sub show_linkitems_toolbar {
         if (ref($args->{'linkitems'}) eq 'HASH') {          if (ref($args->{'linkitems'}) eq 'HASH') {
             my $numlinks = scalar(keys(%{$args->{'linkitems'}}));              my $numlinks = scalar(keys(%{$args->{'linkitems'}}));
             if ($numlinks > 1) {              if ($numlinks > 1) {
                 $result = '<td>'.                  $result = '<div class="LC_navtools">'.
                           &Apache::loncommon::help_open_menu('Navigation Screen','Navigation_Screen',                            &Apache::loncommon::help_open_menu('Navigation Screen','Navigation_Screen',
                                                              undef,'RAT').                                                               undef,'RAT').
                           '</td>'.                            '</div><div class="LC_navtools">&nbsp;'.&mt('Tools:').'</div>';
                           '<td>&nbsp;</td>'.  
                           '<td class="LC_middle">'.&mt('Tools:').'</td>';  
             }              }
             $result .= '<td align="left">'."\n".              $result .= '<div class="LC_navtools">'."\n".
                        '<ul id="LC_toolbar">';                         '<ul id="LC_toolbar">';
             my @linkorder = ('firsthomework','everything','uncompleted',              my @linkorder = ('firsthomework','everything','uncompleted',
                              'changefolder','clearbubbles','printout','edittoplevel');                               'changefolder','clearbubbles','printout','edittoplevel');
Line 2183  sub show_linkitems_toolbar { Line 2220  sub show_linkitems_toolbar {
                 }                  }
             }              }
             $result .= '</ul>'.              $result .= '</ul>'.
                        '</td>';                         '</div>';
             if (($numlinks==1) && (exists($args->{'linkitems'}{'edittoplevel'}))) {              if (($numlinks==1) && (exists($args->{'linkitems'}{'edittoplevel'}))) {
                 $result .= '<td><a href="'.$args->{'linkitems'}{'edittoplevel'}{'cmd'}.'">'.                  $result .= '<div class="LC_navtools">'.
                            &mt('Content Editor').'</a></td>';                             '&nbsp;<a href="'.$args->{'linkitems'}{'edittoplevel'}{'cmd'}.'">'.
                              &mt('Content Editor').'</a></div>';
             }              }
         }          }
         if ($args->{'sort_html'}) {          if ($args->{'sort_html'}) {
             $result .= '<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>'.              $result .= '<div class="LC_navtools">&nbsp;&nbsp;&nbsp;'.
                        '<td align="right">'.$args->{'sort_html'}.'</td>';                         $args->{'sort_html'}.'</div>';
         }          }
     }      }
     if ($result) {      if ($result) {
         $result = "<table><tr>$result</tr></table>";          $result = '<div class="LC_navtools">'.$result.'</div>'."\n".
                     '<div style="padding:0;clear:both;margin:0;border:0"></div>'."\n";
     }      }
     return $result;      return $result;
 }  }
Line 2353  sub new { Line 2392  sub new {
 # username/domain associated with a navmap (e.g. to navigate for someone  # username/domain associated with a navmap (e.g. to navigate for someone
 # else besides the current user...if sufficiently privileged.  # else besides the current user...if sufficiently privileged.
 # Parameters:  # Parameters:
 #    user  - New user.  #    user    - New user.
 #    domain- Domain the user belongs to.  #    domain  - Domain to which the user belongs.
 #    code  - Anonymous CODE in use.  #    section - Section to which the user belongs.
   #    code    - Anonymous CODE in use.
 # Implicit inputs:  # Implicit inputs:
 #     #   
 sub change_user {  sub change_user {
Line 3058  sub parmval_real { Line 3098  sub parmval_real {
 }  }
   
 sub recurseup_maps {  sub recurseup_maps {
     my ($self,$mapname,$getsymb) = @_;      my ($self,$mapname,$getsymb,$inclusive) = @_;
     my @recurseup;      my @recurseup;
     if ($mapname) {      if ($mapname) {
         my $res = $self->getResourceByUrl($mapname);          my $res = $self->getResourceByUrl($mapname);
Line 3072  sub recurseup_maps { Line 3112  sub recurseup_maps {
                     @recurseup = map { &Apache::lonnet::declutter($self->getByMapPc($_)->src()); } reverse(@pcs);                      @recurseup = map { &Apache::lonnet::declutter($self->getByMapPc($_)->src()); } reverse(@pcs);
                 }                  }
             }              }
               if ($inclusive) {
                   if ($getsymb) {
                       unshift(@recurseup,$res->symb());
                   } else {
                       unshift(@recurseup,$mapname);
                   }
               }
         }          }
     }      }
     return @recurseup;      return @recurseup;
Line 5140  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 5229  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 5807  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 5816  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 6084  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.566  
changed lines
  Added in v.1.576


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