Diff for /loncom/interface/lonnavmaps.pm between versions 1.469 and 1.485

version 1.469, 2011/11/29 01:49:00 version 1.485, 2012/05/28 10:31:17
Line 464  returns 4 Line 464  returns 4
   
 =item add_linkitem()  =item add_linkitem()
   
 =item show_linkitems()  =item show_linkitems_toolbar()
   
 =back  =back
   
Line 542  my %colormap = Line 542  my %colormap =
 # is not yet done and due in less than 24 hours  # is not yet done and due in less than 24 hours
 my $hurryUpColor = "#FF0000";  my $hurryUpColor = "#FF0000";
   
 my $future_slots_checked = 0;  
 my $future_slots = 0;  
   
 sub addToFilter {  sub addToFilter {
     my $hashIn = shift;      my $hashIn = shift;
     my $addition = shift;      my $addition = shift;
Line 635  sub getDescription { Line 632  sub getDescription {
                 return &mt('Reserved - next open [_1]',                  return &mt('Reserved - next open [_1]',
                            timeToHumanString($slot_time,'start'));                             timeToHumanString($slot_time,'start'));
             } elsif ($slot_status == $res->RESERVABLE) {              } elsif ($slot_status == $res->RESERVABLE) {
                 return &mt('Reservable ending [_1]',                  return &mt('Reservable, reservations close [_1]',
                            timeToHumanString($slot_time,'end'));                             timeToHumanString($slot_time,'end'));
             } elsif ($slot_status == $res->RESERVABLE_LATER) {              } elsif ($slot_status == $res->RESERVABLE_LATER) {
                 return &mt('Reservable starting [_1]',                  return &mt('Reservable, reservations open [_1]',
                            timeToHumanString($slot_time,'start'));                             timeToHumanString($slot_time,'start'));
             } elsif ($slot_status == $res->NOT_IN_A_SLOT) {              } elsif ($slot_status == $res->NOT_IN_A_SLOT) {
                 return &mt('Reserve a time/place to work');                  return &mt('Reserve a time/place to work');
Line 899  sub part_status_summary { return 4; } Line 896  sub part_status_summary { return 4; }
 sub render_resource {  sub render_resource {
     my ($resource, $part, $params) = @_;      my ($resource, $part, $params) = @_;
   
       my $editmapLink;
     my $nonLinkedText = ''; # stuff after resource title not in link      my $nonLinkedText = ''; # stuff after resource title not in link
   
     my $link = $params->{"resourceLink"};      my $link = $params->{"resourceLink"};
Line 980  sub render_resource { Line 978  sub render_resource {
             $linkopen = "";              $linkopen = "";
             $linkclose = "";              $linkclose = "";
         }          }
           if ((&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) &&
               ($resource->symb=~/\_\_\_[^\_]+\_\_\_uploaded/)) {
               my $icon = &Apache::loncommon::lonhttpdurl('/res/adm/pages').'/editmap.png';
               $editmapLink=' '.
                            '<a href="/adm/coursedocs?command=direct&symb='.&escape($resource->symb()).'">'.
                            '<img src="'.$icon.'" alt="'.&mt('Edit Content').'" title="'.&mt('Edit Content').'" />'.
                            '</a>';
           }
     }      }
   
     if ($resource->randomout()) {      if ($resource->randomout()) {
Line 1013  sub render_resource { Line 1019  sub render_resource {
     # Is this the current resource?      # Is this the current resource?
     if (!$params->{'displayedHereMarker'} &&       if (!$params->{'displayedHereMarker'} && 
         $resource->symb() eq $params->{'here'} ) {          $resource->symb() eq $params->{'here'} ) {
         $curMarkerBegin = '<em>';          unless ($resource->is_map()) {
         $curMarkerEnd = '</em>';              $curMarkerBegin = '<span class="LC_current_nav_location">';
               $curMarkerEnd = '</span>';
           }
  $params->{'displayedHereMarker'} = 1;   $params->{'displayedHereMarker'} = 1;
     }      }
   
Line 1033  sub render_resource { Line 1041  sub render_resource {
     if (!$params->{'resource_nolink'} && !$resource->is_sequence() && !$resource->is_empty_sequence) {      if (!$params->{'resource_nolink'} && !$resource->is_sequence() && !$resource->is_empty_sequence) {
         $result .= "$curMarkerBegin<a href=\"$link\">$title$partLabel</a>$curMarkerEnd$nonLinkedText</td>";          $result .= "$curMarkerBegin<a href=\"$link\">$title$partLabel</a>$curMarkerEnd$nonLinkedText</td>";
     } else {      } else {
         $result .= "$curMarkerBegin$linkopen$title$partLabel</a>$curMarkerEnd$nonLinkedText</td>";          $result .= "$curMarkerBegin$linkopen$title$partLabel</a>$curMarkerEnd$editmapLink$nonLinkedText</td>";
     }      }
   
     return $result;      return $result;
Line 1047  sub render_communication_status { Line 1055  sub render_communication_status {
     my $linkopen = "<a href=\"$link\">";      my $linkopen = "<a href=\"$link\">";
     my $linkclose = "</a>";      my $linkclose = "</a>";
     my $location=&Apache::loncommon::lonhttpdurl("/adm/lonMisc");      my $location=&Apache::loncommon::lonhttpdurl("/adm/lonMisc");
   
     if ($resource->hasDiscussion()) {      if ($resource->hasDiscussion()) {
         $discussionHTML = $linkopen .          $discussionHTML = $linkopen .
             '<img alt="'.&mt('New Discussion').'" src="'.$location.'/chat.gif" title="'.&mt('New Discussion').'"/>' .              '<img alt="'.&mt('New Discussion').'" src="'.$location.'/chat.gif" title="'.&mt('New Discussion').'"/>' .
Line 1135  sub render_long_status { Line 1144  sub render_long_status {
         $result .= getDescription($resource, $part);          $result .= getDescription($resource, $part);
         if ($color) {$result .= "</b></font>"; }          if ($color) {$result .= "</b></font>"; }
     }      }
     if ($resource->is_map()) {  
         if (&Apache::lonnet::allowed('mdc')) {  
             if ($resource->symb=~/\_\_\_[^\_]+\_\_\_uploaded/) {  
                $result.="&nbsp;<a href='/adm/coursedocs?command=direct&symb=".&escape($resource->symb())."'>".  
                               "<span class='LC_setting'>".&mt("Edit Content").'</span></a>&nbsp;';  
             }  
         }  
     }  
     if ($resource->is_map() && &advancedUser() && $resource->randompick()) {      if ($resource->is_map() && &advancedUser() && $resource->randompick()) {
         $result .= &mt('(randomly select [_1])', $resource->randompick());          $result .= &mt('(randomly select [_1])', $resource->randompick());
     }      }
Line 1464  sub render { Line 1465  sub render {
             $link .= '&amp;register='.$env{'form.register'};              $link .= '&amp;register='.$env{'form.register'};
         }          }
  if ($args->{'caller'} eq 'navmapsdisplay') {   if ($args->{'caller'} eq 'navmapsdisplay') {
     &add_linkitem($args->{'linkitems'},'changefolder',              unless ($args->{'notools'}) {
   "location.href='$link'",$text);                  &add_linkitem($args->{'linkitems'},'changefolder',
                                 "location.href='$link'",$text);
               }
  } else {   } else {
     $result.= '<a href="'.$link.'">'.&mt($text).'</a>';      $result.= '<a href="'.$link.'">'.&mt($text).'</a>';
  }   }
Line 1473  sub render { Line 1476  sub render {
     }      }
   
     # Check for any unread discussions in all resources.      # Check for any unread discussions in all resources.
     if ($args->{'caller'} eq 'navmapsdisplay') {      if (($args->{'caller'} eq 'navmapsdisplay') && (!$args->{'notools'})) {
  &add_linkitem($args->{'linkitems'},'clearbubbles',   &add_linkitem($args->{'linkitems'},'clearbubbles',
       'document.clearbubbles.submit()',        'document.clearbubbles.submit()',
       'Mark all posts read');        'Mark all posts read');
Line 1506  END Line 1509  END
  }   }
  $result.='</form>';   $result.='</form>';
     }      }
       if (($args->{'caller'} eq 'navmapsdisplay') &&
           (&Apache::lonnet::allowed('mdc',$env{'request.course.id'}))) {
           my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
           my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
           if ($env{'course.'.$env{'request.course.id'}.'.url'} eq 
               "uploaded/$cdom/$cnum/default.sequence") {
               &add_linkitem($args->{'linkitems'},'edittoplevel',
                             "javascript:gocmd('/adm/coursedocs','editdocs');",
                             'Content Editor');
           }
       }
   
     if ($args->{'caller'} eq 'navmapsdisplay') {      if ($args->{'caller'} eq 'navmapsdisplay') {
         $result .= '<table><tr><td>'.          $result .= &show_linkitems_toolbar($args,$condition);
                    &Apache::loncommon::help_open_menu('Navigation Screen','Navigation_Screen',undef,'RAT').'</td>';  
     $result .= '<td>&nbsp;</td>';   
  $result.='<td class="LC_middle">'.&mt('Tools:').'</td>';  
  $result.=&show_linkitems_toolbar($args->{'linkitems'});  
         if ($args->{'sort_html'}) {  
             $result.='<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>'.  
                 '<td align="right">'.$args->{'sort_html'}.'</td></tr>';  
         }  
         $result .= '</table>';  
     } elsif ($args->{'sort_html'}) {       } elsif ($args->{'sort_html'}) { 
         $result.=$args->{'sort_html'};           $result.=$args->{'sort_html'}; 
     }      }
Line 1854  sub add_linkitem { Line 1859  sub add_linkitem {
 }  }
   
 sub show_linkitems_toolbar {  sub show_linkitems_toolbar {
     my ($linkitems,$condition)=@_;      my ($args,$condition) = @_;
     my @linkorder = ('firsthomework','everything','uncompleted',      my $result;
                      'changefolder','clearbubbles');      if (ref($args) eq 'HASH') {
     my $result .='<td align="left">'."\n".           if (ref($args->{'linkitems'}) eq 'HASH') {
                  '<span class="LC_nobreak">'."\n".              my $numlinks = scalar(keys(%{$args->{'linkitems'}}));
                  '<ul id="LC_toolbar">';              if ($numlinks > 1) {
     foreach my $link (@linkorder) {                  $result = '<td>'.
         my $link_id = 'LC_content_toolbar_'.$link;                            &Apache::loncommon::help_open_menu('Navigation Screen','Navigation_Screen',
         if (defined($linkitems->{$link})) {                                                               undef,'RAT').
             if ($linkitems->{$link}{'text'} ne '') {                            '</td>'.
                 $linkitems->{$link}{'cmd'}=~s/"/'/g;                            '<td>&nbsp;</td>'.
                 if ($linkitems->{$link}{'cmd'}) {                            '<td class="LC_middle">'.&mt('Tools:').'</td>';
                     if ($link eq 'changefolder') {              }
                         if ($condition) {              $result .= '<td align="left">'."\n".
                             $link_id='LC_content_toolbar_changefolder_toggled';                         '<span class="LC_nobreak">'."\n".
                         } else {                         '<ul id="LC_toolbar">';
                             $link_id='LC_content_toolbar_changefolder';              my @linkorder = ('firsthomework','everything','uncompleted',
                                'changefolder','clearbubbles','edittoplevel');
               foreach my $link (@linkorder) {
                   if (ref($args->{'linkitems'}{$link}) eq 'HASH') {
                       if ($args->{'linkitems'}{$link}{'text'} ne '') {
                           $args->{'linkitems'}{$link}{'cmd'}=~s/"/'/g;
                           if ($args->{'linkitems'}{$link}{'cmd'}) {
                               my $link_id = 'LC_content_toolbar_'.$link;
                               if ($link eq 'changefolder') {
                                   if ($condition) {
                                       $link_id='LC_content_toolbar_changefolder_toggled';
                                   } else {
                                       $link_id='LC_content_toolbar_changefolder';
                                   }
                               }
                               $result .= '<li><a href="#" '.
                                          'onclick="'.$args->{'linkitems'}{$link}{'cmd'}.'" '.
                                          'id="'.$link_id.'" '.
                                          'class="LC_toolbarItem" '.
                                          'title="'.$args->{'linkitems'}{$link}{'text'}.'">'.
                                          '</a></li>'."\n";
                         }                          }
                     }                      }
                     $result .= '<li><a href="#" '.  
                                'onclick="'.$linkitems->{$link}{'cmd'}.'" '.  
                                'id="'.$link_id.'" '.  
                                'class="LC_toolbarItem" '.  
                                'title="'.$linkitems->{$link}{'text'}.'">'.  
                                '</a></li>'."\n";  
                 }                  }
             }              }
               $result .= '</ul>'.
                          '</span></td>';
               if (($numlinks==1) && (exists($args->{'linkitems'}{'edittoplevel'}))) {
                   $result .= '<td><a href="'.$args->{'linkitems'}{'edittoplevel'}{'cmd'}.'">'.
                              &mt('Content Editor').'</a></td>';
               }
         }          }
           if ($args->{'sort_html'}) {
               $result .= '<td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>'.
                          '<td align="right">'.$args->{'sort_html'}.'</td>';
           }
       }
       if ($result) {
           $result = "<table><tr>$result</tr></table>";
     }      }
     $result .= '</ul>'.  
                '</span></td>'."\n";  
     return $result;      return $result;
 }  }
   
   
 1;  1;
   
   
Line 2020  sub new { Line 2049  sub new {
     } else {      } else {
  $self->change_user($self->{USERNAME}, $self->{DOMAIN});   $self->change_user($self->{USERNAME}, $self->{DOMAIN});
     }      }
           
     return $self;      return $self;
 }  }
   
Line 2055  sub change_user { Line 2084  sub change_user {
     &Apache::lonmap::loadmap($cnum, $cdom, $self->{USERNAME}, $self->{DOMAIN}, \%big_hash);      &Apache::lonmap::loadmap($cnum, $cdom, $self->{USERNAME}, $self->{DOMAIN}, \%big_hash);
     $self->{NAV_HASH} = \%big_hash;      $self->{NAV_HASH} = \%big_hash;
   
   
   
     # Now clear the parm cache and reconstruct the parm hash fromt he big_hash      # Now clear the parm cache and reconstruct the parm hash fromt he big_hash
     # param.xxxx keys.      # param.xxxx keys.
   
Line 2115  sub generate_course_user_opt { Line 2146  sub generate_course_user_opt {
     return;      return;
 }  }
   
   
   
 sub generate_email_discuss_status {  sub generate_email_discuss_status {
     my $self = shift;      my $self = shift;
     my $symb = shift;      my $symb = shift;
Line 2528  sub parmval { Line 2561  sub parmval {
     return $result->[0];      return $result->[0];
 }  }
   
   
 sub parmval_real {  sub parmval_real {
     my $self = shift;      my $self = shift;
     my ($what,$symb,$recurse) = @_;      my ($what,$symb,$recurse) = @_;
   
   
     # Make sure the {USER_OPT} and {COURSE_OPT} hashes are populated      # Make sure the {USER_OPT} and {COURSE_OPT} hashes are populated
     $self->generate_course_user_opt();      $self->generate_course_user_opt();
   
Line 2560  sub parmval_real { Line 2595  sub parmval_real {
     my $mapparm=$mapname.'___(all).'.$what;      my $mapparm=$mapname.'___(all).'.$what;
     my $usercourseprefix=$cid;      my $usercourseprefix=$cid;
   
   
   
     my $grplevel=$usercourseprefix.'.['.$cgroup.'].'.$what;      my $grplevel=$usercourseprefix.'.['.$cgroup.'].'.$what;
     my $grplevelr=$usercourseprefix.'.['.$cgroup.'].'.$symbparm;      my $grplevelr=$usercourseprefix.'.['.$cgroup.'].'.$symbparm;
     my $grplevelm=$usercourseprefix.'.['.$cgroup.'].'.$mapparm;      my $grplevelm=$usercourseprefix.'.['.$cgroup.'].'.$mapparm;
   
   
     my $seclevel= $usercourseprefix.'.['.$csec.'].'.$what;      my $seclevel= $usercourseprefix.'.['.$csec.'].'.$what;
     my $seclevelr=$usercourseprefix.'.['.$csec.'].'.$symbparm;      my $seclevelr=$usercourseprefix.'.['.$csec.'].'.$symbparm;
     my $seclevelm=$usercourseprefix.'.['.$csec.'].'.$mapparm;      my $seclevelm=$usercourseprefix.'.['.$csec.'].'.$mapparm;
   
   
     my $courselevel= $usercourseprefix.'.'.$what;      my $courselevel= $usercourseprefix.'.'.$what;
     my $courselevelr=$usercourseprefix.'.'.$symbparm;      my $courselevelr=$usercourseprefix.'.'.$symbparm;
     my $courselevelm=$usercourseprefix.'.'.$mapparm;      my $courselevelm=$usercourseprefix.'.'.$mapparm;
   
   
     my $useropt = $self->{USER_OPT};      my $useropt = $self->{USER_OPT};
     my $courseopt = $self->{COURSE_OPT};      my $courseopt = $self->{COURSE_OPT};
     my $parmhash = $self->{PARM_HASH};      my $parmhash = $self->{PARM_HASH};
Line 2638  sub parmval_real { Line 2678  sub parmval_real {
     if (defined($pack_def)) { return [$pack_def,'resource']; }      if (defined($pack_def)) { return [$pack_def,'resource']; }
     return [''];      return [''];
 }  }
   #
   #  Determines the open/close dates for printing a map that
   #  encloses a resource.
   #
   sub map_printdates {
       my ($self, $res, $part) = @_;
   
   
   
   
   
       my $opendate = $self->get_mapparam($res->symb(), "$part.printstartdate");
       my $closedate= $self->get_mapparam($res->symb(), "$part.printenddate");
   
   
       return ($opendate, $closedate);
   }
   
   sub get_mapparam {
       my ($self, $symb, $what) = @_;
   
       # Ensure the course option hash is populated:
   
       $self->generate_course_user_opt();
   
       # Get the course id and section if there is one.
   
       my $cid=$env{'request.course.id'};
       my $csec=$env{'request.course.sec'};
       my $cgroup='';
       my @cgrps=split(/:/,$env{'request.course.groups'});
       if (@cgrps > 0) {
           @cgrps = sort(@cgrps);
           $cgroup = $cgrps[0];
       } 
       my $uname=$self->{USERNAME};
       my $udom=$self->{DOMAIN};
   
       unless ($symb) { return ['']; }
       my $result='';
   
   
       # Figure out which map we are in.
   
       my ($mapname,$id,$fn)=&Apache::lonnet::decode_symb($symb);
       $mapname = &Apache::lonnet::deversion($mapname);
   
   
       my $rwhat=$what;
       $what=~s/^parameter\_//;
       $what=~s/\_/\./;
   
       # Build the hash keys for the lookup:
   
       my $symbparm=$symb.'.'.$what;
       my $mapparm=$mapname.'___(all).'.$what;
       my $usercourseprefix=$cid;
   
   
       my $grplevel    = "$usercourseprefix.[$cgroup].$mapparm";
       my $seclevel    = "$usercourseprefix.[$csec].$mapparm";
       my $courselevel = "$usercourseprefix.$mapparm";
   
   
       # Get handy references to the hashes we need in $self:
   
       my $useropt = $self->{USER_OPT};
       my $courseopt = $self->{COURSE_OPT};
       my $parmhash = $self->{PARM_HASH};
   
       # Check per user 
   
   
   
       if ($uname and defined($useropt)) {
    if (defined($$useropt{$courselevel})) {
       return $$useropt{$courselevel};
    }
       }
   
       # Check course -- group
   
   
   
       if ($cgroup ne '' and defined ($courseopt)) {
    if (defined($$courseopt{$grplevel})) {
       return $$courseopt{$grplevel};
    }
       }
   
       # Check course -- section
   
   
   
   
   
       if ($csec and defined($courseopt)) {
    if (defined($$courseopt{$seclevel})) {
       return $$courseopt{$seclevel};
    }
       }
       # Check the map parameters themselves:
   
       my $thisparm = $$parmhash{$symbparm};
       if (defined($thisparm)) {
    return $thisparm;
       }
   
   
       # Additional course parameters:
   
       if (defined($courseopt)) {
    if (defined($$courseopt{$courselevel})) {
       return $$courseopt{$courselevel};
    }
       }
       return undef; # Unefined if we got here.
   }
   
   sub course_printdates {
       my ($self, $symb,  $part) = @_;
   
   
       my $opendate  = $self->getcourseparam($symb, $part . '.printstartdate');
       my $closedate = $self->getcourseparam($symb, $part . '.printenddate');
       return ($opendate, $closedate);
   
   }
   
   sub getcourseparam {
       my ($self, $symb, $what) = @_;
   
       $self->generate_course_user_opt(); # If necessary populate the hashes.
   
       my $uname = $self->{USERNAME};
       my $udom  = $self->{DOMAIN};
       
       # Course, section, group ids come from the env:
   
       my $cid   = $env{'request.course.id'};
       my $csec  = $env{'request.course.sec'};
       my $cgroup = ''; # Assume no group
   
       my @cgroups = split(/:/, $env{'request.course.groups'});
       if(@cgroups > 0) {
    @cgroups = sort(@cgroups);
    $cgroup  = $cgroups[0]; # There is a course group. 
      }
       my ($mapname,$id,$fn)=&Apache::lonnet::decode_symb($symb);
       $mapname = &Apache::lonnet::deversion($mapname);
   
       #
       # Make the various lookup keys:
       #
   
       $what=~s/^parameter\_//;
       $what=~s/\_/\./;
   
   
       my $symbparm = $symb . '.' . $what;
       my $mapparm=$mapname.'___(all).'.$what;
   
       # Local refs to the hashes we're going to look at:
   
       my $useropt   = $self->{USER_OPT};
       my $courseopt = $self->{COURSE_OPT};
   
       # 
       # We want the course level stuff from the way
       # parmval_real operates 
       # TODO: Fator some of this stuff out of
       # both parmval_real and here
       #
       my $courselevel = $cid . '.' .  $what;
       my $grplevel    = $cid . '.[' . $cgroup   . ']' . $what;
       my $seclevel    = $cid . '.[' . $csec     . ']' . $what;
   
   
       # Try for the user's course level option:
   
       if ($uname and defined($useropt)) {
    if (defined($$useropt{$courselevel})) {
       return $$useropt{$courselevel};
    }
       }
       # Try for the group's course level option:
   
       if ($uname ne '' and defined($courseopt)) {
    if (defined($$courseopt{$grplevel})) {
       return $$courseopt{$grplevel};
    }
       }
   
       #  Try for section level parameters:
   
       if ($csec and defined($courseopt)) {
    if (defined($$courseopt{$seclevel})) {
       return $$courseopt{$seclevel};
    }
       }
       # Try for 'additional' course parameterse:
   
       if (defined($courseopt)) {
    if (defined($$courseopt{$courselevel})) {
       return $$courseopt{$courselevel};
    }
       }
       return undef;
   
   }
   
   
 =pod  =pod
   
Line 3062  sub new { Line 3313  sub new {
     if ($resourceCount == 1 && $resource->is_sequence() && !$self->{FORCE_TOP}) {       if ($resourceCount == 1 && $resource->is_sequence() && !$self->{FORCE_TOP}) { 
         my $firstResource = $resource->map_start();          my $firstResource = $resource->map_start();
         my $finishResource = $resource->map_finish();          my $finishResource = $resource->map_finish();
         return    my $result;
             Apache::lonnavmaps::iterator->new($self->{NAV_MAP}, $firstResource,   $result =  Apache::lonnavmaps::iterator->new($self->{NAV_MAP}, $firstResource,
                                               $finishResource, $self->{FILTER},       $finishResource, $self->{FILTER},
                                               $self->{ALREADY_SEEN},        $self->{ALREADY_SEEN}, 
                                               $self->{CONDITION},       $self->{CONDITION},
       $self->{FORCE_TOP});       $self->{FORCE_TOP});
    return $result;
              
                   
     }      }
   
Line 3087  sub new { Line 3340  sub new {
     $self->{ALREADY_SEEN}->{$self->{FIRST_RESOURCE}->{ID}} = 1;      $self->{ALREADY_SEEN}->{$self->{FIRST_RESOURCE}->{ID}} = 1;
   
     bless ($self);      bless ($self);
   
     return $self;      return $self;
 }  }
   
Line 3102  sub next { Line 3354  sub next {
     # do so.      # do so.
     if ($self->{RETURN_0} && !$self->{HAVE_RETURNED_0}) {      if ($self->{RETURN_0} && !$self->{HAVE_RETURNED_0}) {
         $self->{HAVE_RETURNED_0} = 1;          $self->{HAVE_RETURNED_0} = 1;
    my $nextTopLevel = $self->{NAV_MAP}->getById('0.0');
         return $self->{NAV_MAP}->getById('0.0');          return $self->{NAV_MAP}->getById('0.0');
     }      }
     if ($self->{RETURN_0} && !$self->{HAVE_RETURNED_0_BEGIN_MAP}) {      if ($self->{RETURN_0} && !$self->{HAVE_RETURNED_0_BEGIN_MAP}) {
Line 3121  sub next { Line 3374  sub next {
         if ($self->{RECURSIVE_DEPTH} == 0) {          if ($self->{RECURSIVE_DEPTH} == 0) {
             $self->{RECURSIVE_ITERATOR_FLAG} = 0;              $self->{RECURSIVE_ITERATOR_FLAG} = 0;
         }          }
   
         return $next;          return $next;
     }      }
   
Line 3197  sub next { Line 3449  sub next {
     # So we need to look at all the resources we can get to from here,      # So we need to look at all the resources we can get to from here,
     # categorize them if we haven't seen them, remember if we have a new      # categorize them if we haven't seen them, remember if we have a new
     my $nextUnfiltered = $here->getNext();      my $nextUnfiltered = $here->getNext();
   
   
     my $maxDepthAdded = -1;      my $maxDepthAdded = -1;
           
     for (@$nextUnfiltered) {      for (@$nextUnfiltered) {
Line 3230  sub next { Line 3484  sub next {
         $self->{RECURSIVE_ITERATOR_FLAG} = 1;          $self->{RECURSIVE_ITERATOR_FLAG} = 1;
         my $firstResource = $self->{HERE}->map_start();          my $firstResource = $self->{HERE}->map_start();
         my $finishResource = $self->{HERE}->map_finish();          my $finishResource = $self->{HERE}->map_finish();
   
         $self->{RECURSIVE_ITERATOR} =           $self->{RECURSIVE_ITERATOR} = 
             Apache::lonnavmaps::iterator->new($self->{NAV_MAP}, $firstResource,              Apache::lonnavmaps::iterator->new($self->{NAV_MAP}, $firstResource,
                                               $finishResource, $self->{FILTER},                                                $finishResource, $self->{FILTER},
Line 3568  sub new { Line 3821  sub new {
     $self->{NAV_MAP}->{RESOURCE_CACHE}->{$self->{ID}} = $self;      $self->{NAV_MAP}->{RESOURCE_CACHE}->{$self->{ID}} = $self;
     $self->{RESOURCE_ERROR} = 0;      $self->{RESOURCE_ERROR} = 0;
   
       $self->{DUEDATE_CACHE} = undef;
   
     # A hash that can be used by two-pass algorithms to store data      # A hash that can be used by two-pass algorithms to store data
     # about this resource in. Not used by the resource object      # about this resource in. Not used by the resource object
     # directly.      # directly.
Line 4035  their code.) Line 4290  their code.)
   
 =over 4  =over 4
   
   
 =item * B<printable>  =item * B<printable>
   
 returns true if the current date is such that the   returns true if the current date is such that the 
 specified resource part is printable.  specified resource part is printable.
   
   
 =item * B<resprintable>  =item * B<resprintable>
   
 Returns true if all parts in the resource are printable making the  Returns true if all parts in the resource are printable making the
Line 4098  Get the weight for the problem. Line 4355  Get the weight for the problem.
   
 =cut  =cut
   
   
   
   
 sub printable {  sub printable {
   
     my ($self, $part) = @_;      my ($self, $part) = @_;
   
     # Get the print open/close dates for the resource.      # Get the print open/close dates for the resource.
   
     my $start = $self->parmval("prinstartdate", $part);      my $start = $self->parmval("printstartdate", $part);
     my $end   = $self->parmval("printenddate", $part);      my $end   = $self->parmval("printenddate", $part);
   
     #  The following cases apply:      #  The following cases apply:
Line 4206  sub checkedin { Line 4466  sub checkedin {
   
 sub duedate {  sub duedate {
     (my $self, my $part) = @_;      (my $self, my $part) = @_;
       if (defined ($self->{DUEDATE_CACHE}->{$part})) {
           return $self->{DUEDATE_CACHE}->{$part};
       }
     my $date;      my $date;
     my @interval=$self->parmval("interval", $part);      my @interval=$self->parmval("interval", $part);
     my $due_date=$self->parmval("duedate", $part);      my $due_date=$self->parmval("duedate", $part);
Line 4222  sub duedate { Line 4485  sub duedate {
     } else {      } else {
  $date = $due_date;   $date = $due_date;
     }      }
       $self->{DUEDATE_CACHE}->{$part} = $date;
     return $date;      return $date;
 }  }
 sub handgrade {  sub handgrade {
Line 5073  sub status { Line 5337  sub status {
     }      }
   
     # Otherwise, it's untried and open      # Otherwise, it's untried and open
     return OPEN;       return OPEN;
 }  }
   
 sub check_for_slot {  sub check_for_slot {
     my $self = shift;      my $self = shift;
     my $part = shift;      my $part = shift;
       my $symb = $self->symb();
     my ($use_slots,$available,$availablestudent) = $self->slot_control($part);      my ($use_slots,$available,$availablestudent) = $self->slot_control($part);
     if (($use_slots ne '') && ($use_slots !~ /^\s*no\s*$/i)) {      if (($use_slots ne '') && ($use_slots !~ /^\s*no\s*$/i)) {
         my @slots = (split(/:/,$availablestudent),split(/:/,$available));          my @slots = (split(/:/,$availablestudent),split(/:/,$available));
Line 5086  sub check_for_slot { Line 5351  sub check_for_slot {
         my $cdom=$env{'course.'.$cid.'.domain'};          my $cdom=$env{'course.'.$cid.'.domain'};
         my $cnum=$env{'course.'.$cid.'.num'};          my $cnum=$env{'course.'.$cid.'.num'};
         my $now = time;          my $now = time;
           my $num_usable_slots = 0;
         if (@slots > 0) {          if (@slots > 0) {
             my %slots=&Apache::lonnet::get('slots',[@slots],$cdom,$cnum);              my %slots=&Apache::lonnet::get('slots',[@slots],$cdom,$cnum);
             if (&Apache::lonnet::error(%slots)) {              if (&Apache::lonnet::error(%slots)) {
                 return (UNKNOWN);                  return (UNKNOWN);
             }              }
             my @sorted_slots = &Apache::loncommon::sorted_slots(\@slots,\%slots);              my @sorted_slots = &Apache::loncommon::sorted_slots(\@slots,\%slots,'starttime');
             my ($checkedin,$checkedinslot);              my ($checkedin,$checkedinslot);
             foreach my $slot_name (@sorted_slots) {              foreach my $slot_name (@sorted_slots) {
                 next if (!defined($slots{$slot_name}) ||                  next if (!defined($slots{$slot_name}) || !ref($slots{$slot_name}));
                          !ref($slots{$slot_name}));  
                 my $end = $slots{$slot_name}->{'endtime'};                  my $end = $slots{$slot_name}->{'endtime'};
                 my $start = $slots{$slot_name}->{'starttime'};                  my $start = $slots{$slot_name}->{'starttime'};
                 my $ip = $slots{$slot_name}->{'ip'};                  my $ip = $slots{$slot_name}->{'ip'};
                 if ($self->simpleStatus() == OPEN) {                  if ($self->simpleStatus() == OPEN) {
                     my $startreserve = $slots{$slot_name}->{'startreserve'};  
                     my @proctors;  
                     if ($slots{$slot_name}->{'proctor'} ne '') {  
                         @proctors = split(',',$slots{$slot_name}->{'proctor'});  
                     }  
                     if ($end > $now) {                      if ($end > $now) {
                         ($checkedin,$checkedinslot) = $self->checkedin();                          if ($start > $now) {
                         if ($startreserve < $now) {                              return (RESERVED_LATER,$start,$slot_name);
                             if ($start > $now) {                          } else {
                                 return (RESERVED_LATER,$start,$slot_name);                              if ($ip ne '') {
                             } else {                                  if (!&Apache::loncommon::check_ip_acc($ip)) {
                                 if ($ip ne '') {                                      return (RESERVED_LOCATION,$ip,$slot_name);
                                     if (!&Apache::loncommon::check_ip_acc($ip)) {  
                                         return (RESERVED_LOCATION,$ip,$slot_name);  
                                     }  
                                 }   
                                 if (@proctors > 0) {  
                                     unless ((grep(/^\Q$checkedin\E/,@proctors)) &&  
                                         ($checkedinslot eq $slot_name)) {  
                                         return (NEEDS_CHECKIN,undef,$slot_name);   
                                     }  
                                 }                                  }
                                 return (RESERVED,$end,$slot_name);  
                             }                              }
                         } else {                              my @proctors;
                             if ($start > $now) {                              if ($slots{$slot_name}->{'proctor'} ne '') {
                                 return (RESERVABLE,$startreserve,$slot_name);                                  @proctors = split(',',$slots{$slot_name}->{'proctor'});
                               }
                               if (@proctors > 0) {
                                   ($checkedin,$checkedinslot) = $self->checkedin();
                                   unless ((grep(/^\Q$checkedin\E/,@proctors)) &&
                                           ($checkedinslot eq $slot_name)) {
                                       return (NEEDS_CHECKIN,undef,$slot_name); 
                                   }
                             }                              }
                               return (RESERVED,$end,$slot_name);
                         }                          }
                     }                      }
                   } elsif ($end > $now) {
                       $num_usable_slots ++;
                 }                  }
             }              }
             my ($is_correct,$got_grade);              my ($is_correct,$got_grade);
Line 5150  sub check_for_slot { Line 5410  sub check_for_slot {
                     return (CORRECT);                       return (CORRECT); 
                 }                  }
             }              }
             return(NOT_IN_A_SLOT);              if ($num_usable_slots) {
         } else {  
             if (!$future_slots_checked) {  
                 $future_slots = &get_future_slots($cdom,$cnum,$now);  
                 $future_slots_checked = 1;  
             }  
             if ($future_slots) {  
                 return(NOT_IN_A_SLOT);                  return(NOT_IN_A_SLOT);
             }              }
             return(NOTRESERVABLE);  
         }          }
     }          my $reservable = &Apache::lonnet::get_reservable_slots($cnum,$cdom,$env{'user.name'},
     return;                                                                 $env{'user.domain'});
 }          if (ref($reservable) eq 'HASH') {
               if ((ref($reservable->{'now_order'}) eq 'ARRAY') && (ref($reservable->{'now'}) eq 'HASH')) {
 sub get_future_slots {                  foreach my $slot (reverse (@{$reservable->{'now_order'}})) {
     my ($cdom,$cnum,$now) = @_;                      if (($reservable->{'now'}{$slot}{'symb'} eq '') ||
     my %slots=&Apache::lonnet::dump('slots',$cdom,$cnum);                          ($reservable->{'now'}{$slot}{'symb'} eq $symb)) {
     my $future_slots = 0;                          return(RESERVABLE,$reservable->{'now'}{$slot}{'endreserve'});
     foreach my $slot (keys(%slots)) {                      }
         if (($slots{$slot}->{'starttime'} > $now) &&                  }
             ($slots{$slot}->{'endtime'} > $now)) {              }
             $future_slots ++;              if ((ref($reservable->{'future_order'}) eq 'ARRAY') && (ref($reservable->{'future'}) eq 'HASH')) {
                   foreach my $slot (@{$reservable->{'future_order'}}) {
                       if (($reservable->{'future'}{$slot}{'symb'} eq '') ||
                           ($reservable->{'future'}{$slot}{'symb'} eq $symb)) {
                           return(RESERVABLE_LATER,$reservable->{'future'}{$slot}{'startreserve'});
                       }
                   }
               }
         }          }
           return(NOTRESERVABLE);
     }      }
     return $future_slots;      return;
 }  }
   
 sub CLOSED { return 23; }  sub CLOSED { return 23; }

Removed from v.1.469  
changed lines
  Added in v.1.485


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