Diff for /loncom/interface/lonnavmaps.pm between versions 1.423.4.2 and 1.424

version 1.423.4.2, 2009/09/23 14:30:45 version 1.424, 2009/02/14 12:20:10
Line 31 Line 31
   
 =head1 NAME  =head1 NAME
   
 Apache::lonnavmaps - Subroutines to handle and render the navigation  Apache::lonnavmaps.pm
   
 =head1 SYNOPSIS  =head1 SYNOPSIS
   
Line 530  my %colormap = Line 530  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 close {  sub close {
     if ($env{'environment.remotenavmap'} ne 'on') { return ''; }      if ($env{'environment.remotenavmap'} ne 'on') { return ''; }
     return(<<ENDCLOSE);      return(<<ENDCLOSE);
Line 637  sub getDescription { Line 634  sub getDescription {
     if ($status == $res->OPEN_LATER) {      if ($status == $res->OPEN_LATER) {
         return &mt("Open ") .timeToHumanString($open,'start');          return &mt("Open ") .timeToHumanString($open,'start');
     }      }
     if ($res->simpleStatus($part) == $res->OPEN) {  
         unless (&Apache::lonnet::allowed('mgr',$env{'request.course.id'})) {  
             my ($slot_status,$slot_time,$slot_name)=$res->check_for_slot($part);  
             if ($slot_status == $res->UNKNOWN) {  
                 return &mt('Reservation status unknown');  
             } elsif ($slot_status == $res->RESERVED) {  
                 return &mt('Reserved - ends [_1]',  
                            timeToHumanString($slot_time,'end'));  
             } elsif ($slot_status == $res->RESERVED_LOCATION) {  
                 return &mt('Reserved - specific location(s) - ends [_1]',  
                            timeToHumanString($slot_time,'end'));  
             } elsif ($slot_status == $res->RESERVED_LATER) {  
                 return &mt('Reserved - next open [_1]',  
                            timeToHumanString($slot_time,'start'));  
             } elsif ($slot_status == $res->RESERVABLE) {  
                 return &mt('Reservable ending [_1]',  
                            timeToHumanString($slot_time,'end'));  
             } elsif ($slot_status == $res->RESERVABLE_LATER) {  
                 return &mt('Reservable starting [_1]',  
                            timeToHumanString($slot_time,'start'));  
             } elsif ($slot_status == $res->NOT_IN_A_SLOT) {  
                 return &mt('Reserve a time/place to work');  
             } elsif ($slot_status == $res->NOTRESERVABLE) {  
                 return &mt('Reservation not available');  
             } elsif ($slot_status == $res->WAITING_FOR_GRADE) {  
                 return &mt('Submission in grading queue');  
             }  
         }  
     }  
     if ($status == $res->OPEN) {      if ($status == $res->OPEN) {
         if ($due) {          if ($due) {
     if ($res->is_practice()) {      if ($res->is_practice()) {
Line 695  sub getDescription { Line 663  sub getDescription {
         return &mt("Excused by instructor");          return &mt("Excused by instructor");
     }      }
     if ($status == $res->ATTEMPTED) {      if ($status == $res->ATTEMPTED) {
         if ($res->src() eq '/res/gci/gci/internal/submission.problem') {          return &mt("Answer submitted, not yet graded");
             return &mt('Question(s) submitted for review');  
         } else {  
             return &mt("Answer submitted, not yet graded");  
         }  
     }      }
     if ($status == $res->TRIES_LEFT) {      if ($status == $res->TRIES_LEFT) {
         my $tries = $res->tries($part);          my $tries = $res->tries($part);
Line 719  sub getDescription { Line 683  sub getDescription {
         }          }
     }      }
     if ($status == $res->ANSWER_SUBMITTED) {      if ($status == $res->ANSWER_SUBMITTED) {
         if ($res->src() eq '/res/gci/gci/internal/submission.problem') {          return &mt('Answer submitted');
             return &mt('Question(s) submitted for review');  
         } else {  
             return &mt('Answer submitted');  
         }  
     }      }
 }  }
   
Line 905  sub render_resource { Line 865  sub render_resource {
     my $location=&Apache::loncommon::lonhttpdurl("/adm/lonIcons");      my $location=&Apache::loncommon::lonhttpdurl("/adm/lonIcons");
     # If this is a new branch, label it so      # If this is a new branch, label it so
     if ($params->{'isNewBranch'}) {      if ($params->{'isNewBranch'}) {
         $newBranchText = '<img src="'.$location.'/branch.gif" border="0" alt="'.          $newBranchText = "<img src='$location/branch.gif' border='0' alt='Branch' />";
                          &mt('Branch').'" />';  
     }      }
   
     # links to open and close the folder      # links to open and close the folder
Line 1007  sub render_resource { Line 966  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 = '<span class="LC_fontcolor_red LC_fontsize_large">&gt;</span>';          $curMarkerBegin = '<em style="font-weight:bold;">';
         $curMarkerEnd = '<span class="LC_fontcolor_red LC_fontsize_large">&lt;</span>';          $curMarkerEnd = '</em>';
         $params->{'displayedHereMarker'} = 1;   $params->{'displayedHereMarker'} = 1;
     }      }
   
     if ($resource->is_problem() && $part ne '0' &&       if ($resource->is_problem() && $part ne '0' && 
Line 1435  sub render { Line 1394  sub render {
  my $location=&Apache::loncommon::lonhttpdurl("/adm/lonMisc");   my $location=&Apache::loncommon::lonhttpdurl("/adm/lonMisc");
         if ($navmap->{LAST_CHECK}) {          if ($navmap->{LAST_CHECK}) {
             $result .=               $result .= 
                 '<img src="'.$location.'/chat.gif" alt="" /> '.&mt('New discussion since').' '.                  '<img src="'.$location.'/chat.gif"> '.&mt('New discussion since').' '.
                 strftime("%A, %b %e at %I:%M %P", localtime($navmap->{LAST_CHECK})).                  strftime("%A, %b %e at %I:%M %P", localtime($navmap->{LAST_CHECK})).
                 '</td><td align="center" valign="bottom">&nbsp;&nbsp;'.                  '</td><td align="center" valign="bottom">&nbsp;&nbsp;'.
                 '<img src="'.$location.'/feedback.gif" alt="" /> '.&mt('New message (click to open)').'<p>'.                  '<img src="'.$location.'/feedback.gif"> '.&mt('New message (click to open)').'<p>'.
                 '</td>';                   '</td>'; 
         } else {          } else {
             $result .= '<td align="center" valign="bottom">&nbsp;&nbsp;'.              $result .= '<td align="center" valign="bottom">&nbsp;&nbsp;'.
                 '<img src="'.$location.'/chat.gif" alt="" /> '.&mt('Discussions').'</td><td align="center" valign="bottom">'.                  '<img src="'.$location.'/chat.gif"> '.&mt('Discussions').'</td><td align="center" valign="bottom">'.
                 '&nbsp;&nbsp;<img src="'.$location.'/feedback.gif" alt="" /> '.&mt('New message (click to open)').                  '&nbsp;&nbsp;<img src="'.$location.'/feedback.gif"> '.&mt('New message (click to open)').
                 '</td>';                   '</td>'; 
         }          }
   
Line 3985  sub awarded { Line 3944  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 taskversion {  
     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.'.version'};  
 }  
 sub taskstatus {  
     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.'.$self->taskversion($part).'.'.$part.'.status'};  
 }  
 sub solved {  
     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.'.solved'};  
 }  
 sub checkedin {  
     my $self = shift; my $part = shift;  
     $self->{NAV_MAP}->get_user_data();  
     if (!defined($part)) { $part = '0'; }  
     if ($self->is_task()) {  
         my $version = $self->taskversion($part);  
         return ($self->{NAV_MAP}->{STUDENT_DATA}->{$self->symb()}->{'resource.'.$version .'.'.$part.'.checkedin'},$self->{NAV_MAP}->{STUDENT_DATA}->{$self->symb()}->{'resource.'.$version .'.'.$part.'.checkedin.slot'});  
     } else {  
         return ($self->{NAV_MAP}->{STUDENT_DATA}->{$self->symb()}->{'resource.'.$part.'.checkedin'},$self->{NAV_MAP}->{STUDENT_DATA}->{$self->symb()}->{'resource.'.$part.'.checkedin.slot'});  
     }  
 }  
 # this should work exactly like the copy in lonhomework.pm  # this should work exactly like the copy in lonhomework.pm
 sub duedate {  sub duedate {
     (my $self, my $part) = @_;      (my $self, my $part) = @_;
Line 4109  sub part_display { Line 4039  sub part_display {
     }      }
     return $display;      return $display;
 }  }
 sub slot_control {  
     my $self=shift(); my $part = shift();  
     if (!defined($part)) { $part = '0'; }  
     my $useslots = $self->parmval("useslots", $part);  
     my $availablestudent = $self->parmval("availablestudent", $part);  
     my $available = $self->parmval("available", $part);  
     return ($useslots,$availablestudent,$available);  
 }  
   
 # Multiple things need this  # Multiple things need this
 sub getReturnHash {  sub getReturnHash {
Line 4765  sub TRIES_LEFT       { return 20; } Line 4687  sub TRIES_LEFT       { return 20; }
 sub ANSWER_SUBMITTED { return 21; }  sub ANSWER_SUBMITTED { return 21; }
 sub PARTIALLY_CORRECT{ return 22; }  sub PARTIALLY_CORRECT{ return 22; }
   
 sub RESERVED_LATER    { return 30; }  
 sub RESERVED          { return 31; }  
 sub RESERVED_LOCATION { return 32; }  
 sub RESERVABLE        { return 33; }  
 sub RESERVABLE_LATER  { return 34; }  
 sub NOTRESERVABLE     { return 35; }  
 sub NOT_IN_A_SLOT     { return 36; }  
 sub NEEDS_CHECKIN     { return 37; }  
 sub WAITING_FOR_GRADE { return 38; }  
 sub UNKNOWN           { return 39; }  
   
 sub status {  sub status {
     my $self = shift;      my $self = shift;
     my $part = shift;      my $part = shift;
Line 4867  sub status { Line 4778  sub status {
     return OPEN;       return OPEN; 
 }  }
   
 sub check_for_slot {  
     my $self = shift;  
     my $part = shift;  
     my ($use_slots,$available,$availablestudent) = $self->slot_control($part);  
     if (($use_slots ne '') && ($use_slots !~ /^\s*no\s*$/i)) {  
         my @slots = (split(/:/,$availablestudent),split(/:/,$available));  
         my $cid=$env{'request.course.id'};  
         my $cdom=$env{'course.'.$cid.'.domain'};  
         my $cnum=$env{'course.'.$cid.'.num'};  
         my $now = time;  
         if (@slots > 0) {  
             my %slots=&Apache::lonnet::get('slots',[@slots],$cdom,$cnum);  
             if (&Apache::lonnet::error(%slots)) {  
                 return (UNKNOWN);  
             }  
             my @sorted_slots = &Apache::loncommon::sorted_slots(\@slots,\%slots);  
             my ($checkedin,$checkedinslot);  
             foreach my $slot_name (@sorted_slots) {  
                 next if (!defined($slots{$slot_name}) ||  
                          !ref($slots{$slot_name}));  
                 my $end = $slots{$slot_name}->{'endtime'};  
                 my $start = $slots{$slot_name}->{'starttime'};  
                 my $ip = $slots{$slot_name}->{'ip'};  
                 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) {  
                         ($checkedin,$checkedinslot) = $self->checkedin();  
                         if ($startreserve < $now) {  
                             if ($start > $now) {  
                                 return (RESERVED_LATER,$start,$slot_name);  
                             } else {  
                                 if ($ip ne '') {  
                                     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 {  
                             if ($start > $now) {  
                                 return (RESERVABLE,$startreserve,$slot_name);  
                             }  
                         }  
                     }  
                 }  
             }  
             my ($is_correct,$got_grade);  
             if ($self->is_task()) {  
                 my $taskstatus = $self->taskstatus();  
                 $is_correct = (($taskstatus eq 'pass') ||  
                                ($self->solved() =~ /^correct_/));  
                 $got_grade = ($self->solved() =~ /^(?:pass|fail)$/);  
             } else {  
                 $got_grade = 1;  
                 $is_correct = ($self->solved() =~ /^correct_/);  
             }  
             ($checkedin,$checkedinslot) = $self->checkedin();  
             if ($checkedin) {  
                 if (!$got_grade) {  
                     return (WAITING_FOR_GRADE);  
                 } elsif ($is_correct) {  
                     return (CORRECT);  
                 }  
             }  
             return(NOT_IN_A_SLOT);  
         } 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(NOTRESERVABLE);  
         }  
     }  
     return;  
 }  
   
 sub get_future_slots {  
     my ($cdom,$cnum,$now) = @_;  
     my %slots=&Apache::lonnet::dump('slots',$cdom,$cnum);  
     my $future_slots = 0;  
     foreach my $slot (keys(%slots)) {  
         if (($slots{$slot}->{'starttime'} > $now) &&  
             ($slots{$slot}->{'endtime'} > $now)) {  
             $future_slots ++;  
         }  
     }  
     return $future_slots;  
 }  
   
 sub CLOSED { return 23; }  sub CLOSED { return 23; }
 sub ERROR { return 24; }  sub ERROR { return 24; }
   

Removed from v.1.423.4.2  
changed lines
  Added in v.1.424


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