[LON-CAPA-cvs] cvs: loncom(GCI_2) /interface lonnavmaps.pm

gci gci@source.lon-capa.org
Wed, 23 Sep 2009 14:28:33 -0000


This is a MIME encoded message

--gci1253716113
Content-Type: text/plain

gci		Wed Sep 23 14:28:33 2009 EDT

  Modified files:              (Branch: GCI_2)
    /loncom/interface	lonnavmaps.pm 
  Log:
  - lonnavmaps.pm for GCI_2 updated to 2.9.X
  - Backport 1.429, 1.432, 1.433, 1.434, 1.435
  
  
--gci1253716113
Content-Type: text/plain
Content-Disposition: attachment; filename="gci-20090923142833.txt"

Index: loncom/interface/lonnavmaps.pm
diff -u loncom/interface/lonnavmaps.pm:1.423 loncom/interface/lonnavmaps.pm:1.423.4.1
--- loncom/interface/lonnavmaps.pm:1.423	Fri Dec 19 21:00:06 2008
+++ loncom/interface/lonnavmaps.pm	Wed Sep 23 14:28:33 2009
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Navigate Maps Handler
 #
-# $Id: lonnavmaps.pm,v 1.423 2008/12/19 21:00:06 raeburn Exp $
+# $Id: lonnavmaps.pm,v 1.423.4.1 2009/09/23 14:28:33 gci Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -31,7 +31,7 @@
 
 =head1 NAME
 
-Apache::lonnavmaps.pm
+Apache::lonnavmaps - Subroutines to handle and render the navigation
 
 =head1 SYNOPSIS
 
@@ -530,6 +530,9 @@
 # is not yet done and due in less than 24 hours
 my $hurryUpColor = "#FF0000";
 
+my $future_slots_checked = 0;
+my $future_slots = 0;
+
 sub close {
     if ($env{'environment.remotenavmap'} ne 'on') { return ''; }
     return(<<ENDCLOSE);
@@ -634,6 +637,35 @@
     if ($status == $res->OPEN_LATER) {
         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 ($due) {
 	    if ($res->is_practice()) {
@@ -865,7 +897,8 @@
     my $location=&Apache::loncommon::lonhttpdurl("/adm/lonIcons");
     # If this is a new branch, label it so
     if ($params->{'isNewBranch'}) {
-        $newBranchText = "<img src='$location/branch.gif' border='0' alt='Branch' />";
+        $newBranchText = '<img src="'.$location.'/branch.gif" border="0" alt="'.
+                         &mt('Branch').'" />';
     }
 
     # links to open and close the folder
@@ -1394,15 +1427,15 @@
 	my $location=&Apache::loncommon::lonhttpdurl("/adm/lonMisc");
         if ($navmap->{LAST_CHECK}) {
             $result .= 
-                '<img src="'.$location.'/chat.gif"> '.&mt('New discussion since').' '.
+                '<img src="'.$location.'/chat.gif" alt="" /> '.&mt('New discussion since').' '.
                 strftime("%A, %b %e at %I:%M %P", localtime($navmap->{LAST_CHECK})).
                 '</td><td align="center" valign="bottom">&nbsp;&nbsp;'.
-                '<img src="'.$location.'/feedback.gif"> '.&mt('New message (click to open)').'<p>'.
+                '<img src="'.$location.'/feedback.gif" alt="" /> '.&mt('New message (click to open)').'<p>'.
                 '</td>'; 
         } else {
             $result .= '<td align="center" valign="bottom">&nbsp;&nbsp;'.
-                '<img src="'.$location.'/chat.gif"> '.&mt('Discussions').'</td><td align="center" valign="bottom">'.
-                '&nbsp;&nbsp;<img src="'.$location.'/feedback.gif"> '.&mt('New message (click to open)').
+                '<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>'; 
         }
 
@@ -3944,6 +3977,35 @@
     if (!defined($part)) { $part = '0'; }
     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
 sub duedate {
     (my $self, my $part) = @_;
@@ -4039,6 +4101,14 @@
     }
     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
 sub getReturnHash {
@@ -4687,6 +4757,17 @@
 sub ANSWER_SUBMITTED { return 21; }
 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 {
     my $self = shift;
     my $part = shift;
@@ -4778,6 +4859,108 @@
     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 ERROR { return 24; }
 

--gci1253716113--